说到免费开放的数据,自然会想到 Open Street Map,这里分享下在 ArcGIS 产品线中osm数据的使用实践。
环境:ArcGIS Desktop 10.6, Esri CityEngine 2017.1
在ArcMap中使用osm数据
一般情况下,我们可以在
Open Street Map 官网可以通过指定范围直接下载osm格式数据,然后在 ArcMap中直接读取。如下,以Esri中国所在的金泰大厦为中心的数据:
osm数据是基于xml的数据格式,ArcMap不能直接编辑。如果希望导入地理数据库中编辑,可以利用插件,这是Esri额外提供的一个桌面端的免费开源的osm插件,
ArcGIS Editor for OSM 10.6.x Desktop。 通过这个插件可以下载、更新OSM数据有关这个插件的源码、文档,可以在
Github上获得。
OSM is an XML-based format used to describe vector data in a map. It defines three basic data types—nodes, ways, and closed ways—which are used to describe all the other elements:
- Nodes—Points between which segments are drawn.
- Ways—Ordered list of nodes, displayed as connected by line segments in the editor.
- Closed Ways—Ways that go in a complete loop. They are used to describe areas such as parks, lakes, or islands.
以前10.3年代的时候,整理过一次简单的说明,点
这里直达。通过测试,相同的网络环境下,官网下载osm数据,之后再使用 Load OSM File 导入GDB,效率明显优于直接使用 Download OSM Data导入GDB。
在CityEngine中使用osm数据
如果osm数据用于CityEngine,那么无需事先导入GDB,CityEngine可以直接解析osm并可分类导入数据,例如下图中导入highway,Building类:
在CityEngine中导入osm时,可以勾选“Map OSM tags”,从而CityEngine会通过OSM street type来定义道路的宽度,并给与不同道路组成部分不同的起始规则,方便后续利用规则批量建模。如下,以金泰大厦以南的东直门大枢纽为例,复杂的交通仍然保持错落有致:
选中Jintai_Streets这个图层,可以在Inspect窗口中看到图层的属性,其中即为默认情况下osm数据在CityEngine中的映射规则,可以根据需要修改:
//-------------------------
// Example OSM Tag Mapping
streetscale = 1 // street width scale factor
width = getObjectAttr("width", false)
lanes = getObjectAttr("lanes", false)
attr streetWidth = // street width dependeding on available attributes
case width > 0 : width * streetscale
case lanes > 0 : lanes * 3.5 * streetscale
else : streetWidthByClass * streetscale * oneway
class = getObjectAttr("highway", false)
streetWidthByClass =
case class == "primary" : 8
case class == "secondary" : 7
case class == "tertiary" : 6
case class == "motorway" : 12
case class == "trunk" : 11
case class == "road" : 6
case class == "residential" : 5
case class == "footway" : 2
case class == "cycleway" : 2
case class == "steps" : 2
else : 4
oneway = // oneway width correction
case getObjectAttr("oneway", false) == "yes" : 0.5
else : 1
sidewalkscale = 1 // sidewalk width scale factor
sidewalkWidth =
case class == "primary" : 2
case class == "secondary" : 2
case class == "tertiary" : 2
case class == "residential" : 2
else : 0
attr sidewalkWidthLeft = sidewalkWidth * sidewalkscale
attr sidewalkWidthRight = sidewalkWidth * sidewalkscale
默认情况下,进入cityEngine中的道路数据,会使用Esri.lib库中的规则Street_Modern_Standard.cga,当然也可以自己来编写。
文章来源:http://kikitamap.com/2018/03/15/osm2ce