@adelina_turcan
Люблю программировать

Тип данных polygon в mysql, как искать среди них?

Имееться таблица mysql: objects_on_map(скачать). В ней 3 колонки:

  • id - smallint primary key
  • name - varchar
  • zone - polygon

Добавил 5 рядов для примера:
5c755c40f2bb3243849881.png5c755c497e3b8421341298.png5c755c5007d95338945982.png5c755c5a0eb01694094236.png5c755c600a9ed824374434.png
Теперь мне нужно искать среди объектов в бд, например вот такую зону
Первый полигон для примера
{
  "type": "Polygon",
  "coordinates": [
    [
      [
        26.680096221945632,
        48.321938323603554
      ],
      [
        28.164459014914428,
        46.83322861900734
      ],
      [
        28.255058456442725,
        46.48886163202014
      ],
      [
        28.125931335471023,
        46.1575226177054
      ],
      [
        28.197266937277732,
        45.488822095796266
      ],
      [
        28.471774078391036,
        45.48352675782778
      ],
      [
        29.02078836061753,
        46.00964308670618
      ],
      [
        28.998211456320632,
        46.490161685568545
      ],
      [
        30.161553741476837,
        46.41825757113949
      ],
      [
        29.614678360007133,
        46.93363548533478
      ],
      [
        29.52922875978743,
        47.38462608018191
      ],
      [
        29.160575653097908,
        47.55353053897963
      ],
      [
        29.14836709596898,
        47.97804022625874
      ],
      [
        27.717699981711235,
        48.45366512797827
      ],
      [
        26.680096221945632,
        48.321938323603554
      ]
    ]
  ]
}

Как формировать запрос чтобы искать среди значений колонки polygon? В ответ должны приходить все записи.

А если искать наприм вот такой объект:
Второй полигон для примера
{
  "type": "Polygon",
  "coordinates": [
    [
      [
        28.84997134215496,
        47.0428453687384
      ],
      [
        28.73491702086585,
        46.982931417099465
      ],
      [
        28.923826932975317,
        46.99791941766723
      ],
      [
        28.84997134215496,
        47.0428453687384
      ]
    ]
  ]
}

то в ответ должны приходить только id: 1, 3 и 4. Записей в таблице будет примерно 100 миллионов, поэтому если можете подскажите какие индексы использовать.

Для формирования объектов на карте использовал это.
  • Вопрос задан
  • 855 просмотров
Решения вопроса 3
@BorisKorobkov Куратор тега MySQL
Web developer
Для "сферического коня в вакууме" используйте основы геометрии (косинус и синус).
Для полигонов лучше перейти на PostreSQL и использовать postgis.net
Ответ написан
@Fixid
Для 100 миллионов записей уже придется использовать PostgreSQL + PostGIS. Личный опыт.
Сейчас есть база в 500гб с полигонами, выборка занимает 5-15мс
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы