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

Odpovedet emailem