[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