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 [email protected] https://lists.openstreetmap.org/listinfo/talk-cz

