【问题标题】:using mongodb 2.6 multipolygon support with mongoid使用 mongodb 2.6 多多边形支持和 mongoid
【发布时间】:2014-04-10 11:49:18
【问题描述】:

我有以下型号:

class
  include Mongoid::Document

  field :polygons, type: Hash
  index({"polygon" => "2dsphere"})
end

当我尝试插入以下文档时出现错误:

{ 
  _id: ObjectId('53467c7f476f6c551c020000'), 
  polygons: { 
    type: "MultiPolygon", 
    coordinates: [ [ [ [ 13.00695419311523, 47.81822655820738 ], [ 13.03579330444336, 47.75825258545904 ], [ 13.09175491333008, 47.7658685011539 ], [ 13.07767868041992, 47.81707386519431 ] ], [ [ 13.00695419311523, 47.81822655820738 ], [ 13.03579330444336, 47.75825258545904 ], [ 13.09175491333008, 47.7658685011539 ], [ 13.07767868041992, 47.81707386519431 ] ] ], [ [ [ 13.07355880737305, 47.8260641920274 ], [ 13.05810928344727, 47.80323955290061 ], [ 13.10857772827148, 47.80116408820393 ], [ 13.1041145324707, 47.82514217887775 ], [ 13.08626174926758, 47.8290606216547 ] ], [ [ 13.07355880737305, 47.8260641920274 ], [ 13.05810928344727, 47.80323955290061 ], [ 13.10857772827148, 47.80116408820393 ], [ 13.1041145324707, 47.82514217887775 ], [ 13.08626174926758, 47.8290606216547 ] ] ] ] 
  }
}

错误信息只说:

The operation: #<Moped::Protocol::Command ...> failed with error 16755: "Can't extract geo keys from object, malformed geometry?

根据http://geojsonlint.com/,上述geojson是有效的。我做错了什么?

【问题讨论】:

    标签: mongodb geospatial mongoid4


    【解决方案1】:

    据我所知,您的多面环没有闭合。您需要以与开始时相同的坐标主动结束每个环。在您的情况下,这将是有效的 geoJson Multipolygon。

    { 
        type: "MultiPolygon", 
        coordinates: [ 
                        [
                            [ 
                                [ 13.00695419311523, 47.81822655820738 ], 
                                [ 13.03579330444336, 47.75825258545904 ], 
                                [ 13.09175491333008, 47.7658685011539 ], 
                                [ 13.07767868041992, 47.81707386519431 ],
                                [ 13.00695419311523, 47.81822655820738 ]
                            ], 
                            [ 
                                [ 13.00695419311523, 47.81822655820738 ], 
                                [ 13.03579330444336, 47.75825258545904 ], 
                                [ 13.09175491333008, 47.7658685011539 ], 
                                [ 13.07767868041992, 47.81707386519431 ] ,
                                [ 13.00695419311523, 47.81822655820738 ]
                            ] 
                        ], 
                        [ 
                            [ 
                                [ 13.07355880737305, 47.8260641920274 ], 
                                [ 13.05810928344727, 47.80323955290061 ], 
                                [ 13.10857772827148, 47.80116408820393 ], 
                                [ 13.1041145324707, 47.82514217887775 ], 
                                [ 13.08626174926758, 47.8290606216547 ],
                                [ 13.07355880737305, 47.8260641920274 ]
                            ], 
                            [ 
                                [ 13.07355880737305, 47.8260641920274 ], 
                                [ 13.05810928344727, 47.80323955290061 ], 
                                [ 13.10857772827148, 47.80116408820393 ], 
                                [ 13.1041145324707, 47.82514217887775 ], 
                                [ 13.08626174926758, 47.8290606216547 ],
                                [ 13.07355880737305, 47.8260641920274 ]
                            ] 
                        ] 
                    ] 
      }
    

    根据 geojsonlint,我相信语法是有效的,例如对于多线字符串,但 linter 不会强制执行特定的几何类型规则。

    请注意,但是,您的 MultiPolygon 由两个多边形组成,每个多边形都有两个环,但内环的坐标与外环的坐标相同。虽然这可能会在大多数 geojson 解析器中呈现,但它在拓扑上并不正确。内环与外环相交的点数是有限的。一条或多条边相等意味着它们相交于无限点。

    这是没有内环的几何形状

    type: "MultiPolygon", 
        coordinates: [ 
                        [
                            [ 
                                [ 13.00695419311523, 47.81822655820738 ], 
                                [ 13.03579330444336, 47.75825258545904 ], 
                                [ 13.09175491333008, 47.7658685011539 ], 
                                [ 13.07767868041992, 47.81707386519431 ],
                                [ 13.00695419311523, 47.81822655820738 ]
                            ]
                        ], 
                        [ 
                            [ 
                                [ 13.07355880737305, 47.8260641920274 ], 
                                [ 13.05810928344727, 47.80323955290061 ], 
                                [ 13.10857772827148, 47.80116408820393 ], 
                                [ 13.1041145324707, 47.82514217887775 ], 
                                [ 13.08626174926758, 47.8290606216547 ],
                                [ 13.07355880737305, 47.8260641920274 ]
                            ]
                        ] 
                    ] 
      }
    

    其次,即使您移除内环,您仍然会有两个重叠的多边形,它们不是有效的多多边形。您可能可以绘制它,但在某个地方您可能无法用它解析几何查询。

    【讨论】:

    • 不幸的是,尝试插入它会产生相同的错误。索引是否正确放置?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    相关资源
    最近更新 更多