Geojson文件转为shp

原json文件:
在这里插入图片描述
json里面有多个属性,其中需要提取这三个:
在这里插入图片描述

json转txt:

import os
import json
geojsonPath = r'D:\chenxiao\original_data'
outPath = r'D:\chenxiao\txt'
geojsonFiles = [o for o in os.listdir(geojsonPath) if o.endswith('.json') and 'GEDI' in o]
for file in geojsonFiles:
    with open(geojsonPath + '/' + file, 'r', encoding='utf8') as fp:
        data = json.load(fp)
        lonlat_num = 0
        Lon, Lat, PAI = [], [], []
        for item in data['features']:
            if item["properties"]["pai"] is not None:
                Lon.append(item["properties"]["Longitude"])
                Lat.append(item["properties"]["Latitude"])
                PAI.append(item["properties"]["pai"])
                lonlat_num += 1
            else:
                print("无”pai“字段,请检查文件类型!")
                break
    jsonFilename = file.split('.')
    with open(outPath + '/' + jsonFilename[0] + '.txt', 'w', encoding='utf8') as fp:
        fp.write("longtitude,latitude,pai\n")
        for l in range(0,lonlat_num-1):
            fp.write(("%.15f,%.15f,%.18f\n" %(Lon[l], Lat[l], PAI[l])))
        print("%s Finished!" % jsonFilename[0])

txt结果:
在这里插入图片描述

txt转shp:

# -*-coding:utf-8-*-
import shapefile as shp
import os

def trans_point(folder, delimiter=','):
    # create a point shapefile
    filepath = os.listdir(folder)
    for i in filepath:
        print(i)
        filepath_save = 'D:\\chenxiao\\shp\\'+i     #输出
        filepath_input = folder+i

        output_shp = shp.Writer(filepath_save, shp.POINT)
        output_shp.autoBalance = 1

        output_shp.field('longitude', 'F', 15)  # float
        output_shp.field('latitude', 'F', 15)  # float
        output_shp.field('pai', 'F', 15, 8)  # z
        #output_shp.field('elevation', 'F', 15, 8)

        with open(filepath_input, 'r', encoding='utf-8') as txtfile:
            reader = []
            count = 0
            for line in txtfile.readlines():
                if count == 0:
                    count = 1
                    continue
                else:
                    curLine = line.strip().split(",")
                    floatLine = list(map(float, curLine))  # 这里使用的是map函数直接把数据转化成为float类型
                    reader.append(floatLine[:])

            for row in reader:

                if len(row)==0:
                    break
                else:
                    lng= float(row[0])

                    lat = float(row[1])
                    pai = float(row[2])
                    #elevation = float(row[3])
                    output_shp.point(lng,lat)
                    # add attribute data
                    #output_shp.record(lng,lat,pai,elevation)
                    output_shp.record(lng, lat, pai)
    print("#####finish####")


if __name__ == '__main__':
    folder = 'D:\\chenxiao\\txt\\' #输入文件
    trans_point(folder)

或者:
在下面这个网址上将json先转为csv文件,再由csv转为shp
json转csv网址
csv转shp:

# -*-coding:utf-8-*-
import shapefile as shp
import os

def trans_point(folder, delimiter=','):
    # create a point shapefile
    filepath = os.listdir(folder)
    for i in filepath:
        print(i)
        filepath_save = 'D:\\chenxiao\\shp\\'+i     #输出
        filepath_input = folder+i

        output_shp = shp.Writer(filepath_save, shp.POINT)
        output_shp.autoBalance = 1

        output_shp.field('longitude', 'F', 15)  # float
        output_shp.field('latitude', 'F', 15)  # float
        output_shp.field('pai', 'F', 15, 8)  # z
        #output_shp.field('elevation', 'F', 15, 8)

        with open(filepath_input, 'r', encoding='utf-8') as txtfile:
            reader = []
            count = 0
            for line in txtfile.readlines():
                if count == 0:
                    count = 1
                    continue
                else:
                    curLine = line.strip().split(",")
                    floatLine = list(map(float, curLine))  # 这里使用的是map函数直接把数据转化成为float类型
                    reader.append(floatLine[:])

            for row in reader:

                if len(row)==0:
                    break
                else:
                    lng= float(row[0])

                    lat = float(row[1])
                    pai = float(row[2])
                    #elevation = float(row[3])
                    output_shp.point(lng,lat)
                    # add attribute data
                    #output_shp.record(lng,lat,pai,elevation)
                    output_shp.record(lng, lat, pai)
    print("#####finish####")


if __name__ == '__main__':
    folder = 'D:\\chenxiao\\txt\\' #输入文件
    trans_point(folder)

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值