Странная проблема при хранении и запросе GeoJson в MongoDB - PullRequest
0 голосов
/ 27 сентября 2019

Я хочу сохранить данные GeoJson для области, используя MongoDB.Данные поступают с официального сайта.Каждая область представлена ​​как MultiPolygon.В конце я хочу найти все области, которые содержат пары lng / lat, используя $intersect, например:

db.areas.find({
  "location.geometry": {
    "$geoIntersects": {
         "$geometry": {
            "type": "Point",
            "coordinates": [ 
                <lng>, 
                <lat>
            ]
         }
     }
  }
}

В принципе, это, кажется, работает нормально.Тем не менее, я столкнулся с проблемами в некоторых областях, по-видимому, в отношении набора полигонов MultiPolygon.Я мог бы свести мою проблему к индивидуальному случаю:

Область (будучи GeoJson MultiPolygon) имеет шесть полигонов, скажем [A, B, C, D, E, F].Также точка <lng>,<lat>, которую я запрашиваю, лежит в пределах многоугольника A.Теперь приведенный выше запрос работает только в том случае, если область не содержит многоугольников D и F (конечно, всегда нужно включать A), то есть я получаю ожидаемый результат поиска.В противном случае запрос будет пустым (но без ошибки).Короче говоря

  • Что работает: [A], [A,B], [A,B,C], [A,B,C,E], [A,C], ... (любая комбинация с A и без D &F)
  • Что не работает: [A,D], [A,B,F], ... (любая комбинация, которая содержит D или F)

Чтопроблема с полигонами D и F?Разве им не разрешено перекрываться с другими полигонами в MultiPolygon?Возможно, они слишком маленькие?Я попробовал определение GeoJson, но не увидел никаких проблем.Может быть потому, что GeoJson поддерживает MongoDB.

1 Ответ

0 голосов
/ 30 сентября 2019

После еще нескольких копаний я выяснил, что полигоны, вызывающие проблемы, содержат дублирующиеся координаты (кроме первой и последней координаты).Онлайновый валидатор GeoJson не вызвал ошибку, но кажется, что MongoDB не справляется с этим.

После удаления всех дубликатов все работает нормально - по крайней мере, я надеюсь, что удаление дубликатов изменит форму многоугольниковслишком много (но это не слишком важно для моего случая).Немного прискорбно, что MongoDB не вызывает ошибку, а просто возвращает пустой результат.

...