Могу ли я запросить документ DocumentDB с ограничивающим многоугольником рядом с многоугольником?

Как и многие люди, я был взволнован, когда команда Microsoft Azure объявила о поддержке пространственных запросов в DocumentDB два месяца назад. В частности, DocumentDB поддерживает ST_DISTANCE запрос, который позволяет запрашивать документы по их расстоянию от другой геометрии. Пример этого с использованием LINQ можно найти в документации по Azure:

foreach (UserProfile user in client.CreateDocumentQuery<UserProfile>(collection.SelfLink)
    .Where(u => u.ProfileType == "Public" && a.Location.Distance(new Point(32.33, -4.66)) < 30000))
{
    Console.WriteLine("\t" + user);
}

В этом примере запрос находится между двумя точками. Однако тот факт, что в документации говорится о расстоянии между "геометриями" и "точечными выражениями", заставляет меня думать, что возможно выполнить запрос по геометриям, отличным от точек.

У меня есть документы с ограничивающим полигоном в качестве атрибута. Я хочу запросить эти документы по их близости друг к другу. Я пробовал следующее:

DocumentClient Client = Connection.Client;

var nearbyItems = Client
    .CreateDocumentQuery<T>(Collection.DocumentsLink)
    .Where(x.BoundingPolygon.Distance(adjacentPolygon) < 1000)
    .ToList();

Я пробовал это со следующими смежными и очень простыми ограничивающими полигонами:

Полигон документа:

"geometry": {
  "type": "Polygon",
  "coordinates": [[
    [-33,18],[-34,18],[-34,19],[-33,19],[-33,18]
    ]]
  }

AdjacentPolygon:

"geometry": {
  "type": "Polygon",
  "coordinates": [[
    [-33,19],[-34,19],[-34,20],[-33,20],[-33,19]
    ]]
  }

Но документ не возвращается из моего запроса, даже при увеличении расстояния до тысяч километров.

Можно ли запросить документ DocumentDB с ограничивающим полигоном по близости к другому ограничивающему полигону?

1 ответ

Решение

Нет. ST_DISTANCE предназначен для работы только с двумя точечными выражениями. ST_WITHIN будет работать с точечным выражением и многоугольником.

Чтобы найти минимальное расстояние между двумя полигонами, вам нужно сравнить расстояние между каждой точкой на одном полигоне с каждой точкой на другой, но я обнаружил, что вам часто не нужна такая точность, и даже когда вы это делаете, имеет смысл сначала получить приблизительный ответ, прежде чем делать детальный расчет.

В качестве примера приблизительного ответа вы можете сравнить центр одного многоугольника с центром других. GeoLib - это библиотека JavaScript с getCenter() функция. Извлеките код оттуда и поместите его в хранимую процедуру, которую вы вызываете всякий раз, когда пишете свои полигоны (вам придется написать миграцию для существующих полигонов). В этой хранимой процедуре вызовите getCenter() Функция и сохранить результат в другом поле в том же документе, что и полигон. Затем используйте ST_DISTANCE Функция против этих центральных точек в запросе, чтобы найти все другие многоугольники, которые находятся рядом.

Другие вопросы по тегам