Moc díky. Myslím, že pro začátek mi to stačí. Marián
Dne 2.2.2014 20:23, Petr Vejsada napsal(a):
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 _______________________________________________ Talk-cz mailing list Talk-cz@openstreetmap.org https://lists.openstreetmap.org/listinfo/talk-cz
_______________________________________________ Talk-cz mailing list Talk-cz@openstreetmap.org https://lists.openstreetmap.org/listinfo/talk-cz