Могу ли я запросить документ 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
Функция против этих центральных точек в запросе, чтобы найти все другие многоугольники, которые находятся рядом.