1

我有以下模型:

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 是有效的。我究竟做错了什么?

4

1 回答 1

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 ]
                        ]
                    ] 
                ] 
  }

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

于 2014-04-10T12:01:07.173 回答