Przypuszczalnie elementy x i y w danych POINT w Twojej geometry
kolumna jest w stopniach szerokości i długości geograficznej.
Aby przeprowadzić to wyszukiwanie efektywnie w MySQL, będziesz potrzebować kilku rzeczy.
- Tabela MyISAM (lub MySQL w wersji 5.7 i nowszej oraz InnoDB lub MyISAM)
- Kwalifikacja NOT NULL w kolumnie geometrii
- Indeks przestrzenny
ALTER TABLE flags ADD SPATIAL INDEX (coordinates)
- Kod do tworzenia tekstowej reprezentacji prostokąta, który chcesz przeszukać
- Użyj funkcji GeomFromText i MBRContains / MBRWithin w instrukcji SELECT.
Załóżmy, że Twoje pole szerokości/długości jest prostokątem o stopniu równym jeden stopień wyśrodkowany wokół Katedra Winchester (51.0606, -1.3131) . Potrzebujesz ramki ograniczającej wokół tego punktu. To zapytanie MySQL wygeneruje LINESTRING (tekst) dla linii przechodzącej po przekątnej przez obwiednię.
SELECT
CONCAT('LINESTRING(',
latitude-0.5,' ',longitude-0.5,
',',
latitude+0.5 ,' ',longitude +0.5,
')') AS box
FROM (
SELECT 51.0606 AS latitude, -1.3131 AS longitude
) AS coord
Zapytanie daje ci to:
LINESTRING(50.5606 -1.8131,51.5606 -0.8131)
Możesz również użyć przetwarzania ciągów w języku hosta, aby uzyskać podobny rodzaj ciągu tekstowego. Format, którego potrzebujesz, jest taki.
LINESTRING(lat1 long1, lat2 long2)
Następnie możesz go użyć do przeszukania tabeli przestrzennej w następujący sposób:
SELECT whatever, whatever
FROM flags
WHERE MBRContains(
GeomFromText( 'LINESTRING(50.5606 -1.8131,51.5606 -0.8131)' ),
flags.coordinates)
To wykorzysta indeks przestrzenny i znajdzie każdy wiersz flags
którego współrzędne leżą w obramowaniu tej ukośnej linii.
Oto kilka dokumentacji .
Jeśli twoje flags
tabela zawiera mniej niż kilkaset tysięcy wierszy, może się okazać, że zwykła tabela (nie tabela przestrzenna) z kolumnami o szerokości i długości geograficznej (typy danych FLOAT, indeksowane) działa równie dobrze i jest łatwiejsza do opracowania i debugowania.
Napisałem samouczek dotyczący tej techniki. http://www.plumislandmedia.net/mysql/haversine-mysql- najbliższy-loc/