最近在做项目时,需要判断某个点是否在感兴趣区内。所以需要使用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. Activiti 7 启动流程实例

    首先,考虑下面这样一个流程图 主要的流程定义如下: <process id="demo" name="demo" isExecutable="t ...

  2. 有执行语句:console.log(fn2(2)[3]),补充函数,使执行结果为"hello"

    function fn2(a){ return [1,2,3,"hello"];}console.log(fn2(2)[3])//hello 这个2是混淆视线的,即使没有这个2.函 ...

  3. ACM-位运算符-判断奇偶

    同样一个问题,位运算可以提高程序的运行效率. 下面讲一下关于奇偶性的判断. 常规方法 public static boolean isOdd(int i){ ​ return i % 2 != 0; ...

  4. 任意Exe转ShellCode?

    之前写过一个远控,但一直在琢磨如何生成shellcode,今天偶然看见一个项目:sRDI,github上就有 这个项目主要就是将dll转成shellcode,于是我就想到了"写一个输出文件的 ...

  5. Java -- 增强for循环(foreach)

    增强for循环 相对于经典for循环, foreach可以减少代码量,但不是所有情况下foreach都可以代替for循环 当需要修改元素的值或和下标相关的操作需要使用标准for循环 foreach格式 ...

  6. Kubernetes(K8S)内核优化常用参数详解

    net.ipv4.tcp_keepalive_time=600 net.ipv4.tcp_keepalive_intvl=30 net.ipv4.tcp_keepalive_probes=10 net ...

  7. pysimplegui之tiee实例(附带github仓库地址)

    今天想写一个文件管理器,结果整了一下午,还是自己看的源代码少,分析别人代码少,最终还是看别人代码才找到错误原因.#!/usr/bin/env python import sys import os i ...

  8. [Linux]./configure | make | make install的工作过程与原理

    经常使用的Linux编译/安装命令,有必要了解一下原理了. step1 ./configure 配置与编译前检查 通常由软件开发商编写一个检测程序(configure或config)来检测用户的操作环 ...

  9. 环形链表_相交链表_多数元素(java语言)

    环形链表 力扣141题 问题: 思路:创建hashset,把链表的每个节点放到集合中,在放入的过程中检查这个节点是否已经存在,存在则证明存在环. 代码实现: public class Solution ...

  10. P4055 [JSOI2009] 游戏(博弈论 、最大匹配)

    P4055 [JSOI2009] 游戏 目录 P4055 [JSOI2009] 游戏 题目传送门 题目大意 : 思路: code 题目传送门 题目大意 : 小AA和小YY玩游戏,在这个游戏中,同一个格 ...