三种通过代码创建矢量文件的方法及例子

现有四个点:(1, 1), (2, 2), (3, 3), (4, 4)

以这四个点围起来就是一个面。

如何通过python创建矢量文件。

我们以创建一个面矢量文件为例子,进行阐释。

我们可以使用geopandas、fiona、gdal库完成矢量创建。

geopandas

假设我们创建的矢量文件格式为 shp格式,代码如下:

import geopandas as gpd
from shapely.geometry import Polygon
def write_points_as_polygons_to_shp(points, output_file):"""将一系列点坐标转换为以这些点为中心的小正方形多边形,并写入Shapefile文件。参数:- points: 一个包含点坐标的列表,每个点是一个元组或列表,如[(1, 1), (2, 2), ...]- output_file: 输出的Shapefile文件名返回:- 无,但会生成一个Shapefile文件"""# 创建多边形对象simplify_poly_geoms = [Polygon(points)]gdf_poly = gpd.GeoDataFrame(geometry=simplify_poly_geoms, crs=CRS("epsg:4326"))# 保存为 Shapefilegdf_poly.to_file(output_file, driver='ESRI Shapefile')if __name__ == '__main__':# 示例用法points = [(1, 1), (3, 0), (3, 3), (0, 4)]output_file = r'd://temp/create_shp_by_geopandas.shp'write_points_as_polygons_to_shp(points, output_file)

矢量在Qgis打开如下:

gdf.to_file() 实际上是在背后调用 Fiona 来读取和写入 Shapefile 文件。

常见的矢量文件格式除了shp之外,还有geojson、GPKG。其实,只要对上述代码中的driver进行修改就可以保存为其他的shp格式。

JSON矢量创建如下:

import geopandas as gpd
from shapely.geometry import Polygon
def write_points_as_polygons_to_geojson(points, output_file):"""将一系列点坐标转换为以这些点为中心的小正方形多边形,并写入Shapefile文件。参数:- points: 一个包含点坐标的列表,每个点是一个元组或列表,如[(1, 1), (2, 2), ...]- output_file: 输出的Shapefile文件名返回:- 无,但会生成一个Shapefile文件"""# 创建多边形对象simplify_poly_geoms = [Polygon(points)]gdf_poly = gpd.GeoDataFrame(geometry=simplify_poly_geoms, crs=CRS("epsg:4326"))# 保存为 Shapefilegdf_poly.to_file(output_file, driver='GeoJSON')if __name__ == '__main__':# 示例用法points =[(1, 1), (3, 0), (3, 3), (0, 4)]output_file = r'd://temp/create_shp_by_geopandas.geojson'write_points_as_polygons_to_geojson(points, output_file)

矢量在Qgis打开如下:

gpkg矢量创建如下:

import geopandas as gpd
from shapely.geometry import Polygon
def write_points_as_polygons_to_gpkg(points, output_file):"""将一系列点坐标转换为以这些点为中心的小正方形多边形,并写入Shapefile文件。参数:- points: 一个包含点坐标的列表,每个点是一个元组或列表,如[(1, 1), (2, 2), ...]- output_file: 输出的Shapefile文件名- crs_epsg: 坐标参考系统的EPSG代码,默认为4326(WGS 84)- square_size: 正方形的边长,默认为0.1单位返回:- 无,但会生成一个Shapefile文件"""# 创建多边形对象simplify_poly_geoms = [Polygon(points)]gdf_poly = gpd.GeoDataFrame(geometry=simplify_poly_geoms, crs=CRS("epsg:4326"))# 保存为 Shapefilegdf_poly.to_file(output_file, driver='GPKG')if __name__ == '__main__':    # 示例用法points = [(1, 1), (3, 0), (3, 3), (0, 4)]output_file = r'd://temp/create_shp_by_geopandas.gpkg'write_points_as_polygons_to_gpkg(points, output_file)

矢量在Qgis打开如下:

geopandas很强大也很好用,但是它有个严重的问题,比如说是在程序打包的过程中往往出现打包错误,现不再展开,因为这个问题属于另一个故事了。

fiona

上面说到geopandas使用了fiona进行对矢量文件的读写,那么我们完全可以直接使用fiona读写矢量文件。

import fiona
from shapely.geometry import Polygon
def create_polygon_shapefile_by_fiona(coords, output_path, crs='EPSG:4326', filetype='ESRI Shapefile'):"""创建一个包含单个多边形的 Shapefile 数据集。参数:- output_path: 输出 Shapefile 的文件路径。- coords: 一个列表,包含多边形的坐标,格式为 [(x1, y1), (x2, y2), ..., (xn, yn)]。- crs: 字符串,表示坐标参考系统,默认为 WGS84 (EPSG:4326)。"""# 创建 Polygon 几何对象polygon = Polygon(coords)# 设置输出文件的模式、驱动器、模式、CRS 和模式schema = {'geometry': 'Polygon'}# 创建新的 Shapefile 数据集with fiona.open(output_path,mode='w',driver= filetype,schema=schema,crs=crs) as dst:# 将 Polygon 写入 Shapefiletry:dst.write({"geometry": polygon.__geo_interface__})except Exception as e:print(e)print(f"Polygon data has been saved to {output_path}")if __name__ == '__main__':# 示例用法points = [(1, 1), (3, 0), (3, 3), (0, 4)]output_file = r'd://temp/create_shp_by_fiona.shp'create_polygon_shapefile_by_fiona(points, output_file)

上面的函数中,我们把filetype设置为默认参数,这个函数还可以生成geojson、gpkg格式的矢量文件。

完整例子如下:

def create_polygon_shapefile_by_fiona(coords, output_path, crs='EPSG:4326', filetype='ESRI Shapefile'):"""创建一个包含单个多边形的 Shapefile 数据集。参数:- output_path: 输出 Shapefile 的文件路径。- coords: 一个列表,包含多边形的坐标,格式为 [(x1, y1), (x2, y2), ..., (xn, yn)]。- crs: 字符串,表示坐标参考系统,默认为 WGS84 (EPSG:4326)。"""from shapely.geometry import mapping# 创建 Polygon 几何对象polygon = Polygon(coords)# 设置输出文件的模式、驱动器、模式、CRS 和模式schema = {'geometry': 'Polygon'}# 创建新的 Shapefile 数据集with fiona.open(output_path,mode='w',driver= filetype,schema=schema,crs=crs) as dst:# 将 Polygon 写入 Shapefiletry:dst.write({"geometry": polygon.__geo_interface__})except Exception as e:print(e)print(f"Polygon data has been saved to {output_path}")if __name__ == '__main__':# 示例用法points = [(1, 1), (3, 0), (3, 3), (0, 4)]output_file = r'd://temp/create_shp_by_fiona.shp'create_polygon_shapefile_by_fiona(points, output_file)output_json_file = r'd://temp/create_shp_by_fiona.geojson'create_polygon_shapefile_by_fiona(points, output_json_file, filetype= "GeoJSON")output_gpkg_file = r'd://temp/create_shp_by_fiona.gpkg'create_polygon_shapefile_by_fiona(points, output_gpkg_file, filetype= "GPKG")

osgeo

GDAL(Geospatial Data Abstraction Library,地理空间数据抽象库)是一个在GIS(地理信息系统)领域广泛使用的开源库,它主要用于读取和写入栅格地理空间数据格式。GDAL提供了一种统一的数据模型来处理这些格式的数据,支持多种主流的栅格数据格式,如GeoTIFF、JPEG、PNG等。

OGR(OpenGIS Simple Features Reference Implementation)是GDAL的一个子项目,专门用于处理矢量地理空间数据格式。OGR支持多种矢量数据格式,包括ESRI Shapefiles、GeoJSON、KML等,使得用户可以在不同的矢量数据格式之间进行转换和处理。

OSR模块允许用户查询、创建和修改空间参考系统,这对于确保地理空间数据在不同坐标系统之间的一致性和准确性至关重要。例如,在进行地理空间数据的投影转换或重采样时,就需要正确地设置和处理空间参考系统。

简单来说,GDAL主要针对栅格地理空间数据,OGR针对矢量地理空间数据,而OSR在GDAL/OGR中则负责空间参考系统的处理。这三者共同构成了强大的地理空间数据处理和分析工具集。

假设我们创建的矢量文件格式为 shp格式,代码如下:

from osgeo import ogr, osrdef create_polygon_shp(longitude_latitude_list, filename):driver = ogr.GetDriverByName("ESRI Shapefile")data_source = driver.CreateDataSource(filename)srs = osr.SpatialReference()srs.ImportFromEPSG(4326)# 创建一个多边形层layer = data_source.CreateLayer("Polygon", srs, ogr.wkbPolygon)field_name = ogr.FieldDefn("data", ogr.OFTString)field_name.SetWidth(14)layer.CreateField(field_name)# 确保列表中的点数量至少为3,以形成一个多边形if len(longitude_latitude_list) < 3:raise ValueError("需要至少3个点来形成一个多边形")# 创建一个多边形几何对象polygon = ogr.Geometry(ogr.wkbPolygon)# 创建一个线性环(外环)ring = ogr.Geometry(ogr.wkbLinearRing)for point in longitude_latitude_list:# 向线性环中添加点ring.AddPoint(float(point[0]), float(point[1]))# 将线性环添加到多边形中polygon.AddGeometry(ring)# 创建一个要素,并设置其几何形状和属性feature = ogr.Feature(layer.GetLayerDefn())feature.SetGeometry(polygon)feature.SetField("data", "Example Polygon")# 将要素添加到层中layer.CreateFeature(feature)# 清理资源feature = Nonedata_source = Noneprint(f"Shapefile {filename} has been created with a polygon feature.")if __name__ == '__main__':output_file = r'd://temp/create_shp_by_ogr.shp'create_point_shp(points, output_file)

矢量在Qgis打开如下:

如果要生成其他格式的矢量,修改上述代码这一行:

driver = ogr.GetDriverByName("ESRI Shapefile")

把ESRI Shapefile 改成你想要的格式,其格式不仅限于GPKG、JSON、KML等等

ogr支持的矢量格式共有82种:

0 ESRIC

1 FITS

2 PCIDSK

3 netCDF

4 PDS4

5 VICAR

6 JP2OpenJPEG

7 JPEG2000

8 PDF

9 MBTiles

10 BAG

11 EEDA

12 OGCAPI

13 DB2ODBC

14 ESRI Shapefile

15 MapInfo File

16 UK .NTF

17 LVBAG

18 OGR_SDTS

19 S57

20 DGN

21 OGR_VRT

22 REC

23 Memor

y24 CSV

25 GML

26 GPX

27 LIBKML

28 KML

29 GeoJSON

30 GeoJSONSeq

31 ESRIJSON

32 TopoJSON

33 OGR_GMT

34 GPKG

35 SQLite

36 ODBC

37 WAsP

38 PGeo

39 MSSQLSpatial

40 PostgreSQL

41 OpenFileGDB

42 DXF

43 CAD

44 FlatGeobuf

45 Geoconcept

46 GeoRSS

47 GPSTrackMaker

48 VFK

49 PGDUMP

50 OSM

51 GPSBabel

52 OGR_PDS

53 WFS

54 OAPIF

55 Geomedia

56 EDIGEO

57 SVG

58 CouchDB

59 Cloudant

60 Idrisi

61 ARCGEN

62 XLS

63 ODS

64 XLSX

65 Elasticsearch

66 Walk

67 Carto

68 AmigoCloud

69 SXF

70 Selafin

71 JML

72 PLSCENES

73 CSW

74 VDV

75 MVT

76 NGW

77 MapML

78 TIGER

79 AVCBin

80 AVCE00

81 HTTP

小结

以上例子都是生成wgs-84坐标系的矢量,如果要生成其他坐标系的矢量需要更改EPSG的数值。

同时,以上例子都是单个面矢量的创建,至于是多个面矢量、多个孔洞面矢量该如何去创建,这里不再细说。

可以参考这篇文章。

带孔的面矢量在GIS中的应用与实现

篇幅有限,下次继续。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/52658.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打卡55天------图论(并查集)

图论这里我学的不是很好&#xff0c;作为一名JavaScript前端开发工程师&#xff0c;我能说我基本上在工作中都没用到过吗&#xff1f; 一、并查集理论基础 这个说句实话&#xff0c;我平常工作很少用到&#xff0c;上学的时候好像也没学过&#xff0c;可能我只是本科生吧&…

Chrome H265 WebRTC 支持

Chrome从127版本开始支持RTC H265解码&#xff0c;这样服务器就不需要对H265转码了&#xff0c; H5S和USC会自动检测浏览器支持的解码类型并自动判断是否启动转码&#xff0c;这样客户端不用关心摄像机具体是H264还是H265&#xff0c;尽量使用带GPU的客户端&#xff0c;这样服务…

ArcGIS应用指南:近邻分析(点匹配到最近线段上)

近邻分析通常用于确定一个要素集中的要素与另一个要素集中最近要素的距离。当涉及到点匹配到最近的线时&#xff0c;这种分析可以用来确定每个点到最近线段的距离及位置&#xff0c;也就是我们常说的点匹配到最近线上&#xff0c;可以参考官方文档&#xff1a;近邻分析 (Covera…

动态规划之买卖股票篇-代码随想录算法训练营第三十八天| 买卖股票的最佳时机ⅠⅡⅢⅣ,309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费

121. 买卖股票的最佳时机 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 讲解视频&#xff1a; 动态规划之 LeetCode&#xff1a;121.买卖股票的最佳时机1 题目描述&#xff1a; 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定…

软件测试-Selenium+python自动化测试

目录 一、元素定位 1.1一个简单的模板 1.2单选框radio定位实战 1.3下拉操作 1.4弹窗 1.5文件上传 1.6 iframe(类似于页中页,嵌套进去了) 二、元素定位实战 会用到谷歌浏览器Chrome测试,需要下载一个Chromedriver(Chrome for Testing availability)对应自己的浏览…

华为2024 届秋招招聘——硬件技术工程师-电源方向-机试题(四套)(每套四十题)

华为 2024 届秋招——硬件-电源机试题&#xff08;四套&#xff09;&#xff08;每套四十题&#xff09; 岗位——硬件技术工程师 岗位意向——电源 真题题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&am…

OpenCV杂项图像变换(1)自适应阈值处理函数adaptiveThreshold()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 函数对数组应用自适应阈值。 该函数根据以下公式将灰度图像转换为二值图像&#xff1a; 对于 THRESH_BINARY: t e x t d s t ( x , y ) { maxV…

OpenAI API: How to count tokens before API request

题意&#xff1a;“OpenAI API&#xff1a;如何在 API 请求之前计算令牌数量” 问题背景&#xff1a; I would like to count the tokens of my OpenAI API request in R before sending it (version gpt-3.5-turbo). Since the OpenAI API has rate limits, this seems impor…

【网络安全】分析cookie实现PII IDOR

未经许可,不得转载。 文章目录 正文正文 目标:公共电子商务类型的网站,每月有大约6万到10万访问者,注册用户大约有5万。 存在一个查询个人资料的端点/GetProfiledetails,以下是完整的请求和响应: 我发现,cookie非常类似于base64编码后的结果,于是我将其进行base64解码…

windows虚拟机VMware共享文件

1、设置本机电脑共享目录 2、设置所有人可连接 3、记录共享文件夹路径 4、设置当前用户密码 5、在虚拟机内映射驱动 6、在虚拟机内添入路径 7、输入用户名和密码 8、链接成功

经典数据结构 | 原理与应用场景汇总

一、二叉树 1、性质和原理 若规定根结点的层数为1&#xff0c;那么一棵非空二叉树的第i层最多有2的(i-1)次方个结点【就是每个结点都存在左右两个孩子即为最多】若规定只有根节点的二叉树高度为1&#xff0c;则高度为h的二叉树的最大结点数是&#xff08;2的h次方&#xff09…

天玑9400顶级图形技术曝光,GPU新技术让光追画质超一个档次

近日&#xff0c;有关联发科旗下最新旗舰芯片天玑9400的消息引发了广泛关注。据悉&#xff0c;该芯片在图形技术上取得了显著突破&#xff0c;光追性能提升近20%&#xff0c;并首发一项新的光追技术&#xff0c;该技术堪比PC端的顶级光追技术OMM&#xff0c;有望为移动端带来前…

Oracle数据库

注意&#xff1a;其实oracle数据库跟mysql数据库基本语法大致一样只有小部分语言存在差别。 安装PL/SQL Developer 一.数据库实例 1.1 启动数据库实例 一个Oracle实例&#xff08;Oracle Instance&#xff09;有一系列的后台进程&#xff08;Backguound Processes)和内存结构…

el-image的配套使用(表格,表单)

1. 配合table在一起使用&#xff0c;支持预览 此处使用场景是表格中只显示一张图片 preview-src-list只支持数组&#xff0c;故需要将单个字符串转换为转换为字符串数组 <el-table-column align"center" label"二维码"><template slot-scope&q…

2024最新版Python+Pycharm安装教程,安装、环境配置、汉化全搞定,保姆级教学!

一、Python下载 为了节约时间&#xff0c;我将PythonPycharm安装包、集火码全部打包上传至CSDN官方&#xff0c;可放心下载&#xff0c;完全免费&#xff01;&#xff08;安装包均为最新版本&#xff09; 二、Python安装 1.双击运行本地文件夹下的python安装包&#xff08;以…

Unity与UE,哪种游戏引擎适合你?

PlayStation vs Xbox&#xff0c;Mario vs Sonic&#xff0c;Unreal vs Unity&#xff1f;无论是游戏主机、角色还是游戏引擎&#xff0c;人们总是热衷于捍卫他们在游戏行业中的偏爱。 专注于游戏引擎&#xff0c;Unity和Unreal Engine&#xff08;简称UE4&#xff09;是目前市…

微信群自动群发软件:解锁私域流量运营新高度

随着移动互联网的普及和社交媒体的兴起&#xff0c;企业越来越重视私域流量的积累与运营。微信群作为私域流量的重要组成部分&#xff0c;其运营管理成为了企业关注的焦点。然而&#xff0c;传统的手工群发方式已难以满足企业高效、精准的需求。微信群自动群发软件的出现&#…

QT 与 C++实现基于[ TCP ]的聊天室界面

TCP客户端 Widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpSocket> //客户端类 #include <QMessageBox> #include <QListWidgetItem> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } …

leetcode232:栈实现队列

栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() …

PB:使Ctrl+Alt+Del失效

程序是调用SystemParametersInfo API函数完成。 先定义&#xff1a; Function uLong SystemParametersInfoA (ulong uAction, ulong uParam, ref any lpvParam, ulong fuWinIni) Library "user32.dll" Integer SPI_SCREENSAVERRUNNING 97 //使CtrlAltDel失效: I…