首页 > 编程语言 >【Python&GIS】基于Python面矢量转换线矢量

【Python&GIS】基于Python面矢量转换线矢量

时间:2023-11-23 12:22:57浏览次数:42  
标签:layer GIS Python 矢量 geom result path out

        今天有些不一样,发这篇文章并不是项目需要。单纯的想到有这个功能没使用Python实现,所以就去研究了一下,第一时间就和大家分享。如何使用Python的osgeo库实现面矢量数据与线矢量数据的互相转换。

一、导入所需库

import os
from osgeo import ogr

二、面转线

        代码中注释都给了,就不讲解了。入参就是输入面矢量的路径,输出线矢量的路径。有一个小问题就是这段代码只适用于多个单面,即一个面为一个要素的情况。如果多个面合并成一个面的也能转换,不过要素会缺失!

# -*- coding: utf-8 -*-
"""
@Time : 2023/11/21 11:02
@Auth : RS迷途小书童
@File :Vector Face To Line.py
@IDE :PyCharm
@Purpose:面矢量、线矢量相互转换
"""


def face_to_line(int_path, out_path):
    """
    :param int_path: 输入面矢量路径
    :param out_path: 输出线矢量路径
    :return: None
    """
    driver = ogr.GetDriverByName('ESRI Shapefile')
    ds = ogr.Open(int_path, 0)
    layer = ds.GetLayer()
    # 打开面矢量数据,并获取其图层
    src_proj = layer.GetSpatialRef()
    # 获取其源坐标信息
    if os.path.exists(out_path):
        driver.DeleteDataSource(out_path)
        # 如果目标文件已存在,则删除它
    ds_result = driver.CreateDataSource(out_path)
    layer_result = ds_result.CreateLayer(out_path, srs=src_proj, geom_type=ogr.wkbLineString)
    defn_result = layer_result.GetLayerDefn()
    # 创建目标资源、目标图层、目标要素
    for feature in layer:
        # 遍历面矢量中的所有要素
        geom = feature.GetGeometryRef()
        # 获取该要素的地理空间范围
        line_geom = geom.GetGeometryRef(0)
        # 获取线格式地理空间范围
        feature_result = ogr.Feature(defn_result)
        # 创建一个新的要素。要素是Shapefile中的数据实体,它们有几何形状和属性。
        feature_result.SetGeometry(line_geom)
        # 将图形赋值到要素上
        layer_result.CreateFeature(feature_result)
        # 创建该要素,写入
    layer_result = None


if __name__ == '__main__':
    os.chdir(r'G:\彭俊喜')
    face_to_line('1.shp', '样本_line.shp')
    # 参数:输入面矢量,输出线矢量

三、线转面

        这里的逻辑就和面转线不一样,不能够直接读取要素范围然后写入,只能通过线的范围创建wkt格式的面数据再写入。同样入参为线矢量路径和面矢量路径。

# -*- coding: utf-8 -*-
"""
@Time : 2023/11/21 11:02
@Auth : RS迷途小书童
@File :Vector Face To Line.py
@IDE :PyCharm
@Purpose:面矢量、线矢量相互转换
"""


def line_to_face(int_path, out_path):
    """
    :param int_path: 输入线矢量路径
    :param out_path: 输出面矢量路径
    :return: None
    """
    driver = ogr.GetDriverByName('ESRI Shapefile')
    ds = ogr.Open(int_path, 0)
    layer = ds.GetLayer()
    # 打开面矢量数据,并获取其图层
    src_proj = layer.GetSpatialRef()
    # 获取其源坐标信息
    if os.path.exists(out_path):
        driver.DeleteDataSource(out_path)
        # 如果目标文件已存在,则删除它
    ds_result = driver.CreateDataSource(out_path)
    layer_result = ds_result.CreateLayer(out_path, srs=src_proj, geom_type=ogr.wkbPolygon)
    # 创建一个数据资源,格式为面矢量,坐标系为src_proj
    defn_result = layer_result.GetLayerDefn()
    # 创建目标资源、目标图层、目标要素
    for feature in layer:
        # 遍历面矢量中的所有要素
        geom = feature.GetGeometryRef()
        # 获取该要素的地理空间范围
        feature_result = ogr.Feature(defn_result)
        # 创建一个新的要素。要素是Shapefile中的数据实体,它们有几何形状和属性。
        polygon = ogr.CreateGeometryFromWkt("Polygon(%s)" % str(geom)[str(geom).find("("):])
        # print("Polygon"+str(geom)[11:])
        feature_result.SetGeometry(polygon)
        # 将图形赋值到要素上
        layer_result.CreateFeature(feature_result)
        # 创建该要素,写入
    layer_result = None


if __name__ == '__main__':
    os.chdir(r'G:\彭俊喜')
    line_to_face('样本_line.shp', '123312.shp')
    # 参数:输入线矢量,输出面矢量

四、总结

        网上貌似还没有线转面的教程,我应该算是首发了。当然我说的是使用osgeo库,arcpy除外,毕竟这玩意相当于ARCGIS一样太变态了。

        本文章主要是分享个人在学习Python过程中写过的一些代码。有些部分借鉴了前人以及官网的教程,如有侵权请联系作者删除,大家有问题可以随时留言交流,博主会及时回复。

标签:layer,GIS,Python,矢量,geom,result,path,out
From: https://www.cnblogs.com/RSran/p/17851290.html

相关文章

  • python脚本把日志转成excel
    之前go写的,转成了python版本,日志是json格式的,按行读取{"aid":"1111","cid":"2222","callback_url":"http:\/\/ad.toutiao.com\/track\/activate\/?callback=B.eDCQxxxxxGCB&os=0&muid=","advertiser_id"......
  • python编译成可执行文件
    安装pipinstallpyinstaller执行pyinstaller--onefilexxxxx.py会在当前文件的同级目录生成dist文件夹,可执行文件就在里面......
  • Python通过tushare获取股票历史数据
    一、使用Tushare获取可参照官网:https://tushare.pro/步骤1:安装Tushare库在Python环境中使用pip命令安装Tushare库:pipinstalltushare步骤2:导入Tushare库在Python代码中导入Tushare库:importtushareasts步骤3:设置TushareToken在使用Tusha......
  • 基于python开发的股市行情看板
    近期股市又骚动起来,回忆起昔日炒股经历,历历在目,悲惨经历让人黯然神伤,去年共投入4000元入市,最后仅剩1000多,无奈闭关修炼,忘记股市,全身心投入代码世界,享受代码带来的乐趣。近日,当看到别人用python进行量化投资暴富的消息,顿时振奋,立刻学习起python数据分析之道,开发了一个股市行情看板,希......
  • 基于python的种子搜索网站-开发过程
    本讲会对种子搜索网站的开发过程进行详细的讲解。 项目开发过程项目简介该项目是基于python的web类库django开发的一套web网站,做为本人的毕业设计。本人的研究方向是一项关于搜索的研究项目。在该项目中,笔者开发了一个简单版的搜索网站,实现了对数据库数据的检索和更新。网站域名......
  • Dijkstra 算法python版
    算法策略Dijkstra算法是求一个图中一个点到其他所有点的最短路径的算法,先了解图的数据结构「邻接矩阵」Dijkstra算法是一个基于「贪心」、「广度优先搜索」、「动态规划」求一个图中一个点到其他所有点的最短路径的算法,时间复杂度O(n2)B站视频:https://www.bilibili.com/vide......
  • 安装python连接eureka并且vector search milvus centos7
    先安装python到centos7第一步:安装必要的软件包,使用root权限:yumgroupinstall-y"Developmenttools"yuminstall-yncurses-develgdbm-develxz-develsqlite-develtk-develuuid-develreadline-develbzip2-devellibffi-devel第二步:Python官方地址:WelcometoPyth......
  • Python中列表和字符串常用的数据去重方法你还记得几个?
    (Python中列表和字符串常用的数据去重方法你还记得几个?)1关于数据去重关于数据去重,咱们这里简单理解下,就是删除掉重复的数据;应用的场景比如某些产品产生的大数据,有很多重复的数据,为了不影响分析结果,我们可能需要对这些数据进行去重,删除重复的数据,提高分析效率等等。2字符串......
  • Python GUI编程
    #!/usr/bin/python--coding:UTF-8--Python2.x导入方法fromTkinterimport*#导入Tkinter库Python3.x导入方法#fromtkinterimport*root=Tk()#创建窗口对象的背景色#创建两个列表li=['C','python','php','htm......
  • VS2022新建python项目爬虫网页
    一、安装python插件。 二、新建python项目。 三、安装配置DEBUG环境。   四、根据操作系统选择DEBUG环境。 五、安装requests库 在当前DEBUG环境安装requests库 六、使用requests库,爬取网页内容 完结! ......