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

现有四个点:(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,一经查实,立即删除!

相关文章

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、链接成功

天玑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)和内存结构…

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;是目前市…

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; } …

【操作系统】实验:文件系统

目录 一、实验目的 二、实验要求 三、实验步骤 四、核心代码 五、记录与处理 六、思考 七、完整报告和成果文件提取链接 一、实验目的 1、掌握文件系统的基本结构和文件系统的管理方法 2、加深对两级文件目录认识和理解 3、对文件操作的系统命令实质内容和执行过程深入…

【9月持续更新】国内ChatGPT-4o中文镜像网站整理~

以前我也是通过官网使用&#xff0c;但是经常被封号&#xff0c;就非常不方便&#xff0c;后来有朋友推荐国内工具&#xff0c;用了一阵之后&#xff0c;发现&#xff1a;稳定方便&#xff0c;用着也挺好的。 最新的 GPT-4o、4o mini&#xff0c;可搭配使用~ 1、 最新模型科普&…

Revit 2025.2新增功能及安装教程和下载

Revit 2025.2 带来了许多新功能和改进&#xff0c;增强了BIM工作流程。以下是主要的新功能&#xff1a; 项目浏览器标签功能&#xff1a;新增的标签功能使得用户可以通过标签过滤浏览器列表&#xff0c;这对大型项目非常有用&#xff0c;减少了滚动和点击次数​。 链接管理对…

若依将登录用户的userId自动加载到查询中

点击搜索&#xff0c;会将登录用户的userId作为搜索条件&#xff0c;去查询。 新版本自动存储了userId&#xff0c;我们不用改&#xff0c;只要知道如何引用。 前端使用 在对应的vue文件&#xff0c;查询queryParams 加查询的值 然后参考他的 添加store import store from &…

PDM系统多少钱一般?一文详细了解三品PDM系统报价

在现代企业的数字化转型过程中&#xff0c;PDM产品数据管理软件扮演着至关重要的角色。PDM软件是一种应用于管理产品全生命周期的软件工具&#xff0c;涵盖了产品设计、工艺流程、生产制造、销售和维护等多个环节。随着技术的不断进步和市场的日益竞争&#xff0c;PDM软件的价格…

零基础学PLC的指令-沿指令(2)

扫描操作数的信号上升沿&#xff1a; 在触点分配的 "IN" 位上检测到正跳变&#xff08;0->1&#xff09;时&#xff0c;该触点的状态为 TRUE。该触点逻辑状态随后与能流输入状态组合以设置能流输出状态。P 触点可以放置在程序段中除分支结尾外的任何位置。 扫描…