Super,
teď už to funguje správně. Taky mě ten order by mohl napadnout :-D
Marián
Dne 4.2.2014 21:26, Petr Vejsada napsal:
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
_______________________________________________
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