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

Marián Kyral mkyral na email.cz
Úterý Únor 4 18:27:37 UTC 2014


Ahoj,
tak jsem se dopracoval k tomuto selectu:

select u.kod, u.nazev, ST_asText(st_transform(u.definicni_cara,4326))
from ( select kod, nazev, definicni_cara
        from ruian.rn_ulice
        order by definicni_cara <->
               
st_transform(st_setsrid(st_makepoint(18.36564928953012,49.670527512403766),4326),900913)
      LIMIT 100) as u
where st_distance( (st_transform(u.definicni_cara,4326))::geography, 
(st_setsrid(st_makepoint(18.3657227215035,49.66980665513853),4326))::geography 
) < 10
;

Jediná věc mne zarazila. Musel jsem u subselectu nastavit "LIMIT 100". S 
nastavením "LIMIT 1" mi to vrátilo výsledek jen někdy. Klikal jsme podél 
ulice, na jednom místě mi to ulici vypsalo a o kousek dál už zase ne.

Teď to vypadá, že to funguje slušně. Jen na křižovatkách to někdy vrátí 
vedlejší ulici. Ale to bych neviděl jako moc velký problém. Inteligentní 
uživatel klikne kousek dál od křižovatky.

Díky,
Marián

Dne 2.2.2014 20:23, Petr Vejsada napsal:
> 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 na openstreetmap.org
> https://lists.openstreetmap.org/listinfo/talk-cz




Další informace o konferenci talk-cz