python gdal,ogr实现geojson转shpfile

2023-05-16

本文修改自:【python】geoJson转换Shapefile

gdal,ogr实现geojson转shpfile

import json
import gdal
from osgeo import ogr


def create_polygon(coords):
    ring = ogr.Geometry(ogr.wkbLinearRing)
    for coord in coords:
        for xy in coord:
            ring.AddPoint(xy[0], xy[1])

            poly = ogr.Geometry(ogr.wkbPolygon)
            poly.AddGeometry(ring)
    return poly.ExportToWkt()


def create_shp_with_geoJson(json, shpFile):
    gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")
    gdal.SetConfigOption("SHAPE_ENCODING", "GBK")
    driver = ogr.GetDriverByName("ESRI Shapefile")
    polygon_data_source = driver.CreateDataSource(shpFile)
    polygon_layer = polygon_data_source.CreateLayer("Vector", geom_type=ogr.wkbPolygon)
    field_testfield = ogr.FieldDefn("polygon", ogr.OFTString)
    field_testfield.SetWidth(254)
    polygon_layer.CreateField(field_testfield)

    '''
    polygon_data_source = driver.CreateDataSource(shpFile)
    point_layer = polygon_data_source.CreateLayer("Point", geom_type=ogr.wkbPoint)
    field_testfield = ogr.FieldDefn("point", ogr.OFTString)
    field_testfield.SetWidth(254)
    point_layer.CreateField(field_testfield)

    polygon_data_source = driver.CreateDataSource(shpFile)
    polyline_layer = polygon_data_source.CreateLayer("Line", geom_type=ogr.wkbLineString)
    field_testfield = ogr.FieldDefn("polyline", ogr.OFTString)
    field_testfield.SetWidth(254)
    polyline_layer.CreateField(field_testfield)
    '''

    for i in json['features']:
        geo = i.get("geometry")
        geo_type = geo.get('type')

        if geo_type == 'Polygon':
            # Polygon

            polygonCOOR = geo.get('coordinates')
            poly = create_polygon(polygonCOOR)
            if poly:
                feature = ogr.Feature(polygon_layer.GetLayerDefn())
                feature.SetField('polygon', 'polygon')
                area = ogr.CreateGeometryFromWkt(poly)
                feature.SetGeometry(area)
                polygon_layer.CreateFeature(feature)
                feature = None
        elif geo_type == "MultiPolygon":
            # 简单操作
            feature = ogr.Feature(polygon_layer.GetLayerDefn())
            feature.SetField('polygon', "polygon")

            gjson = ogr.CreateGeometryFromJson(str(geo))
            if gjson:
                feature.SetGeometry(gjson)
                polygon_layer.CreateFeature(feature)
                feature = None
        '''
        elif geo_type == "Point":
            # Point
            feature = ogr.Feature(point_layer.GetLayerDefn())
            feature.SetField('point', "point")

            point_geo = ogr.CreateGeometryFromJson(str(geo))
            if point_geo:
                feature.SetGeometry(point_geo)
                point_layer.CreateFeature(feature)
                feature = None
            pass
        elif geo_type == "LineString":
            # line
            feature = ogr.Feature(polyline_layer.GetLayerDefn())
            feature.SetField('polyline', "polyline")

            line_geo = ogr.CreateGeometryFromJson(str(geo))
            if line_geo:
                feature.SetGeometry(line_geo)
                polyline_layer.CreateFeature(feature)
                feature = None
            pass
        else:
            print('Could not discern geometry')
        '''


#
# geojson to shp
fg = 'input.geojson'
fs = 'out.shp'
with open(fg, 'r') as ff:
    temp = json.loads(ff.read())
    create_shp_with_geoJson(temp, fs)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python gdal,ogr实现geojson转shpfile 的相关文章

  • 根据随机选择的列生成随机天数

    我有一个如下所示的数据框 感谢 SO 社区在以下方面提供的帮助 df1 pd DataFrame person id 11 11 12 13 14 date birth 01 01 1961 12 30 1961 05 29 1967 01
  • 如何查找分布式dask中任务失败的原因?

    我正在开发一个分布式计算系统dask distributed 我通过以下方式提交给它的任务Executor map功能有时会失败 而其他看起来相同的功能却可以成功运行 该框架是否提供了诊断问题的方法 update我所说的失败是指增加 Bok
  • 如何有条件地组合两个相同形状的 numpy 数组

    这听起来很简单 但我想我把它想得太复杂了 我想创建一个数组 其元素是从两个形状相同的源数组生成的 具体取决于源数组中哪个元素更大 为了显示 import numpy as np array1 np array 2 3 0 array2 np
  • 无法将 datetime.datetime 与 datetime.date 进行比较

    我有以下代码并收到上述错误 由于我是 python 新手 我无法理解这里的语法以及如何修复错误 if not start or date lt start start date 有一个datetime date 从日期时间转换为日期的方法
  • 如何在“python setup.py test”中运行 py.test 和 linter

    我有一个项目setup py文件 我用pytest作为测试框架 我还在我的代码上运行各种 linter pep8 pylint pydocstyle pyflakes ETC 我用tox在多个 Python 版本中运行它们 并使用以下命令构
  • 如何用xlrd读取公式

    我正在尝试做一个解析器 它读取几个 Excel 文件 我通常需要位于行底部的值 您可以在其中找到所有上部元素的总和 因此 单元格值实际上是 sum 或 A5 0 5 可以说 对于使用 Excel 打开此文件的用户来说 它看起来像一个数字 这
  • 使用 Python 中的 IAM 角色访问 AWS API Gateway

    我有一个 AWS API 网关 我想使用它来保护其安全IAM 角色 http docs aws amazon com apigateway latest developerguide permissions html 我正在寻找一个包来帮助
  • 使用reduce方法的斐波那契数列

    于是 我看到有人用reduce方法来计算斐波那契数列 这是他的想法 1 0 1 1 2 1 3 2 5 3 对应于 1 1 2 3 5 8 13 21 代码如下所示 def fib reduce n initial 1 0 dummy ra
  • 如何解码 dtype=numpy.string_ 的 numpy 数组?

    我需要使用 Python 3 解码按以下方式编码的字符串 gt gt gt s numpy asarray numpy string hello nworld gt gt gt s array b hello nworld dtype S1
  • Pandas,按最大返回值进行分组 AssertionError:

    熊猫有问题 我想听听你的意见 我有这个数据框 我需要在其中获取最大值 代码就在下面 df stack pd DataFrame 1 0 2016 0 NonResidential Hotel 98101 0 DOWNTOWN 47 6122
  • 将具有不同大小的行的数据加载到 Numpy 数组中

    假设我有一个包含如下数据的文本文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 如何将它加载到 numpy 数组中 使其看起来像这样 1 2 3 4 5 0 6 7 8 0 0 0 9 1
  • 从 python 中的缩进文本文件创建树/深度嵌套字典

    基本上 我想迭代一个文件并将每行的内容放入一个深层嵌套的字典中 其结构由每行开头的空格数量定义 本质上 目标是采取这样的事情 a b c d e 并将其变成这样的东西 a b c d e Or this apple colours red
  • Matplotlib 将颜色图 tab20 更改为三种颜色

    Matplotlib 有一些新的且非常方便的颜色图 选项卡颜色图 https matplotlib org examples color colormaps reference html 我错过的是生成像 tab20b 或 tab20c 这
  • Python time.sleep - 永不醒来

    我认为这将是那些简单的问题之一 但它让我感到困惑 停止媒体 我是对的 找到了解决方案 查看答案 我正在使用 Python 的单元测试框架来测试多线程应用程序 很好而且很直接 我有 5 个左右的工作线程监视一个公共队列 以及一个为它们制作工作
  • python csv按列转换为字典

    是否可以将 csv 文件中的数据读取到字典中 使得列的第一行是键 同一列的其余行构成列表的值 例如 我有一个 csv 文件 strings numbers colors string1 1 blue string2 2 red string
  • Windows 与 Linux 文本文件读取

    问题是 我最近从 Windows 切换到 Ubuntu 我的一些用于分析数据文件的 python 脚本给了我错误 我不确定如何正确解决 我当前仪器的数据文件输出如下 Header 有关仪器等的各种信息 Data 状态 代码 温度 字段等 0
  • 在 python 查询参数中使用 %20 而不是 + 作为空格

    我使用 python requests 编写了以下 python 脚本 http requests readthedocs org en latest http requests readthedocs org en latest impo
  • Melt() 函数复制数据集

    我有一个这样的表 id name doggo floofer puppo pupper 1 rowa NaN NaN NaN NaN 2 ray NaN NaN NaN NaN 3 emma NaN NaN NaN pupper 4 sop
  • 将数组从 .npy 文件读入 Fortran 90

    我使用 Python 以二维数组 例如 X 的形式生成一些初始数据 然后使用 Fortran 对它们进行一些计算 最初 当数组大小约为 10 000 x 10 000 时 np savetxt 在速度方面表现良好 但是一旦我开始增加数组的维
  • Python - 打印漂亮的 XML 为空标签文本创建开始和结束标签

    我正在编写一个 python 应用程序 它创建一个 ElementTree XML 然后使用 minidom 的 toprettyxml 将其写入文件 final tree minidom parseString ET tostring r

随机推荐