[Talk-cz] Postgis tutoriál (bylo PointInfo JOSM plugin - zobrazení informací z RUIAN)

Petr Vejsada osm na propsychology.cz
Neděle Únor 2 19:23:29 UTC 2014


Ahoj,

Dne Ne 2. února 2014 19:28:12, Marián Kyral napsal(a):

definiční čára, mně blbne na klávesnici F, fakt, nedělám si srandu...

Geometry typ prostě obsahuje údaje o tvaru nějakého objektu. Zobrazení:

třeba
select st_astext(definicni_cara)

Geometrie může být bod, čára, polygon, multipolygon, oblouky a též směs všeho 
uvedeného.

SRID = identifikace projekce, ve kreré je geometrie vyjádřena. Používáme v OSM 
dvě - 900913 pro zobrazování a 4326, což jsou ty stupně, jak je známe z 
běžného života.

RUIAN mám uložen v 900913, aby s tím Mapnik neměl tolik práce.

select st_srid(definicni_cara) from ruian.rn_ulice limit 1;

 st_srid
---------
  900913
(1 řádka)

Když chceš najít nejbližší ulici k bodu, vyjádřenému v "občanských" 
souřadnicích, tedy 4326, je potřeba to převést do 900913, protože takto jsou 
uložena data (platí jen pro tu databázi, co mám na serveru; někdo jiný to mlže 
mít jinak).

To se dělá transformací - select 
st_transform(<geometrie_v_lidských_souřadnicích>,<do jakého systému>)

Bod jakožto data typu geometrie vytvoříš třeba funkcí 
st_makepoint(<lon>,<lat>). Tato funkce vrátí data typu geometry a je to point.

Není však jasné, v jakém souřadnicovém systému to vlastně je. Proto použijeme 
st_setsrid(<geometry>,<srid>)

Takže do PG zadáme bod třeba

select st_setsrid(st_makepoint(14,50),4326)


Lidsky čitelné totéž:

select st_astext(st_setsrid(st_makepoint(14,50),4326));
  st_astext
--------------
 POINT(14 50)
(1 řádka)


V jakém souřadnicovém systému to vlastně máme?

select st_srid(st_setsrid(st_makepoint(14,50),4326));
 st_srid
---------
    4326
(1 řádka)


Ten samý bod si zobrazíme v lidsky čitelné formě v souřadnicovém systému 
900913:

select st_astext(st_transform(st_setsrid(st_makepoint(14,50),4326),900913));
                st_astext
------------------------------------------
 POINT(1558472.87110583 6446275.84101716)
(1 řádka)

A konečně se dostáváme k cíli:

select nazev from ruian.rn_ulice order by definicni_cara <-> 
st_transform(st_setsrid(st_makepoint(14,50),4326),900913) limit 1;
  nazev
----------
 Na Zámku
(1 řádka)


Jak je ta ulice daleko?

Funkce st_distance(geometry,geometry)

Ta ráda vrací vzdálenost v radiánech na zemském povrchu, osobně dávám přednost 
metrům ;-). V metrech nám to řekne, když geometrie budou geografie. Geography 
je podobný datový typ, vyjadřuje se v souřadnicovém systému 4326.

Toho se docílí přetypováním na typ geography.

Celý select pak vypadá:

select nazev,st_distance( (st_transform(definicni_cara,4326))::geography, 
(st_setsrid(st_makepoint(14,50),4326))::geography ) from ruian.rn_ulice order 
by definicni_cara <-> st_transform(st_setsrid(st_makepoint(14,50),4326),900913) 
limit 1;

  nazev   | st_distance
----------+--------------
 Na Zámku | 26.405619556
(1 řádka)

Nejbližší bod ulice Na Zámku je od nás vzdálen 26 metrů a 40 centimetrů.

Cvičení:

Jak si zobrazíme lidsky čitelné souřadnice adresního bodu z RUIAN?

A:
select st_astext(st_transform(definicni_bod,4326)) from ruian.rn_adresni_misto 
where kod=21411409;

                st_astext
------------------------------------------
 POINT(13.6752996130858 49.2886006596294)
(1 řádka)


Učebnice Postgisu:

http://workshops.boundlessgeo.com/postgis-intro/

je IMO super, ale nedá se to za 10 minut

--
Petr





Další informace o konferenci talk-cz