[Talk-cz] Postgis tutoriál (bylo PointInfo JOSM plugin - zobrazení informací z RUIAN)
Marián Kyral
mkyral na email.cz
Úterý Únor 4 20:56:22 UTC 2014
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 na openstreetmap.org
> https://lists.openstreetmap.org/listinfo/talk-cz
Další informace o konferenci talk-cz