Сохранение полигонов GeoJSON в MongoDB

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

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

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

У кого-нибудь есть идея?


person Dominik Nöger    schedule 21.06.2012    source источник


Ответы (6)


Похоже, что выпуск разработки mongo 2.3.2 теперь имеет поддержку GeoJSON: улучшенная сферическая геометрия" rel="nofollow">Примечания к выпуску для MongoDB 2.4

person Víctor Penela    schedule 10.02.2013

В MongoDB 2.4 используйте индекс «2dsphere» для точек GeoJSON, строк линий и полигонов.

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

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

И сохраните эту LineString:

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

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

person Bob Grabar    schedule 20.03.2013
comment
2.6 будет поддерживать MultiPoint, MultiLineString, MultiPolygon и GeometryCollection docs.mongodb.org/manual/release -примечания/2.6 - person Gianfranco P.; 18.10.2013

Мне пришлось сделать то же самое, чтобы настроить функцию 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 библиотеку. Сначала я нахожу список объектов, центр которых ближе всего к моей точке. Затем на стороне клиента (python) я использую shapely для преобразования каждого большого массива координат в многоугольник, а затем проверяю области, чтобы найти, какие из них содержат мою точку.

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

person jdi    schedule 28.06.2012

Попробуйте это из оболочки монго:

// 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" });
person qconner    schedule 23.09.2014
comment
Я только начал работать с полигонами в MongoDB, но мне кажется странной форма структуры многоугольника... Если фигура представляет собой набор точек, почему массив этих точек находится внутри другого массива? Разве poly.geo.coordinates = [[-80.0, 30.0], [-40.0, 30.0], ... ] не должно быть достаточно? - person Loupax; 20.06.2015
comment
@Loupax Координаты многоугольника представляют собой массив массивов координат LinearRing. Первый элемент массива представляет внешнее кольцо. Любые последующие элементы представляют собой внутренние кольца (или отверстия).(geojson.org/geojson-spec.html# идентификатор4) - person Farhadi; 16.08.2015

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

person mstearn    schedule 28.06.2012

Согласно документации MongoDB здесь, полигон может храниться как GeoJSON полигон типа:

{
  type: "Polygon",
  coordinates: [ [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0  ] ] ]
}

Это простой полигон с простым кольцом, но также можно хранить многоугольник с несколькими кольцами.

person Aboozar Rajabi    schedule 25.10.2018