利用OpenStreetMap(OSM)数据搭建一个地图服务
http://www.cnblogs.com/LBSer/p/4451471.html

图 利用OSM数据简单发布的北京地图服务
一、OSM是什么
开放街道图(OpenStreetMap,简称OSM)是一个网上地图协作计划,目标是创造一个内容自由且能让所有人编辑的世界地图(wiki:http://wiki.openstreetmap.org/wiki/Main_Page)。尤其值得称道的是,osm数据开源,可以自由下载使用。
二、OSM数据结构
OpenStreetMap包括空间数据以及属性数据。其中空间数据主要包括三种:点(Nodes)、路(Ways)和关系(Relations),这三种原始构成了整个地图画面。其中,Nodes定义了空间中点的位置;Ways定义了线或区域;Relations(可选的)定义了元素间的关系。
属性数据Tags用于描述上述矢量数据基元。(http://wiki.openstreetmap.org/wiki/Elements)
2.1. Node
node通过经纬度定义了一个地理坐标点。同时,还可以height=*标示物体所海拔;通过layer=* 和 level=*,可以标示物体所在的地图层面与所在建筑物内的层数;通过place=* and name=*来表示对象的名称。同时,way也是通过多个点(node)连接成线(面)来构成的。
2.2. Way
通过2-2000个点(nodes)构成了way。way可表示如下3种图形事物(非闭合线(Open polyline )、闭合线(Closed polyline)、区域(Area ))。对于超过2000 nodes的way,可以通过分割来处理。
a)Open polyline
非闭合线:收尾不闭合的线段。通常可用于表示现实中的道路、河流、铁路等。
b)Closed polyline
闭合线:收尾相连的线。例如可以表示现实中的环线地铁。
c)Area
区域:闭合区域。通常使用landuse=* 来标示区域等。
2.3. Relation
一个Relation是用来描述两个或多个基元的相互关系(nodes, ways 或者其他的relations),相互的关系通过role来定义,包括:
a)route :定义公路、自行车道、铁路等
b)多个多边形:定义area例如建筑、河堤等
c)边界:装门用来定义行政边界
d)限制:用于描述限制比如“非左转”
2.4. Tag
标签不是地图基本元素,但是各元素都通过tag来记录数据信息。通过'key' and a 'value'来对数据进行记录(了解xml或者数据库的应该都比较清楚了吧?)。例如,可以通过highway=residential来定义居住区道路;同时,可以使用附加的命名空间来添加附加信息,例如:maxspeed:winter=*就表示冬天的最高限速。
三、OSM数据及下载
osm数据格式主要有以下几种,可以通过以下网站下载数据。
osm数据格式:
|
OSM XML – xml-format provided by the API PBF – highly compressed, optimized binary format similar to the API o5m – for high-speed processing, uses PBF coding, has same structure as XML format OSMJSON – json variant of OSM XML |
|---|
osm数据下载网站:
|
GeoFabrik:http://www.geofabrik.de/ Metro Extracts:http://metro.teczno.com/ HOT Exports:http://hot.openstreetmap.org/ BBBike:http://extract.bbbike.org/ |
|---|
四、基于OSM数据搭建一个地图服务
OSM wiki提供了张架构图,很有价值,我们可以按此架构图一步步进行探索。

4.1. 数据库
Postgresql+插件PostGIS非常适合存储地理空间数据,上面架构图的底层数据库也是此搭配,因此我们也使用此搭配。
a)下载postgresql+postGIS插件
|
sudo apt-get install postgresql postgresql-contrib postgis postgresql-9.1-postgis 安装完毕,我们需要更改postgres用户的密码,否则我们就没法使用这个数据库服务器。以postgres这个系统用户的身份运行psql命令,在终端中输入如下: sudo su postgres -c psql template1 这时候会出现新的提示符,输入下面两个命令,用新密码替换 <***password***>: ALTER USER postgres WITH PASSWORD ' <***password***> '; |
|---|
b)创建用户及数据库
|
postgres# CREATE USER zhanlijun WITH PASSWORD 'xxxx'; postgres# CREATE DATABASE osm; postgres# GRANT ALL PRIVILEGES ON DATABASE osm to zhanlijun; |
|---|
c)为数据库添加空间扩展
|
CREATE EXTENSION postgis; -- Enable Topology CREATE EXTENSION postgis_topology; -- fuzzy matching needed for Tiger CREATE EXTENSION fuzzystrmatch; -- 地理编码 CREATE EXTENSION postgis_tiger_geocoder; -- 用于存储属性tags,key-value CREATE EXTENSION hstore; |
|---|
4.2. 导入数据
从网站上下载的osm数据一般是文件格式(如xml、pbf等),为了使用我们需要将其导入到数据库中,这就需要导入工具,架构图使用了osmpsis,但是使用起来并不友好,推荐使用osm2pgsql。
a)安装osm2pgsql
|
Run sudo apt-get install software-properties-common to install the command add-apt-repository if the command can't be found. Run sudo add-apt-repository ppa:kakrueger/openstreetmap to add the PPA Run sudo apt-get update to update your packaging system. Run sudo apt-get install osm2pgsql to install the osm2pgsql package. |
|---|
b)安装protobuf(为了导入pbf格式数据)
|
sudo apt-get install libprotobuf-c0-dev protobuf-c-compiler |
|---|
c)导入数据库
|
osm2pgsql -s -U zhanlijun -d osm /Users/zhanlijun/Downloads/planet_116.104,39.667_116.892,40.066.osm.pbf -H localhost -W; |
|---|
注:osm2pgsql导入数据有两种模式, normal and slim mode。
normal mode会在内存中产生如下三张中间表,并在导入结束后丢弃,因此速度较快。
- planet_osm_nodes
- planet_osm_ways
- planet_osm_rels
而slim mode则将中间结果完全放置到数据库中。slim模式的好处是方便更新。
两者使用的区别在于是否加“-s”,加了表示slimmode,本文使用slim mode。
使用slim mode导入数据后在数据库中会产生如下表。

4.3. 渲染
数据已经导入到postgresql了,下面需要将数据渲染出来,也就是将postgresql中的矢量数据渲染成图片。
4.3.1 使用Mapnik进行渲染
目前最出名的开源地图渲染引擎莫过于Mapnik。
Mapnik可以渲染多种数据源,包括数据库如postgresql,以及文件格式数据例如shapefile、osm.xml格式等。
这里以shapefile格式数据为例,下载需要渲染的矢量数据:http://www.naturalearthdata.com/
1)打开python编辑器
python
2)导入mapnik python bindings
import mapnik
3)创建地图
m = mapnik.Map(600,300) #创建一个地图:宽600 高300
#m.srs 是该地图的投影,默认是'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'
m.background = mapnik.Color('steelblue') #设置背景色
4)创建样式
根据我们需求设置样式,样式决定了最终渲染的结果。
s = mapnik.Style() #style对象
r = mapnik.Rule() #rule对象来管理符号
#多边形填充符号
polygon_symbolizer = mapnik.PolygonSymbolizer(mapnik.Color('#f2eff9'))
r.symbols.append(polygon_symbolizer)
#多边形边界填充符号
line_symbolizer = mapnik.LineSymbolizer(mapnik.Color('rgb(50%,50%,50%)'),0.1)
r.symbols.append(line_symbolizer)
s.rules.append(r)
#将样式加入地图
m.append_style('My Style',s)
5) 创建数据源
ds=mapnik.Shapefile(file='Users/zhanlijun/Downloads/110m-admin-0-countries/ne_110m_admin_0_countries.shp')
6)创建图层
mapnik的layer是数据的基础容器。
layer = mapnik.Layer('world')#新建一个叫world的图层
#layer.srs 默认是'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'
layer.datasource = ds
layer.styles.append('My Style')
7)准备map渲染
m.layers.append(layer) #将layer加到地图
m.zoom_all() #将数据zoom_all,如果不用,结果将是空白
8)渲染地图
最后我们得到一张png格式的世界地图:world.png

4.3.2 使用TileMill进行渲染
Mapnik使用起来并不容易,尤其是配置样式的时候,下面我们使用TileMill进行渲染,TileMill的内核是Mapnik。
TileMill的好处是所见即所得,右边配置样式,左边能马上显示出结果。此外还可以将结果展示出来(下图就是利用TileMill渲染北京osm数据的结果)。

4.4 一体化解决方案
GeoServer + OpenLayers +PostGIS叠加显示动态矢量数据。
安装geoserver
|
sudo apt-get update sudo apt-get install unzip openjdk-6-jre echo "export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-amd64" >> ~/.bashrc source ~/.bashrc wget -c http://sourceforge.net/projects/geoserver/files/GeoServer/2.3.5/geoserver-2.3.5-bin.zip unzip -a geoserver-2.3.5-bin.zip cd geoserver-2.3.5/bin ./startup.sh & |
|---|
地图相关博文:
地图点聚合优化方案
利用OpenStreetMap(OSM)数据搭建一个地图服务的更多相关文章
- 【百度地图API】如何利用自己的数据制作社交地图?只显示可视区域内的标注
原文:[百度地图API]如何利用自己的数据制作社交地图?只显示可视区域内的标注 摘要:如果你自己的数据已经超过1万个,如何进行合理的显示?除了聚合marker外,还有一个办法.那就是,只显示可视区域内 ...
- 利用vue-cli配合vue-router搭建一个完整的spa流程
好文章备忘录: 转自:https://segmentfault.com/a/1190000009160934?_ea=1849098 demo源码:https://github.com/1590123 ...
- 通过express快速搭建一个node服务
Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台.可以理解为是运行在服务端的 JavaScript.如果你是一个前端程序员,不太擅长像PHP.Python或Ruby等 ...
- 利用git+hugo+markdown 搭建一个静态网站
利用git+hugo+markdown 搭建一个静态网站 一直想要有一个自己的文档管理系统: 可以很方便书写,而且相应的文档很容易被分享 很方便的存储.管理.历史记录 比较方面的浏览和查询 第一点用M ...
- 搭建一个web服务下载HDFS的文件
需求描述 为了能方便快速的获取HDFS中的文件,简单的搭建一个web服务提供下载很方便快速,而且在web服务器端不留临时文件,只做stream中转,效率相当高! 使用的框架是SpringMVC+HDF ...
- 利用Wamp在本地搭建一个wordpress站点
原文链接:利用Wamp在本地搭建一个wordpress站点 有时候我们会想搭建一个自己的站点,可是由于只是想自己访问,就不是很想为这个站点在买一个服务器和域名,那我们可能首先就想到把自己电脑当做服务器 ...
- OpenStreetMap/Google/百度/Bing瓦片地图服务(TMS)
开源与成熟商业的瓦片地图服务(TMS 2 WMTS),都有如下共同的特性,基本成为了标准: (1) 坐标系:WGS84 (2) 投影:墨卡托投影(Marcator,正轴等角圆柱投影) ------ ...
- [转]OpenStreetMap/Google/百度/Bing瓦片地图服务(TMS)
转自:https://blog.csdn.net/youngkingyj/article/details/23365849 开源与成熟商业的瓦片地图服务(TMS 2 WMTS),都有如下共同的特性 ...
- 技术人如何利用 github+Jekyll ,搭建一个独立免费的技术博客
上次有人留言说,技术博客是程序员的标配,但据我所知绝大部分技术同学到现在仍然没有自己的技术博客.原因有很多,有的是懒的写,有的是怕写不好,还有的是一直想憋个大招,幻想做到完美再发出来,结果一直胎死腹中 ...
随机推荐
- 安卓开发学习笔记(四):Android Stuidio无法实现隐式Intent是为什么?
一.首先检查我们的代码: FirstActivity.java(主活动程序当中的代码):Button3监听器后面的代码就是我们隐式Intent的业务逻辑所在了,大家可以往下面看看,大概在代码的第57行 ...
- Dubbo+zookeeper构建高可用分布式集群(一)-单机部署
不久前,我们讨论过Nginx+tomcat组成的集群,这已经是非常灵活的集群技术,但是当我们的系统遇到更大的瓶颈,全部应用的单点服务器已经不能满足我们的需求,这时,我们要考虑另外一种,我们熟悉的内容, ...
- 主流数据库连接池性能比较 hikari druid c3p0 dbcp jdbc
背景 对现有的数据库连接池做调研对比,综合性能,可靠性,稳定性,扩展性等因素选出推荐出最优的数据库连接池 . NOTE: 本文所有测试均是MySQL库 测试结论 1:性能方面 hikariCP> ...
- SQL Server索引碎片整理实际操作记录
SQL Server 版本是 2008 R2. 查询数据库索引碎片情况的 SQL 语句(来源): SELECT OBJECT_NAME(ind.OBJECT_ID) AS TableName, ind ...
- 第五周 IP通信基础回顾
广播请求,单播响应,ARP IPV4,IP地址32位二进制代码分为8个位一组 路由器每一个接口都是一个网段 ,网段与网段区分看网络地址 同一段链路是同网段 直接广播:主机号全为1 受限广播:全为1 特 ...
- Python——day12 nonlcoal关键字、装饰器(开放封闭原则、函数被装饰、最终写法)
一.nonlocal关键字 1.作用:将L与E(E中的名字需要提前定义)的名字统一 2.应用场景:如果想在被嵌套的函数中修改外部函数变量(名字)的值 def outer(): num=10 print ...
- Python内置函数(18)——enumerate
英文文档: enumerate(iterable, start=0) Return an enumerate object. iterable must be a sequence, an itera ...
- Guava 源码分析(Cache 原理 对象引用、事件回调)
前言 在上文「Guava 源码分析(Cache 原理)」中分析了 Guava Cache 的相关原理. 文末提到了回收机制.移除时间通知等内容,许多朋友也挺感兴趣,这次就这两个内容再来分析分析. 在开 ...
- 什么样的IT业务适合外包?
很多公司都应该遇到过这样的问题,什么样的IT业务才适合外包呢? 百度大家都可以百度的到一些信息,比如: 针对这样的推荐答案,是否也需要认真思考一下,我需要外包的业务是什么样的业务?是不是真的适合外包? ...
- 如何使用Git提高研发团队工作效率?
为什么使用Git 随着互联网时代的来临与发展,尤其分布式开发的大力引入,对于开发工程师来说,代码管理变成了头等难题.10多个人或者更多的成员的研发团队如何管理同一份代码,异地办公如何跟同事有效的维护同 ...