Shp与GeoJSON数据相互转换(2024.7.15)

引言

        在实际的科研、工作和学习中,大家可能会面临数据转换的问题,之所以存在这样一个问题,是因为不同的数据格式在应对不同场景和需求时具有它自身的独特性及优势,比如有的数据格式占用空间少,利于网络传输有的数据进行了二进制加密,定义自己的特殊格式,将结果封装为产品为客户提供,安全性较高有的数据便于解析、分析和查看,方便调试和学习研究有的数据则兼顾不同平台使用,考虑软件使用生态,拥抱开源,促进人类交流进步

        正所谓,学问有远近,术业有专攻,很多时候人们往往更加关注结果,并不特别在意中间的实现过程,总是觉得许多东西的产生或者由来是理所当然的,殊不知前人花费了多少时间和精力,苦苦思索,总结凝练,重复实验,才有了如今的一系列理论、科学和技术成果,其中充满了智慧的结晶,彰显了真理的光芒,并非后人一言一语、不假思索所能评价和质疑。

1、简介

        在空间信息领域,海量的点、线、面数据经由外业人员利用高精设备采集、传输、内业处理、入库、质检和成果交付,最终得以保存,这些数据大多带有空间参考(地理位置),可以反映特定时空条件下某些区域所处的真实状态,如位置数据地物要素数据地表形变沉降数据重力场监测数据等等。这些数据往往会以特定的数据格式(.dat、.csv、.txt、.xyz等)进行保存,其中地理信息领域较为知名且极具代表性的的数据格式当属ShapeFileGeoJSON,这两类数据在表达属性数据几何数据方面十分灵活,备受行业和用户青睐,用途极为广泛。当然,这里主要介绍两类数据的转换方法及具体实现过程。

1.1 Shp

        Shp全称为ShapeFile,顾名思义与形状有关,它是一种矢量数据文件标准格式,在GIS中应用广泛,由ESRI(环境科学研究协会)设计的用于存储点、线、面等多种几何类型数据,可包含地理实体要素的几何属性信息,比如表达一条道路、一条河流、一个房屋、一座建筑、地形点高度、室内平面结构等等。值得注意的是,shp文件并非单个文件,而是由多个文件组成,包含主文件.shp、索引文件.shx、dBASE表文件.dbf、投影文件.prj、.cpg、.sbn、.sbx

shp数据文件结构(样例)

1.1.1 示例数据

        人们通常利用ArcGIS、QGIS、Google Earth、GlobalMapper等专业软件打开shp文件进行查看,当然互联网上存在许多在线网站可供下载shp数据,如geoBoundariesNatural EarthOpenStreetMapbbbike国家基础地理信息中心等等。

geoBoundaries官网
Natural Earth官网
OpenStreetMap官网
bbbike
geoBoundaries-BEL-ADM3-all(源自geoBoundaries)

1.2 GeoJSON

        作为一种地理空间数据结构编码和交换的文件标准格式,GEOJSON由于采用JSONJavaScript Object Notation)类型的树形存储方式,十分便于网络传输和在线解析。它支持PointLineStringPolygonMultiPointMultiLineString、和 MultiPolygon等几何类型,最小单元以Feature为代表(含有属性properties和几何geometry),众多Feature组成了FeatureCollection集合。为了促进GeoJSON标准化工作,2015年IETF联合起草规范的作者们一起成立了GeoJSON工作组,在2016年8月发布了新版标准规范GeoJSON Specification——RFC 7946以替换 2008版本的GeoJSON规范,也可查看草稿版本。当然,GeoJSON数据通常默认推荐以WGS 84参考椭球经纬度坐标系为空间参考系统,因为其具有全球统一性且世界各国公认,其他的参考系统使用场景较少。

1.2.1 示例数据

高德JS开放平台

        GeoJSON数据一般可以通过WebGIS引擎来加载查看,如MapBox、Cesium、OpenLayers、LeafLet、ArcGIS API for JavaScript等。在线高德 JS API 中的GeoJSON 提供了 重庆的实例数据MapBox官方示例中也提供了地震相关的点位数据OpenLayers官网示例中包含加载GeoJSON的样例数据;L7 Editor是蚂蚁提供的一款支持 GeoJSON、WKTGIS 格式的地理数据可视编辑工具,可以在线绘制范围并生成对应数据以下载测试,同时阿里云数据可视化平台中提供的DataV Atlas可在线虚选择行政区界并支持下载对应的JSON数据;此外,LeafLet官方示例提供了加载GeoJSON的例子,同时提供了点、线、面GeoJSON数据,这些数据可供大家练习使用。

蚂蚁的L7 Editor
阿里云的DataV Atlas

2、转换原理

        参考ShapeFileESRI Shapefile Technical Description学习ShapeFile的内部文件组织方式、数据存储结构、文件头读写方法等知识,同时参考geojson WG了解GeoJSON数据的内部类型和组织方式,它们的本质均为矢量要素集合的表达,掌握全部的几何类型对象及要素属性存储结构,利用Python、Java、C#、C++等高级编程语言读写文件进行转换即可,或者借助第三方依赖、开源类库和转换引擎,具体还可参考网上资料及Github进行最后的功能及效果实现。由于矢量GIS数据会涉及到空间参考(坐标系统),考虑到统一性及兼容性等原因,通常采用公认的WGS 84经纬度地理坐标系记性坐标的存储及转换,便于数据转换后的交换、重用及共享

3、具体实现

        下面主要介绍在线转换本地转换两类方法,这两类方法尽管各有优劣,但可能最大的区别在于是否连接网络以及是否自主可控。顾名思义,在线转换就是利用网络上的在线工具进行数据的转换,需要自己寻找正规可靠的官网并谨慎使用,有条件的可以开通会员使用在线服务调用本地转换则是将功能迁移至本地,在离线的计算机上使用相关软件或者编写程序代码实现自定义功能

3.1 在线转换(联网方便但不推荐使用)

        这里主要介绍三个在线转换工具mapshaperMapJSgeojson.io,其中前两个均可以进行GeoJSON与ShapeFile的相互转换;而另一个在线工具仅能实现GeoJSON向ShapeFile的转换

3.1.1 mapshaper(Shp与GeoJSON互转)

        mapshaper是用JavaScript编写的用于编辑Shapefile、GeoJSON、TopoJSON、CSV和其他几种数据格式的软件,它支持基本的地图制作任务,如简化形状、编辑属性数据、剪切、擦除、合并、过滤等处理操作,提供了交互式的web接口。同时作为一个开源项目,其在Github平台已经收获3.7KStar,好评如潮。

Github上的mapshaper
mapshaper在线转换步骤演示

3.1.2 MapJS(Shp与GeoJSON互转)

        MapJS是一款由BimAnt推出的GIS地图数据在线查看与编辑工具应用,支持ShapeFile、GeoJSON、TopoJSON、KML、CSV、gzip以及zip压缩文件的在线查看。总体尔言,MapJS应该是参考mapshaper开源项目重新修改后封装而成,因为样式UI与功能布局基本是完全相同

MapJS 在线转换步骤演示

3.1.3 geojson.io(GeoJSON转Shp——暂不可用)

        geojson.io是一个快速、简单的工具,用于创建、查看和共享地图。geojson.io以开源空间数据格式geojson命名,它以各种方式支持geojson,但也接受KML、GPX、CSV、GTFS、TopoJSON和其他格式,支持输出保存为ShapeFile格式。

geojson.io 在线GeoJSON转Shp步骤演示

3.2 本地转换(安全灵活自主定制可控)

        本地转换的原则在于不联网、单机本地离线处理,下面主要介绍三种方式进行转换实现:
      (1)将mapshaper离线化使用以实现GeoJSON与ShapeFile的数据互转
      (2)Python编程实现ShapeFile向GeoJSON的数据转换
      (3)本地GeoJSON引擎实现ShapeFile向GeoJSON的数据转换

3.2.1 离线版mapshaper(Shp与GeoJSON互转)

        断网使用mapshaper离线版,数据转换操作方法与在线版相同,利用nginx发布离线版mapshaper即可使用。

在这里插入图片描述

离线版mapshaper打开shp
离线版mapshaper将shp转geojson
离线版mapshaper打开geojson
离线版mapshaper将geojson转shp

3.2.2 Python(Shp转GeoJSON)

        这里使用Python编译器,需要利用pip安装依赖库gdalfiona

import codecs
import json
import fiona

# 输入的Shapefile文件路径
shapefile_path = 'test/input.shp'

# 使用fiona读取Shapefile
with fiona.open(shapefile_path, 'r') as shapefile:
    # 将每个要素转换为GeoJSON字典
    geojson_features = [
        {
            "type": "Feature",
            "properties": {
                key: value for key, value in feature["properties"].items()
            },
            "geometry": feature["geometry"]
        } for feature in shapefile
    ]

# 创建GeoJSON字典
geojson = {
    "type": "FeatureCollection",
    "features": geojson_features
}

n = len(geojson_features)
# 输出GeoJSON文件路径
geojson_output_path = 'test/output.json'

for i in range(0, n):
    geomI = geojson_features[i]['geometry']
    geometry_json = json.dumps(geomI.__geo_interface__)
    geojson_features[i]['geometry'] = json.loads(geometry_json)
# 将GeoJSON字典写入文件
# with open(geojson_output_path, 'w') as f:
#     json.dump(geojson, f)
print(geojson)
#
ws = codecs.open(geojson_output_path, "w", encoding='utf-8')
ws.write(json.dumps(geojson, ensure_ascii=False, indent=4) + '\n')
ws.close()
print('转换成功!')

3.2.3 本地GeoServer(Shp转GeoJSON)

        在一台已安装好GeoServer的机器上,访问部署页面,登录管理员默认账号后新建工作空间,之后新建仓库,在仓库中上传ShapeFile文件发布图层,设置坐标系为WGS84(EPSG:4326),设置视图的经纬度范围从数据中自动获取,发布成功后点击图层预览,找到发布的图层,在对应行的下拉栏中选择GeoJSON后则可查看转换后的结果,当然默认是带分页的URL,在URLGet请求的键值对当中删除分页参数即可范湖完整结果,最终浏览器访问不带分页的URL即可获得ShapeFile转换后的GeoJSON结果,可下载至本地使用。发布图层后查看GeoJSON数据的Url默认是会带分页的,为了获取所有的要素数据,可以去除maxFeatures参数可得到最终包含完整GeoJSON数据的Url

本地GeoServer
新建工作区
工作区命名并保存
添加数据存储
新建数据源->ShapeFile
矢量数据源命名并设置参数
保存并发布图层
查看发布图层
OpenLayers预览
选择输出为GeoJSON
浏览器查看转换后的GeoJSON
保存GeoJSON至本地
geojson.io在线查看转换后的GeoJSON

4、小结

        矢量数据文件转换用途较为广泛,许多地理信息平台、空间大数据可视化平台、实景三维数据展示平台、城市基础信息模型平台、数字孪生平台都离不开矢量空间数据的加载与展示,不同的平台接入不同的数据后台服务提供商,有时往往需要进行格式转换来兼容现有的引擎平台。真金不怕火炼,百炼方可成钢。面对实际的学习、生活和工作,有的事物看似简单实则一点也不简单,有的现象看似合理实则困难与疑点重重。我们需要迎难而上,克服眼前困难,纵使心有羁绊,也应全力以赴、一往无前、付诸行动。

        从一点一滴做起,战胜拖延、摆脱恐惧的唯一有效方法就是要迎难而上开始行动。了解自己首先要了解周围的世界,观察万事万物后清楚自身的状态,理解运行的规律,时刻怀揣赤诚之心、谦虚向上之心,向优秀的前辈们学习其精神、品质、毅力与格局,不断攀登一座又一座山峰,跨越重重障碍,纵使前方迷雾重重,顿时不知所往,仍需耐心谨慎,敬畏自然生命,积极探索发现,寻求科学真理

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值