osm数据导入mysql_利用OpenStreetMap(OSM)数据搭建一个地图服务
摘要: 图 利用OSM数据简单发布的北京地图服务 一、OSM是什么 开放街道图(OpenStreetMap,简称OSM)是一个网上地图协作计划,目标是创造一个内容自由且能让所有人编辑的世界地图(wiki:http://wiki.openstreetmap.org/wiki/Main_Page)。
图 利用OSM数据简单发布的北京地图服务
一、OSM是什么
开放街道图(OpenStreetMap,简称OSM)是一个网上地图协作计划,目标是创造一个内容自由且能让所有人编辑的世界地图(wiki:http://wiki.openstreetmap.org/wiki/Main_Page)。尤其值得称道的是,osm数据开源,可以自由下载使用。
二、OSM数据结构
OpenStreetMap包括空间数据以及属性数据。其中空间数据主要包括三种:点(Nodes)、路(Ways)和关系(Relations),这三种原始构成了整个地图画面。其中,Nodes定义了空间中点的位置;Ways定义了线或区域;Relations(可选的)定义了元素间的关系。
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数据下载网站:
四、基于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
这时候会出现新的提示符,输入下面两个命令,用新密码替换 :
ALTER USER postgres WITH 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格式等。
1)打开python编辑器
1 python
2)导入mapnik python bindings
1 import mapnik
3)创建地图
1 m = mapnik.Map(600,300) #创建一个地图:宽600 高300
2 #m.srs 是该地图的投影,默认是'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'
3 m.background = mapnik.Color('steelblue') #设置背景色
4)创建样式
根据我们需求设置样式,样式决定了最终渲染的结果。
1 s = mapnik.Style() #style对象
2 r = mapnik.Rule() #rule对象来管理符号
3 #多边形填充符号
4 polygon_symbolizer = mapnik.PolygonSymbolizer(mapnik.Color('#f2eff9'))5 r.symbols.append(polygon_symbolizer)6 #多边形边界填充符号
7 line_symbolizer = mapnik.LineSymbolizer(mapnik.Color('rgb(50%,50%,50%)'),0.1)8 r.symbols.append(line_symbolizer)9 s.rules.append(r)10 #将样式加入地图
11 m.append_style('My Style',s)
5) 创建数据源
1 ds=mapnik.Shapefile(file='Users/zhanlijun/Downloads/110m-admin-0-countries/ne_110m_admin_0_countries.shp')
6)创建图层
mapnik的layer是数据的基础容器。
1 layer = mapnik.Layer('world')#新建一个叫world的图层
2 #layer.srs 默认是'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'
3 layer.datasource =ds4 layer.styles.append('My Style')
7)准备map渲染
1 m.layers.append(layer) #将layer加到地图
2 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
unzip -a geoserver-2.3.5-bin.zip
cd geoserver-2.3.5/bin
./startup.sh &
osm数据导入mysql_利用OpenStreetMap(OSM)数据搭建一个地图服务相关推荐
- 利用OpenStreetMap(OSM)数据搭建一个地图服务
图 利用OSM数据简单发布的北京地图服务 一.OSM是什么 开放街道图(OpenStreetMap,简称OSM)是一个网上地图协作计划,目标是创造一个内容自由且能让所有人编辑的世界地图(wiki: ...
- oracle 数据导入 mysql_将oracle的数据导入到mysql的三种方法
为了生产库释放部分资源,需要将API模块迁移到MysqL中,及需要导数据. 尝试了oracle to MysqL工具,迁移时报错不说,这么大的数据量,用这种简陋的工具不大可靠. 意外发现平时用的数据库 ...
- 数据集可以导入mysql_利用数据集进行数据访问操作
数据访问有两种不同的方式,一种是用Connection, Command , DataReader来进行数据对数据的操作,另一种是用DataAdapter(适配器)来进行数据操作,而数据则一般放在内存 ...
- 无偏移谷歌瓦片地址_[转]OpenStreetMap/Google/百度/Bing瓦片地图服务(TMS)
开源与成熟商业的瓦片地图服务(TMS 2 WMTS),都有如下共同的特性,基本成为了标准: (1) 坐标系:WGS84 (2) 投影:墨卡托投影(Marcator,正轴等角圆柱投影) ------ ...
- 利用vue-cli配合vue-router搭建一个完整的spa流程
好文章备忘录: 转自:https://segmentfault.com/a/1190000009160934?_ea=1849098 demo源码:https://github.com/1590123 ...
- rds 数据导入mysql_将数据导入到 Amazon RDS 数据库实例
常规数据导入性能准则 以下性能准则适用于所有 Amazon RDS 数据导入/导出操作: 使用压缩和多线程并行加载和卸载数据.如果您正在将大量数据并行加载到客户端计算机,请确保在数据加载过程中具有足够 ...
- sqoop从mysql导入数据到hdfs_利用Sqoop将数据从数据库导入到HDFS
基本使用 如下面这个shell脚本: #Oracle的连接字符串,其中包含了Oracle的地址,SID,和端口号 CONNECTURL=jdbc:oracle:thin:@20.135.60.21:1 ...
- vc中人脸识别数据导入mysql_虹软人脸识别 - 采用数据库存取人脸特征数据
虹软人脸识别 - 采用数据库存取人脸特征数据 前几天有个朋友遇到了个问题,他在使用虹软的人脸识别引擎时,想更换一下人脸识别的存储方式,原本demo中使用的是文件的方式进行存储,而他想要通过数据库的方式 ...
- 数据库oracle数据导入导出命令,数据库oracle数据导入导出命令
exp Oracle数据导入导出imp/exp 功能:Oracle数据导入导出imp/exp就相当与oracle数据还原与备份. 大多情况都可以用Oracle数据导入导出完成数据的备份和还原(不会造成 ...
- KUDU数据导入尝试一:TextFile数据导入Hive,Hive数据导入KUDU
背景 SQLSERVER数据库中单表数据几十亿,分区方案也已经无法查询出结果.故:采用导出功能,导出数据到Text文本(文本>40G)中. 因上原因,所以本次的实验样本为:[数据量:61w条,文 ...
最新文章
- 大约 Apple Metal API 一些想法
- error LNK2005: “找到一个或多个多重定义的符号” 已经在 xxxx.obj 中定义 的解决方法
- python教学视频下载-Python机器学习入门教程全套视频下载【传智播客】
- 使用post向webservice发送请求,并且返回值
- 《Drupal实战》——2.5 使用Node clone快速添加测试数据
- 基于U-net的肝脏肿瘤分割实战(Pytorch实现)
- CF889E-Mod Mod Mod【dp】
- Python之Hello World
- 深度学习的实用层面 —— 1.3 机器学习基础
- Mac 登陆Linux云服务器方法
- apache在线升级yum_基于Redis实现在线游戏积分排行榜 - phyger
- 斐波那契 —— 矩阵形式推导
- c/c++线性循环队列
- Abaqus 两套常用单位
- Java设计模式超详细
- 笔记本电脑不要锁定计算机,笔记本电脑键盘怎么解锁呢
- linux shc shell脚本_用shc加密shell脚本
- js方法禁止查看源文件、防止复制、禁止右键、防被框架的方法总结
- 港科夜闻丨香港科大教授权龙:三维重建才是计算机视觉的灵魂
- excel概率密度函数公式_用excel怎么制作概率密度图_EXCEL 正态分布公式�9�3
热门文章
- java转置输出_在java中如何将一个5*3的二维数组转置输出
- 收盘价对数收益率matlab,R语言怎么把股票日收盘价转换成对数收益率
- 基于dotNET 5 MVC经典模式引入Swagger进行web api开发和管理发布OAS3标准接口文档全过程
- Rap2接口管理工具搭建及版本升级
- 小型计算机和Pc,超小型台式电脑:重量相当于两个新iPhone
- hp 交换机远程连接_Hp服务器 iLO3 使用方法
- SAP APO 取订单函数(取计划订单数据一)
- mysql期中考试题及答案_MySQL数据库考试试题及答案 -
- prometheus如何评估告警策略以及如何推送告警消息到alertmanager?
- staruml 依赖于 libgcrypt11 (= 1.4.5);然而:未安装软件包 libgcrypt11。