说到免费开放的数据,自然会想到 Open Street Map,这里分享下在 ArcGIS 产品线中osm数据的使用实践。

环境:ArcGIS Desktop 10.6, Esri CityEngine 2017.1

在ArcMap中使用osm数据

一般情况下,我们可以在 Open Street Map 官网可以通过指定范围直接下载osm格式数据,然后在 ArcMap中直接读取。如下,以Esri中国所在的金泰大厦为中心的数据:

ArcMap直读OSM

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类:

导入OSM至CityEngine场景

在CityEngine中导入osm时,可以勾选“Map OSM tags”,从而CityEngine会通过OSM street type来定义道路的宽度,并给与不同道路组成部分不同的起始规则,方便后续利用规则批量建模。如下,以金泰大厦以南的东直门大枢纽为例,复杂的交通仍然保持错落有致:

OSM Highway

选中Jintai_Streets 这个图层,可以在Inspect窗口中看到图层的属性,其中即为默认情况下osm数据在CityEngine中的映射规则,可以根据需要修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//------------------------- 
// 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,当然也可以自己来编写。