首页 > Python资料 博客日记
Shp与GeoJSON数据相互转换(2024.7.15)
2024-10-29 05:00:05Python资料围观47次
Shp与GeoJSON数据转换学习 2024.7.15
引言
在实际的科研、工作和学习中,大家可能会面临数据转换的问题,之所以存在这样一个问题,是因为不同的数据格式在应对不同场景和需求时具有它自身的独特性及优势,比如有的数据格式占用空间少,利于网络传输
;有的数据进行了二进制加密,定义自己的特殊格式,将结果封装为产品为客户提供,安全性较高
;有的数据便于解析、分析和查看,方便调试和学习研究
;有的数据则兼顾不同平台使用,考虑软件使用生态,拥抱开源,促进人类交流进步
。
正所谓,学问有远近,术业有专攻
,很多时候人们往往更加关注结果,并不特别在意中间的实现过程,总是觉得许多东西的产生或者由来是理所当然的,殊不知前人花费了多少时间和精力,苦苦思索,总结凝练,重复实验,才有了如今的一系列理论、科学和技术成果,其中充满了智慧的结晶,彰显了真理的光芒,并非后人一言一语、不假思索所能评价和质疑。
1、简介
在空间信息领域,海量的点、线、面
数据经由外业人员利用高精设备采集、传输、内业处理、入库、质检和成果交付,最终得以保存,这些数据大多带有空间参考(地理位置),可以反映特定时空条件下某些区域所处的真实状态,如位置数据、地物要素数据、地表形变沉降数据、重力场监测数据等等。这些数据往往会以特定的数据格式(.dat、.csv、.txt、.xyz等)进行保存,其中地理信息领域较为知名且极具代表性的的数据格式当属ShapeFile
和GeoJSON
,这两类数据在表达属性数据
和几何数据
方面十分灵活,备受行业和用户青睐,用途极为广泛。当然,这里主要介绍两类数据的转换方法及具体实现过程。
1.1 Shp
Shp全称为ShapeFile
,顾名思义与形状有关,它是一种矢量数据文件标准格式,在GIS中应用广泛,由ESRI
(环境科学研究协会)设计的用于存储点、线、面等
多种几何类型数据,可包含地理实体要素的几何和属性信息,比如表达一条道路、一条河流、一个房屋、一座建筑、地形点高度、室内平面结构
等等。值得注意的是,shp文件并非单个文件,而是由多个文件组成,包含主文件.shp、索引文件.shx、dBASE表文件.dbf、投影文件.prj、.cpg、.sbn、.sbx。
1.1.1 示例数据
人们通常利用ArcGIS、QGIS、Google Earth、GlobalMapper
等专业软件打开shp
文件进行查看,当然互联网上存在许多在线网站可供下载shp
数据,如geoBoundaries、Natural Earth、OpenStreetMap、bbbike、国家基础地理信息中心等等。
|
|
|
|
1.2 GeoJSON
作为一种地理空间数据结构编码和交换的文件标准格式,GEOJSON由于采用JSON
(JavaScript Object Notation
)类型的树形存储方式,十分便于网络传输和在线解析。它支持Point
、LineString
、Polygon
、MultiPoint
、MultiLineString
、和 MultiPolygon
等几何类型,最小单元以Feature
为代表(含有属性properties
和几何geometry
),众多Feature
组成了FeatureCollection
集合。为了促进GeoJSON标准化工作,2015年IETF联合起草规范的作者们一起成立了GeoJSON工作组,在2016年8月发布了新版标准规范GeoJSON Specification——RFC 7946以替换 2008
版本的GeoJSON
规范,也可查看草稿版本。当然,GeoJSON
数据通常默认推荐以WGS 84参考椭球经纬度坐标系
为空间参考系统,因为其具有全球统一性且世界各国公认,其他的参考系统使用场景较少。
1.2.1 示例数据
GeoJSON数据一般可以通过WebGIS引擎来加载查看,如MapBox、Cesium、OpenLayers、LeafLet、ArcGIS API for JavaScript等。在线高德 JS API 中的GeoJSON 提供了 重庆的实例数据;MapBox官方示例中也提供了地震相关的点位数据;OpenLayers官网示例中包含加载GeoJSON
的样例数据;L7 Editor是蚂蚁提供的一款支持 GeoJSON、WKT
等 GIS
格式的地理数据可视编辑工具,可以在线绘制范围并生成对应数据以下载测试,同时阿里云数据可视化平台中提供的DataV Atlas可在线虚选择行政区界并支持下载对应的JSON
数据;此外,LeafLet官方示例提供了加载GeoJSON
的例子,同时提供了点、线、面GeoJSON数据,这些数据可供大家练习使用。
2、转换原理
参考ShapeFile和ESRI Shapefile Technical Description学习ShapeFile
的内部文件组织方式、数据存储结构、文件头读写方法等知识,同时参考geojson WG了解GeoJSON
数据的内部类型和组织方式,它们的本质均为矢量要素集合的表达,掌握全部的几何类型对象及要素属性存储结构,利用Python、Java、C#、C++
等高级编程语言读写文件进行转换即可,或者借助第三方依赖、开源类库和转换引擎,具体还可参考网上资料及Github进行最后的功能及效果实现。由于矢量GIS数据会涉及到空间参考(坐标系统),考虑到统一性及兼容性等原因,通常采用公认的WGS 84经纬度地理坐标系记性坐标的存储及转换,便于数据转换后的交换、重用及共享。
3、具体实现
下面主要介绍在线转换
和本地转换
两类方法,这两类方法尽管各有优劣,但可能最大的区别在于是否连接网络以及是否自主可控。顾名思义,在线转换就是利用网络上的在线工具进行数据的转换,需要自己寻找正规可靠的官网并谨慎使用,有条件的可以开通会员使用在线服务调用 ;本地转换则是将功能迁移至本地,在离线的计算机上使用相关软件或者编写程序代码实现自定义功能。
3.1 在线转换(联网方便但不推荐使用)
这里主要介绍三个在线转换工具mapshaper
、MapJS
和geojson.io
,其中前两个均可以进行GeoJSON与ShapeFile的相互转换
;而另一个在线工具仅能实现GeoJSON向ShapeFile的转换
。
3.1.1 mapshaper(Shp与GeoJSON互转)
mapshaper是用JavaScript
编写的用于编辑Shapefile、GeoJSON、TopoJSON、CSV
和其他几种数据格式的软件,它支持基本的地图制作任务,如简化形状、编辑属性数据、剪切、擦除、合并、过滤等处理操作,提供了交互式的web
接口。同时作为一个开源项目,其在Github平台已经收获3.7K
的Star
,好评如潮。
3.1.2 MapJS(Shp与GeoJSON互转)
MapJS是一款由BimAnt推出的GIS
地图数据在线查看与编辑工具应用,支持ShapeFile、GeoJSON、TopoJSON、KML、CSV、gzip以及zip压缩文件的在线查看。总体尔言,MapJS
应该是参考mapshaper开源项目重新修改后封装而成,因为样式UI与功能布局基本是完全相同。
3.1.3 geojson.io(GeoJSON转Shp——暂不可用)
geojson.io是一个快速、简单的工具,用于创建、查看和共享地图。geojson.io
以开源空间数据格式geojson
命名,它以各种方式支持geojson
,但也接受KML、GPX、CSV、GTFS、TopoJSON
和其他格式,支持输出保存为ShapeFile格式。
3.2 本地转换(安全灵活自主定制可控)
本地转换的原则在于不联网、单机本地离线处理,下面主要介绍三种方式进行转换实现:
(1)将mapshaper离线化使用以实现GeoJSON与ShapeFile的数据互转;
(2)Python编程实现ShapeFile向GeoJSON的数据转换;
(3)本地GeoJSON引擎实现ShapeFile向GeoJSON的数据转换。
3.2.1 离线版mapshaper(Shp与GeoJSON互转)
断网使用mapshaper离线版,数据转换操作方法与在线版相同,利用nginx发布离线版mapshaper
即可使用。
|
|
|
|
3.2.2 Python(Shp转GeoJSON)
这里使用Python
编译器,需要利用pip
安装依赖库gdal
和fiona
。
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
,在URL
的Get
请求的键值对当中删除分页参数即可范湖完整结果,最终浏览器访问不带分页的URL即可获得ShapeFile转换后的GeoJSON结果,可下载至本地使用。发布图层后查看GeoJSON数据的Url默认是会带分页的,为了获取所有的要素数据,可以去除maxFeatures
参数可得到最终包含完整GeoJSON数据的Url。
|
|
|
|
|
|
|
|
|
|
|
|
4、小结
矢量数据文件转换用途较为广泛,许多地理信息平台、空间大数据可视化平台、实景三维数据展示平台、城市基础信息模型平台、数字孪生平台
都离不开矢量空间数据的加载与展示,不同的平台接入不同的数据后台服务提供商,有时往往需要进行格式转换来兼容现有的引擎平台。真金不怕火炼,百炼方可成钢。面对实际的学习、生活和工作,有的事物看似简单实则一点也不简单,有的现象看似合理实则困难与疑点重重
。我们需要迎难而上,克服眼前困难,纵使心有羁绊,也应全力以赴、一往无前、付诸行动。
从一点一滴做起,战胜拖延、摆脱恐惧的唯一有效方法就是要迎难而上,开始行动。了解自己首先要了解周围的世界,观察万事万物后清楚自身的状态,理解运行的规律,时刻怀揣赤诚之心、谦虚向上之心,向优秀的前辈们学习其精神、品质、毅力与格局
,不断攀登一座又一座山峰,跨越重重障碍,纵使前方迷雾重重,顿时不知所往,仍需耐心谨慎,敬畏自然生命,积极探索发现,寻求科学真理。
标签:
相关文章
最新发布
- 【Python】selenium安装+Microsoft Edge驱动器下载配置流程
- Python 中自动打开网页并点击[自动化脚本],Selenium
- Anaconda基础使用
- 【Python】成功解决 TypeError: ‘<‘ not supported between instances of ‘str’ and ‘int’
- manim边学边做--三维的点和线
- CPython是最常用的Python解释器之一,也是Python官方实现。它是用C语言编写的,旨在提供一个高效且易于使用的Python解释器。
- Anaconda安装配置Jupyter(2024最新版)
- Python中读取Excel最快的几种方法!
- Python某城市美食商家爬虫数据可视化分析和推荐查询系统毕业设计论文开题报告
- 如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Python与PyTorch的版本对应
- Anaconda版本和Python版本对应关系(持续更新...)
- Python pyinstaller打包exe最完整教程
- Could not build wheels for llama-cpp-python, which is required to install pyproject.toml-based proj