gdal
gdal.warp
矢量裁剪栅格
from osgeo import gdal,gdalconst
shppath = r'D:\Africa\Africa_city.shp'
tifpath = r'D:\regionImg\VNL_2012Africa.tif'
outtif1 = r'D:\Africa\Africa_FID0.tif'
cutlineWhere = 'FID = 2485'
ds = gdal.Warp(
outtif1, #裁剪后图像保存的完整路径(包括文件名)
tifpath, #待裁剪的影像完整路径(包括文件名)
format='GTiff', # 保存图像的格式
cutlineDSName=shppath, # 矢量文件的完整路径
cropToCutline=True, # 保证裁剪后影像大小跟矢量文件的图框大小一致(设置为False时,结果图像大小会跟待裁剪影像大小一样,则会出现大量的空值区域)
del ds
栅格转矢量
import gdal,ogr
shp_file = ogr.Open(shp_path)
attribute_field = "yjlbm"
# 创建栅格
target_ds = gdal.GetDriverByName('GTiff').Create(
utf8_path=target_tif_path, # 栅格地址
xsize=width, # 栅格宽
ysize=height, # 栅格高
bands=1, # 栅格波段数
eType=gdal.GDT_Byte # 栅格数据类型
)
# 将参考栅格的仿射变换信息设置为结果栅格仿射变换信息
target_ds.SetGeoTransform(geotrans)
# 设置投影坐标信息
target_ds.SetProjection(proj)
band = target_ds.GetRasterBand(1)
# 设置背景nodata数值
band.SetNoDataValue(nodata_value)
band.FlushCache()
shp_layer = shp_file.GetLayer()
gdal.RasterizeLayer(
dataset=target_ds, # 输出的栅格数据集
bands=[1], # 输出波段
layer=shp_layer, # 输入待转换的矢量图层
options=[f"ATTRIBUTE={attribute_field}"] # 指定字段值为栅格值
)
geopandas
获取shp四至
import geopandas as gpd
gdf = gpd.read_file(self.buffer_shp)
shp_extent_df = gdf.bounds
shp_extent = [gdf.bounds[gdf.bounds.columns[i]].values.tolist() for i in range(4)]
print(shp_extent)
# [[108.94713511999997], [34.18955996000003], [110.62953112000004], [35.874355976764114]]
# 将大列表中的小列表去除
# 第一种方法:
newlist = sum(shp_extent ,[])
print(newlist)
# [108.94713511999997, 34.18955996000003, 110.62953112000004, 35.874355976764114]
# 第二种方法
import numpy as np
arr2 = list(np.array(shp_extent).flatten())
print(arr2)
# arr2:
# [108.94713511999997, 34.18955996000003, 110.62953112000004, 35.874355976764114]
# 第三种方法
final_list = [x for x, in shp_extent]
根据某一个字段合并矢量
import geopandas as gpd
shp = r'G:\00算法研究专用文件夹\vfc\0510\柠条塔地表景观.shp'
gdf = gpd.read_file(shp)
# 根据yjlbm字段对矢量进行合并
dissolve_gdf = gdf.dissolve(by='yjlbm')
# 导出矢量,注意编码问题
dissolve_gdf.to_file(r'输出矢量',encoding='UTF-8')
pandas
df制作
# 创建字典进行df制作
df = pd.DataFrame({'a':1,
'b':2})
字段为空
df.isnull().sum()
datetime
将字符串日期转换为 datetime 日期
# acqu_time : '2022-06-23 11:56:08'
from datetime import datetime
datetime.strptime(acqu_time,'%Y-%m-%d %H:%M:%S')
# result
datetime.datetime(2022, 6, 23, 11, 56, 8)
根据已知值,查找对应其它列的值
#df:
编码 调查区名称
0 610500000000-001 秦岭北麓(渭南段)矿山地质环境调查区
1 610500000000-002 桥山南麓(蒲城、富平)矿山地质环境调查区
2 610500000000 渭南市
# 需求为根据已知编码的值,查找对应调查区的值
name = '610500000000-001'
exDesc = df[df['编码']==name]
print(exDesc)
编码 调查区名称
2 610500000000 渭南市
# 获取具体值
value = exDesc['调查区名称'].values[0]
print(value)
#'渭南市'
glob
从一个文件夹内找到特定文件
# 从last_result文件夹中查找符合 C1000002008081120000593 VFC .tif的数据
last_result = r'G:\去年成果\2021'
tifdatalist = glob.glob(last_result+"/C1000002008081120000593*VFC*.tif")
xml.etree.ElementTree
从xml文件中查找,修改值
import xml.etree.ElementTree as ET
xml_file = r'G:\WeiNan_modify\元数据模板.tif.xml'
# 构建xml解析器
doc = ET.parse(raw_xml)
# 获得根目录
root = doc.getroot()
# 子节点获取方法1
for child in root:
if child.tag == 'dataIdInfo':
child.text = xxx #xxx为你要修改的值
# 子节点获取方法2:知道xml结构
xml_tmbegin = './/dataIdInfo/dataExt/tempEle/TempExtent/exTemp/TM_Period/tmBegin'
tmbegin = root.find(xml_tmbegin)
tmbegin.text = xxx #xxx为你要修改的值
# 修改完成后,将xml导出
out_file = '' # 输出路径
doc.write(out_file,encoding='UTF-8',xml_declaration=True)
Numpy
去除数组中的特定值
import numpy as np
a = [0,1,2,3,4]
b = a[a!=0]
print(b)
# b:[1,2,3,4]
其他
计算两列数据的相关系数
from pandas import Series
# 必须是一维数组
s1 = Series(data_flatten2)
s2 = Series(data_flatten2)
corr = s1.corr(s2)