【发布时间】:2016-07-22 01:18:23
【问题描述】:
我将最新的 OpenStreetMap 数据导入本地 SQLServer 数据库并为某些管理区域生成“外部”形状。原始区域形状可在此处获得: http://www.openstreetmap.org/relation/2658573
我收到的内容如下:
我所做的是我按照 db 中定义的顺序为这个形状(上面提到的)定义了“外部”方式,并按照 OpenStreetMap db 中定义的顺序从属于所有方式的点构造了 POLYGON 定义。
为了将数据导入 SQLServer db,我使用了 OsmSharp.core nuget 包。 根据此页面上的信息,形状数据的方向是顺时针方向(请参阅命名和方向部分)): http://wiki.openstreetmap.org/wiki/Talk:Relation:multipolygon
我的问题是:
有人知道为什么对描述某些区域形状的“方式”/线条进行直接定义不能正常工作吗? 我应该拒绝线路/方式定义中的一些点吗? 也许我只是错过了其他东西......
编辑 1:
我进行了快速查询以验证来自 scai 的信息,看起来很有希望:
NodeNr 列显示了我应该将路径/线定义上的哪个点作为多边形定义的起点/终点。 WayNr 显示哪条连续的方式与哪条路径共享点。
编辑 2:
我已经测试了与方式定义相关的数据,看起来主要问题仅在于方式定义中的节点顺序。所有经过测试的方式都使用了属于它们的所有节点(没有任何冗余点,以防万一该方式可能在该方式的中间穿过其他方式)。
一些示例数据:
nr 42(WayNr = 42)的路定义表明这条线的起点(路nr 41的延续)在位置44上。这意味着42路定义中的点/节点44有与第 41 路定义中位置 30 上的点相同的 gps/坐标。
在以正确的顺序采用这些“还原”行后,我收到了如下所示的形状:
添加内部区域(排除)后,它最终看起来就像原来的一个形状:
OpenStreetMap 数据的另一个问题是它使用右手规则来定义形状的外环(顺时针而不是逆时针),因此对于 SQLServer,我们必须在 Geography 实例上使用 ReorientObject() 方法。例如,要检测形状的方向,您可以在 Geography 对象上使用 EnvelopeAngle() 方法。
编辑 3:
我在 OSM forum 上收到了一个答案,关系成员的方式顺序无关紧要(我们不能依赖它)所以在进一步处理之前必须重新排序方式......
【问题讨论】:
-
基于 OpenStreetMap 中形状的链接以及您发布的来自 SQL 数据库的内容,我认为它是正确的。你有什么问题?
-
区域的形状在一些地方不同(例如西南部分)。看起来 mu 多边形有很多点,我还不知道为什么...
标签: sql-server maps geospatial openstreetmap