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

Petr Vejsada osm na propsychology.cz
Úterý Únor 4 20:26:45 UTC 2014


Ahoj,

Dne Út 4. února 2014 19:27:37, Marián Kyral napsal(a):

> 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),4
> 326),900913) LIMIT 100) as u
> where st_distance( (st_transform(u.definicni_cara,4326))::geography,
> (st_setsrid(st_makepoint(18.3657227215035,49.66980665513853),4326))::geograp
> hy ) < 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.

Já tě tím nechtěl pro začátek zatěžovat, ale teď vidím, že jsem měl, no, 
alespoň sis na to přišel sám.

V tom odkazu, co jsem posílal, je psáno, že třídění pomocí <-> je přibližné, 
protože  geometrie (čára) se převede na bbox. Hledáš-li vzdálenost bodu od 
bodu, pak bbox bodu je totéž jako bod samotný, ale bbox čáry je prostě 
obdelník, takový, aby se do něho ta čára vešla. 

Tak, jak jsi to vyřešil, to řeším i já, tedy podobně. Na konec toho druhého 
selectu dávám order by st_distance(...) limit 1. st_distance už třídí exaktně, 
sice pomalu, ale u 100 položek to zase nevadí. U 20M položek (parcely) je to 
sakra znát.

Takže ten tvůj select by v mém podání vypadal:

........ 326),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 order by st_distance( (st_transform(u.definicni_cara,4326))::geography,
(st_setsrid(st_makepoint(18.3657227215035,49.66980665513853),4326))::geography 
limit 1

to vrátí s vysokou pravděpodobností tu správnou ulici, ledaže by ani těch 100 
řádku, nalezených aproximovaným výběrem z bboxů, neobsahovalo ten řádek se 
skutečně nejbližší ulicí.

> 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.

protože tam nemáš ten order_by st_distance. Vrátí ti to prostě první řádek, 
který vyhovuje podmínce, že st_distance < 10 a to může být klidně i ta druhá 
ulice.

--
Petr





Další informace o konferenci talk-cz