2012-06-21 4 views
9

У меня есть следующая проблема с MongoDB. Я получил некоторые геоданные из своей родной страны, и я должен хранить их в mongodb, чтобы создать простую службу веб-функций. Эта услуга будет в основном выполнять запросы с ограничивающей коробкой, используя оператор $within. Данные находятся в формате GeoJSON. Поэтому я импортировал сначала Деревни и Города, которые представлены в виде точек ([1,2]) в этом формате. Нет проблем. Следующий шаг рек и улиц, которые являются LineStrings, и в соответствии с GeoJSON представлены таким образом [[1,2],[3,4]]. Но при импорте районов (которые на самом деле являются многоугольниками и в соответствии с спецификацией GeoJSON 3 тусклых искажения), я получил ошибку geo values have to be numbers при создании индекса.Сохранение полигонов GeoJSON в MongoDB

db.collection.ensureIndex({"geometry.coordinates" : "2d"}); 

Все данные действительны GeoJSON и находятся в равных координатах 2d в EPSG: 4326 проекции.

Есть ли у кого-нибудь идеи?

ответ

1

Геопространственные функции MongoDB в настоящее время поддерживают только точки хранения, а не фигуры или линии. Однако вы можете запрашивать точки с помощью кругов, прямоугольников или полигонов.

2

Я должен был сделать то же самое сам, чтобы настроить функцию GeoFence. То, что я сделал, это хранить данные «полигона» как серию координат и центра. Например:

{ 
    "_id" : ObjectId("4f189d132ae5e92272000000"), 
    "name" : "Alaska", 
    "points" : [ 
     { "coords" : [ 
      -141.0205, 
      70.0187 ] 
     }, 

     ... 

     { "coords" : [ 
      -141.0205, 
      70.0187 ] 
     } 
    ], 
    "center" : { 
     "coords" : [ 
      -153.6370465116279, 
      61.42329302325581 ] 
    } 
} 

В моем приложении (в Python) Я использую shapely library. Сначала я нахожу список объектов, у которых есть центр, самый близкий к моей точке. Затем на стороне клиента (python) я использую shapely, чтобы преобразовать каждый большой массив координат в многоугольник, а затем проверить области, чтобы найти, какие из них содержат мою точку.

Значит, вы можете хранить данные о полигонах в MongoDB как только данные и использовать какой-либо другой предварительно вычисленный индекс 2d, как центр.

13

С MongoDB 2.4 использовать "2dsphere" индекс для GeoJSON точек, объект LineString и многоугольников.

Например, вы можете создать этот индекс:

db.mycoll.ensureIndex({ loc : "2dsphere" }) 

И хранить этот LineString:

{ loc : { type : "LineString" , coordinates : [ [ 1 , 2 ] , [ 3 , 4 ] ] } } 

См http://docs.mongodb.org/manual/applications/2dsphere/.

+0

2,6 будет поддерживать MultiPoint, MultiLineString, MultiPolygon и GEOMETRYCOLLECTION http://docs.mongodb.org/manual/release-notes/2.6/ –

+0

Этот совет работал для меня и экономит дополнительную логику приложения! –

2

Дайте этому попытку из Монго оболочки:

// Polygon in GeoJson format 
var poly = {}; 
poly.name = 'GeoJson polygon'; 
poly.geo = {}; 
poly.geo.type = 'Polygon'; 
poly.geo.coordinates = [ 
    [ [ -80.0, 30.0 ], [ -40.0, 30.0 ], [ -40.0, 60.0 ], [-80.0, 60.0 ], [ -80.0, 30.0 ] ] 
]; 
db.foo.insert(poly); 
db.foo.ensureIndex({geo: "2dsphere" }); 
+0

Я только начал работать с Polygons в MongoDB, но я обнаружил, что форма многоугольной структуры странная ... Если фигура представляет собой набор точек, почему массив этих точек находится внутри другого массива? Должно ли 'poly.geo.coordinates = [[-80.0, 30.0], [-40.0, 30.0], ...]' быть достаточно? – Loupax

+1

@ Loupax Координаты многоугольника - это массив массивов координат LinearRing. Первый элемент в массиве представляет внешнее кольцо. Любые последующие элементы представляют собой внутренние кольца (или отверстия). (Http://geojson.org/geojson-spec.html#id4) – Farhadi