Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wybierz wszystkie punkty geoprzestrzenne wewnątrz ramki ograniczającej

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/



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Usuwanie duplikatów z dużej tabeli

  2. DOS i DONT dla indeksów

  3. Jak wyeksportować i zaimportować istniejącego użytkownika (z jego uprawnieniami!)

  4. Rozbieżność strefy czasowej w mysql i java

  5. Błędy MySQL MAX_JOIN_SIZE