| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Python知识库 -> Python读写矢量数据(2)矢量数据写入(属性数据)——Python地理数据处理学习分享 -> 正文阅读 |
|
[Python知识库]Python读写矢量数据(2)矢量数据写入(属性数据)——Python地理数据处理学习分享 |
? ? ? ? 这一节主要介绍矢量数据的写入(只有属性数据,无几何),如果有读者没有读取的基础建议先看一下上一篇文章,需要对矢量数据读取有一定的了解才能继续学习本节。在这里我们用到的数据仍为goble文件夹下的数据,数据获取可参考下方链接中的附录获取。Python读写矢量数据(1)针对读取矢量数据——Python地理数据处理学习分享_Cishazhu_ooook的博客-CSDN博客https://blog.csdn.net/remote_giser/article/details/127351424?spm=1001.2014.3001.5502 1.矢量数据的复制? ? ? ? 当我们想新建矢量文件(shapefile)比复制以前的矢量数据时,可以采用以下方法。
? ? ? ? 这个程序打开方式就与众不同,首先我们打开的不是某个shapefile文件,而是将路径定义在某个文件夹下(这个文件夹包含大量shapefile文件),并用编辑的方式打开(Open(x,1/0)设为1为编辑模式,0为只读)。打开这个文件夹后,这个文件夹中的所有shapefile文件都可被看作是一个单独的图层。因此,在我们可以创建一个新图层,就会为我们默认创建一个shapefile文件。接着我们使用GetLayer()函数获取了"ne_50m_populated_places"文件当作图层in_layer。 ? ? ? ? 在创建新图层capital_cities(shapefile文件)之前,我们要确认文件夹中有无这个图层,如果有将其删除,重新创建,这一步的目的是后面我对程序多次运行对图层进行修改(没有这一步,多次运行将会持续报错有同名文件)。用if语句来判断文件夹时候能获取到(GetLayer())这个图层,如果存在将用DeleteLayer()函数将其删除。 ? ? ? ? 随后我们创建了我们的图层our_layer。在这里我们使用的是CreateLayer()函数在文件夹下创建了新的图层our_layer。这里需要注意CreateLayer()函数有四个参数。CreateLayer(name,[srs],[geo_type],[options])如下:
????????创建图层完成后,我们接下来要给图层创建属性,利用CreateFields()的方法继承in_layer的属性(schema属性会获得图层FieldDefn对象列表)。到这里我们创建图层属性的任务基本完成。如果这时候运行程序会发现会获得继承文件的属性,可在GIS软件中查看。 ? ? ? ? 从代码的14行开始,我们将进行继承每一个要素对应的属性(几何和文本)添加到文件中。首先我们要创建一个用于存储属性和几何的虚拟要素(变量our_defn),将图层对象属性信息传递给这个虚拟要素,这里采用GetLayerDefn()的方法来传递,让out_defn接受in_layer的图层对象属性。? ? ? ? ? 随后我们需要使用ogr.Feature把这个虚拟要素包含的属性真正给一个变量,在这里我们将虚拟要素our_defn的特征给了our_feat(这里称变量吧)。 ? ? ? ? 接下来我们将进行要素对应的属性赋值,这也是最繁琐的一步。在被继承的图层in_layer中遍历每个要素(for循环中的feat)。如果某个要素的'FEATURECLA'等于'Admin-0 capital',建立一个继承要素的遍量geom,使用geometry()方法继承in_feat要素(循环中指每个要素)的几何。再使用SetGeometry()的方法让我们变量our_feat继承原来图层要素的几何。 ? ? ? ? 几何继承完后我们就可以继承属性值,当然两者继承没有先后(只是我觉着有了几个位置再向内部插值比较直观)。就一次循环过程中而言(最外层的for),使用for循环遍历要素in_feat的属性数量,让变量value获取in_field的属性(有for循环,采用的函数为GetField()),最后用变量our_feat使用SetField()逐一获取单一value,直到读完整个要素的value。这样我们的特征都被存入再our_feat中了,接下来使用CreateFeatyre()让我们图层全部继承其几何和属性。 2.创建新的数据源2.1创建正确的驱动????????在创建新的数据源之前我们要了解到,新的数据源创建需要正确驱动。例如,GeoJSON驱动程序并不能创建一个shapefile文件,即使创建后扩展名为.shp,其核心还是一个GeoJSON文件。 ? ? ? ? 下面有两者方法来创建所需的驱动。 ????????1.继承从打开的数据中进行获取驱动(该方法创建的数据源将会和打开的数据源一致)。
? ? ? ? 在这里使用.GetDriver()的方式继承了文件doc的驱动。 ? ? ? ? 2.使用OGR的GetDriverByName()函数,传递给他驱动名字。
? ? ? ? 这里我们使用是驱动名为ESRI Shapefile,其他驱动的访问可以参考下代码(该代码与创建驱动无关,但我们可能需要特定驱动才能正确创建数据源):
????????从图可以看到这里可以获取我们常用的格式 。如果不清楚对应文件可取OGR网站查询每种格式对应的文件。 2.2创建新的数据源? ? ? ? 只有在正确的驱动下我们才可以进行创建正确的数据源。创建数据源代码如下:
? ? ? ? ? ?从图片可以看到,我们在文件夹目录下创建了一个new_shp文件(数据源是个文件夹)。注意,创建新的数据源时,不能覆盖现有的数据源,那么我们就需要在创建新数据源之前删除旧的数据源,目前采用的方法是Python的os.path.exists()函数处理。
2.3新建属性字段????????OGR定义字段与数据库类型时,首先需查看有哪些字段类型。这里统计了一些常见的字段数据类型在OGR中的对应。
? ? ? ? 要将一个字段添加到图层中,首先需要一个包含字段名称、数据类型、字段宽度、精度等重要信息的对象(使用ogr.FieldDefn()函数)。然后基于这个对象将其添加到图层。
? ? ? ? 别忘了,我们在这里创建完数据源后记得添加新的图层(即shape file文件,在这里我忘了添加坐标系和类型。),然后用变量add_1指向新建的字段并输入字段名称和类型(在对应表中寻找)。随后我们设置了新字段的宽度和精度(分别用到了SetWidth()、SetPrecision())函数。最后使用CreatField()添加到了图层中,并在GIS软件中可以到如下结果。 ? ? ? ? ?当然有时我们可能想要创建仅仅是字段名不同的两个字段,这里会提供SetName()函数来改变字段名而其他不发生改变,但需要重新将第二个字段添加到属性表中(实际修改了变量然后增进行了第二次增加)。
? ? ? ? 查看结果如下: 2.4修改字段信息?? ? ? ? 对于实例中的add_the_1名称不满意,在这里我们可以对字段就行修改(包括精度、类型等)。采用AlterFieldDefn(iField,field_def,nFlags)进行修改。
?????????
? ? ? ? 其实这串代码也十分好解释,首先让 i 获取到要修改的字段(寻找字段名),重新定义一个字段信息并设置精度和宽度。最后使用上述提过的函数来完成字段的改变,当然我们也可以针对单一进行改变。 ?要素添加、更新和删除? ? ? ? 经过上方的学习,我们已经能修改数据源、图层、属性表的字段了,但我们现在还需要对属性表的要素进行更改。(下方代码用到的数据是50m人口)
? ? ? ? ?首先我们要找到我们需要添加的字段名称,然后使用for循环来改变要素。SetField("字段名“,更改内容)是用来确定某一要素对应的字段和要改变的内容。SetFeature()是对这个要素对应字段进行改变。 改变单一要素对应值:
? ? ? ? 从上面我们可以知道,要获取某要素时我们往往通过for来进行遍历,然后让其等于某字段的内容。(常采用FID或者名称)这是有一种常用的矢量写入的方法。 ? ? ? ? 对于要素的删除,则更简单。我们只需要知道要素某个字段的值,便可删除。?这里使用DeleteFeature()的方法将循环参数对应FID的要素删除。(FID的获取使用GetFID())
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/26 2:12:40- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |