Znajdowanie miast w promieniu "X" na podstawie współrzędnych

0

Cześć wszystkim, szukam rozwiązania dla mojego problemu jakim jest zbudowanie zapytania do bazy o treści, "Podaj miejsca w promieniu XYZ od współrzędnych
Latitude: 53.029880 /Longitude: 18.759460

Moja tabela nazywa się tbl_city i każdy rekord ma uzupełnione Latitude oraz Longitude. Próbowałem coś podziałać z cosinusem i sinusem oraz funkcją RADIANS() ale bez skutku :(

1

Z tego co widzę MySQL ma dedykowane funkcje i struktury do pracy z danymi GIS:
https://dev.mysql.com/doc/refman/8.0/en/spatial-analysis-functions.html
https://dev.mysql.com/doc/refman/8.0/en/spatial-types.html

Potencjalnie łatwiej będzie Ci to ogarnąć, wykorzystując wsparcie DBMS niż rzeźbiąc samemu (tym bardziej, że współrzędne mogą być w różnych źródłach w baaaardzo różnych projekcjach) ;)

Znając współrzędne miasta * i interesującego Cię punktu możesz w zapytaniu połączyć dwa punkty w LINESTRING np. skorzystać z funkcji ST_LENGTH - możesz nawet dodatkowym argumentem wskazać, w jakich jednostkach ma być rezultat: The INFORMATION_SCHEMA ST_UNITS_OF_MEASURE Table

* o ile redukowanie całego miasta do jednego punktu na mapie ma w Twoim przypadku sens - jak zredukujesz Warszawę do jej centralnego punktu i na obrzeżach zaczniesz szukać miast w promieniu 5km, to możesz nie znaleźć Warszawy :D Mogą przydać się dodatkowe operacje na wielokątach i obrys poszczególnych miast, by zrobić bardziej sensowne wyszukiwanie ;)

0

Problem jest dla konkretnej aplikacji, a wspomniane "miasta" to tak naprawdę konkretne budynki na mapie Polski :). Wszytko działa w integracji z api google maps i chce aby moje API "wypluwało" liste miejsc do warstwy frontendowej.

0

Mała uwaga ze strony laika GIS:
"Cywilni" ludzie pisząc

"Latitude: 53.029880 /Longitude: 18.759460"

zwykle na myśli mają WKID 4326 i często mogą nawet nie wiedzieć że istnieją inne projekcje.

Scope: Horizontal component of 3D system. Used by the GPS satellite navigation system and for NATO military geodetic surveying.

1

@pozdrawiam:
Ok, to w takim razie co trzymasz w bazie, co wyciągasz z API map Google i jak jedno będzie się mieć do drugiego? Wyciągasz interesujące Cię punkty z API Google i wrzucasz je do bazy, czy masz jakieś dane w bazie które przeszukujesz na podstawie rzeczy wypluwanych przez API Google Maps? Jedno i drugie jest danymi punktowymi, czy obrabiasz jakoś geometrie, i jeśli tak to wiesz w jakiej projekcji są jedne i drugie / masz nad tym kontrolę (w razie potrzeby normalizujesz do wybranej)?

0

Wszystko wiem i napisanie tego tematu zadziałało trochę jak efekt gumowej kaczki :)

SELECT
    *
FROM
    city
WHERE
    POWER((Latitude-53.029880),2) + POWER((Longitude-18.759460),2) <= POWER(PROMIEN,2);

Lecz mam wrażenie, że źle to pokazuję. Może ktoś mnie nakierować gdzie jest błąd?

0

Dla koła o środku (0,0)
x^2 +y^2 = r^2

Bardziej ogólnie
(x - x0)^2 + (y - y0)^2 = r^2

Pitagoras

0

@pozdrawiam: w jakich jednostkach jest PROMIEN? Jak duże odległości wchodzą tu w grę? Właśnie dlatego projekcja jest istotna.

Zwróć uwagę na dwie rzeczy:

  • Projekcje przyporządkowują punktom arbitralne koordynaty, w jednej możesz mieć stopnie / minuty / sekundy szerokości/długości geograficznej, w innej numerki 23335.42 i -853834.4
  • Te współrzędne 2D reprezentują punkt na sferze 3D, więc policzenie "na piechotę" wektora ze współrzędnych Lat/Long nie oznacza, że policzyłeś cokolwiek sensownego nawet, gdyby jednostki się w miarę zgadzały.

Nawet jak "w przybliżeniu" przyjmiesz, że jednak wszystko jest OK i z daną projekcją możesz liczyć odległości prostym Pitagorasem i nawet jednostki będą się zgadzać, to w dalszym ciągu będzie jako-tako działać tylko na niewielkich odległościach - na większych wskoczą problemy z niedokładnym "mapowaniem" sfery na płaską mapę, zmianą długości etc. etc.

Podobnie możesz władować się w problemy na konkretnych obszarach (np. blisko biegunów) gdzie występują przekłamania. Ogólnie pooglądaj sobie na co mapowana jest powierzchnia Ziemi na przykładach z dokumentacji ArcGIS:
https://pro.arcgis.com/en/pro-app/latest/help/mapping/properties/list-of-supported-map-projections.htm

0

Na płaszczyźnie

metry

W małym obszarze powinno IMO dać się przeliczać "linowo" współrzędne na współrzędne.

Na mapie na równiku 40 000 km to na biegunie objęcie ramionami - upraszczam, nie znam się na GIS
Odwzorowań jest trochę i sposobów przeliczania dystansu na współrzędne geograficzne

https://www.coursera.org/lecture/excel-vba-for-creative-problem-solving-part-3-projects/how-to-calculate-the-distance-between-two-points-knowing-latitude-and-longitude-X33Ek

0

@superdurszlak: odległości będą właściwie, możliwe na całą Polskę więc nawet i 500km będzie dostępne dla użytkownika jako warunek

0

IMO najbezpieczniej będzie zrzucić odpowiedzialność za wyznaczanie odległości we właściwych jednostkach na DBMS, która wspiera operacje i dane GIS (np. PostGIS dla PostgreSQL, czy to wsparcie w MySQL które podlinkowałem). Możesz zawsze sięgnąć sobie po projekcję, która zwróci z grubsza poprawny wynik dla odległości liczonej tym pitagorasem na jakimś ograniczonym obszarze, ale po co? I tak będziesz musiał przekształcić współrzędne z Lat/Long do tej właściwej projekcji żeby móc to zrobić.

0

Zgrubnie
Dla danej szerokości geograficznej możesz sobie zrobić mapowanie zmiany długości i szerokości geograficznej równe np. 100 metrów i tak upraszczając dane szacować, że np promień 2 km to taka delta szerokości geograficznej a taka długości

Centralny
52.228609946852586, 21.00304191635952
"Patelnia" metro Centrum
52.23031850128755, 21.010470725164534
odległość ok. 550 m

W Excelu ludzie liczą
https://excel.tips.net/T003275_Calculating_the_Distance_between_Points.html
https://bluemm.blogspot.com/2007/01/excel-formula-to-calculate-distance.html

Na przykładzie Polski

1 użytkowników online, w tym zalogowanych: 0, gości: 1