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)