# -*- coding: utf-8 -*-
from osgeo import gdal
from osgeo import ogr, osr
def read_img(filename):
dataset=gdal.Open(filename)
im_width = dataset.RasterXSize
im_height = dataset.RasterYSize
im_geotrans = dataset.GetGeoTransform()
im_proj = dataset.GetProjection()
im_data = dataset.ReadAsArray(0,0,im_width,im_height)
# del dataset
return im_width,im_height,im_proj,im_geotrans,im_data,dataset
def getSRSPair(dataset):
'''
获得给定数据的投影参考系和地理参考系
:param dataset: GDAL地理数据
:return: 投影参考系和地理参考系
'''
prosrs = osr.SpatialReference()
prosrs.ImportFromWkt(dataset.GetProjection())
geosrs = prosrs.CloneGeogCS()
return prosrs, geosrs
def geo2lonlat(dataset, x, y):
'''
将投影坐标转为经纬度坐标(具体的投影坐标系由给定数据确定)
:param dataset: GDAL地理数据
:param x: 投影坐标x
:param y: 投影坐标y
:return: 投影坐标(x, y)对应的经纬度坐标(lon, lat)
'''
prosrs, geosrs = getSRSPair(dataset)
ct = osr.CoordinateTransformation(prosrs, geosrs)
coords = ct.TransformPoint(x, y)
return coords[:2]
def imagexy2geo(dataset, col, row):
'''
根据GDAL的六参数模型将影像图上坐标(行列号)转为投影坐标或地理坐标(根据具体数据的坐标系统转换)
:param dataset: GDAL地理数据
:param row: 像素的行号
:param col: 像素的列号
:return: 行列号(row, col)对应的投影坐标或地理坐标(x, y)
'''
trans = dataset.GetGeoTransform()
print(trans)
print(row,col)
px = trans[0] + col * trans[1] + row * trans[2]
py = trans[3] + col * trans[4] + row * trans[5]
return px, py
def imagexy2PointShp(img_path, strVectorFile, Points):
im_width,im_height,im_proj,im_geotrans,im_data,dataset = read_img(img_path)
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO") # 为了支持中文路径
gdal.SetConfigOption("SHAPE_ENCODING", "CP936") # 为了使属性表字段支持中文
ogr.RegisterAll()
strDriverName = "ESRI Shapefile" # 创建数据,这里创建ESRI的shp文件
oDriver = ogr.GetDriverByName(strDriverName)
if oDriver == None:
print("%s 驱动不可用!\n", strDriverName)
oDS = oDriver.CreateDataSource(strVectorFile) # 创建数据源
if oDS == None:
print("创建文件【%s】失败!", strVectorFile)
# srs = osr.SpatialReference() # 创建空间参考
# srs.ImportFromEPSG(4326) # 定义地理坐标系WGS1984
srs = osr.SpatialReference(wkt=dataset.GetProjection())#我在读栅格图的时候增加了输出dataset,这里就可以不用指定投影,实现全自动了,上面两行可以注释了,并且那个proj参数也可以去掉了,你们自己去掉吧
papszLCO = []
# 创建图层,创建一个多边形图层,"TestPolygon"->属性表名
oLayer = oDS.CreateLayer("Point", srs, ogr.wkbPoint, papszLCO)
oDefn = oLayer.GetLayerDefn() # 定义要素
for point in Points:
oFeatureTriangle = ogr.Feature(oDefn)
ring = ogr.Geometry(ogr.wkbPoint) # 构建几何类型:线
ring.AddPoint(point[0], point[1]) # 添加点01
oFeatureTriangle.SetGeometry(ring)
oLayer.CreateFeature(oFeatureTriangle)
oDS.Destroy()
print("数据集创建完成!\n")
if __name__ == "__main__":
img_filename = r'D:\MyWorkSpace\MyUtilsCode\CroplandAI2\cq\0000000001_V1\0000000001.tif'
dst_filename = 'label.shp'
dataset = gdal.Open(img_filename)
anns = [[0, 0], [200, 200]]
annsGEO = []
for ann in anns:
xmin, ymin = imagexy2geo(dataset, ann[0], ann[1])
annsGEO.append([xmin, ymin])
# 转换成点矢量
imagexy2PointShp(img_filename, dst_filename, annsGEO)
基于ogr的点矢量生成方法
猜你喜欢
转载自blog.csdn.net/weixin_42990464/article/details/124718529
今日推荐
周排行