python处理矢量数据格式转换,shp转为geojson,geojson转为pbf,pbf转为geojson

矢量数据转geojson/pbf

需求:读取矢量shp面数据,将其转为可以进行geoserver发布使用的pbf/geojson格式
步骤:

  • 读取shp数据
  • 处理矢量数据,重构为geojson格式
  • 输出geojson数据
  • 压缩pbf格式
import geopandas 
import geobuf
# 读取shp数据
shpdata = geopandas.GeoDataFrame.from_file(shpfile)
# 获取box
box = list(shpdata.total_bounds)
# 获取feature信息
for i in range(len(shpdata)):
	geo = shpdata.geometry[0]
	feature = geo.__geo_interface__
	if feature['type'] == 'MultiPolygon':
	    group = feature["coordinates"]
	    feas = []
	    # 多面的处理方式
	    for i in range(len(group)):
	        fea = group[i]
	        feas.append([list(map(list,fea[0]))])
	    print(enname)
	    _feature = {
	    "type":"Feature",
	    "properties":{
	    "id":id[key],
	    "name":enname
	    },
	    "geometry":{
	    "type":'MultiPolygon',
	    "coordinates":feas
	    }
	    }
	elif feature['type'] == 'Polygon':
	    _feature = {
	        "type":"Feature",
	        "properties":{
	        "id":id[key],
	        "name":enname
	        },
	        "geometry":{
	        "type":feature['type'],
	        "coordinates":[list(map(list,feature["coordinates"][0]))]
	        }
	    }
	features.append(_feature)
geojson = {
        "type": "FeatureCollection",
        "box": box,
        "features":features
    }
#写出json
outfile = 'test'.json'
with open(outfile,'w+',encoding='utf-8') as fp:
    fp.write(json.dumps(geojson))
# 将geojson数据压缩为pbf格式
ed = geobuf.encode(geojson)
outpbf = os.path.splitext(outfile)[0]+'.pbf'
with open(outpbf, "wb") as f:
    f.write(ed)
print("pbf write success")

pbf/json转为shp

需求:解码地图数据pbf格式,将其转为明文的json,进一步转为shp
步骤:

  • 读取pbf文件
  • 解析pbf文件
  • 存储为json文件
  • geopands读取json文件
  • 存为shp文件
from osgeo import ogr
from osgeo.gdalconst import GA_ReadOnly
import geopandas
driver = ogr.GetDriverByName("MVT")
pbf_file_list = '/luxl/LSYS/PBF'
for infile in os.listdir(pbf_file_list):
    data_source = driver.Open(os.path.join(pbf_file_list,infile), GA_ReadOnly)  # get data source
    layer_num = data_source.GetLayerCount()
    for i in range(layer_num):
        layer = data_source.GetLayer(i)  # get layers in data source
        layer_name = layer.GetName()  # get layer name 
        for feature in layer:  # get feature in layer
                geometry = feature.ExportToJson()  # get geometry in feature
                print(json.loads(geometry))
                with open(os.path.join(pbf_file_list,infile)+'.json','w+',encoding='utf-8') as fp:
                    fp.write(json.dumps(json.loads(geometry))) # geometry是字符串格式,需要json.loads转为字典格式
# 测试样例
jsondata = geopandas.read_file(os.path.join(pbf_file_list,infile)+'.json') # 读取json文件
# to write shpfile from geojson
localPath = maskname+'.shp'#用于存放生成的文件
jsondata.to_file(localPath, driver='ESRI Shapefile', encoding='utf-8')
print("--保存成功,文件存放位置:"+localPath)
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Shapefile (shp) 和 GeoJSON 都是常见的矢量数据格式,它们都能够存储点、线、面等矢量地理数据信息。下面是它们的一些结构和异同点: 结构: - Shapefile 由多个文件组成,包括 .shp 文件、.dbf 文件、.shx 文件等。其中,.shp 文件存储矢量地理数据信息,.dbf 文件存储属性数据,.shx 文件存储索引信息。 - GeoJSON 是一种基于 JSON 的格式,它只包含一个文件,其中存储了矢量地理数据信息和属性数据。 异同: - Shapefile 是ESRI公司开发的一种矢量数据格式,而 GeoJSON 是一种开放标准格式,因此 GeoJSON 可以被更多的 GIS 软件支持。 - Shapefile 存储的矢量地理数据信息和属性数据是分别存储在不同的文件中的,而 GeoJSON 是统一存储在一个文件中的。 - Shapefile 可以存储多个几何体,而 GeoJSON 只能存储一个几何体。 - GeoJSON 支持更多的几何体类型,如三角形、多边形、多点等,而 Shapefile 只支持点、线、多边形等几何体类型。 实现二者互转互通: 可以使用许多 GIS 软件或在线转换工具将 Shapefile 转换GeoJSON 或将 GeoJSON 转换为 Shapefile。下面是一个使用 Python 的示例: - 将 Shapefile 转换GeoJSON: ```python import geopandas as gpd shp_file = 'path/to/shapefile.shp' geojson_file = 'path/to/geojson.json' # 读取 Shapefile 文件 gdf = gpd.read_file(shp_file) # 将 GeoDataFrame 转换GeoJSON 格式 gdf.to_file(geojson_file, driver='GeoJSON') ``` - 将 GeoJSON 转换为 Shapefile: ```python import geopandas as gpd geojson_file = 'path/to/geojson.json' shp_file = 'path/to/shapefile.shp' # 读取 GeoJSON 文件 gdf = gpd.read_file(geojson_file) # 将 GeoDataFrame 转换为 Shapefile 格式 gdf.to_file(shp_file, driver='ESRI Shapefile') ``` 需要注意的是,在转换时需要保证矢量地理数据信息和属性数据的字段类型和对应关系一致。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值