一、简介

Shp格式是GIS中非常重要的数据格式,主要在Arcgis中使用,但在进行很多基于网页的空间数据可视化时,通常只接受GeoJSON格式的数据,众所周知JSON(JavaScript Object Nonation)是利用键值对+嵌套来表示数据的一种格式,以其轻量、易解析的优点,被广泛使用与各种领域,而GeoJSON就是指在一套规定的语法规则下用JSON格式存储矢量数据,本文就将针对GeoJSON的语法规则,以及如何利用Python完成Shp格式到GeoJSON格式的转换进行介绍。Python学习交流群:1004391443

二、Shp转GeoJSON

2.1 GeoJSON格式说明

GeoJSON本质依旧是JSON,其基本格式如下:

{"type": "FeatureCollection","features": []
}

一个完整的GeoJSON文件最外层为一个字典,把整个GeoJSON文件看做自顶向下的树状结构的话,其根目录包含键值对 "type":"FeaturesCollection" ,以及存放所有要素的键值对 "features":[] ,所有矢量要素都存放在这个列表中,每个要素都是一个字典,下面我们来认识一下各种矢量要素在GeoJSON中的规范格式:

点要素(Point):

对于单个点要素,其格式如下:

{"type":"Feature","properties":{value1,value2},"geometry":{"type":"Point","coordinates":[经度,纬度]}}

其中properties对应的值为这个要素对应的属性表中按顺序存放的值,geometry对应的值中type指明了要素类型,coordinates传入一个包含两个元素的列表,第一个元素代表经度,第二个元素代表纬度。

多点要素(MultiPoint):

多点要素是点要素的特殊情况,其geometry下的type属性传入"MultiPoint",其coordinates属性传入的是一个二维列表,其最内层列表定义了每个点的经纬度,如下:

{"type":"Feature","properties":{value1,value2},"geometry":{"type":"MultiPoint","coordinates":[[经度1,纬度1],[经度2,纬度2]]}}

线要素(LineString):

线要素记录的是一条线上所有折点的经纬度信息,只需要按顺序连接这些折点就可以还原一条线的形态,在GeoJSON中线要素与多点要素在coordinates属性上格式相同,区别在于geometry属性需要传入"LineString",如下:

{"type":"Feature","properties":{value1,value2},"geometry":{"type":"LineString","coordinates":[[经度1,纬度1],[经度2,纬度2],[经度3,纬度3],[经度4,,纬度4]]}}

多线要素(MultiLineString):

多线要素是多个线要素的组合,因此其coordinates传入三维列表,来组合多条线,对应的geometry下type属性为"MultiLineString",如下:

{"type":"Feature","properties":{value1,value2},"geometry":{"type":"MultiLineString","coordinates":[[[经度1,纬度1],[经度2,纬度2],[经度3,纬度3],[经度4,纬度4]],[[经度5,纬度5],[经度6,纬度6]]]}}

多边形要素(Polygon):

多边形要素记录了构成一个多边形所有边缘折点的经纬度信息,其coordinates属性传入"Polygon",其geometry下type属性格式为三维列表,其第三层列表中嵌套的所有列表记录的经纬度按顺序连接即构成了一个多边形,但需要注意的是,多边形头尾折点的经纬度需要相同,才能构成一个闭合的多边形,如下:

{"type":"Feature","properties":{value1,value2},"geometry":{"type":"Polygon","coordinates":[[[经度1,纬度1],[经度2,纬度2],[经度3,纬度3],[经度4,纬度4],[经度1,纬度1]]]}}

多多边形要素(MultiPolygon):

多多边形的格式为四维列表,其geometry下type属性传入"MultiPloygon",由于多多边形要素中存在几种特殊情况,下面我们在geojson.io中进行对应GeoJSON数据的可视化以便于理解:

互不重叠的两个多边形:

下面是互不重叠的两个多边形的示例:

对应的GeoJSON数据如下:

{"type": "Feature","properties": {},"geometry": {"type": "MultiPolygon","coordinates":[ [[[102.74414062499999,36.217687122250574],[102.7001953125,35.585851593232356],[104.8590087890625,35.496456056584165],[104.96337890625,36.24427318493909],[102.74414062499999,36.217687122250574]]],[[[102.6397705078125,35.074964853989556],[103.0352783203125,34.23905366851639],[105.00732421875,34.24813554589752],[105.3973388671875,35.77771427205079],[104.556884765625,35.05698043137265],[102.711181640625,35.16931803601131],[102.6397705078125,35.074964853989556]]]]}
}

可以看到在多个多边形不重叠时,直接将两个多边形要素对应的三维列表存放在最外层列表下即可。

互有重叠的两个多边形:

互有重叠的多个多边形要素格式同多个不重叠的多边形,效果如下:

对应的GeoJSON数据如下:

{"type": "Feature","properties": {},"geometry": {"type": "MultiPolygon","coordinates": [[[[101.6455078125,27.68352808378776],[114.78515624999999,27.68352808378776],[114.78515624999999, 35.209721645221386],[101.6455078125,35.209721645221386],[101.6455078125,27.68352808378776]]],[[[104.2822265625,30.107117887092357],[108.896484375,30.107117887092357],[108.896484375,33.76088200086917],[104.2822265625,33.76088200086917],[104.2822265625,30.107117887092357]]]]}
}

有孔的多边形:

有孔的多边形在类别上也是归类到MultiPolygon,下面是一个示例:

对应的GeoJSON数据如下,可以看出其与多个重叠的多边形的区别在于多边形矢量信息嵌套在第二层列表中:

{"type": "Feature","properties": {},"geometry": {"type": "MultiPolygon","coordinates":[ [[[101.6455078125,27.68352808378776],[114.78515624999999,27.68352808378776],[114.78515624999999,35.209721645221386],[101.6455078125,35.209721645221386],[101.6455078125,27.68352808378776]],[[104.2822265625,30.107117887092357],[108.896484375,30.107117887092357],[108.896484375,33.76088200086917],[104.2822265625,33.76088200086917],[104.2822265625,30.107117887092357]]]]}
}

2.2 将Shp格式转换为GeoJSON

在2.1中我们较为详细的了解到矢量数据在GeoJSON数据中具体的表现形式,通过下面的自编函数,以Shp文件名称(去除文件拓展名)、Shp文件编码、GeoJSON文件编码为输入参数:

def Shp2JSON(filename,shp_encoding='utf-8',json_encoding='utf-8'):'''这个函数用于将shp文件转换为GeoJSON文件:param filename: shp文件对应的文件名(去除文件拓展名):return:''''''创建shp IO连接'''reader = shapefile.Reader(filename,encoding=shp_encoding)'''提取所有field部分内容'''fields = reader.fields[1:]'''提取所有field的名称'''field_names = [field[0] for field in fields]'''初始化要素列表'''buffer = []for sr in tqdm(reader.shapeRecords()):'''提取每一个矢量对象对应的属性值'''record = sr.record'''属性转换为列表'''record = [r.decode('gb2312','ignore') if isinstance(r, bytes)else r for r in record]'''对齐属性与对应数值的键值对'''atr = dict(zip(field_names, record))'''获取当前矢量对象的类型及矢量信息'''geom = sr.shape.__geo_interface__'''向要素列表追加新对象'''buffer.append(dict(type="Feature",geometry=geom,properties=atr))'''写出GeoJSON文件'''geojson = codecs.open(filename + "-geo.json","w", encoding=json_encoding)geojson.write(json.dumps({"type":"FeatureCollection","features":buffer}) + '\n')geojson.close()print('转换成功!')

下面我们通过一个示例来展示实际转换效果,使用到的Shp数据为中国省份数据,在arcgis中效果如下:

import shapefile
import json
import codecs
def Shp2JSON(filename,shp_encoding='utf-8',json_encoding='utf-8'):'''这个函数用于将shp文件转换为GeoJSON文件:param filename: shp文件对应的文件名(去除文件拓展名):return:''''''创建shp IO连接'''reader = shapefile.Reader(filename,encoding=shp_encoding)'''提取所有field部分内容'''fields = reader.fields[1:]'''提取所有field的名称'''field_names = [field[0] for field in fields]'''初始化要素列表'''buffer = []for sr in tqdm(reader.shapeRecords()):'''提取每一个矢量对象对应的属性值'''record = sr.record'''属性转换为列表'''record = [r.decode('gb2312','ignore') if isinstance(r, bytes)else r for r in record]'''对齐属性与对应数值的键值对'''atr = dict(zip(field_names, record))'''获取当前矢量对象的类型及矢量信息'''geom = sr.shape.__geo_interface__'''向要素列表追加新对象'''buffer.append(dict(type="Feature",geometry=geom,properties=atr))'''写出GeoJSON文件'''geojson = codecs.open(filename + "-geo.json","w", encoding=json_encoding)geojson.write(json.dumps({"type":"FeatureCollection","features":buffer}) + '\n')geojson.close()print('转换成功!')
if __name__ == '__main__':import osos.chdir(r'C:\Users\hp\Desktop\飞线图素材')Shp2JSON(filename='bou2_4p.shp',shp_encoding='gbk',json_encoding='utf-8')

运行之后同一目录下出现对应的json文件:

导入到Kepler.gl中进行可视化:

from keplergl import KeplerGl
import json
with open('bou2_4p.shp-geo.json') as b:data = json.load(b)
map1 = KeplerGl(height=700,data={'layer1':data});map1

以上就是本文的全部内容,如有笔误望指出!

利用Python实现Shp格式向GeoJSON的转换!相关推荐

  1. 利用python实现m4a格式到MP3的转换

    实现m4a格式到MP3的转换 前言 安装ffmpeg库 安装pydub库 代码主体 前言 \quad 因为会议海报需要录制音频解说,但是手机录音机默认的格式是m4a的格式,不符合mp3的格式要求,所以 ...

  2. python输出jpg_利用python实现.dcm格式图像转为.jpg格式

    如下所示: import pydicom import matplotlib.pyplot as plt import scipy.misc import pandas as pd import nu ...

  3. python bmp转jpg_利用python实现.dcm格式图像转为.jpg格式

    如下所示: import pydicom import matplotlib.pyplot as plt import scipy.misc import pandas as pd import nu ...

  4. python图片保存jpg、show变成bmp_利用python实现.dcm格式图像转为.jpg格式

    如下所示: import pydicom import matplotlib.pyplot as plt import scipy.misc import pandas as pd import nu ...

  5. 免费利用python把pdf格式转docx

    免费利用python把pdf格式转docx,再也不用wps等要钱办公软件转文档了,不多说,直接上代码 1.首先导入pdf包,通过pip安装 pip install pdfplumber 2.开发代码上 ...

  6. Python把对应格式的csv文件转换成字典类型存储脚本的方法_python_脚本之家

    该脚本是为了结合之前的编写的脚本,来实现数据的比对模块,实现数据的自动化!由于数据格式是定死的,该代码只做参考,有什么问题可以私信我! CSV的数据格式截图如下: readDataToDic.py源代 ...

  7. python操作json_Python学习之利用Python处理JSON格式数据

    最近在研究利用zabbix的自动发现功能来监控一台服务器上的多个Redis端口.网上有篇文章写个Python程序来发现Redis端口并显示成JSON格式.这里就学习下Python如何处理JSON格式数 ...

  8. 利用python将长视频、长语音转换成文字教程 ,非常好用

    原本自己想弄一个语音转文本的,但是发现很多博客都说的不是自己想要的,原因有以下几点:1.因为百度接口支持的语音是pcm格式,而自己的是.mp3格式的文件. 2.百度只支持60s内的文件格式,而自己想要 ...

  9. 利用Python完成华氏度和摄氏度的转换

    1 问题 利用python如何完成华氏度和摄氏度的转换. 2 方法 Tempstr = input('请输入一个带有符号的温度值:')#输入带单位温度值 if Tempstr[-1] in ['c', ...

  10. 利用Python将WEBVTT格式的视频字幕文件转为SRT格式

    1 WebVTT & SRT 格式 WebVTT字幕格式与SRT字幕格式主要区别在于时间格式的区分. 下面是一个WebVTT格式的字幕文件 WEBVTT1 00:00:20.000 --> ...

最新文章

  1. objective-c 面试题
  2. 学习java应该如何理解反射?
  3. 大学电路题目怎么搜_电路(二),中国大学MOOC(慕课)答案公众号搜题
  4. 多进程/多线程同时向一个文件中写入日志如何避免冲突?
  5. java_codereview随笔
  6. IIS配置教程。。。。。
  7. 3.5k欧/m,HIIT 博士后招募,共48个项目可选
  8. ghost网络克隆功能实现【批量】计算机操作【系统的安装】,网络学习(三十)通过ghost的网络克隆功能实现操作系统的分发...
  9. 《Unix网络编程卷1:套接字联网API》读书笔记
  10. 前人栽树,后人擦屁股
  11. 栈的顺序存储结构框架搭建
  12. 使用iftop监控网卡实时流量
  13. 工业企业数据库处理——2.匹配样本
  14. 经典软件架构设计模式
  15. linux音频设备id,ubuntu下提取DSDT SSDT和声卡ID _ 黑苹果乐园
  16. 720nopenwrt设置打印服务器_打印服务器的ip配置及共享设置
  17. android远程输入法,远程输入法
  18. 最左前缀原则最左匹配原则
  19. 本以为java语言很难学,其实就学完下面这些知识,就能理解了
  20. 地球系统模式(CESM)技术

热门文章

  1. uni-app的生命周期
  2. 如何在5分钟内发现 SQL 语言中的数据血缘
  3. Process Hacker工具使用
  4. java青鸟影院项目_影院在线售票云平台(仿猫眼电影,附SpringBoot项目源码) 系统功能实现...
  5. java android开发框架_android开发的三大框架是什么?
  6. php 排除前后空格,php去除字符串前后空格的方法
  7. 小米手机鸿蒙开机动画,华为“鸿蒙”来了!开机动画美炸了,用PPT一分钟就搞定...
  8. 图灵机器人和ichat
  9. 别在花钱买Java资料了!自学Java必备的干货合集免费给你(含珍藏电子书)
  10. PDFLib9以上版本的去水印办法