如何使用GDAL/OGR打开矢量并输出每个面外界矩形范围内的point数据

4 篇文章 6 订阅

如何使用GDAL/OGR打开矢量并输出图层数据范围和每个ploygon要素范围

本文主要目的:我们有的时候需要获取矢量数据的外接矩形范围,但是一个图层数据有好几个面要素,如果获取整体的外接矩形进行处理的话,还是会造成数据量较大;那么我们就逐个面要素进行判断其外接矩形;然后按外接矩形范围生成point数据。

1)如何使用GDAL/OGR打开矢量并输出图层数据范围和每个ploygon要素范围
2)按矩形范围生成以及像元的大小为间隔,生成point数据

0、构想

来源:
数据形式,有一个面图层数据,
在这里插入图片描述
在这里插入图片描述
一个栅格数据:
在这里插入图片描述
我需要对矢量面数据内,提取出每个面图层内的point数据,point数据的间隔大小是 栅格数据的像元大小; 也即是上图;需要提取的point数据为:

在这里插入图片描述
放大查看即是这种point数据:
在这里插入图片描述

1、arcmap查看数据属性信息

首先用arcmap打开的我的数据,查看数据的范围,以及数据的属性信息:

在这里插入图片描述

2、输出每个数据的extent外接矩形范围

获取图层数据范围使用GetExtent()函数;
获取要素范围,则需要循环每个要素,然后使用GetEnvelope()函数即可;

#如何使用GDAL/OGR打开矢量文件、读取属性表字段,并将数据范围和每个ploygon要素的范围
import ogr,sys,os
import numpy as np

os.chdir('D:/20200309/shujushouji/python+jupyternoterbook/zuoye1(1)/6栅格数据操作/shiyan')

#设置driver,并打开矢量文件
driver = ogr.GetDriverByName('ESRI Shapefile')
ds = driver.Open('polygon.shp', 0)
if ds is None:
  print("Could not open", 'sites.shp')
  sys.exit(1)
#获取图册
layer = ds.GetLayer()

#要素数量
numFeatures = layer.GetFeatureCount()
print("Feature count: "+str(numFeatures))

#获取范围
extent = layer.GetExtent()
print("Extent:", extent)
print("UL:", extent[0],extent[3])
print("LR:", extent[1],extent[2])

#获取要素
#feature = layer.GetNextFeature()
 
#循环每个要素属性
for i in range(numFeatures):
  feature = layer.GetNextFeature()
  #获取字段“id”的属性
  id = feature.GetField('type')
  #获取空间属性
  print(id)
  geometry = feature.GetGeometryRef()
  #x = geometry.GetX()
  polygonextent=geometry.GetEnvelope()
  print(geometry.GetEnvelope())
  #print(y)

  #y = geometry.GetY()
  print("UL:", polygonextent[0],polygonextent[3])
  print("LR:", polygonextent[1],polygonextent[2])
  

3、按外界矩形范围生成point数据

下面代码是根据polygon的extent的外接矩形进行采样生成point生成;
其中涉及到知识有gdal读取栅格数据,获取其影像的左上角起始坐标和像元大小,以及按找矢量获取到的外界矩形范围的空间坐标,把空间坐标转换成 影像的行列号;然后循环生成矢量point数据,并写到矢量文件中。

# 先获取polygon.shp外界矩形 的范围,以及坐标点;  然后将坐标点转换为 栅格的行列号,只对sample_region范围内的栅格区域,进行栅格转point
%matplotlib inline
import matplotlib.pyplot as plt
from shapely.geometry import Point
import geopandas as gpd
import ogr,sys,os
from pyproj import Transformer
import numpy as np
from osgeo import gdal

os.chdir('D:/20200309/shujushouji/python+jupyternoterbook/zuoye1(1)/shiyan/polygon')


#设置driver,并打开矢量文件
driver = ogr.GetDriverByName('ESRI Shapefile')
dsshp = driver.Open('sample_regions.shp', 0)
if dsshp is None:
  print("Could not open", 'sites.shp')
  sys.exit(1)
#获取图册
layer = dsshp.GetLayer()

#要素数量
numFeatures = layer.GetFeatureCount()
print("Feature count: "+str(numFeatures))

def world2Pixel(geotransform, x, y):
    originX = geotransform[0]
    originY = geotransform[3]
    pixelWidth = geotransform[1]
    pixelHeight = geotransform[5]
    line = int((y-originY)/pixelHeight)+1
    column = int((x-originX)/pixelWidth)+1
    return (line,column)
def Pixel2world(geotransform, line, column):
    originX = geotransform[0]
    originY = geotransform[3]
    pixelWidth = geotransform[1]
    pixelHeight = geotransform[5]
    x = column*pixelWidth + originX - pixelWidth/2
    y = line*pixelHeight + originY - pixelHeight/2
    return(x,y)

ds = gdal.Open( "D:/20200309/shujushouji/python+jupyternoterbook/zuoye1(1)/6栅格数据操作/landsat8_20180523/20180523.img" )

geotransform = ds.GetGeoTransform()

 
# 获取 空间坐标 范围 
extent = layer.GetExtent()
print("Extent:", extent)
print("UL:", extent[0],extent[3])
print("LR:", extent[1],extent[2])

# 将获取研究区polygon.shp的空间坐标,转换成 栅格数据的行列数 
linex1,columny1 = world2Pixel(geotransform, extent[0],extent[3])
print(f"linex1:{linex1}")
print(f"columny1:{columny1}")

linex2,columny2 = world2Pixel(geotransform,extent[1],extent[2])
print(f"linex2:{linex2}")
print(f"columny2:{columny2}")


points = []
for i in range(linex1,linex2):
    for j in range(columny1,columny2):
        x,y = Pixel2world(geotransform,i+1,j+1)
        point = Point((x,y))
        points.append(point)
gdf = gpd.GeoDataFrame()
gdf["geometry"] = points

#将栅格数据的坐标系 赋予 感兴趣区的point数据
print(ds.GetProjection())
gdf.crs=ds.GetProjection()
gdf.to_file("D:/20200309/shujushouji/python+jupyternoterbook/zuoye1(1)/6栅格数据操作/test/d_points1.shp") 
gdf.plot()
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
以下是使用Java和GDAL/OGR打开矢量文件并输出每个外界矩形范围内的POINT数据的代码示例: ```java import org.gdal.ogr.DataSource; import org.gdal.ogr.Driver; import org.gdal.ogr.Layer; import org.gdal.ogr.Feature; import org.gdal.ogr.Geometry; import org.gdal.ogr.ogr; public class GDALOGRExample { public static void main(String[] args) { // 初始化GDAL/OGR ogr.RegisterAll(); // 打开矢量文件 String filename = "path/to/vector/file.shp"; DataSource dataSource = ogr.Open(filename); // 获取第一个图层 Layer layer = dataSource.GetLayer(0); // 遍历每个 Feature feature; while ((feature = layer.GetNextFeature()) != null) { Geometry geometry = feature.GetGeometryRef(); // 获取外界矩形 Geometry envelope = geometry.GetEnvelope(); double minX = envelope.GetX(0); double maxX = envelope.GetX(1); double minY = envelope.GetY(0); double maxY = envelope.GetY(1); // 输出每个外界矩形范围内的POINT数据 Layer pointLayer = dataSource.ExecuteSQL("SELECT * FROM " + layer.GetName() + " WHERE " + "X > " + minX + " AND X < " + maxX + " AND Y > " + minY + " AND Y < " + maxY, null, "SQLITE"); Feature pointFeature; while ((pointFeature = pointLayer.GetNextFeature()) != null) { Geometry pointGeometry = pointFeature.GetGeometryRef(); System.out.println(pointGeometry.GetX() + "," + pointGeometry.GetY()); } pointLayer.delete(); feature.delete(); geometry.delete(); } layer.delete(); dataSource.delete(); } } ``` 代码解释: 1. 首先需要初始化GDAL/OGR,可以调用`ogr.RegisterAll()`方法进行初始化; 2. 打开矢量文件,可以使用`ogr.Open()`方法; 3. 获取第一个图层,可以使用`dataSource.GetLayer()`方法; 4. 遍历每个,可以使用`layer.GetNextFeature()`方法获取每个的Feature对象; 5. 获取每个外界矩形范围,可以使用`geometry.GetEnvelope()`方法获取外界矩形,然后获取最小X、最大X、最小Y、最大Y; 6. 输出每个外界矩形范围内的POINT数据,可以使用SQL语句过滤出符合条件的数据,然后使用`dataSource.ExecuteSQL()`方法执行SQL语句并返回一个新的Layer对象,遍历该Layer对象的每个Feature对象,获取每个Feature对象的Geometry对象,并输出其坐标; 7. 最后需要释放资源,可以调用各个对象的`delete()`方法进行释放。 注意事项: 1. 需要引入GDAL/OGR的Java库,可以使用Maven或手动下载并添加到classpath中; 2. 矢量文件的路径需要修改为实际的路径; 3. 输出结果可以根据需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GIS哼哈哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值