Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF2][Symfony2][Symfony]POINT inPOLYGON
Forum PHP.pl > Forum > PHP > Frameworki
Michal_Sz
Witam,

Chciałbym zapytać czy jest w Symfony2 jakiegoś gotowe rozwiązanie które umożliwia bardzo szybkie preszukiwanie punktów i obszarów.

Przykładem może być sprawdzenie które z zadanych punktów znajdują się w zadanych obszarach (jest 5000 punktów i 500 obszarów - każdy punkt musi przejść przez każdy obszar)
Podkreślam, że jednocześnie może być zadane bardzo dużo punktów i obszarów.
Punkty i obszary przetrzymywane są w MYSQL , gdzie współrzędne są typem GEOMETRY.

BYć może lepiej to robić na poziomie bazy danych, jeśli tak to jak.

Pozdrawiam
markuz
"point in polygon mysql" + Google
Michal_Sz
Ale ja wiem jak wygląda zapytanie które pozwoli to sprawdzić ale (tak jak pisałem wcześniej) biorąc pod uwagę ilość danych to musiałaby się wykonać ogromna ilość zapytań a ja pytam o optymalne rozwiązanie dla sprawdzenia właśnie ogromnej ilości danych.
markuz
Co masz na myśli mówiąc ogromna ilość danych - 5000 punktów i 500 obszarów? To nie tak dużo.
Ile czasu zajmuje Ci aktualnie wykonanie zapytania które sprawdza te 5000 punktów na 1 obszarze?
Elasticsearch posiada też takie możliwości i działa szybciej od MySQL - możesz go sobie przetestować.
Michal_Sz
Sprawdzenie około 12,5 tyś punktów w jednym obszarze zajmuje około 6 sekund, natomiast gorzej jest jeśli chcę sprawdzić np. podobną ilość punktów w 500 obszarach.
Mam wrażenie że to się nie chce skończyć.
Moje zapytanie wygląda w ten sposób:

  1. SELECT gps.id, gps.local_date_time FROM obszary ob, gps_data gps WHERE CONTAINS(ob.GEOMETRY, (Point(gps.LATITUDE,gps.LONGITUDE)))
  2. AND gps.local_date_time>='2016-06-10 00:00:00' AND gps.local_date_time<='2016-07-15 08:00:00' AND ob.id = '1063'


i podając id obszaru (ob.id) tak jak wyżej zapytanie wykonuje się w kilka sekund, natomiast pomijając ten warunek i szukając we wszystkich obszarach jest już źle.
markuz
Te punkty i obszary są stałe?
Jeżeli tak możesz stworzyć nową tabele o strukturze:
- obszar_id
- gps_id
- contains TINYTINY(1)
Napisać skrypt który wypełni ją danymi tj. 6 250 000 rekordami i zmienić zapytanie, tak aby nie korzystało już z funkcji CONTAINS tylko z tej tabeli.
Indeks UNIQUE na obszar_id i gps_id.

Jeżeli punkty nie są stałe a obszary tak, możesz zrobić automatycznie usuwanie rekordów z tej tabeli po usunięciu punktu (tylko założ indeks na gps_id) i jakieś kolejkowanie przy dodawaniu punktu tak aby cron zaczął obliczać contains jak najwcześniej.

Jeszcze jest opcja, że mając w obszarze GEOMETRY które zajmuje dla każdego rekordu np. 100 kB możesz zrobić kolejne pole o nazwie np. geo_2 które będzie zawierało odchudzona wersję tego kształu np. do 1/10 - dokładność będzie mniejsza ale szybkość powinna wzrosnąć.
Michal_Sz
Rzeczy w tym, ze te dane są dynamiczne i jest ich znacznie więcej. Przykład który podałem zawiera tylko zakres wyszukiwanych danych.
markuz
A do czego to wszystko służy? Może obrałeś złe założenia i da sie to zrobić w inny sposób.
Podaj konkretnie jak dynamiczne, jak często się zmieniają i ile ich moze być..
Na słabym komputerze nie odpalisz dobrej gry, może rozwiązaniem są chmury obliczeniowe skoro zależy Ci na szybkim czasie?
Michal_Sz
Jeśli chodzi o punkty to wpływają one regularnie co minutę do bazy. Natomiast obszary zmieniają się znacznie rzadziej ale tu nie jestem w stanie określić jak często.
Celem który chcę osiągnąć jest szybkie sprawdzenie w dowolnej chwili czy dany zakres punktów zawierał się w zadanych obszarach. Ten zakres punktów może być dowolny (od kilkuset do kilkunastu tysięcy), natomiast liczba obszarów nie powinna przekraczać kilkaset.
markuz
Ja widzę 3 rozwiązania które już Ci wyżej podałem.

1. Stworzyć dodatkową tabelę która trzyma cache punktów w obszarach, przy dodawaniu punktu ustawiać pole np. "cache" na 0, to samo w obszarach dodatkowe pole cache na "0" - potem stworzyć skrypt który szuka danych gdzie cache = 0, oblicza dane i dodaje do tej dodatkowej tabeli. Przy usuwaniu punktów/obszarów kolejny skrypt który czyści dane z tej dodatkowej tabeli.

2. Przenieść to wszystko do elasticsearch, postawić na kilku VPS/dedykach dodatkowe node do obliczeń - jak dobrze wszystko skonfigurujesz to będzie działać szybko.

3. Zwiększyć moc obliczeniową serwera na którym stoi baza danych.

Odnieś się do każdego - co Cię powstrzymuje przed jego wykorzystaniem.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.