OSM地图本地发布(三)-----自定义图层提取

article/2025/7/22 2:34:53

一、准备工作

 

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中。


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

相关文章

Python实现OSM地图数据解析——OSM2Rail

目录 1. 简介2. 功能特色2.1 自动下载OpenStreetMap地图数据包2.2 提供更精确的铁路网络数据解析2.3 扩展GMNS标准 3. 快速上手4. 效果展示5. 相关阅读 1. 简介 前期为大家介绍了由美国亚利桑那州立大学ASU TransAI Lab团队开发的开源python依赖库——OSM2GMNS&#xff0c;不仅…

下载OSM地图数据

OSM数据有几种下载方式&#xff1a;1&#xff09;直接通过wget下载&#xff1b; 2&#xff09;通过官网直接导出指定区域&#xff1b; 3&#xff09;通过QGIS下载指定区域 1.通过wget下载数据 进入http://download.geofabrik.de/&#xff0c; 可以按照自己的需求下载不同国家不…

QGIS获取OSM地图矢量数据

目录 一、QGIS加载OSM底图图层 二、quickosm插件导入openstreetmap数据 三、数据导出 四、Overpass query查询用法 五、写在最后 一、QGIS加载OSM底图图层 1.安装QuickMapServices插件&#xff0c;在网络菜单下可以加载各类底图 2.插件安装后&#xff0c;通过插件打开OS…

OSM地图本地发布(一)-----概述

目录 一、前言 二、开源GIS介绍 1.前端GIS框架 2.后端技术 3.空间数据库 4.地图服务器 4.GIS软件 三、技术选型 四、文章目录 1.OSM本地发布(一)-----概述 2.OSM本地发布(二)-----数据准备 3.OSM本地发布(三)-----自定义图层提取 4.OSM本地发布(四)-----Geoserver…

中国省份/城市OSM地图数据

下载访问地址 网站截图

数据分享|2023年OSM道路数据(全国,分省,分市)

道路数据是我们在各项研究中经常使用的数据!道路数据虽然很常用,但是却基本没有能下载最近年份道路数据的网站,所以很多人不知道如何获到道路数据。 本次我们为大家推荐的下载道路数据的网站是Open Street Map!我们先来了解下Open Street Map,其简称为OSM,是一个开源的地…

基于 OSM 构建全球瓦片地图(一):概述

一、什么是OSM 开放街道地图&#xff08;英语&#xff1a;OpenStreetMap&#xff0c;缩写为OSM&#xff09;&#xff0c;其概念启发自维基百科网站&#xff0c;是一个建构自由内容之网上地图协作计划&#xff0c;目标是创造一个内容自由且能让所有人编辑的世界地图。 从2007年…

Python实现OSM地图数据解析——OSM2GMNS

目录 1. 开源地图OSM2. 数据解析方法对比3. OSM2GMNS3.1 关于GMNS数据格式3.2 安装方法3.3 使用方法3.3.1 地图数据下载3.3.2 数据解析 3.4 输出文件 4. 可视化5. 总结参考 1. 开源地图OSM OpenStreetMap&#xff08;www.openstreetmap.org&#xff09;是一款知名的开源地图数…

利用微信网页录音接口实现语音搜索

微信网页接口有3个录音相关接口 开始录音接口 wx.startRecord();停止录音接口 wx.stopRecord({ success: function (res) { var localId res.localId; } });监听录音自动停止接口 wx.onVoiceRecordEnd({ // 录音时间超过一分钟没有停止的时候会执行 complete 回调 complete…

Unity WebGL基于js通信实现网页录音

Unity WebGL基于js通信实现网页录音 由于Unity发布WebGL后无法使用Unity中的Microphone,所以无法进行录音&#xff0c;只能借助与网页进行录音操作&#xff0c;因此基于Unity新版页面对接方式jslib实现页面录音。可以将录音数据回传至unity&#xff0c;并在unity中进行播放。理…

php录音功能,h5做出网页录音功能

这次给大家带来h5做出网页录音功能,h5做出网页录音功能的注意事项有哪些,下面就是实战案例,一起来看一下。 得益于前辈的分享,做了一个h5录音的demo。效果图如下: 点击开始录音会先弹出确认框: 首次确认允许后,再次录音不需要再确认,但如果用户点击禁止,则无法录音: …

java 网页 录音_Java+FlashWavRecorder实现网页录音并上传【新】

【注意】 【说明】 1.在线录音并直接上传到服务器中 【使用】 1.运行 1.请下载本项目&#xff0c;并导入myeclipse中 2.跑起项目&#xff0c;访问http://localhost:8080/recorder-online-upload查看效果 2.定制 1.打开WEB-INF/view/index.html 2.只有两段html注释中的代码是需要…

java 网页 录音_Java+FlashWavRecorder实现网页录音并上传

【注意】 【前言】 肯定有需求要网页录音&#xff0c;并且要上传。这奇葩需求。 然后找到了FlashWavRecorder&#xff0c; 【原始版本号】 1.下载 在上面的地址下载zip解压之后&#xff0c;目录里面有个index.html。打开之后这效果&#xff1a; 2.录音权限 必须保证你的电脑有麦…

10.WebRTC实现网页录音功能

一、概述 通过WebRTC&#xff0c;实现在页面上进行录音&#xff0c;并将录音结果转换为.wav格式进行播放 二、录音实现 检测是否有麦克风权限 navigator.mediaDevices.enumerateDevices().then(function(devices) {// 检测视频输入let video devices.find((device) > {…

uniapp中使用网页录音并上传声音文件(发语音)——js-audio-recorder的使用【伸手党福利】

uniapp中上传音频只能在app或小程序当中实现&#xff0c;如何使用网页完成语音的录制和上传则成为了困扰前端童鞋的重点。 本文着重解决&#xff1a; js-audio-recorder报 error:浏览器不支持getUserMedia ! 的问题。 js-audio-recorder报 NotFoundError : Requested device no…

前端实现在浏览器网页中录音

一、整体实现的思想 页面中实现录音需要使用浏览器提供的MediaRecorder API,所以要实现页面录音就需要浏览器支持MediaStream Recording相关的功能&#xff0c;即浏览器能够获取浏览器的录音权限。 页面内容&#xff0c;需要一个记录录音开始和结束的按钮&#xff0c;以及一个用…

基于神经网络的自适应最优控制

《 N e u r a l n e t w o r k a p p r o a c h t o c o n t i n u o u s − t i m e d i r e c t a d a p t i v e o p t i m a l c o n t r o l f o r p a r t i a l l y u n k n o w n n o n l i n e a r s y s t e m s 》 D r a g u n a V r a b i e ∗ , F r a n k L e w …

堆排序(排升序为啥建大堆,排降序为啥建小堆)

简介&#xff1a; 之前对堆排序认识的不是很透彻&#xff0c;今天回过头来再把堆排序的知识整理整理&#xff01;以及排升序为什么要建大堆&#xff0c;排降序要建小堆。 正文&#xff1a; 首先我们要知道&#xff1a;   ①堆的逻辑是一颗完全二叉树&#xff1b;   ②它使…

残差网络Residual Networks-残差网络的创建、训练、测试、调参

残差网络的创建、训练、测试、调参加粗样式 在Keras中实现残差网络模型的创建&#xff0c;并通过模型来实现对图片的分类。 残差网络的预备知识 网络越深越好&#xff1f; 随着网络层级的不断增加&#xff0c;模型精度不断得到提升&#xff0c;而当网络层级增加到一定的数目…

堆排序,为什么升序排列要建大堆,降序排列要建小堆

堆排序中用到了建立大小堆和向下调整的内容&#xff0c;对这些内容有些不了解的同学可以去补一补专门写堆的博客&#xff0c;方便更好的理解堆排序数据结构之堆&#xff08;Heap&#xff09;&#xff0c;堆的相关操作&#xff0c;用堆模拟优先级队列。 如果把待排序序列分为未排…