上传文件至 'x64/Release/models/mask_fill'
This commit is contained in:
parent
b163a03dc9
commit
1ca146c0c5
548
x64/Release/models/mask_fill/demFillHoles.py
Normal file
548
x64/Release/models/mask_fill/demFillHoles.py
Normal file
@ -0,0 +1,548 @@
|
|||||||
|
import os
|
||||||
|
import cv2
|
||||||
|
import numpy as np
|
||||||
|
import tifIO
|
||||||
|
import shutil
|
||||||
|
import sys
|
||||||
|
import argparse
|
||||||
|
import math
|
||||||
|
from math import floor
|
||||||
|
import json
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
import qgis
|
||||||
|
from qgis.core import * # attach main QGIS library
|
||||||
|
from qgis.utils import * # attach main python library
|
||||||
|
from qgis.analysis import *
|
||||||
|
from osgeo import gdal
|
||||||
|
|
||||||
|
#相对路径
|
||||||
|
qgis_path = sys.executable
|
||||||
|
process_path = qgis_path.split('bin')[0]+'apps\\qgis-ltr\\python\\plugins'
|
||||||
|
# process_path = 'D:/code/RsSurvey/RsSurvey_Build/x64/Release/QGIS_3.22.8/apps/qgis-ltr/python/plugins/'
|
||||||
|
if os.path.exists(process_path):
|
||||||
|
print("exists path:"+process_path)
|
||||||
|
sys.stdout.flush()
|
||||||
|
else:
|
||||||
|
print("fine no path:"+process_path)
|
||||||
|
sys.stdout.flush()
|
||||||
|
sys.path.append(process_path)
|
||||||
|
|
||||||
|
qgs = QgsApplication([], False)
|
||||||
|
qgs.initQgis()
|
||||||
|
|
||||||
|
import processing
|
||||||
|
from processing.core.Processing import Processing
|
||||||
|
Processing.initialize()
|
||||||
|
|
||||||
|
|
||||||
|
#添加参数
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument('--in_holedem', type=str,
|
||||||
|
default='D:/A_testdata/dianli_test/00yanshou/data_train_dem/05veg_maskedTiff/',
|
||||||
|
help='输入数据,经过裁剪的dem')
|
||||||
|
parser.add_argument('--work_space', type=str,
|
||||||
|
default='D:/A_testdata/dianli_test/00yanshou/data_train_dem/06veg_dataFill_workspace/',
|
||||||
|
help='用于填补时存放中间路径及结果文件')
|
||||||
|
parser.add_argument('--scale', type=float,
|
||||||
|
default=0.1,
|
||||||
|
help='外接矩形放大的比例')
|
||||||
|
parser.add_argument('--win_size', type=int,
|
||||||
|
default=3,
|
||||||
|
help='空洞外扩像素')
|
||||||
|
opt = parser.parse_args()
|
||||||
|
in_holedem = opt.in_holedem
|
||||||
|
work_space = opt.work_space
|
||||||
|
scale = opt.scale
|
||||||
|
win_size = opt.win_size
|
||||||
|
'''
|
||||||
|
txt文件名以in_holedem中dem数据文件名命名
|
||||||
|
内容以singlehole文件开始,包含位置信息
|
||||||
|
subname, lt_x,lt_y,rb_x,rb_y
|
||||||
|
tktk130_mask_id_1_hw_83_106.tif,1364,1950,1470,2033
|
||||||
|
'''
|
||||||
|
out_txt_folder = 'txt_singlehole/'
|
||||||
|
singlehole_folder = 'dem_singlehole/'# 保存单个空洞
|
||||||
|
|
||||||
|
ras2pot_folder = 'raster2points/'
|
||||||
|
ras2potpro_folder = 'raster2points_pro/'
|
||||||
|
tinmesh_folder = 'TINMesh/'
|
||||||
|
potfrommesh_folder = 'pointfrommesh/'
|
||||||
|
potfrommeshfloat_folder = 'pointfrommeshfloat/'
|
||||||
|
filltif_folder = 'tif/'
|
||||||
|
filltifpro_folder = 'tif_pro/'
|
||||||
|
|
||||||
|
out_fulltif_folder = 'out_result/'# 填补并放回的整图结果
|
||||||
|
|
||||||
|
print("win_size:%d,scale:%.4f" % (win_size, scale))
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
|
||||||
|
def findHoles(in_demfolder, out_singlehole, txt_folder):
|
||||||
|
count = 0
|
||||||
|
ev = floor(win_size / 2)
|
||||||
|
|
||||||
|
if os.path.exists(txt_folder):
|
||||||
|
try:
|
||||||
|
shutil.rmtree(txt_folder)
|
||||||
|
time.sleep(2) # 防止删除操作未结束就运行mkdir()
|
||||||
|
except Exception as e:
|
||||||
|
print("error {}".format(str(e)))
|
||||||
|
sys.stdout.flush()
|
||||||
|
print(-1.0)
|
||||||
|
sys.stdout.flush()
|
||||||
|
os.mkdir(txt_folder)
|
||||||
|
|
||||||
|
if os.path.exists(out_singlehole):
|
||||||
|
try:
|
||||||
|
shutil.rmtree(out_singlehole)
|
||||||
|
time.sleep(2) # 防止删除操作未结束就运行mkdir()
|
||||||
|
except Exception as e:
|
||||||
|
print("error {}".format(str(e)))
|
||||||
|
sys.stdout.flush()
|
||||||
|
print(-1)
|
||||||
|
sys.stdout.flush()
|
||||||
|
os.mkdir(out_singlehole)
|
||||||
|
|
||||||
|
dem_list = []
|
||||||
|
src_list = os.listdir(in_demfolder)
|
||||||
|
for f in src_list:
|
||||||
|
if os.path.splitext(f)[1] == '.tif' or os.path.splitext(f)[1] == '.TIF':
|
||||||
|
dem_list.append(f)
|
||||||
|
|
||||||
|
for imgfile in dem_list:
|
||||||
|
filename = os.path.splitext(imgfile)[0]
|
||||||
|
txtname = filename + '.txt'
|
||||||
|
txt_route = os.path.join(txt_folder, txtname)
|
||||||
|
|
||||||
|
file_handle = open(txt_route, mode='w')
|
||||||
|
# file_handle.writelines(['文件名,左上角列号,左上角行号,右下角列号,右下角行号\n'])
|
||||||
|
|
||||||
|
dem_route = os.path.join(in_demfolder, imgfile)
|
||||||
|
proj, geotrans, dem_img, width, height = tifIO.ReadTif(dem_route) # c,h,w
|
||||||
|
origin = cv2.imread(dem_route, cv2.IMREAD_UNCHANGED)
|
||||||
|
|
||||||
|
img = origin.copy()
|
||||||
|
# 二值化,转换类型
|
||||||
|
ret2, binary = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY_INV)
|
||||||
|
thresh_image = binary.astype(np.uint8)
|
||||||
|
|
||||||
|
# 连通域分析
|
||||||
|
contours, hierarchy = cv2.findContours(thresh_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) # 检索最外轮廓
|
||||||
|
# contours, hierarchy = cv2.findContours(thresh_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) # 检索所有轮廓
|
||||||
|
|
||||||
|
for i in range(0, len(contours)):
|
||||||
|
thisgeo = geotrans.copy()
|
||||||
|
lt_x, lt_y, w, h = cv2.boundingRect(contours[i]) # 最小包络矩形的四至
|
||||||
|
# 矩形外扩,最小外扩2像元,保证空洞再小也能外扩
|
||||||
|
w_ex = floor(w * scale / 2) if floor(w * scale / 2) > 2 else 2
|
||||||
|
h_ex = floor(h * scale / 2) if floor(h * scale / 2) > 2 else 2
|
||||||
|
if lt_x - w_ex >= 0:
|
||||||
|
new_lt_x = lt_x - w_ex
|
||||||
|
else:
|
||||||
|
new_lt_x = 0
|
||||||
|
|
||||||
|
if lt_y - h_ex >= 0:
|
||||||
|
new_lt_y = lt_y - h_ex
|
||||||
|
else:
|
||||||
|
new_lt_y = 0
|
||||||
|
|
||||||
|
if lt_x + w + w_ex <= width:
|
||||||
|
new_rb_x = lt_x + w + w_ex
|
||||||
|
else:
|
||||||
|
new_rb_x = width
|
||||||
|
|
||||||
|
if lt_y + h + h_ex <= height:
|
||||||
|
new_rb_y = lt_y + h + h_ex
|
||||||
|
else:
|
||||||
|
new_rb_y = height
|
||||||
|
|
||||||
|
this_hole = img[new_lt_y: new_rb_y, new_lt_x: new_rb_x]
|
||||||
|
flag = np.zeros(this_hole.shape, dtype=int)
|
||||||
|
flag[this_hole > -9999] = 1 # 如果低于-9999,arcgis中nodata是极小的负数
|
||||||
|
|
||||||
|
# 洞不扩大
|
||||||
|
# this_hole[this_hole <=0] = np.nan
|
||||||
|
|
||||||
|
# 洞外扩
|
||||||
|
new_w = new_rb_x - new_lt_x
|
||||||
|
new_h = new_rb_y - new_lt_y
|
||||||
|
for c in range(0, new_w):
|
||||||
|
for r in range(0, new_h):
|
||||||
|
if flag[r, c] == 0:
|
||||||
|
for win_c in range(win_size):
|
||||||
|
for win_r in range(win_size):
|
||||||
|
tempr = r + win_r - ev
|
||||||
|
tempc = c + win_c - ev
|
||||||
|
if tempr >= 0 and tempr < new_h and tempc >= 0 and tempc < new_w:
|
||||||
|
this_hole[tempr, tempc] = np.nan
|
||||||
|
|
||||||
|
lon = thisgeo[0] + thisgeo[1] * new_lt_x
|
||||||
|
lat = thisgeo[3] + thisgeo[5] * new_lt_y
|
||||||
|
|
||||||
|
thisgeo[0] = lon
|
||||||
|
thisgeo[3] = lat
|
||||||
|
|
||||||
|
# fileroutesub =filename+ '_%d.tif' % count
|
||||||
|
fileroutesub = filename + '_id_%d_hw_%d_%d' % (i + 1, new_h, new_w) + '.tif'
|
||||||
|
fileroute = os.path.join(out_singlehole, fileroutesub)
|
||||||
|
this_hole[np.where(this_hole == 0.0)] = np.nan
|
||||||
|
tifIO.writeTif(fileroute, proj, thisgeo, this_hole) # 投影信息不对
|
||||||
|
|
||||||
|
# 坐标从【0,0】开始计,左上坐标【x,y】,右下坐标[x+w-1,y+h-1]
|
||||||
|
file_handle.writelines([fileroutesub, ',', str(new_lt_x), ',',
|
||||||
|
str(new_lt_y), ',', str(new_rb_x), ',', str(new_rb_y), '\n'])
|
||||||
|
count = count + 1
|
||||||
|
file_handle.close()
|
||||||
|
|
||||||
|
|
||||||
|
def confirmWorkspaceClear(rootPath):
|
||||||
|
out_path_raster2points = os.path.join(rootPath, ras2pot_folder)
|
||||||
|
if os.path.exists(out_path_raster2points):
|
||||||
|
try:
|
||||||
|
shutil.rmtree(out_path_raster2points)
|
||||||
|
time.sleep(2) # 防止删除操作未结束就运行mkdir()
|
||||||
|
except Exception as e:
|
||||||
|
print(-1.0)
|
||||||
|
sys.stdout.flush()
|
||||||
|
os.mkdir(out_path_raster2points)
|
||||||
|
print(4)
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
out_path_raster2points_pro = os.path.join(rootPath, ras2potpro_folder)
|
||||||
|
if os.path.exists(out_path_raster2points_pro):
|
||||||
|
try:
|
||||||
|
shutil.rmtree(out_path_raster2points_pro)
|
||||||
|
time.sleep(2) # 防止删除操作未结束就运行mkdir()
|
||||||
|
except Exception as e:
|
||||||
|
print(-1.0)
|
||||||
|
sys.stdout.flush()
|
||||||
|
os.mkdir(out_path_raster2points_pro)
|
||||||
|
print(5)
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
out_path_TINMesh = os.path.join(rootPath, tinmesh_folder)
|
||||||
|
if os.path.exists(out_path_TINMesh):
|
||||||
|
try:
|
||||||
|
shutil.rmtree(out_path_TINMesh)
|
||||||
|
time.sleep(2) # 防止删除操作未结束就运行mkdir()
|
||||||
|
except Exception as e:
|
||||||
|
print(-1.0)
|
||||||
|
sys.stdout.flush()
|
||||||
|
os.mkdir(out_path_TINMesh)
|
||||||
|
print(6)
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
out_path_pointfrommesh = os.path.join(rootPath, potfrommesh_folder)
|
||||||
|
if os.path.exists(out_path_pointfrommesh):
|
||||||
|
try:
|
||||||
|
shutil.rmtree(out_path_pointfrommesh)
|
||||||
|
time.sleep(2) # 防止删除操作未结束就运行mkdir()
|
||||||
|
except Exception as e:
|
||||||
|
print(-1.0)
|
||||||
|
sys.stdout.flush()
|
||||||
|
os.mkdir(out_path_pointfrommesh)
|
||||||
|
print(7)
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
out_path_pointfrommeshfloat = os.path.join(rootPath, potfrommeshfloat_folder)
|
||||||
|
if os.path.exists(out_path_pointfrommeshfloat):
|
||||||
|
try:
|
||||||
|
shutil.rmtree(out_path_pointfrommeshfloat)
|
||||||
|
time.sleep(2) # 防止删除操作未结束就运行mkdir()
|
||||||
|
except Exception as e:
|
||||||
|
print(-1.0)
|
||||||
|
sys.stdout.flush()
|
||||||
|
os.mkdir(out_path_pointfrommeshfloat)
|
||||||
|
print(8)
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
out_path_tif = os.path.join(rootPath, filltif_folder)
|
||||||
|
if os.path.exists(out_path_tif):
|
||||||
|
try:
|
||||||
|
shutil.rmtree(out_path_tif)
|
||||||
|
time.sleep(2) # 防止删除操作未结束就运行mkdir()
|
||||||
|
except Exception as e:
|
||||||
|
print(-1.0)
|
||||||
|
sys.stdout.flush()
|
||||||
|
os.mkdir(out_path_tif)
|
||||||
|
print(9)
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
out_path_tif_pro = os.path.join(rootPath, filltifpro_folder)
|
||||||
|
if os.path.exists(out_path_tif_pro):
|
||||||
|
try:
|
||||||
|
shutil.rmtree(out_path_tif_pro)
|
||||||
|
time.sleep(2) # 防止删除操作未结束就运行mkdir()
|
||||||
|
except Exception as e:
|
||||||
|
print(-1.0)
|
||||||
|
sys.stdout.flush()
|
||||||
|
os.mkdir(out_path_tif_pro)
|
||||||
|
print(10)
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
|
||||||
|
def raster2points(fileName):
|
||||||
|
inFile=work_space+singlehole_folder+fileName
|
||||||
|
# 获取文件信息
|
||||||
|
rlayer = QgsRasterLayer(inFile, "SRTM layer name")
|
||||||
|
tif_crs =rlayer.crs().toWkt()
|
||||||
|
if not rlayer.isValid():
|
||||||
|
print("图层加载失败!")
|
||||||
|
dataset = gdal.Open(inFile)
|
||||||
|
gt = dataset.GetGeoTransform()
|
||||||
|
Xmin = gt[0]
|
||||||
|
Ymin = gt[3]
|
||||||
|
width = dataset.RasterXSize
|
||||||
|
height = dataset.RasterYSize
|
||||||
|
Xmax = gt[0] + width*gt[1] + height*gt[2]
|
||||||
|
Ymax = gt[3] + width*gt[4] + height*gt[5]
|
||||||
|
extent = [Xmin,Xmax,min(Ymin,Ymax),max(Ymin,Ymax)]
|
||||||
|
cellHeight = math.fabs(gt[1])
|
||||||
|
cellWidth = math.fabs(gt[5])
|
||||||
|
|
||||||
|
# #准备进行处理
|
||||||
|
# aid='saga:rastervaluestopoints'
|
||||||
|
out_path = os.path.join(work_space,ras2pot_folder)
|
||||||
|
outFile=out_path+fileName[0:fileName.index('.')]+'.geojson'
|
||||||
|
# p = {
|
||||||
|
# 'GRIDS': [inFile],
|
||||||
|
# 'NODATA': True,
|
||||||
|
# 'POLYGONS': None,
|
||||||
|
# 'SHAPES': outFile,
|
||||||
|
# 'TYPE': 0}
|
||||||
|
# processing.run(aid, p)
|
||||||
|
print(qgis_path)
|
||||||
|
exe_path= qgis_path.split('python.exe')[0]+"saga_cmd.exe"
|
||||||
|
print(exe_path)
|
||||||
|
cammand_line=exe_path+" shapes_grid 3 -GRIDS {} -POLYGONS None -NODATA 1 -SHAPES {} -TYPE 0".format(inFile,outFile)# --flags[qr]
|
||||||
|
process_status=subprocess.call(cammand_line)
|
||||||
|
if 0!=process_status:
|
||||||
|
print("error ")
|
||||||
|
|
||||||
|
pro_aid = 'native:assignprojection'
|
||||||
|
proFile = work_space+ras2potpro_folder+fileName[0:fileName.index('.')]+'.geojson'
|
||||||
|
pro_p = {
|
||||||
|
'CRS': QgsCoordinateReferenceSystem('EPSG:4546'),
|
||||||
|
'INPUT': outFile,
|
||||||
|
'OUTPUT': proFile,
|
||||||
|
}
|
||||||
|
processing.run(pro_aid, pro_p)
|
||||||
|
return fileName[0:fileName.index('.')]+'.geojson', cellHeight, cellWidth, tif_crs, extent
|
||||||
|
|
||||||
|
|
||||||
|
def points2mesh(fileName,tif_crs):
|
||||||
|
aid='native:tinmeshcreation'
|
||||||
|
inFile=work_space+ras2potpro_folder+fileName
|
||||||
|
optFile=work_space+tinmesh_folder+fileName[0:fileName.index('.')]+'.file'
|
||||||
|
p={ 'CRS_OUTPUT' : QgsCoordinateReferenceSystem('EPSG:4546'), 'MESH_FORMAT' : 2, 'OUTPUT_MESH' : optFile,
|
||||||
|
'SOURCE_DATA' : [{'source': inFile,'type': 0,'attributeIndex': 3}] }
|
||||||
|
|
||||||
|
processing.run(aid,p)
|
||||||
|
return fileName[0:fileName.index('.')]+'.file'
|
||||||
|
|
||||||
|
|
||||||
|
def getpointFromMesh(fileName, tif_crs,extent):
|
||||||
|
inFile = work_space + tinmesh_folder + fileName
|
||||||
|
if not os.path.exists(inFile):
|
||||||
|
inFile = work_space + tinmesh_folder + fileName + '.ply'
|
||||||
|
optFile = 'TEMPORARY_OUTPUT'
|
||||||
|
aid = 'native:exportmeshongrid'
|
||||||
|
# tif_crs
|
||||||
|
p = {'CRS_OUTPUT' : QgsCoordinateReferenceSystem('EPSG:4546'), 'DATASET_GROUPS': [0],
|
||||||
|
'DATASET_TIME': {'type': 'static'},
|
||||||
|
'EXTENT':None,
|
||||||
|
'GRID_SPACING': 0.05,
|
||||||
|
'INPUT' : inFile, 'OUTPUT': optFile, 'VECTOR_OPTION': 0}
|
||||||
|
# 'EXTENT': '%.8f,%.8f,%.8f,%.8f [EPSG:4546]' % (extent[0],extent[1],extent[2],extent[3]),
|
||||||
|
res = processing.run(aid, p)
|
||||||
|
# Save as a shapefile
|
||||||
|
Fl_ou = fileName[0:fileName.index('.')] + '.geojson'
|
||||||
|
Fl_ou = work_space + potfrommesh_folder + Fl_ou
|
||||||
|
|
||||||
|
options = QgsVectorFileWriter.SaveVectorOptions()
|
||||||
|
options.driverName = "geojson"
|
||||||
|
QgsVectorFileWriter.writeAsVectorFormatV2(res['OUTPUT'], Fl_ou, QgsCoordinateTransformContext(), options)
|
||||||
|
# TODO turn string to realNumber
|
||||||
|
return fileName[0:fileName.index('.')] + '.geojson'
|
||||||
|
|
||||||
|
|
||||||
|
def transString2float(fileName):
|
||||||
|
inFile = work_space + potfrommesh_folder + fileName
|
||||||
|
|
||||||
|
opt = work_space + potfrommeshfloat_folder + fileName
|
||||||
|
optFile = open(opt, 'w')
|
||||||
|
# minx=9999999
|
||||||
|
# maxx=0
|
||||||
|
# miny=99999999
|
||||||
|
# maxy=0
|
||||||
|
with open(inFile) as jsonFile:
|
||||||
|
points = json.load(jsonFile)
|
||||||
|
features = points['features']
|
||||||
|
for feature in features:
|
||||||
|
properties = feature['properties']
|
||||||
|
Bed_Elevation = float(properties['Bed Elevation'])
|
||||||
|
properties['Bed Elevation'] = Bed_Elevation
|
||||||
|
#
|
||||||
|
# geometry=feature['geometry']
|
||||||
|
'''
|
||||||
|
coordinates = geometry['coordinates']
|
||||||
|
|
||||||
|
x = coordinates[0]
|
||||||
|
if minx>x:
|
||||||
|
minx =x
|
||||||
|
if maxx<x:
|
||||||
|
maxx=x
|
||||||
|
y= coordinates[1]
|
||||||
|
if miny > y:
|
||||||
|
miny=y
|
||||||
|
if maxy <y:
|
||||||
|
maxy=y
|
||||||
|
'''
|
||||||
|
json.dump(points, optFile)
|
||||||
|
optFile.close()
|
||||||
|
return fileName
|
||||||
|
|
||||||
|
|
||||||
|
def point2tif(fileName,cellHeight,cellWidth,tif_crs,extent):
|
||||||
|
inFile=work_space+potfrommeshfloat_folder+fileName
|
||||||
|
# print(inFile)
|
||||||
|
optFile=work_space+filltif_folder+fileName[0:fileName.index('.')]+'.tif'
|
||||||
|
# print(extent)
|
||||||
|
aid='gdal:rasterize'
|
||||||
|
p = {'BURN':0, 'DATA_TYPE':5,
|
||||||
|
'EXTENT':None,
|
||||||
|
'EXTRA': '', 'FIELD' : 'Bed Elevation', 'HEIGHT' : cellHeight,'INIT' : None,
|
||||||
|
'INPUT': inFile, 'INVERT' : False, 'NODATA' : 0, 'OPTIONS' : '', 'OUTPUT' : optFile,
|
||||||
|
'UNITS': 1, 'USE_Z' : False, 'WIDTH' : cellWidth}
|
||||||
|
# p= { 'BURN':0, 'DATA_TYPE':5,
|
||||||
|
# 'EXTENT':'544158.5540865903, 544161.2540865903, 4450451.895210848, 4450455.295210849 [EPSG:4546]',
|
||||||
|
# 'EXTRA' : '', 'FIELD' : 'Bed Elevation', 'HEIGHT' : cellHeight,
|
||||||
|
# 'INIT' : None, 'INPUT' : inFile, 'INVERT' : False, 'NODATA' : 0,
|
||||||
|
# 'OPTIONS' : '',
|
||||||
|
# 'OUTPUT' : optFile, 'UNITS' : 1, 'USE_Z' : False, 'WIDTH' : cellWidth}
|
||||||
|
processing.run(aid,p)
|
||||||
|
dataset=gdal.Open(optFile)
|
||||||
|
width = dataset.RasterXSize
|
||||||
|
height = dataset.RasterYSize
|
||||||
|
# print('out wid,hei:',width,height)
|
||||||
|
|
||||||
|
optFile2=work_space+'tif2/'+fileName[0:fileName.index('.')]+'.tif'
|
||||||
|
# print(optFile2)
|
||||||
|
pro_aid='gdal:warpreproject'
|
||||||
|
# proFile=optFile
|
||||||
|
# proFile=rootPath+'raster2points_pro/'+fileName[0:fileName.index('.')]+'.shp'
|
||||||
|
# pro_p={ 'CRS' : QgsCoordinateReferenceSystem('EPSG:4546'), 'INPUT' : outFile, 'OUTPUT' :proFile}
|
||||||
|
pro_p={'SOURCE_CRS' : QgsCoordinateReferenceSystem('EPSG:4546'),
|
||||||
|
'TARGET_CRS' : QgsCoordinateReferenceSystem(tif_crs),
|
||||||
|
'EXTENT': '%.8f,%.8f,%.8f,%.8f [EPSG:4546]' % (extent[0], extent[1], extent[2], extent[3]),
|
||||||
|
'RESAMPLING':2,'INPUT' : optFile, 'OUTPUT' :optFile2}
|
||||||
|
processing.run(pro_aid,pro_p)
|
||||||
|
|
||||||
|
return fileName
|
||||||
|
|
||||||
|
|
||||||
|
def processOneTif(fileName):
|
||||||
|
# 转矢量点,赋投影
|
||||||
|
processedFile, cellHeight, cellWidth, tif_crs, extent = raster2points(fileName)
|
||||||
|
meshFile = points2mesh(processedFile, tif_crs)
|
||||||
|
pointsFile = getpointFromMesh(meshFile, tif_crs, extent)
|
||||||
|
pointsFilefloat = transString2float(pointsFile)
|
||||||
|
point2tif(pointsFilefloat, cellHeight, cellWidth, tif_crs, extent)
|
||||||
|
|
||||||
|
|
||||||
|
def demFill():
|
||||||
|
# print("demFill")
|
||||||
|
# sys.stdout.flush()
|
||||||
|
single_files_list=os.listdir(work_space+singlehole_folder)
|
||||||
|
temp_file_lists = []
|
||||||
|
for file in single_files_list:
|
||||||
|
if os.path.splitext(file)[1] == '.tif' or os.path.splitext(file)[1] == '.TIF':
|
||||||
|
temp_file_lists.append(file)
|
||||||
|
total = len(temp_file_lists)
|
||||||
|
for index, file in enumerate(temp_file_lists):
|
||||||
|
sys.stdout.flush()
|
||||||
|
processOneTif(file)
|
||||||
|
print(10+float((index+1) / total * 79))
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
|
||||||
|
def back2Whole():
|
||||||
|
txtList=[]
|
||||||
|
txt_dir=work_space+out_txt_folder
|
||||||
|
sub_list = os.listdir(txt_dir)
|
||||||
|
#先找txt,保存文件名到list中
|
||||||
|
for f in sub_list:
|
||||||
|
if os.path.splitext(f)[1] == '.txt' or os.path.splitext(f)[1] == '.TXT':
|
||||||
|
txtList.append(f)
|
||||||
|
|
||||||
|
txtNum=len(txtList)
|
||||||
|
if txtNum<=0:
|
||||||
|
# print("There is no holes to join")
|
||||||
|
print(-1.0)
|
||||||
|
sys.stdout.flush()
|
||||||
|
currentIndicator=0
|
||||||
|
for txtfile in txtList:
|
||||||
|
#根据文件名找原来的图像文件,拷贝
|
||||||
|
imgname=os.path.splitext(txtfile)[0]
|
||||||
|
demfile=imgname+'.tif'# txt文件名与dem文件名对应
|
||||||
|
txt_route= os.path.join(txt_dir, txtfile)# txt文件
|
||||||
|
dem_route = os.path.join(in_holedem, demfile)# 空缺的整图
|
||||||
|
proj, geotrans, dem_img, width, height = tifIO.ReadTif(dem_route) # c,h,w
|
||||||
|
img = dem_img.copy()
|
||||||
|
#读txt,找到对应的小矩形文件
|
||||||
|
file_handle=open(txt_route,mode="r")
|
||||||
|
lines=file_handle.readlines()
|
||||||
|
for i in lines:
|
||||||
|
s=i.split(',')
|
||||||
|
#['文件名,左上角列号,左上角行号,右下角列号,右下角行号\n']
|
||||||
|
subname=s[0]
|
||||||
|
lt_x=int(s[1])
|
||||||
|
lt_y=int(s[2])
|
||||||
|
rb_x=int(s[3])
|
||||||
|
rb_y=int(s[4])
|
||||||
|
# print(subname+" img's lt_x:%d,lt_y:%d,rb_x:%d,rb_y:%d" % (lt_x,lt_y,rb_x,rb_y))
|
||||||
|
# 读相应的文件,根据行列号替换
|
||||||
|
sub_route = os.path.join(work_space+filltif_folder, subname)
|
||||||
|
proj_sub, geotrans_sub, sub_img, w_sub, h_sub = tifIO.ReadTif(sub_route)
|
||||||
|
sp = sub_img.shape
|
||||||
|
img_w = sp[1]
|
||||||
|
img_h = sp[0]
|
||||||
|
# print(subname + " img's w:%d,h:%d" % (img_w,img_h))
|
||||||
|
# img[lt_y:rb_y,lt_x:rb_x]=sub_img
|
||||||
|
img[lt_y:lt_y+img_h,lt_x:lt_x+img_w]=sub_img
|
||||||
|
file_handle.close()
|
||||||
|
out_path = os.path.join(work_space,out_fulltif_folder)
|
||||||
|
if os.path.exists(out_path):
|
||||||
|
try:
|
||||||
|
shutil.rmtree(out_path)
|
||||||
|
time.sleep(2) # 防止删除操作未结束就运行mkdir()
|
||||||
|
except Exception as e:
|
||||||
|
print(-1.0)
|
||||||
|
sys.stdout.flush()
|
||||||
|
os.mkdir(out_path)
|
||||||
|
|
||||||
|
out_wholefile=imgname+'_whole.tif'
|
||||||
|
tifIO.writeTif(out_path+out_wholefile, proj, geotrans, img)
|
||||||
|
currentIndicator=currentIndicator+1
|
||||||
|
print(90.0+float(currentIndicator/txtNum)*10)
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
print(0)
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
in_demfolder = in_holedem
|
||||||
|
out_singlehole = os.path.join(work_space, singlehole_folder)
|
||||||
|
txt_folder = os.path.join(work_space, out_txt_folder)
|
||||||
|
# 执行寻找并保存单个空洞
|
||||||
|
findHoles(in_demfolder,out_singlehole,txt_folder)
|
||||||
|
print(2)
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
confirmWorkspaceClear(work_space)
|
||||||
|
|
||||||
|
demFill()
|
||||||
|
|
||||||
|
back2Whole()
|
68
x64/Release/models/mask_fill/tifIO.py
Normal file
68
x64/Release/models/mask_fill/tifIO.py
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
from osgeo import gdal
|
||||||
|
# from tqdm import tqdm
|
||||||
|
|
||||||
|
def ReadTif(tif_path):
|
||||||
|
dataset = gdal.Open(tif_path)
|
||||||
|
width = dataset.RasterXSize
|
||||||
|
height = dataset.RasterYSize
|
||||||
|
|
||||||
|
geotrans = list(dataset.GetGeoTransform()) # 仿射矩阵
|
||||||
|
proj = dataset.GetProjection() # 地图投影信息
|
||||||
|
data = dataset.ReadAsArray(0, 0, width, height) # 将数据写成数组,对应栅格矩阵
|
||||||
|
|
||||||
|
del dataset # 关闭对象,文件dataset
|
||||||
|
return proj, geotrans, data, width, height
|
||||||
|
|
||||||
|
def writeTif(fileroute, im_proj, im_geotrans, im_data):
|
||||||
|
# 判断栅格数据的数据类型
|
||||||
|
"""
|
||||||
|
GDAL中的GDALDataType是一个枚举型,其中的值为:
|
||||||
|
GDT_Unknown : 未知数据类型
|
||||||
|
GDT_Byte : 8bit正整型 (C++中对应unsigned char)
|
||||||
|
GDT_UInt16 : 16bit正整型 (C++中对应 unsigned short)
|
||||||
|
GDT_Int16 : 16bit整型 (C++中对应 short 或 short int)
|
||||||
|
GDT_UInt32 : 32bit 正整型 (C++中对应unsigned long)
|
||||||
|
GDT_Int32 : 32bit整型 (C++中对应int 或 long 或 long int)
|
||||||
|
GDT_Float32 : 32bit 浮点型 (C++中对应float)
|
||||||
|
GDT_Float64 : 64bit 浮点型 (C++中对应double)
|
||||||
|
GDT_CInt16 : 16bit复整型 (?)
|
||||||
|
GDT_CInt32 : 32bit复整型 (?)
|
||||||
|
GDT_CFloat32 : 32bit复浮点型 (?)
|
||||||
|
GDT_CFloat64 : 64bit复浮点型 (?)
|
||||||
|
"""
|
||||||
|
if 'int8' in im_data.dtype.name:
|
||||||
|
datatype = gdal.GDT_Byte
|
||||||
|
elif 'int16' in im_data.dtype.name:
|
||||||
|
datatype = gdal.GDT_UInt16
|
||||||
|
else:
|
||||||
|
datatype = gdal.GDT_Float32
|
||||||
|
|
||||||
|
# 判读数组维数
|
||||||
|
if len(im_data.shape) == 3:
|
||||||
|
im_bands, im_height, im_width = im_data.shape
|
||||||
|
else:
|
||||||
|
im_bands, (im_height, im_width) = 1, im_data.shape
|
||||||
|
im_data = im_data.reshape(im_bands,im_height, im_width)
|
||||||
|
# 创建文件
|
||||||
|
driver = gdal.GetDriverByName("GTiff") # 数据类型必须有,因为要计算需要多大内存空间
|
||||||
|
dataset = driver.Create(fileroute, im_width,im_height, im_bands, datatype)
|
||||||
|
|
||||||
|
dataset.SetGeoTransform(im_geotrans) # 写入仿射变换参数
|
||||||
|
dataset.SetProjection(im_proj) # 写入投影
|
||||||
|
|
||||||
|
if im_bands == 1:
|
||||||
|
dataset.GetRasterBand(1).WriteArray(im_data[0]) # 写入数组数据
|
||||||
|
else:
|
||||||
|
#for i in range(im_bands):
|
||||||
|
for i in tqdm(range(im_bands)):
|
||||||
|
dataset.GetRasterBand(i + 1).WriteArray(im_data[i])
|
||||||
|
|
||||||
|
del dataset
|
||||||
|
|
||||||
|
def np2gdal(hwc): # hwc2chw
|
||||||
|
chw = hwc.swapaxes(2, 0).swapaxes(1, 2) # h,w,c to c,h,w
|
||||||
|
return chw
|
||||||
|
|
||||||
|
def gdal2np(chw): #chw2hwc
|
||||||
|
hwc = chw.swapaxes(1, 0).swapaxes(1, 2) # h,w,c
|
||||||
|
return hwc
|
Loading…
Reference in New Issue
Block a user