当前位置:   article > 正文

【Python&GIS】通过经纬度创建矢量点文件_在rs道路上逐渐走歪的迷途小书童,热衷于python、gee等编程语言。致力于rs、gis数

在rs道路上逐渐走歪的迷途小书童,热衷于python、gee等编程语言。致力于rs、gis数

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

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

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

from osgeo import ogr, osr

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

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

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

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

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

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

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

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

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

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

  1. feature_point = ogr.Feature(layer.GetLayerDefn())
  2. # 创建feature
  3. feature_point.SetField("Longitude", 126.123)
  4. feature_point.SetField("Latitude", 31.123)
  5. # 输入字段值
  6. point_geo = ogr.Geometry(ogr.wkbPoint)
  7. # 创建几何点
  8. point_geo.AddPoint(126.123, 31.123)
  9. # 添加几何点
  10. feature_point.SetGeometry(point_geo)
  11. # 设置点的字段值
  12. layer.CreateFeature(feature_point)
  13. feature_point.Destroy()
  14. # 关闭属性
  15. source_data.Destroy()

6.  完整代码

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

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

  1. # -*- coding: utf-8 -*-
  2. """
  3. @Time : 2023/5/19 9:05
  4. @Auth : RS迷途小书童
  5. @File :Create Multipoint.py
  6. @IDE :PyCharm
  7. """
  8. from osgeo import ogr, osr
  9. from pyproj import Proj
  10. def Create_multipoint(list_longitude, list_latitude, path_result):
  11. """
  12. :param list_longitude: 输入经度列表
  13. :param list_latitude: 输入纬度列表
  14. :param path_result: 输入保存的shp路径
  15. :return: 返回shp路径
  16. """
  17. driver = ogr.GetDriverByName("ESRI Shapefile")
  18. # 创建数据驱动
  19. source_data = driver.CreateDataSource(path_result)
  20. # 创建数据资源
  21. spatial_proj = osr.SpatialReference()
  22. # 创建SpatialReference对象,再向SpatialReference导入投影信息
  23. spatial_proj.ImportFromEPSG(4326)
  24. # EPSG编码:【4326:WGS84 、 32651:UTM/WGS84 51N】
  25. """file_path = "G:/local.shp"
  26. ds = ogr.Open(file_path) # 打开数据集dataset
  27. layer_ds = ds.GetLayer()
  28. proj_ds = layer_ds.GetSpatialRef()
  29. # 读取已有坐标系"""
  30. layer = source_data.CreateLayer("point", spatial_proj, ogr.wkbPoint)
  31. # 创建图层,保持名称与文件名一致
  32. field_longitude = ogr.FieldDefn("Longitude", ogr.OFTReal)
  33. field_latitude = ogr.FieldDefn("Latitude", ogr.OFTReal)
  34. # 创建字段,文本属性
  35. field_longitude.SetWidth(10)
  36. field_latitude.SetWidth(10)
  37. # 设置字段长度
  38. layer.CreateField(field_longitude)
  39. layer.CreateField(field_latitude)
  40. # 创建字段
  41. for i in range(len(list_longitude)):
  42. feature_point = ogr.Feature(layer.GetLayerDefn())
  43. # 创建feature
  44. feature_point.SetField("Longitude", str(list_longitude[i]))
  45. feature_point.SetField("Latitude", str(list_latitude[i]))
  46. # 输入字段值
  47. point_geo = ogr.Geometry(ogr.wkbPoint)
  48. # 创建几何点
  49. point_geo.AddPoint(float(list_longitude[i]), float(list_latitude[i]))
  50. # 添加几何点
  51. feature_point.SetGeometry(point_geo)
  52. # 设置点的字段值
  53. layer.CreateFeature(feature_point)
  54. feature_point.Destroy()
  55. # 关闭属性
  56. source_data.Destroy()
  57. # 关闭数据
  58. return path_result
  59. if __name__ == "__main__":
  60. list_longitude = [100.1, 100.2, 100.3, 100.4]
  61. list_latitude = [30.1, 30.2, 30.3, 30.4]
  62. path_result = "G:/Point1.shp"
  63. Create_multipoint(list_longitude, list_latitude, path_result)

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/174462
推荐阅读
相关标签
  

闽ICP备14008679号