相关推荐recommended
Linux【OSMCTools 02】OpenStreetMap数据处理工具OSMCTools使用osmconvert命令截取省市级pbf文件(行政区划边界数据+SQL+Shell脚本)
作者:mmseoamin日期:2024-04-30

链接:https://pan.baidu.com/s/1qPSQ_JdqVOsXa6yLF3abfg?pwd=1eg1

提取码:1eg1

链接包含数据

  • 全国行政区划数据.sql
  • 拼接裁切脚本.sql
  • get.sh

    osmconvert命令截取省市级pbf文件

    • 1.说明
    • 2.步骤
      • 2.1 基础数据
      • 2.2 使用SQL获取命令
      • 2.3 脚本
      • 3.验证
      • 4.其他

        1.说明

        • OpenStreetMap的下载地址(下载文件china-latest.osm.pbf):Geofabrik Download Server
        • OSMCTools的GitHub地址:https://github.com/ramunasd/osmctools

          osmconvert是一个用于处理OSM(OpenStreetMap)地图数据的命令行工具。它可以将OSM地图文件从一种格式转换成另一种格式,比如OSM XML文件转换成PBF(Protocolbuffer Binary Format)、CSV(Comma Separated Values)、Shapefile等格式,并且可以对地图数据进行筛选、剪切、合并等操作。osmconvert是开源软件,支持Linux、macOS和Windows平台。

          本文主要是将较大的china-latest.osm.pbf(980M-20230522)通过osmconvert裁切为较小的以省或市为单位的数据。

          2.步骤

          2.1 基础数据

          基础的行政区划数据来源自网络,通过QGIS导出,执行全国行政区划数据.sql将数据导入数据库(PostgreSQL数据已安装GIS插件)获取到如下记录:

          Linux【OSMCTools 02】OpenStreetMap数据处理工具OSMCTools使用osmconvert命令截取省市级pbf文件(行政区划边界数据+SQL+Shell脚本),image.png,第1张

          2.2 使用SQL获取命令

          使用如下SQL获取市级行政区划的边界,SQL进行了以下操作:

          • 获取做小经纬度和最大经纬度(方形区域)
          • 进行0.01的偏移,并保留9位小数(可根据需要的精度进行调整)
          • 拼接工具的裁切命令(命令如何使用可参考上篇博文)
            SELECT
            	'osmconvert china-latest.osm.pbf -b=' || min_lon || ',' || min_lat || ',' || max_lon || ',' || max_lat || ' --hash-memory="2048M" --complete-ways --out-pbf -o=' || prov || '-' || city || '.osm.pbf' AS command
            FROM
            	(
            	SELECT
            		"省" AS prov,
            		"市" AS city,
            		CAST ( ST_XMin ( ST_Extent ( wkb_geometry ) ) - 0.01 AS NUMERIC ( 13, 9 ) ) AS min_lon,
            		CAST ( ST_YMin ( ST_Extent ( wkb_geometry ) ) - 0.01 AS NUMERIC ( 13, 9 ) ) AS min_lat,
            		CAST ( ST_XMax ( ST_Extent ( wkb_geometry ) ) + 0.01 AS NUMERIC ( 13, 9 ) ) AS max_lon,
            		CAST ( ST_YMax ( ST_Extent ( wkb_geometry ) ) + 0.01 AS NUMERIC ( 13, 9 ) ) AS max_lat 
            	FROM
            		"行政区划" 
            	GROUP BY
            		"省",
            		"市" 
            	ORDER BY
            		"省",
            	"市" 
            	) T
            

            SQL的执行结果如下(仅河南省的数据):

            Linux【OSMCTools 02】OpenStreetMap数据处理工具OSMCTools使用osmconvert命令截取省市级pbf文件(行政区划边界数据+SQL+Shell脚本),image.png,第2张

            2.3 脚本

            shell脚本一定要注意文件的编码格式为UNIX而不是Dos\Windows它们的换行符是不同的:

            #!/bin/bash
            echo "开始裁切...河南省-三门峡市"
            osmconvert china-latest.osm.pbf -b=110.345025689,33.541992497,112.036125086,35.094135922 --hash-memory="2048M" --complete-ways --out-pbf -o=河南省-三门峡市.osm.pbf
            echo "开始裁切...河南省-信阳市"
            osmconvert china-latest.osm.pbf -b=113.694307643,31.374368780,115.948258346,32.672150593 --hash-memory="2048M" --complete-ways --out-pbf -o=河南省-信阳市.osm.pbf
            

            脚本执行结果:

            Linux【OSMCTools 02】OpenStreetMap数据处理工具OSMCTools使用osmconvert命令截取省市级pbf文件(行政区划边界数据+SQL+Shell脚本),image.png,第3张

            可有看出,裁切后的市级数据变得很小了。

            3.验证

            将河南的行政区划和南阳市的裁切结果放到工具里查看,结果可用:

            Linux【OSMCTools 02】OpenStreetMap数据处理工具OSMCTools使用osmconvert命令截取省市级pbf文件(行政区划边界数据+SQL+Shell脚本),image.png,第4张

            由于进行了一定的范围扩大,会多覆盖一些区域,这个可以根据需要进行调整。

            4.其他

            省级的SQL为:

            SELECT
            	'osmconvert china-latest.osm.pbf -b=' || min_lon || ',' || min_lat || ',' || max_lon || ',' || max_lat || ' --hash-memory="2048M" --complete-ways --out-pbf -o=' || prov || '.osm.pbf' AS command 
            FROM
            	(
            	SELECT
            		"省" AS prov,
            		CAST ( ST_XMin ( ST_Extent ( wkb_geometry ) ) - 0.01 AS NUMERIC ( 13, 9 ) ) AS min_lon,
            		CAST ( ST_YMin ( ST_Extent ( wkb_geometry ) ) - 0.01 AS NUMERIC ( 13, 9 ) ) AS min_lat,
            		CAST ( ST_XMax ( ST_Extent ( wkb_geometry ) ) + 0.01 AS NUMERIC ( 13, 9 ) ) AS max_lon,
            		CAST ( ST_YMax ( ST_Extent ( wkb_geometry ) ) + 0.01 AS NUMERIC ( 13, 9 ) ) AS max_lat 
            	FROM
            		"行政区划" 
            	GROUP BY
            		"省" 
            	ORDER BY
            	"省" 
            	) T