osm 搭建离线地图_利用OpenStreetMap(OSM)数据搭建一个地图服务

article/2025/8/26 13:17:04

db7de1d5b984c8f3a47b76b45cb7c092.png

图 利用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提供了张架构图,很有价值,我们可以按此架构图一步步进行探索。

f4fefcce22bbddb5bf9f096501dd43b3.png

4.1. 数据库

Postgresql+插件PostGIS非常适合存储地理空间数据,上面架构图的底层数据库也是此搭配,因此我们也使用此搭配。

a)下载postgresql+postGIS插件

sudoapt-get installpostgresql 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)为数据库添加空间扩展

CREATEEXTENSION postgis;

-- Enable Topology

CREATEEXTENSION postgis_topology;

-- fuzzy matching needed for Tiger

CREATEEXTENSION fuzzystrmatch;

-- 地理编码

CREATEEXTENSION postgis_tiger_geocoder;

-- 用于存储属性tags,key-value

CREATEEXTENSION hstore;

4.2. 导入数据

从网站上下载的osm数据一般是文件格式(如xml、pbf等),为了使用我们需要将其导入到数据库中,这就需要导入工具,架构图使用了osmpsis,但是使用起来并不友好,推荐使用osm2pgsql。

a)安装osm2pgsql

Run sudo apt-get install software-properties-commonto install the command add-apt-repository if the command can't be found.

Runsudo add-apt-repository ppa:kakrueger/openstreetmapto add the PPA

Run sudo apt-get updateto update your packaging system.

Run sudo apt-get install osm2pgsqlto install the osm2pgsql package.

b)安装protobuf(为了导入pbf格式数据)

sudoapt-get installlibprotobuf-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导入数据后在数据库中会产生如下表。

507a3c5304ff3ae76d275ec3de3a6ec5.png

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

9adccc1426091fb9a4eea6520ae9ac55.png

4.3.2 使用TileMill进行渲染

Mapnik使用起来并不容易,尤其是配置样式的时候,下面我们使用TileMill进行渲染,TileMill的内核是Mapnik。

TileMill的好处是所见即所得,右边配置样式,左边能马上显示出结果。此外还可以将结果展示出来(下图就是利用TileMill渲染北京osm数据的结果)。

c39ff1541b7688f40ca6350f9e021de0.png

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 &

地图相关博文:


http://chatgpt.dhexx.cn/article/ySBEshJ8.shtml

相关文章

【功能上新】Python实现OSM地图数据解析——OSM2Rail

一款开源的铁路网络建模工具 目录 1. 简介2. 功能介绍3. 操作流程3.1 安装3.2 快速上手 4. 未来计划 1. 简介 作为一款面向铁路工作者的开源网络建模工具,OSM2Rail实现了在线OSM地图包快速下载、铁路元素自动解析、网络快速可视化以及规范化数据输出。借助OSM2Rail…

数据分析OSM模型

People do not start out with the search for facts,they start out with an opinion. ——Peter F.Drucker 文章目录 前言一、OSM模型是什么二、OSM模型的作用三、OSM模型的适用场景四、案例分享(一)创业初期的打车APP1. 案例背景2. 目标3. 策略4. 度量…

java osm pbf_OSM数据的下载和转换使用

除了去爬高德,百度等在线地图的数据外,还有一种获得数据的方法是下载openstreetmap的免费数据。OpenStreetMap它是利用公众集体的力量和无偿的贡献来改善地图相关的地理数据。OSM是非营利性的,它将数据回馈给社区重新用于其它的产品与服务。O…

cesium加载OSM在线地图

文章目录 1.实现效果2.实现方法2.1官方文档2.2代码调用2.3OSM在线地图风格 Cesium实战系列文章总目录: 传送门 1.实现效果 2.实现方法 2.1官方文档 Cesium官方虽然没有提供直接加载OSM在线地图的方式,但是可以通过UrlTemplateImageryProvider接口加载…

java osm pbf_read format .osm.pbf from geofabrik

#--------------------------20200227更新---------------------------------------- 德国人第二天邮件就反馈了。确实严谨,也学到了。 1 osm 全部坐标信息只在points里, 后面的way 和relation 只有点id的索引。 他给出的读取方法是: l0 osm.…

边缘服务网格 osm-edge

本文篇幅稍长,阅读本文将了解以下内容: •什么是 osm-edge 及其产生背景•边缘计算与中心云计算的差异,以及带来的挑战•osm-edge 的设计及采用的技术•5 分钟快速体验边缘服务网格 关于 osm-edge osm-edge 是针对边缘计算环境设计的服务网格…

GeoServer发布OSM地图

参考顺序: CentOS7.5安装Postgresql10.5和PostGIS(CentOS7.6安装Postgresq11和PostGIS)CentOS7部署GeoServerCentOS7部署osm2pgsql GeoServer发布OSM地图 1. 创建图层数据表 osm_db中包含了planet_osm_line,planet_osm_point,planet_osm_…

使用OSM数据创建城市模型

使用OSM数据创建城市模型 一.OSM数据获取方式 (1)通过OpenStreetMap获取 (2)通过Geofabrik下载最近的OSM数据 (3)有很多插件也提供了数据获取方式,根据自己用的软件,自行百度查找 …

java osm_OSM初识(三)OSM Data

一 导出数据 将XML格式的OSM数据转换成另一种格式。 二 提取数据 剪切你选择区域内的数据,或者提取出特定区域特定的特征 三 数据格式 OSM文件仅属于OSM,不能用别的软件打开。其中后缀为bz2,pdf的文件是为了节省空间压缩过的OSM文件。一个简单…

简单学习OSM(OpenStreetMap)文件格式的最基础结构

目标 获取一个最简单的OSM文件,并学习其最基础的结构。 获取OSM数据的步骤 操作很简单: 进入官网:https://www.openstreetmap.org/ 点击左上角的 “导出” 按钮。 然后,填入坐标范围,点击按钮即可导出osm文件&…

OSM(OpenStreetMap)使用简述

0.背景 基于开源的地图制作工具osm以及开源的仿真引擎CARLA完成交通场景仿真场景的搭建。 1.构建OSM场景 https://www.openstreetmap.org/#map16/31.2808/121.1690 1.1.搜索关键字 1.2. 手动选择不同的区域 1.3.导出 导出为osm文件 2.osm->xodr OpenStreetMap 格式文件…

OSM数据内容解析

OSM数据内容解析 数据简介 OpenStreetMap(简称OSM,中文是公开地图),这是一个网上地图协作计划,目标是创造一个内容自由且能让所有人编辑的世界地图。是一款由网络大众共同打造的免费开源、可编辑的地图服务。 OSM采…

OSM下载路网数据

OpenStreetMap(简称OSM,中文是公开地图)是一个网上地图协作计划,目标是创造一个内容自由且能让所有人编辑的世界地图。 本文介绍如何使用OSM免费下载路网数据。如想直接获取全国路网数据,可见文末! OSM地…

python第三方库pygame的使用

作用:pygame一般用来做游戏 注意:1.在使用pygame提供的功能之前,需要调用init方法 2.在游戏结束前需要调用 quit 方法 pygame中的各个函数: 1.pygame.init():该函数在使用pygame时进行初始化,只有引用了该…

Py之pygame:Python的pygame库的简介、安装、使用方法详细攻略

Py之pygame:Python的pygame库的简介、安装、使用方法详细攻略 目录 pygame库的简介 pygame库的安装 pygame库的使用方法 pygame库的简介 PyPoice是SDL多媒体库的Python包装模块。它包含Python函数和类,这些类和类允许使用SDL对CDROM、音频和视频输出、…

python3安装pygame出错(输入“pip3 install pygame“,安装pygame模块报错)

使用pip3 install pygame,安装出错 自己已经更换源镜像,但总是在执行到最后一步的时候报错,通过网上的方法安装,总是出现两个配置无法被找到,向下执行的时候出现错误,最后以第一种方式安装成功。 执行: p…

【Pygame基本使用】

pygame是什么 pygame是跨平台Python模块,专门为电子游戏设计,包含图像、声音等;简单的说它是别人已经编写好的程序,并放在了一个类似库里,专门给别人使用的; pygame的图形接口 https://www.jianshu.com/p…

python Pygame的具体使用讲解

一、实验介绍 1.1 实验内容 在本节课中,我们将讲解Pygame的常用对象及其操作,包括图形、动画、文字、音频等,确保同学们对Pygame有一个基础的了解,同时为后续课程做好准备。 Pygame图形Pygame动画Pygame文字Pygame音频Pygame事…

Pygame 官方文档 - 中译版

pygame 文档 Pygame之家【Pygame Home】 帮助内容【Help Contents】 指导索引【Reference Index】最有用的东西 【Most useful stuff】Color | display | draw | event | font | image | key | locals mixer | mouse | Rect | Surface | time | music | pygame 高级的东西【…

pygame入门

pygame入门 文章目录 pygame入门说明一、pygame的安装二、pygame模块概览三、pygame的“hello world”四、事件理解事件事件检索处理鼠标事件处理键盘事件事件过滤产生事件 五、显示全屏显示改变窗口尺寸复合模式其他 六、字体创建font对象使用字体中文字体 七、颜色八、图像使…