Ako zoskupit zaznamy podla koordinatov? rubrika: Programování: PHP

6 Ivan Jaros
položil/-a 16.8. 23:19
 
upravil/-a 16.8. 23:27

Ahojte,
dajme tomu ze mam v DB tisice zaznamov s GPS koordinatmi a chcem ich zobrazit na mape.
Samozrejme ze zobrazit vsetky by bola blbost z hladiska vykonu. Takze by som ich chcel zoskupit do skupin podla stvorcov ktorych dlzku hrany si urcim podla zoomu na mape a velkosti viditelnej mapy.

Cize ak je zoom maly(ie. pohlad z velkej vysky) tak na mape bude menej zobrazenych zaznamov(ie. kazdy bod bude predstavovat subset zaznamov v blizkosti) a ked bude velky zoom tak bude zaznamov viac a eventuelne bez zoskupenia pri privelkom zoome.

Otazka je, ako urobit toto zoskupenie v db? Nechcem totiz tahat vsetky zaznamy a triedit ich do skupin v aplikacii.

Prakticky, mapa ktoru vidi uzivatel ma vzdy nejaku geograficku vysku a sirku. Takze podla zoomu si urcim ze si danu mapu rozkuskujem na stvorce po 100km alebo 1000km alebo podobne. Podla toho ake su koordinaty rohov mapy a jej zoom si teda viem spravit N stvorcov ktore maju tiez kazdy rohy s koordinatmi ktore chcem pouzit na group by pre db query...ale neviem ako.

--
Edit: este ma napadlo ze by som teoreticky mohol pre kazdy zoom(kazdy provider ma obmedzeny pocet) urobit mapu stvorcov do ktorych dany bod spada a tym padom by nebola v hre ziadna dynamika, iba obycajne joiny na tieto mapovacie tabulky. Mapa Zeme ma najvyssi a najsirsi bod pevne dany takze mozem zacat odtial. Napriklad od 5000km stvorcov pri 20 zoomoch je to 250km na jeden zoom. Takze to mam 20 tabuliek, kde do kazdej len dam id zaznamu ktory spada do daneho stvorca a je to. Pri poslednych zoomoch uz dam vsetky zaznamy takze nemusim vyuzit toto zoskupenie.

odkaz Vyřešeno
7 vvondra
odpověděl/-a 17.8. 7:37

Jedna z jednodušších možností jsou geohashe. Umí je MySQL spatial i PostGIS

GROUP BY ST_Geohash(lat, lng, zoom)

Seskupí ti to body a přiřadí jim geohash daného rozlišeni.

Pro zobrazení všech 3 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.