OSM地图本地发布(三)-----自定义图层提取
一、准备工作
1.完成数据准备OSM本地发布(二)-----数据准备
2.推荐使用Navicat操作数据库
3.下文是在《在GeoServer中为OpenStreetMap数据设置OSM样式》基础上的改进,可直接看该文实现图层发布
二、OSM字段说明
planet_osm_line,planet_osm_point,planet_osm_polygon和planet_osm_roads四个数据表中字段官方说明文档:https://wiki.openstreetmap.org/wiki/Zh-hans:Map_Features;以下为对部分字段的整理。
1.共有字段
字段名 |
说明 |
osm_id |
主键 |
way |
存储的地理数据 |
name |
属性名称 |
tags |
标签,属性描述信息 |
2.道路相关字段
官方详细说明文档:Map Features - OpenStreetMap highway
字段名称 |
字段取值 |
说明 |
highway |
motorway |
国家级/省级高速公路。 |
trunk |
国道/城市快速路。 |
|
primary |
省道/主干道。 |
|
motorway_link |
其他公路通往高速公路的连接道路,高速公路之间的连接匝道。 |
|
trunk_link |
连接国道/快速路与其他国道/快速路或更低级道路的连接路。 |
|
primary_link |
连接省道/主干道与其他省道/主干道或更低级道路的连接路。 |
|
proposed |
规划道路(未建成道路)。 |
|
construction |
在建道路。 |
|
motorway_junction |
指定高速公路出口,一般标记在出口匝道与主线的分流处。 |
|
services |
服务区。通常位于高速公路或快速公路上 |
|
barrier |
toll_booth |
一个收取道路使用费或费用的地点。 |
3.水路相关字段
官方详细说明文档:Map Features - OpenStreetMap waterway
字段名称 |
字段取值 |
说明 |
waterway |
river |
河流的线性流动,在流动的方向 |
riverbank |
河流的水域覆盖区域 |
|
canal |
人工"开放式流动"水道用于输送有用的水用于运输、供水或灌溉。 |
|
fairway |
湖或海中的通航路线,通常以浮标或信标为标志。 |
4.铁路相关字段
官方详细说明文档:Map Features - OpenStreetMap railway
字段名称 |
字段取值 |
说明 |
railway |
construction |
在建铁路。 |
disused |
废弃铁路,路基、铁轨还没有被拆除。 |
|
rail |
在该国标准轨距上的全尺寸旅客或货物列车 |
|
station |
火车站 |
|
bridge |
yes |
桥梁 |
electrified |
contact_line/rail/yes/no |
架空电力线/第三轨供电/电气化,但是供电方式不详/非电气化铁路 |
service |
siding |
侧线,长度较短的轨道,并行(及连接)于主线。 |
spur |
专用线,长度较短,连接企业、厂矿。 |
|
yard |
站线,车站内的线路。 |
|
usage |
main/branch/industrial/military/tourism |
铁路主要用途(主线/支线/工业/军事/旅游) |
public_transport |
station |
铁路客运专站。 |
5.设施相关字段
官方详细说明文档:Map Features - OpenStreetMap amenity
字段名称 |
字段取值 |
说明 |
amenity |
ferry_terminal |
渡轮站/渡轮码头,渡轮停靠站可供人和车辆上船。 |
townhall |
市政厅,乡,镇,市等地方政府的办公大楼,或者是社区公所。 |
6.土地类型相关字段
官方详细说明文档:Map Features - OpenStreetMap landuse
字段名称 |
字段取值 |
说明 |
landuse |
commercial |
商业办公用地 |
construction |
建筑工地 |
|
education |
主要用于教育目的/设施的区域。 |
|
industrial |
工业用地,包括工厂、车间和仓储用地。 |
|
residential |
居住区。 |
|
forest |
林业用地。 |
|
railway |
铁路用地,一般不对公众开放。 |
|
reservoir |
水库 |
7.线路相关字段
官方详细说明文档:Map Features - OpenStreetMap route
字段名称 |
字段取值 |
说明 |
route |
ferry |
渡轮从两端来回行驶的线路。(航线) |
8.边界相关字段
官方详细说明文档:Map Features - OpenStreetMap boundary
字段名称 |
字段取值 |
说明 |
boundary |
administrative |
行政边界。 |
maritime |
不是行政边界的海洋边界:基线、毗连区和专属经济区 |
9.地区相关字段
官方详细说明文档:Map Features - OpenStreetMap place
字段名称 |
字段取值 |
说明 |
place |
country |
国家高级政治/行政区域。 |
province |
省 |
|
county |
县 |
|
city |
市 |
|
suburb |
城镇或城市的一部分,有一个众所周知的名字 |
|
borough |
大城市的一部分被归入行政单位。 |
|
town |
一个重要的城市中心,在村庄和城市之间 |
三、执行sql语句生成不同图层的表
注意:默认生成图层的坐标系:EPSG:3857
这里以生成简易地图为例,图层主要包括:建筑物、地名、道路、河流、水域等。
表 1 建筑物面图层(building)
字段名 |
类型 |
是否不为空 |
说明 |
name |
text |
否 |
名称 |
building |
text |
否 |
建筑物类型 |
aeroway |
text |
否 |
航空相关建筑物 |
DROP TABLE IF EXISTS "building";
CREATE TABLE "building" AS (SELECT "name",way,building,aerowayFROM planet_osm_polygonWHERE( "building" IS NOT NULL AND "building" != 'no' )OR "aeroway" = 'terminal' OR "waterway" = 'dam' OR man_made = 'pier'ORDER BY z_order ASC
);
CREATE INDEX "building_way_idx" ON "building" USING gist (way);
表 2 全国行政地名点图层(placenames_medium)
字段名 |
类型 |
是否不为空 |
说明 |
name |
text |
否 |
名称 |
place |
text |
否 |
地名行政等级类型:state首都/city城市/ferry港口码头/small_town村庄、乡/large_town街道、办事处 /town镇 |
capital |
text |
否 |
城市分类:3首都/4省会城市/5二级城市/6城市各区 |
amenity |
text |
否 |
其他属性 |
DROP TABLE IF EXISTS "placenames_medium";
CREATE TABLE "placenames_medium" AS ( SELECT(CASE WHEN "name" = '澳門 Macau' THEN '澳门'WHEN "name" = '香港 Hong Kong' THEN '香港'ELSE "name" END) as "name",way,(CASE WHEN "amenity" = 'ferry_terminal' THEN 'ferry'ELSE place END) as place,(CASE WHEN capital = 'yes' and name = '北京市' THEN '3'WHEN capital = 'yes' and name <> '北京市' THEN '4'WHEN capital = '3' and name <> '北京市' THEN nullWHEN name in ('澳門 Macau', '香港 Hong Kong') and place = 'city' THEN '4'ELSE capital END) as capital,amenity FROM planet_osm_pointWHERE place IN ('state','city','metropolis','town','large_town','small_town') AND osm_id <> '8899974086' OR amenity = 'ferry_terminal'
);
CREATE INDEX "placenames_medium_way_idx" ON "placenames_medium" USING gist (way);
表 3 道路线图层(route_line)
字段名 |
类型 |
是否不为空 |
说明 |
osm_id |
int8(64) |
否 |
主键id |
name |
text |
否 |
道路名称 |
highway |
text |
否 |
道路类型 |
aeroway |
text |
否 |
航空道路类型 |
oneway |
text |
否 |
是否单向道路:yes是 |
tunnel |
text |
否 |
是否为隧道:yes是/no不是 |
DROP TABLE IF EXISTS "route_line";
CREATE TABLE "route_line" AS ( SELECT osm_id,"name",way,(CASE WHEN route = 'ferry' THEN 'ferry' ELSE highway END) AS highway,aeroway,CASE WHEN oneway IN ('yes','true','1') THEN 'yes'::text END AS oneway,case when tunnel IN ( 'yes', 'true', '1' ) then 'yes'::textelse 'no'::text end as tunnel,case when service IN ( 'parking_aisle','drive_through','driveway' ) then 'INT_minor'::textelse service end as serviceFROM planet_osm_lineWHERE highway IS NOT NULLOR "aeroway" IN ('apron','runway','taxiway')OR route = 'ferry'ORDER BY z_order
);
CREATE INDEX "route_line_way_idx" ON "route_line" USING gist (way);
表 4 河流线图层(river)
字段名 |
类型 |
是否不为空 |
说明 |
name |
text |
否 |
名称 |
natural |
text |
否 |
自然或人工河流 |
landuse |
text |
否 |
土地利用类型 |
waterway |
text |
否 |
水路类型:river河流 |
DROP TABLE IF EXISTS "river";
CREATE TABLE "river" AS ( SELECT (CASE WHEN name in ('金沙江','长江','扬子江') THEN '长江'WHEN name in ('黄河','རྨ་ཆུ། 玛曲','黄河 济南市—德州市界') THEN '黄河'WHEN name in ('喀拉额尔齐斯河','喀拉额尔齐斯河;额尔齐斯河','Джалгызагат-Хэ') THEN '额尔齐斯河'ELSE "name" END) as "name" ,"natural", "landuse", "waterway", "way"FROM planet_osm_lineWHERE "waterway" IN ('river','riverbank')ORDER BY z_order asc
);
CREATE INDEX "river_idx" ON "river" USING gist (way);
表 5 水域边界线图层(water_outline)
字段名 |
类型 |
是否不为空 |
说明 |
name |
text |
否 |
名称 |
natural |
text |
否 |
水域类型:water水域 |
landuse |
text |
否 |
土地利用类型:reservoir蓄水池/basin盆地/grass草地 |
waterway |
text |
否 |
水路类型:stream自然流动水路/river河流/canal运河/riverbank河岸/fish_pass/drain下水道 |
water |
text |
否 |
河流类型 |
DROP TABLE IF EXISTS "water_outline";
CREATE TABLE "water_outline" AS ( SELECT "name","natural", "landuse", "waterway", "water", "way"FROM planet_osm_lineWHERE "natural" IN ('lake','water')OR "waterway" IN ('canal','mill_pond','river','riverbank')OR "landuse" IN ('basin','reservoir','water')ORDER BY z_order asc
);
CREATE INDEX "water_outline_way_idx" ON "water_outline" USING gist (way);
表 6 水域面图层(water)
字段名 |
类型 |
是否不为空 |
说明 |
name |
text |
否 |
名称 |
natural |
text |
否 |
水域类型:hot_spring温泉/lake湖泊/ shingle河滨海滨/water水域/wetland湿地 |
landuse |
text |
否 |
土地利用类型 |
waterway |
text |
否 |
水路类型 |
water |
text |
否 |
系列水域名称 |
DROP TABLE IF EXISTS "water";
CREATE TABLE "water" AS ( SELECT "name","natural", "landuse", "waterway", "water", "way"FROM planet_osm_polygonWHERE "natural" IN ('lake','water')OR "waterway" IN ('canal','mill_pond','river','riverbank')OR "landuse" IN ('basin','reservoir','water')ORDER BY z_order asc
);
CREATE INDEX "water_way_idx" ON "water" USING gist (way);
完整SQL:
DROP TABLE IF EXISTS "building";
CREATE TABLE "building" AS (SELECT "name",way,building,aerowayFROM planet_osm_polygonWHERE( "building" IS NOT NULL AND "building" != 'no' )OR "aeroway" = 'terminal' OR "waterway" = 'dam' OR man_made = 'pier'ORDER BY z_order ASC
);
CREATE INDEX "building_way_idx" ON "building" USING gist (way);DROP TABLE IF EXISTS "placenames_medium";
CREATE TABLE "placenames_medium" AS ( SELECT(CASE WHEN "name" = '澳門 Macau' THEN '澳门'WHEN "name" = '香港 Hong Kong' THEN '香港'ELSE "name" END) as "name",way,(CASE WHEN "amenity" = 'ferry_terminal' THEN 'ferry'ELSE place END) as place,(CASE WHEN capital = 'yes' and name = '北京市' THEN '3'WHEN capital = 'yes' and name <> '北京市' THEN '4'WHEN capital = '3' and name <> '北京市' THEN nullWHEN name in ('澳門 Macau', '香港 Hong Kong') and place = 'city' THEN '4'ELSE capital END) as capital,amenity FROM planet_osm_pointWHERE place IN ('state','city','metropolis','town','large_town','small_town') AND osm_id <> '8899974086' OR amenity = 'ferry_terminal'
);
CREATE INDEX "placenames_medium_way_idx" ON "placenames_medium" USING gist (way);DROP TABLE IF EXISTS "route_line";
CREATE TABLE "route_line" AS ( SELECT osm_id,"name",way,(CASE WHEN route = 'ferry' THEN 'ferry' ELSE highway END) AS highway,aeroway,CASE WHEN oneway IN ('yes','true','1') THEN 'yes'::text END AS oneway,case when tunnel IN ( 'yes', 'true', '1' ) then 'yes'::textelse 'no'::text end as tunnel,case when service IN ( 'parking_aisle','drive_through','driveway' ) then 'INT_minor'::textelse service end as serviceFROM planet_osm_lineWHERE highway IS NOT NULLOR "aeroway" IN ('apron','runway','taxiway')OR route = 'ferry'ORDER BY z_order
);
CREATE INDEX "route_line_way_idx" ON "route_line" USING gist (way);DROP TABLE IF EXISTS "river";
CREATE TABLE "river" AS ( SELECT (CASE WHEN name in ('金沙江','长江','扬子江') THEN '长江'WHEN name in ('黄河','རྨ་ཆུ། 玛曲','黄河 济南市—德州市界') THEN '黄河'WHEN name in ('喀拉额尔齐斯河','喀拉额尔齐斯河;额尔齐斯河','Джалгызагат-Хэ') THEN '额尔齐斯河'ELSE "name" END) as "name" ,"natural", "landuse", "waterway", "way"FROM planet_osm_lineWHERE "waterway" IN ('river','riverbank')ORDER BY z_order asc
);
CREATE INDEX "river_idx" ON "river" USING gist (way);DROP TABLE IF EXISTS "water_outline";
CREATE TABLE "water_outline" AS ( SELECT "name","natural", "landuse", "waterway", "water", "way"FROM planet_osm_lineWHERE "natural" IN ('lake','water')OR "waterway" IN ('canal','mill_pond','river','riverbank')OR "landuse" IN ('basin','reservoir','water')ORDER BY z_order asc
);
CREATE INDEX "water_outline_way_idx" ON "water_outline" USING gist (way);DROP TABLE IF EXISTS "water";
CREATE TABLE "water" AS ( SELECT "name","natural", "landuse", "waterway", "water", "way"FROM planet_osm_polygonWHERE "natural" IN ('lake','water')OR "waterway" IN ('canal','mill_pond','river','riverbank')OR "landuse" IN ('basin','reservoir','water')ORDER BY z_order asc
);
CREATE INDEX "water_way_idx" ON "water" USING gist (way);
执行上述SQL语句生成不同图层。
四、QGIS查看图层
到此地图雏形基本显现,但直观看上去很乱,后面将对其进行样式调节并发布到Geoserver中。
OSM地图本地发布(三)-----自定义图层提取相关推荐
- 如何实现OSM地图本地发布并自定义配图
文章目录 1.缘起 2.准备环境 2.1.安装linux系统 2.2.安装docker 2.3.安装Docker Compose 2.4.安装git 3.发布地图 3.1.拉取代码 3.2.测试网络 ...
- OSM地图本地发布(四)-----Geoserver发布自定义地图
一.准备工作 1. 安装jdk 1.8.tomcat 2.安装Geoserver,下载地址:https://sourceforge.net/projects/geoserver/files/GeoSe ...
- OSM地图本地发布(一)-----概述
目录 一.前言 二.开源GIS介绍 1.前端GIS框架 2.后端技术 3.空间数据库 4.地图服务器 4.GIS软件 三.技术选型 四.文章目录 1.OSM本地发布(一)-----概述 2.OSM本地 ...
- OSM地图本地发布(五)-----Geoserver发布海洋图层
一.准备工作 1.下载OSM海洋数据,下载地址:Water polygons,OSM地图默认坐标系是EPSG:3857,即为墨卡托投影(Mercator)数据是shp格式,下方有两种海洋数据,Larg ...
- OSM地图本地发布(二)-----数据准备
一.准备工作 1.安装PostgreSQL+PostGIS,版本不限(推荐最新版本)安装教程:Windows上安装.Linux上安装. 2.osm2pgsql工具,下载地址. 3.安装QGIS,方便查 ...
- 如何用高德地图定位生成二维码_OSM地图本地发布如何生成各省市矢量地图
1.缘起 2.问题 3.分析 4.生成自定义地区矢量瓦片 4.1.启动docker 4.2.启动postGIS容器 4.3.设置不清理上次的结果 4.4.删除默认切图范围 4.5.修改切图层级和范围 ...
- Android高德地图路线规划,自定义图层(overlay),所有点和线刚好显示在屏幕中心
高德百度地图SDK路线规划包含:步行,公交,驾车,骑车. 搜索的结果是经纬度点信息Latlng(lat,lng) 功能 在地图map中将所有的点连线,并让该线能刚好被当前的地图层级包含,并且当前路线所 ...
- Cesium最新基础教程系列2—Viewer离线加载地图数据(高程数据,地图瓦片(卫星影像、电子地图)),Viewer属性详解,及离线自定义图层
浏览器打开后,右上角点击图层,cesium所带图层都是在线图层,话不多说.直接代码,可以参考注释 var viewer = new Cesium.Viewer('cesiumContainer',{ ...
- arcgis前端(2)----->基础篇--发布一个自定义地图及加载自定义地图/底图
arcgis前端(2)----->基础篇–发布一个自定义地图及加载自定义地图/底图 文章目录 arcgis前端(2)----->基础篇--发布一个自定义地图及加载自定义地图/底图 前言 & ...
最新文章
- python使用imbalanced-learn的RepeatedEditedNearestNeighbours方法进行下采样处理数据不平衡问题
- 2016没有自带公式编辑器_如何在Visio中插入数学公式
- 积跬步-java任职要求
- 【OS学习笔记】四十 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----动态加载的用户程序/任务二代码
- python except用法和作用_Python面试题(部分附带面试标准答案) 建议收藏
- mysql loose_简单谈谈MySQL的loose index scan
- 解封装(四):avformat_find_stream_info探测获取封装上下文并打印
- 我见过不少赚了钱,投资孵化一堆店铺的,一般而言后续发展都会出问题的
- 10张架构图详解数据中台,附全套数据中台PPT
- Javascript模式——函数提升 (笔记)
- idea怎么集成svn服务端,使用Mac自带svn搭建服务器,并使用idea进行连接(示例代码)...
- 怎样实现VLAN间通信,三种解决方案,一节课带你掌握
- STM32之俄罗斯方块
- 【高自旋和低自旋配合物】
- WebStorm 2016.3.1 版本激活方法
- ECS运维神器 之 阿里云云助手
- 《Microduino实战》——2.1 Microduino系列产品
- ScrollView中嵌套GridView,不在顶部解决办法
- JVM及性能优化(干货)
- 公众号榜单 | 2020·8月公众号地区排行榜重磅发布
热门文章
- QQ第三方登陆流程详解
- 注册邮箱接收验证码小结
- elmah_ELMAH:ASP.NET的错误记录模块和处理程序(也包括MVC!)
- 三、以太网协议栈uIP移植
- 在月亮湖捡到鸿蒙,在腾格里沙漠深处,有6000万年前的湖泊,水深4米
- Python作业day2购物车
- Netty框架之TCP粘包/半包解决方案
- 6、springboot-防止xxs攻击
- The authenticity of host 'izwz9c8l39itikxj328wwuz (IP地址)' can't be established.
- 团灭了3个月的线下营销,还有希望吗?