Mysql
 sql >> база данни >  >> RDS >> Mysql

Изберете всички геопространствени точки вътре в ограничителна кутия

Вероятно елементите x и y във вашите POINT данни във вашата geometry колоната е в градуси на географска ширина и дължина.

За да направите това търсене ефективно в MySQL, ще ви трябват няколко неща.

  • Таблица MyISAM (или MySQL версия 5.7 и по-нова и InnoDB или MyISAM)
  • Квалификация, която НЕ НУЛЕВА за вашата геометрична колона
  • Пространствен индекс ALTER TABLE flags ADD SPATIAL INDEX (coordinates)
  • Код за създаване на текстово представяне на правоъгълника, който искате да търсите
  • Използване на функциите GeomFromText и MBRContains / MBRWithin във вашия оператор SELECT.

Да предположим, че вашата широчина/дълга кутия е правоъгълник един градус в степен, центриран около Катедралата Уинчестър (51.0606, -1.3131) . Имате нужда от ограничаваща кутия около тази точка. Тази MySQL заявка ще генерира LINESTRING (текст) за линия, минаваща диагонално през това ограничаващо поле.

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

Заявката ви дава това:

LINESTRING(50.5606 -1.8131,51.5606 -0.8131)

Можете също да използвате обработка на низове на хост език, за да излезете с подобен вид текстов низ. Форматът, от който се нуждаете, е този.

 LINESTRING(lat1 long1, lat2 long2) 

След това можете да го използвате, за да търсите във вашата пространствена таблица, както следва:

SELECT whatever, whatever 
  FROM flags
 WHERE MBRContains(
        GeomFromText( 'LINESTRING(50.5606 -1.8131,51.5606 -0.8131)' ),
        flags.coordinates)     

Това ще използва пространствения индекс и ще намери всеки ред flags чиито координати се намират в рамките на ограничителната кутия на тази диагонална линия.

Ето малко документация .

Ако вашите flags таблицата съдържа по-малко от няколкостотин хиляди реда, може да откриете, че обикновена таблица (не пространствена таблица) с колони за географска ширина и дължина (типове данни FLOAT, индексирани) също работи и е по-лесна за разработване и отстраняване на грешки.

Написах урок за тази техника. http://www.plumislandmedia.net/mysql/haversine-mysql- най-близкото местоположение/



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Получавайте резултати, които попадат в радиусите на маркера от базата данни

  2. Вземете следващото автоматично увеличение

  3. STR_TO_DATE() Примери – MySQL

  4. Грешка:Неизвестна колона '' в 'списък с полета' Грешка в MySQL

  5. Как да изброите редове за заявка или да покажете „няма записи“ с помощта на една заявка