Могу ли я запросить документ 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]
    ]]
  }

Смежный полигон:

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

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

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


person 08Dc91wk    schedule 07.10.2015    source источник


Ответы (1)


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

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

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

person Larry Maccherone    schedule 07.10.2015
comment
Привет Ларри. Спасибо за Ваш ответ. Я понимаю, что существуют алгоритмы для определения минимального расстояния, но я хочу сделать это с помощью пространственного запроса DocumentDB, чтобы не загружать мою базу данных в память. Обратите внимание, что сравнение всех расстояний между вершинами, как вы предлагаете, не дает вам минимального расстояния в том случае, если минимальное расстояние составляет от вершины до края. Возможно, мне придется аппроксимировать многоугольники кругами, а затем загрузить их в память для дальнейшей обработки с помощью алгоритма минимального расстояния. - person 08Dc91wk; 09.10.2015
comment
Алгоритмы — это весело, да? :-) Если вы нашли две ближайшие вершины на одной стороне, то вы можете провести линию, перпендикулярную линии между этими двумя точками, через ближайшую точку на другой стороне. Затем вы можете сравнить это с тем же расчетом на другой стороне, а также с минимумом от вершины к вершине. Я могу представить себе геометрию, которая победила бы даже этот алгоритм, но представьте, что она редко встречается в настоящей ГИС. - person Larry Maccherone; 09.10.2015
comment
Обратите внимание: то, что я предлагаю относительно сравнения центров в качестве приблизительного ответа, эквивалентно вашему предложению аппроксимировать многоугольники кругами. Когда вы говорите загрузить их в память, я предлагаю вам загрузить приблизительный ответ (используя предложение ST_DISTANCE с поддержкой индекса) в память хранимой процедуры, где вы выполняете свои подробные вычисления. - person Larry Maccherone; 09.10.2015
comment
Чтобы было ясно, ответ на ваш явный вопрос: можно ли запросить документ DocumentDB с ограничивающим многоугольником по близости к другому ограничивающему многоугольнику? нет. - person Larry Maccherone; 09.10.2015