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

本文介绍了如何基于OpenStreetMap(OSM)数据准备和发布图层,涉及OSM字段说明,如道路、水路、铁路、设施、土地类型等,并提供了创建建筑物、地名、道路、河流、水域等图层的SQL语句,为地图渲染和GIS应用提供基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、准备工作

 

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,aeroway
		FROM planet_osm_polygon
		WHERE
		( "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 null
				WHEN name in ('澳門 Macau', '香港 Hong Kong') and place = 'city' THEN '4'
        ELSE capital END) as capital,
        amenity 
  FROM planet_osm_point
  WHERE 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'::text
      else 'no'::text end as tunnel,
    case when service IN ( 'parking_aisle',
      'drive_through','driveway' ) then 'INT_minor'::text
      else service end as service
  FROM planet_osm_line
  WHERE highway IS NOT NULL
  OR "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_line
  WHERE "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_line
  WHERE "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_polygon
  WHERE "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,aeroway
		FROM planet_osm_polygon
		WHERE
		( "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 null
				WHEN name in ('澳門 Macau', '香港 Hong Kong') and place = 'city' THEN '4'
        ELSE capital END) as capital,
        amenity 
  FROM planet_osm_point
  WHERE 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'::text
      else 'no'::text end as tunnel,
    case when service IN ( 'parking_aisle',
      'drive_through','driveway' ) then 'INT_minor'::text
      else service end as service
  FROM planet_osm_line
  WHERE highway IS NOT NULL
  OR "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_line
  WHERE "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_line
  WHERE "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_polygon
  WHERE "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中。

### OpenStreetMap 长沙 数据下载与使用 #### 数据下载方法 OpenStreetMap 提供了多种方式来获取特定区域的数据。对于长沙市的地理数据,可以通过以下几种途径完成下载: 1. **通过 Overpass Turbo 工具** Overpass Turbo 是一种交互式的 API 查询工具,允许用户定义查询范围并提取所需数据。可以访问其网站 [Overpass Turbo](http://overpass-turbo.eu/) 并绘制一个覆盖长沙地区的多边形区域,随后运行预设脚本以导出 GeoJSON 或 OSM XML 文件格式[^1]。 2. **GeoFabrik 下载服务器** 地址为 [https://download.geofabrik.de/asia/china.html](https://download.geofabrik.de/asia/china.html),这里提供了中国各省份以及部分城市的最新 OSM 数据文件。虽然可能不单独提供长沙市区的具体切片,但可以选择湖南省的整体数据集进行进一步筛选处理[^2]。 3. **Planet.osm自定义裁剪** 如果需要更高精度控制,则可以从全球完整的每日更新镜像站点 [https://planet.openstreetmap.org/](https://planet.openstreetmap.org/) 获取整个地球的地图数据存档,并借助第方软件如 `osmium-tool` 对目标地区——即长沙市域内的兴趣点(POIs)、道路网络等要素执行精确切割操作[^3]。 #### 数据解析与应用实例 一旦成功取得原始形式的 OSM 数据之后,就需要考虑如何将其转换成适合具体项目需求的形式。以下是几个常见应用场景及其对应的技术实现方案: - **导入 PostgreSQL 数据库** 利用开源工具链组合包括但不限于 GDAL/OGR 库或者专门针对此目的开发出来的 osm2pgsql 实现快速加载矢量图层到关系型数据库表结构当中去以便后续复杂空间运算支持。 - **可视化渲染** 借助 Leaflet.js 或者 Mapbox GL JS 这样的前端 JavaScript 映射类库,在网页端呈现经过样式美化后的动态效果;另外还有桌面 GIS 软件 QGIS 支持直接打开 .pbf/.shp 类型文档从而方便快捷地浏览整体布局特征. ```javascript // 示例:Leaflet 加载 OSM 瓦片服务 var map = L.map('map').setView([28.21, 112.94], 10); // 设置中心坐标为长沙经纬度 L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors' }).addTo(map); ``` #### 注意事项 由于 OSM 社区贡献性质决定其质量参差不齐,因此在实际工程项目里务必验证所依赖基础资料的有效性和时效性。此外考虑到版权归属问题,请严格遵循许可协议条款合理合法运用相关内容资源。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DXgiser

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值