[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