OpenStreetMap 管理区域呈现问题
Issue with OpenStreetMap administration area rendering
我将最新的 OpenStreetMap 数据导入本地 SQLServer 数据库并为某些行政区域生成 "outer" 形状。原始区域形状可在此处获得:
http://www.openstreetmap.org/relation/2658573
我收到的如下:
我所做的是按照 db 中定义的顺序为这个形状(上面提到的)采用 "outer" 方式定义,并按照 OpenStreetMap db 中定义的顺序从属于所有方式的点构造 POLYGON 定义.
为了将数据导入 SQLServer 数据库,我使用了 OsmSharp.core nuget 包。
根据此页面上的信息,形状数据的方向是顺时针方向(请参阅命名和方向部分):
http://wiki.openstreetmap.org/wiki/Talk:Relation:multipolygon
我的问题是:
有人知道为什么直接定义 "ways"/描述某些区域形状的线不能正常工作吗?
我应该拒绝 line/way 定义中的某些点吗?
也许我只是错过了其他东西...
编辑 1:
我快速查询以验证来自 scai 的信息,它看起来很有希望:
NodeNr 列显示 way/line 定义中的哪个点我应该作为多边形定义的 start/endpoint。 WayNr 显示哪条连续的路与哪条路共享点。
编辑 2:
我已经测试了与方式定义相关的数据,看起来主要问题仅在于方式定义中的节点顺序。所有经过测试的方式都使用了属于它们的所有节点(没有任何冗余点,以防该方式可以在该方式的中间穿过其他方式)。
一些示例数据:
with nr 42 (WayNr = 42)的定义表明这条线的起点(nr 41的延续)在位置44。在定义中表示point/node 44方式 42 与方式 nr 41 定义中位置 30 上的点具有相同的 gps/coordinates。
按照正确的顺序使用 "reverted" 行后,我收到了如下所示的形状:
添加内部区域(排除)后,它最终看起来像原来的形状:
OpenStreetMap 数据的另一个问题是它使用右手法则来定义形状的外环(顺时针而不是逆时针),因此对于 SQLServer,我们必须在 Geography 实例上使用 ReorientObject() 方法.例如,要检测形状的方向,您可以在 Geography 对象上使用 EnvelopeAngle() 方法。
编辑 3:
我在 OSM 上收到了一个答案 forum 关系成员的方式顺序并不重要(我们不能依赖它)所以在任何进一步处理之前必须重新排序方式......
在 Whosebug 和 gis.stackexchange.com 上已经有各种类似的问题。
关系不一定包含正确顺序的方式。因此,有必要自己订购方式。查看一条路的最后一个节点的 ID,并搜索与其起始节点具有相同 ID 的路。如果您对所有方式都这样做,那么生成的几何图形应该没问题。
我将最新的 OpenStreetMap 数据导入本地 SQLServer 数据库并为某些行政区域生成 "outer" 形状。原始区域形状可在此处获得: http://www.openstreetmap.org/relation/2658573
我收到的如下:
我所做的是按照 db 中定义的顺序为这个形状(上面提到的)采用 "outer" 方式定义,并按照 OpenStreetMap db 中定义的顺序从属于所有方式的点构造 POLYGON 定义.
为了将数据导入 SQLServer 数据库,我使用了 OsmSharp.core nuget 包。 根据此页面上的信息,形状数据的方向是顺时针方向(请参阅命名和方向部分): http://wiki.openstreetmap.org/wiki/Talk:Relation:multipolygon
我的问题是:
有人知道为什么直接定义 "ways"/描述某些区域形状的线不能正常工作吗? 我应该拒绝 line/way 定义中的某些点吗? 也许我只是错过了其他东西...
编辑 1:
我快速查询以验证来自 scai 的信息,它看起来很有希望:
NodeNr 列显示 way/line 定义中的哪个点我应该作为多边形定义的 start/endpoint。 WayNr 显示哪条连续的路与哪条路共享点。
编辑 2:
我已经测试了与方式定义相关的数据,看起来主要问题仅在于方式定义中的节点顺序。所有经过测试的方式都使用了属于它们的所有节点(没有任何冗余点,以防该方式可以在该方式的中间穿过其他方式)。
一些示例数据:
with nr 42 (WayNr = 42)的定义表明这条线的起点(nr 41的延续)在位置44。在定义中表示point/node 44方式 42 与方式 nr 41 定义中位置 30 上的点具有相同的 gps/coordinates。
按照正确的顺序使用 "reverted" 行后,我收到了如下所示的形状:
添加内部区域(排除)后,它最终看起来像原来的形状:
OpenStreetMap 数据的另一个问题是它使用右手法则来定义形状的外环(顺时针而不是逆时针),因此对于 SQLServer,我们必须在 Geography 实例上使用 ReorientObject() 方法.例如,要检测形状的方向,您可以在 Geography 对象上使用 EnvelopeAngle() 方法。
编辑 3:
我在 OSM 上收到了一个答案 forum 关系成员的方式顺序并不重要(我们不能依赖它)所以在任何进一步处理之前必须重新排序方式......
在 Whosebug 和 gis.stackexchange.com 上已经有各种类似的问题。
关系不一定包含正确顺序的方式。因此,有必要自己订购方式。查看一条路的最后一个节点的 ID,并搜索与其起始节点具有相同 ID 的路。如果您对所有方式都这样做,那么生成的几何图形应该没问题。