利用OpenStreetMap数据创建三维城市

Openstreetmap(OSM)是全球最大的开放地图数据平台。所有数据都是有用户志愿提供和绘制的。虽然数据的准确性有待提高。但是数据的覆盖范围和精细程度足够满足三维地图和三维城市的创建。本文将向读者介绍几种利用OSM建立三维城市地图的方法、工具和实例。

0. OSM数据

OSM的地图数据包括区块、道路、数据、基础设施和建筑物等。其中建筑物数据中包含楼层高度、楼层数、屋顶样式和高度、颜色,甚至楼层附属物(builidingPart)等描述楼层样式的属性。通过解析这些属性标签,可以实现较为精细的三维城市建模。下面介绍的工具对OSM中建筑物属性的解析程度各不相同

1. Mapbox GL

特点是设计简约、可用于web端展示,但是数据解析程度少,样式少。

Mapbox公司是一个提供地图服务和个性化定制的团队,地图设计非常精美。mapbox为开发者提供了一个基于JavaScript和WebGL的开源地图框架,可以实现简单的地图图元突起(extrusion)效果。结合mapbox自己的瓦片格式和OpenStreetMap的建筑物高度数据,构建三维城市地图。本人做的小demo:

//实现代码
var map = new mapboxgl.Map({  
    style: 'mapbox://styles/mapbox/light-v9',
    center: [-74.0066, 40.7135],
    zoom: 15,
    pitch: 45,
    bearing: -17.6,
    container: 'map'
});

// mapbox-streets的building图层包含建筑物高度字段
// 数据来自OpenStreetMap.
map.on('load', function() {  
    map.addLayer({
        'id': '3d-buildings',
        'source': 'composite',
        'source-layer': 'building',
        'filter': ['==', 'extrude', 'true'],
        'type': 'fill-extrusion',
        'minzoom': 15,
        'paint': {
            'fill-extrusion-color': '#aaa',
            'fill-extrusion-height': {
                'type': 'identity',
                'property': 'height'
            },
            'fill-extrusion-base': {
                'type': 'identity',
                'property': 'min_height'
            },
            'fill-extrusion-opacity': .6
        }
    });
});

2. OSM2World

开源java代码,解析程度高,样式丰富

osm2world是开源的java程序osm2world。能解析出osm数据中不同样式的屋顶样式,生成的建筑物样式比mapbox丰富。除了建筑物,osm2world还可以生成除了建筑物以外的数据,比如树木、森林、水体、桥、道路等。
osm2world生成的模型能导出成obj格式,可以导入到其他三维建模软件的进行处理和渲染。 目前发现的缺点是模型会出现断裂。下面是本人用osm2world模型做的web端展示(建议全屏观看):

3. blender的osm插件

功能和效果与osm2world差不多,但是收费

该项目是近期才开始的,本来是一个开源项目,在github上有源码,不过后来变成收费项目了。github网址:blender-osm

Blender是开源三维建模软件,可以用python进行二次开发和制作拓展插件。blender-osm让blender可以导入osm文件,并生成类似osm2world的三维模型。项目正在开发中。如果是熟悉blender的用户,会觉得用起来非常顺手。

(原创文章,转载请注明出处)

参考链接:http://wiki.openstreetmap.org/wiki/Simple3Dbuildings

浙ICP备16041529号-1