Вопрос по mongodb, geojson, indexing, geo – Хранить полигоны GeoJSON в MongoDB

9

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

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

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

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

Ваш Ответ

6   ответов
13

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

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

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

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

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

Увидетьhttp://docs.mongodb.org/manual/applications/2dsphere/.

Этот совет работал для меня и сохраняет дополнительную логику приложения!
2.6 будет поддерживать MultiPoint, MultiLineString, MultiPolygon и GeometryCollectiondocs.mongodb.org/manual/release-notes/2.6
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) я используюстройная библиотека, Сначала я нахожу список объектов, центр которых находится ближе всего к моей точке. Затем на стороне клиента (python) я использую плавное преобразование каждого большого координатного массива в многоугольник, а затем проверяю регионы, чтобы найти, какие из них содержат мою точку.

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

1

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

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

Похоже, что версия для разработки mongo 2.3.2 теперь имеет поддержку GeoJSON: Замечания к выпуску MongoDB 2.4

0

На основании документации MongoDBВотполигон может быть сохранен как полигон GeoJSON, например:

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

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

Похожие вопросы