Mam szerokość i długość geograficzną i chcę wyciągnąć rekord z bazy danych, która ma najbliższą szerokość i długość geograficzną według odległości, jeśli ta odległość jest większa niż określona, nie pobieraj jej.
Struktura stołu:
id
latitude
longitude
place name
city
country
state
zip
sealevel
mysql
sql
coordinates
geospatial
Basit
źródło
źródło
Odpowiedzi:
gdzie [starlat] i [startlng] to pozycja, od której należy rozpocząć pomiar odległości.
źródło
Rozwiązanie Google:
Tworzenie tabeli
Tworząc tabelę MySQL, chcesz zwrócić szczególną uwagę na atrybuty lat i lng. Przy obecnych możliwościach powiększania w Mapach Google powinieneś potrzebować tylko 6 cyfr dokładności po przecinku. Aby zachować minimalną ilość miejsca wymaganego dla tabeli, możesz określić, że atrybuty lat i lng są zmiennoprzecinkowymi o rozmiarze (10,6). Pozwoli to na przechowywanie w polach 6 cyfr po przecinku plus maksymalnie 4 cyfry przed przecinkiem, np. -123,456789 stopni. Twoja tabela powinna mieć również atrybut id, który będzie służył jako klucz podstawowy.
Wypełnianie tabeli
Po utworzeniu tabeli czas wypełnić ją danymi. Przykładowe dane podane poniżej dotyczą około 180 pizzerii rozsianych po całych Stanach Zjednoczonych. W phpMyAdmin możesz użyć zakładki IMPORT, aby importować różne formaty plików, w tym CSV (wartości rozdzielane przecinkami). Microsoft Excel i Google Spreadsheets eksportują do formatu CSV, dzięki czemu można łatwo przenosić dane z arkuszy kalkulacyjnych do tabel MySQL poprzez eksportowanie / importowanie plików CSV.
Znajdowanie lokalizacji za pomocą MySQL
Aby znaleźć lokalizacje w tabeli znaczników, które znajdują się w określonym promieniu w określonej szerokości / długości geograficznej, możesz użyć instrukcji SELECT opartej na formule Haversine. Wzór Haversine'a jest używany ogólnie do obliczania odległości po ortodromie między dwiema parami współrzędnych na kuli. Szczegółowe wyjaśnienie matematyczne jest podane w Wikipedii, a dobre omówienie wzoru w odniesieniu do programowania znajduje się na stronie Movable Type.
Oto instrukcja SQL, która znajdzie najbliższe 20 lokalizacji w promieniu 25 mil od współrzędnej 37, -122. Oblicza odległość na podstawie szerokości / długości geograficznej tego wiersza i docelowej szerokości / długości geograficznej, a następnie pyta tylko o wiersze, w których wartość odległości jest mniejsza niż 25, porządkuje całe zapytanie według odległości i ogranicza je do 20 wyników. Aby wyszukiwać według kilometrów zamiast mil, zamień 3959 na 6371.
Ten ma znaleźć szerokości i długości geograficzne w odległości mniejszej niż 28 mil.
Innym jest znalezienie ich w odległości od 28 do 29 mil:
https://developers.google.com/maps/articles/phpsqlsearch_v3#creating-the-map
źródło
HAVING distance < 25
gdy sprawdzamy lokalizacje w promieniu 25 mil?Oto moje pełne rozwiązanie zaimplementowane w PHP.
To rozwiązanie wykorzystuje formułę Haversine przedstawioną w http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL .
Należy zauważyć, że formuła Haversine ma słabości wokół biegunów. Ta odpowiedź pokazuje, jak zaimplementować wzór Vincenty Great Circle Distance, aby to obejść, jednak zdecydowałem się po prostu użyć Haversine, ponieważ jest wystarczająco dobry do moich celów.
Zapisuję szerokość geograficzną jako DECIMAL (10,8), a długość geograficzną jako DECIMAL (11,8). Mam nadzieję, że to pomoże!
showClosest.php
./assets/db/db.php
./assets/db/dbSettings.php
Może być możliwe zwiększenie wydajności poprzez użycie procedury składowanej MySQL, zgodnie z sugestią zawartą w artykule „Geo-odległość-wyszukiwanie-z-MySQL” zamieszczonym powyżej.
Mam bazę danych ~ 17 000 miejsc, a czas wykonania zapytania to 0,054 sekundy.
źródło
abs
należy usunąć. Podczas konwersji ze stopni na radiany nie trzeba brać wartości abs, a nawet jeśli tak, robisz to tylko dla jednej z szerokości geograficznych. Edytuj go, aby naprawił błąd.69
z111,044736
(zapomniałem, że w wyżej komentarz)Na wypadek, gdybyś był tak leniwy jak ja, oto rozwiązanie połączone z tą i innymi odpowiedziami na SO.
źródło
bounding_distance
oznacza? czy ta wartość ogranicza wyniki do kwoty mil? więc w tym przypadku zwróci wyniki w promieniu 1 mili?Łatwy ;)
Po prostu zastąp współrzędne wymaganymi. Wartości muszą być przechowywane jako podwójne. To jest działający przykład MySQL 5.x.
Twoje zdrowie
źródło
dx+dy
Spróbuj tego, pokaże najbliższe punkty do podanych współrzędnych (w promieniu 50 km). Działa idealnie:
Po prostu zmień
<table_name>
.<userLat>
i<userLon>
Więcej o tym rozwiązaniu możesz przeczytać tutaj: http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/
źródło
Oryginalne odpowiedzi na to pytanie są dobre, ale nowsze wersje mysql (MySQL 5.7.6 on) obsługują zapytania geograficzne, więc możesz teraz korzystać z wbudowanych funkcji zamiast wykonywać złożone zapytania.
Możesz teraz zrobić coś takiego:
Wyniki są zwracane w formacie
meters
. Więc jeśli chcesz,KM
po prostu użyj.001
zamiast.000621371192
(co jest dla mil).Dokumenty MySql są tutaj
źródło
ST_Distance_Sphere
nie istnieje w install (mysql Ver 15.1 Distrib 10.2.23-MariaDB
) mojego hosta . Czytałem gdzieś, żeby zastąpić,ST_Distance
ale odległości są daleko.ST_Distance_Sphere
Szukasz czegoś takiego jak formuła haversine . Zobacz także tutaj .
Są inne, ale jest to najczęściej cytowane.
Jeśli szukasz czegoś jeszcze bardziej niezawodnego, możesz przyjrzeć się możliwościom GIS baz danych. Są w stanie zrobić kilka fajnych rzeczy, na przykład powiedzieć ci, czy punkt (miasto) pojawia się w danym wielokącie (region, kraj, kontynent).
źródło
Sprawdź ten kod na podstawie artykułu Geo-Distance-Search-with-MySQL :
Przykład: znajdź 10 hoteli położonych najbliżej mojej obecnej lokalizacji w promieniu 10 mil:
źródło
źródło
Wygląda na to, że chcesz przeprowadzić wyszukiwanie najbliższego sąsiada z pewnym ograniczeniem odległości. O ile mi wiadomo, SQL nie obsługuje niczego takiego i musiałbyś użyć alternatywnej struktury danych, takiej jak R-drzewo lub kd-drzewo .
źródło
Znajdź najbliższych użytkowników do mojego:
Odległość w metrach
Oparty na formule Vincenty'ego
mam tabelę użytkowników:
sql:
promień ziemi: 6371000 (w metrach)
źródło
Wersja MS SQL tutaj:
źródło
Wygląda na to, że powinieneś po prostu użyć PostGIS, SpatialLite, SQLServer2008 lub Oracle Spatial. Wszyscy mogą odpowiedzieć na to pytanie za pomocą przestrzennego SQL.
źródło
W skrajnych przypadkach to podejście zawodzi, ale dla wydajności pominąłem trygonometrię i po prostu obliczyłem przekątną do kwadratu.
źródło
Ten problem nie jest wcale trudny, ale staje się bardziej skomplikowany, jeśli trzeba go zoptymalizować.
Chodzi mi o to, czy masz 100 lokalizacji w swojej bazie danych, czy 100 milionów? To robi dużą różnicę.
Jeśli liczba lokalizacji jest niewielka, usuń je z SQL i umieść w kodzie, wykonując po prostu ->
Gdy już wprowadzisz je do kodu, oblicz odległość między każdym szerokości / długości a oryginałem za pomocą formuły Haversine i posortuj go.
źródło