最近在做项目时,需要判断某个点是否在感兴趣区内。所以需要使用Python先根据经纬度的点创建矢量文件,再通过点文件和面文件的位置关系判断点是否在面内。

        这里我们使用osgeo中的ogr和osr库,ogr库是一个处理地理空间矢量数据的开源库。它可以读取多种数据格式,进行地理处理、属性表操作、数据分析等操作。目前ogr和osr库已集成到GDAL库中,可以对栅格数据、矢量数据进行处理分析,被3S的研究人员广泛应用。感兴趣的可以自己去了解一下,不懂得可以一起交流!

1.安装所需库包,因为GDAL、OGR、OSR以及合并成osgeo中,所以需要从osgeo中导入。

from osgeo import ogr, osr

2.初始化资源空间,这里需要写入保存的目标目录及文件名

driver = ogr.GetDriverByName("ESRI Shapefile")
# 创建数据驱动
source_data = driver.CreateDataSource("G:/Point1.shp")
# 创建数据资源

3.创建投影空间,设置投影信息。这里我的点是WGS84的地理坐标系,所以就设置输出的文件为WGS84地理坐标系。(二选一即可)

        1)4386是WGS84的EPSG编码,库里面内置了很多坐标系的EPSG编码。可以在库包中找到一些EPSG编码。存放在“C:\Program Files\Python36\Lib\site-packages\osgeo\data\gdal”中的ozi_datum.csv文件中,其他的可以自己百度搜索,也可以去EPSG官网查询。

spatial_proj = osr.SpatialReference()
# 创建SpatialReference对象,再向SpatialReference导入投影信息
spatial_proj.ImportFromEPSG(4326)

        2)当然我们也可以从已有的坐标系中导入,例如我们可以导入一个包含坐标系的矢量文件,读取它的坐标系信息,使用这个坐标系作为输出的坐标系(这一步可以导入一些地方坐标系,当然你需要有包含这个坐标系的矢量文件)。

file_path = "G:/local.shp"
ds = ogr.Open(file_path) # 打开数据集dataset
layer_ds = ds.GetLayer()
proj_ds = layer_ds.GetSpatialRef()
# 读取已有坐标系

4.创建图层,创建特征信息(属性字段),编辑字段名设置字段长度等。

layer = source_data.CreateLayer("point", spatial_proj, ogr.wkbPoint)
# 创建图层,保持名称与文件名一致
field_longitude = ogr.FieldDefn("Longitude", ogr.OFTReal)
field_latitude = ogr.FieldDefn("Latitude", ogr.OFTReal)
# 创建字段,文本属性
field_longitude.SetWidth(10)
field_latitude.SetWidth(10)
# 设置字段长度
layer.CreateField(field_longitude)
layer.CreateField(field_latitude)
# 创建字段

5.写入字段信息,创建点的几何位置。记得要关闭属性表和数据资源,不然数据在内存中不会保存。如果有多个点,可以创建列表保存经纬度,使用for循环遍历写入属性表。

feature_point = ogr.Feature(layer.GetLayerDefn())
# 创建feature
feature_point.SetField("Longitude", 126.123)
feature_point.SetField("Latitude", 31.123)
# 输入字段值
point_geo = ogr.Geometry(ogr.wkbPoint)
# 创建几何点
point_geo.AddPoint(126.123, 31.123)
# 添加几何点
feature_point.SetGeometry(point_geo)
# 设置点的字段值
layer.CreateFeature(feature_point)
feature_point.Destroy()
# 关闭属性
source_data.Destroy()

6.  完整代码

        根据自己的情况修改坐标系统以及文件保存的目录。第三步的二选一,我默认使用的是内置的EPSG编码,导入已有的投影信息已经注释掉了。如果需要使用已有的投影信息,将内置的EPSG两行代码删掉,再删掉注释的"就行了。

        我这里是有多个点需要创建,所以已经使用了for循环去遍历经纬度列表,根据需求自行修改。

# -*- coding: utf-8 -*-
"""
@Time : 2023/5/19 9:05
@Auth : RS迷途小书童
@File :Create Multipoint.py
@IDE :PyCharm
"""
from osgeo import ogr, osr
from pyproj import Proj def Create_multipoint(list_longitude, list_latitude, path_result):
"""
:param list_longitude: 输入经度列表
:param list_latitude: 输入纬度列表
:param path_result: 输入保存的shp路径
:return: 返回shp路径
"""
driver = ogr.GetDriverByName("ESRI Shapefile")
# 创建数据驱动
source_data = driver.CreateDataSource(path_result)
# 创建数据资源
spatial_proj = osr.SpatialReference()
# 创建SpatialReference对象,再向SpatialReference导入投影信息
spatial_proj.ImportFromEPSG(4326)
# EPSG编码:【4326:WGS84 、 32651:UTM/WGS84 51N】
"""file_path = "G:/local.shp"
ds = ogr.Open(file_path) # 打开数据集dataset
layer_ds = ds.GetLayer()
proj_ds = layer_ds.GetSpatialRef()
# 读取已有坐标系"""
layer = source_data.CreateLayer("point", spatial_proj, ogr.wkbPoint)
# 创建图层,保持名称与文件名一致
field_longitude = ogr.FieldDefn("Longitude", ogr.OFTReal)
field_latitude = ogr.FieldDefn("Latitude", ogr.OFTReal)
# 创建字段,文本属性
field_longitude.SetWidth(10)
field_latitude.SetWidth(10)
# 设置字段长度
layer.CreateField(field_longitude)
layer.CreateField(field_latitude)
# 创建字段
for i in range(len(list_longitude)):
feature_point = ogr.Feature(layer.GetLayerDefn())
# 创建feature
feature_point.SetField("Longitude", str(list_longitude[i]))
feature_point.SetField("Latitude", str(list_latitude[i]))
# 输入字段值
point_geo = ogr.Geometry(ogr.wkbPoint)
# 创建几何点
point_geo.AddPoint(float(list_longitude[i]), float(list_latitude[i]))
# 添加几何点
feature_point.SetGeometry(point_geo)
# 设置点的字段值
layer.CreateFeature(feature_point)
feature_point.Destroy()
# 关闭属性
source_data.Destroy()
# 关闭数据
return path_result if __name__ == "__main__":
list_longitude = [100.1, 100.2, 100.3, 100.4]
list_latitude = [30.1, 30.2, 30.3, 30.4]
path_result = "G:/Point1.shp"
Create_multipoint(list_longitude, list_latitude, path_result)

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

【Python&GIS】通过经纬度创建矢量点文件的更多相关文章

  1. python小练习,打出1-100之间的所有偶数,设计一个函数,在桌面上创建10个文件,并以数字命名,复利计算函数

    练习一:打出1-100之间的所有偶数 def even_print(): for i in range(1,101): if i % 2 == 0: print (i) even_print() #列 ...

  2. python模块介绍- xlwt 创建xls文件(excel)

    python模块介绍- xlwt 创建xls文件(excel) 2013-06-24磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 37391319 ...

  3. python 接口测试1 --如何创建和打印日志文件

    python自带的logging实在是不好用,推荐使用logbook 思路如下: 1.创建path.py文件,获取工程根路径 2.创建log.py文件,在工程根路径下创建日志文件(文件名称按日期命名) ...

  4. Creating Excel files with Python and XlsxWriter(通过 Python和XlsxWriter来创建Excel文件(xlsx格式))

    以下所有内容翻译至: https://xlsxwriter.readthedocs.io/ #----------------------------------------------------- ...

  5. 第三百四十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—craw母版l创建自动爬虫文件—以及 scrapy item loader机制

    第三百四十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—craw母版l创建自动爬虫文件—以及 scrapy item loader机制 用命令创建自动爬虫文件 创建爬虫文件是根据scrap ...

  6. Python读取不同文件夹下的图片并且分类放到新创建的训练文件夹和标签文件夹

    在深度学习的训练时,经常会碰到训练的样本数据集和标签数据集是在一个文件夹中,这个时候我们就不得不进行一些数据的预处理和文件的分类,例如将训练(training data)数据集和标签数据集(label ...

  7. python读取txt批量创建文件

    python读取txt批量创建文件 pythonbatchfile 前几天有个小问题, 需要批量建立很多文件夹,, 所以手动写了个小的脚本, 后续可以直接使用 读取目录文件, 然后直接创建相应的文件 ...

  8. 二十三 Python分布式爬虫打造搜索引擎Scrapy精讲—craw母版l创建自动爬虫文件—以及 scrapy item loader机制

    用命令创建自动爬虫文件 创建爬虫文件是根据scrapy的母版来创建爬虫文件的 scrapy genspider -l  查看scrapy创建爬虫文件可用的母版 Available templates: ...

  9. (数据科学学习手札147)Python GIS利器shapely全新2.0版本一览

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,我写过很多篇介绍geopand ...

  10. [Python] 中文编码问题:raw_input输入、文件读取、变量比较等str、unicode、utf-8转换问题

    最近研究搜索引擎.知识图谱和Python爬虫比较多,中文乱码问题再次浮现于眼前.虽然市面上讲述中文编码问题的文章数不胜数,同时以前我也讲述过PHP处理数据库服务器中文乱码问题,但是此处还是准备简单做下 ...

随机推荐

  1. 全面了解 Redis 高级特性,实现高性能、高可靠的数据存储和处理

    目录 高性能.高可用.高可扩展性的原理 持久化 RDB持久化 AOF持久化 持久化的配置 RDB配置 AOF配置 持久化的恢复 RDB的恢复 AOF的恢复 RDB和AOF的选择 持久化对性能的影响 数 ...

  2. Github美化日记 - 又菜又爱玩

    Github美化日记 - 又菜又爱玩 一.咱就说 无论是技术大牛, 或者是技术小菜, 都希望有一个好看的Github首页吧!(快说你想要! ![iShot_2023-04-05_18.58.32.mi ...

  3. vue之input输入框的几个事件

    目录 事件简介 示例 事件简介 click 点击事件,一般不会用于input输入框,会用于按钮,用于输入框就有点像focus了,当点击输入框时会触发 blur 失去焦点事件,当失去焦点时会触发. fo ...

  4. kubernetes核心实战(三)--- ReplicationController

    5.ReplicationController ReplicationController 确保在任何时候都有特定数量的 Pod 副本处于运行状态.换句话说,ReplicationController ...

  5. Junit5 pom依赖

    <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter- ...

  6. IDA 特征码生成和搜索脚本

    最近比较忙,就少写两句,直接附上源代码,其中的细节点就不再赘述,如有疑问,请留言. 一共就是实现了两个函数,一个用于搜索特征码 (SearchPattern),一个用于生成特征码 (GenerateF ...

  7. [MAUI]模仿网易云音乐黑胶唱片的交互实现

    @ 目录 创建页面布局 创建手势控件 创建影子控件 唱盘拨动交互 唱盘和唱针动画 项目地址 用过网易云音乐App的同学应该都比较熟悉它播放界面. 这是一个良好的交互设计,留声机的界面隐喻准确地向人们传 ...

  8. C# 手写识别方案整理

    书写识别,网上的大佬们都有输出. 书写识别存在的2个问题: 直接拿官网的案例(将 Windows Ink 笔划识别为文本和形状 - Windows apps | Microsoft Learn),会发 ...

  9. [Pytorch框架] 4.2.1 使用Visdom在 PyTorch 中进行可视化

    文章目录 4.2.1 使用Visdom在 PyTorch 中进行可视化 安装 坑 基本概念 Environments Panes VIEW 可视化接口 使用 绘制简单的图形 更新损失函数 import ...

  10. SPN在域环境的应用

    windows域为了集中资源,有效地对资源访问控制权限进行细粒度分配,提高网络资源统一分配的管理.域内的每种资源分配了不同的服务主体名称(SERVICE Pricipal Name,SPN) 相关概念 ...