最近在做项目时,需要判断某个点是否在感兴趣区内。所以需要使用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. Java对象结构详解【MarkWord 与锁的实现原理】

    Java对象存储在堆(Heap)内存.那么一个 Java对象到底包含什么呢?概括起来分为对象头.对象体和对齐字节.如下图所示:

  2. Docke的使用与详解2 --RabbitMQ安装与使用

    一.RabbitMQ安装与使用 1.RabbitMQ安装 --RabbbitMQ官网 1>使用docker pull rabbitmq拉取镜像,默认拉取最新版本: 这时你会想,我要拉取指定版本该 ...

  3. 《程序是怎样跑起来的》读书笔记1——对程序员来说CPU是什么

    一丶什么是程序 程序是指令和数组的组合体,如:print("你好世界"),其中print是指令,你好世界是数据. CPU能直接识别和执行的只有机器语言,使用C,java这种高级语言 ...

  4. selenuim文件的下载

    文件下载:谷歌浏览器则会自动实现下载,不会弹出框提示,会直接下载谷歌的默认路径:火狐浏览器下载会弹出提示框,此时火狐需要添加浏览器的配置参数信息: 火狐的相关浏览器配置参数可以通过about:conf ...

  5. Alchemy Nft黑客松任务(第一周)

    Alchemy是什么项目? 2019年12月,Alchemy完成1500万美元A轮融资,资方为Pantera Capital,斯坦福大学,Coinbase,三星等. 2021年4月,Alchemy以5 ...

  6. IDEAL部署外部tomcat及其乱码解决

    控制台tomca乱码问题: 本人使用tomcat9为例 1.启动信息有中文乱码: 原因:tomcat采用的是utf-8,而windows默认是GBK 修改java.util.logging.Conso ...

  7. abc294G

    Upd G 看上好模板的样子, 果然是个模板题 好题 , 首先考虑这张图的 \(Euler \ Tour\), 简单点说, 就是dfs一遍, 把每个点入栈出栈顺序存起来, 举个例子· 2 1 2 2 ...

  8. 高可用(keepalived)部署方案

    前言:为了减少三维数据中心可视化管理系统的停工时间,保持其服务的高度可用性.同时部署多套同样的三维可视化系统,让三维数据中心可视化系统同时部署并运行到多个服务器上.同时提供一个虚拟IP,然后外面通过这 ...

  9. 全网最详细中英文ChatGPT-GPT-4示例文档-人工智能助手从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)

    目录 Introduce 简介 setting 设置 Prompt 提示 Sample response 回复样本 API request 接口请求 python接口请求示例 node.js接口请求示 ...

  10. linux 给lvm磁盘扩容

    目录 linux 给lvm磁盘扩容 扩容步骤 确认可用空间 创建新的物理卷 将物理卷添加到现有的卷组中 扩展逻辑卷 linux 给lvm磁盘扩容 早上到公司发现磁盘满了,挂载点是一个lvm 跟领导确认 ...