Portál AbcLinuxu, 10. května 2025 11:41

Dotaz: Řazení výsledku dotazu z DB

8.9.2012 23:01 Jiří Čížek
Řazení výsledku dotazu z DB
Přečteno: 719×
Odpovědět | Admin
Chtěl bych se zeptat, zda nemá někdo zkušenosti s výpisem a řazením z MySQL, dle konkrétního případu:

V databázi jsou sloupce se souřadnicemi GPS locX a locY. Potřebuji seřadit záznamy podle nejbližších hodnot od zadané souřadnice zlocX, zlocY. Prakticky od udaného bodu jakýmkoliv směrem - nahoru i dolů.

Děkuji za posunutí :-) k řešení.

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

8.9.2012 23:25 l0gik | skóre: 22
Rozbalit Rozbalit vše Re: Řazení výsledku dotazu z DB
Odpovědět | | Sbalit | Link | Blokovat | Admin
SELECT .... ORDER BY (zLocX - ?x)*(zLocX - ?x) + (zLocY - ?y) * (zLocY - ?y)

?
8.9.2012 23:40 Jiří Čížek
Rozbalit Rozbalit vše Re: Řazení výsledku dotazu z DB
Děkuji moc. To je ono.
Josef Kufner avatar 9.9.2012 00:58 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Řazení výsledku dotazu z DB
Jen nezapomeň, že se pohybuješ po šišaté kouli a ne v rovině.
Hello world ! Segmentation fault (core dumped)
8.9.2012 23:46 Kit
Rozbalit Rozbalit vše Re: Řazení výsledku dotazu z DB
To vypadá dobře, ale zřejmě to nebude pro větší počet záznamů moc efektivní. Pro seřazení podle velikosti asi nic jiného nezbývá.

Asi by bylo dobré se poohlédnout po databázi, která umí R-stromy. Možná by se dal v MySQL využít spatial index.
10.9.2012 06:57 Ivan Nový
Rozbalit Rozbalit vše Re: Řazení výsledku dotazu z DB
MyISAM MySQL používá R-stromy.
Heron avatar 25.9.2012 16:16 Heron | skóre: 53 | blog: root_at_heron | Olomouc
Rozbalit Rozbalit vše Re: Řazení výsledku dotazu z DB
Případně rovnou použít PostgreSQL a PostGIS, který má na tohle nejen přímo datové typy, ale dokonce i fce a indexy ;-)
25.9.2012 19:03 cronin | skóre: 49
Rozbalit Rozbalit vše Re: Řazení výsledku dotazu z DB
Stačila by city-block vzdialenosť, netreba euklidovskú. Výpočtovo je menej náročná a poradie zachová.
27.9.2012 12:21 l0gik | skóre: 22
Rozbalit Rozbalit vše Re: Řazení výsledku dotazu z DB
Nezachovává.

a: 0, 0 b: 10, 10 c: 19, 0

b je euleidovsky blíž k a než c, ale v L1 metrice dál.
Josef Kufner avatar 11.10.2012 12:23 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Řazení výsledku dotazu z DB
Odpovědět | | Sbalit | Link | Blokovat | Admin
Vzdálenost spočítáš dle Haversine formula (použitelné vzorečky), přičemž zanedbáš, že Země je šišatá a ne kulatá. Pokud ti počítání na kouli přijde moc zatěžující, v tom druhém odkazu jsou i vzorečky pro "equirectangular projection" (rozbalení koule na obdélník).

Pokud máš dat mnoho všude možně a hledáš v relativně malých vzdálenostech, rozděl si data do mřížky (políčka např. 1×1 km). Pak můžeš hledání omezit na několik málo polí a indexy v databázi se dostanou ke slovu.

Nebo můžeš předpočítat tabulku vzdálenosti středů jednotlivých polí a to pak použít jako odhad vzdálenosti pro omezení zpracovávaných dat a přesný výpočet pak pro získání skutečných údajů. Takový přístup by mohl umožnit důkladné využití indexů a cizích klíčů a tím vše značně zrychlit na úroveň jednoduchých dotazů.
Hello world ! Segmentation fault (core dumped)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.