[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