add some icons

This commit is contained in:
gis-xh 2022-11-07 15:24:33 +08:00
parent 3d753a88a5
commit 2445b7aec0
14 changed files with 737 additions and 583 deletions

View File

@ -6,7 +6,15 @@ CVEO团队
Python3.7 + PyQt + QGIS Python3.7 + PyQt + QGIS
## 配置方式 ## 配置方式
```
conda create -f conda.yaml conda create -f conda.yaml
```
```
conda env create -n cevo_qt -f conda.yaml
```
# 打包方式 # 打包方式

View File

@ -11,6 +11,7 @@ dependencies:
- pyqtads=3.8.2=py37hf2a7229_0 - pyqtads=3.8.2=py37hf2a7229_0
- python=3.7.10=h7840368_101_cpython - python=3.7.10=h7840368_101_cpython
- python_abi=3.7=2_cp37m - python_abi=3.7=2_cp37m
- pip
- pyyaml=5.4.1=py37hcc03f2d_1 - pyyaml=5.4.1=py37hcc03f2d_1
- qgis=3.18.3=py37h3dc7164_2 - qgis=3.18.3=py37h3dc7164_2
- qt=5.12.9=h5909a2a_4 - qt=5.12.9=h5909a2a_4

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
icons/植被变化.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -1 +1 @@
vd4FiYncytyziGH9GNCAA8hGGr1/79Xmphtc5+PHPJDpxvqj1hP7+985QMojYO4M5Qn/aqEAvFgeDN3CA8x1YAK8SdCgSXSBJpRBK8wqPQjBY1ak96QfdPCrTLunr+xuPxK3Gxe772adTTsee2+ot7WePYUsC4y4NcS5+rlP1if87xtYqVeSwx3c64cOmAGP IEhM2L0c7TWXeIEGUm8n1nMToPxkWiapMjEFtLFLHad4a1+2IKcrD2wbRobBLmTIdux5iOV+AV+t2JY75+w5NAU+umtYPWmpbAiphAQ1S8s8/h7fclRBU6Ym8oXDxCmZoWpCLCpJd8lE/R3nfKBoexDRYXecz/lw58wkdZbHktpNVKfjoe827/aKa7gmYNXO

View File

@ -1,6 +1,14 @@
from rscder.utils.icons import IconInstance
from .SH import SH
from .LHBA import LHBA
from .OCD import OCD
from .AHT import AHT
from .ACD import ACD
import numpy as np
from datetime import datetime from datetime import datetime
from osgeo import gdal from osgeo import gdal
import math,os import math
import os
import time import time
from PyQt5 import QtWidgets from PyQt5 import QtWidgets
from sklearn.cluster import k_means from sklearn.cluster import k_means
@ -10,29 +18,26 @@ from misc import Register, AlgFrontend
UNSUPER_CD = Register('无监督变化检测方法') UNSUPER_CD = Register('无监督变化检测方法')
import numpy as np
from .ACD import ACD
from .AHT import AHT
from .OCD import OCD
from .LHBA import LHBA
from .SH import SH
def warp(file,ds:gdal.Dataset,srcWin=[0,0,0,0]): def warp(file, ds: gdal.Dataset, srcWin=[0, 0, 0, 0]):
driver = gdal.GetDriverByName('GTiff') driver = gdal.GetDriverByName('GTiff')
xsize=ds.RasterXSize xsize = ds.RasterXSize
ysize=ds.RasterYSize ysize = ds.RasterYSize
geo=ds.GetGeoTransform() geo = ds.GetGeoTransform()
orj=ds.GetProjection() orj = ds.GetProjection()
band=ds.RasterCount band = ds.RasterCount
if os.path.exists(file): if os.path.exists(file):
os.remove(file) os.remove(file)
out_ds:gdal.Dataset=driver.Create(file, xsize, ysize, band, gdal.GDT_Byte) out_ds: gdal.Dataset = driver.Create(
file, xsize, ysize, band, gdal.GDT_Byte)
out_ds.SetGeoTransform(geo) out_ds.SetGeoTransform(geo)
out_ds.SetProjection(orj) out_ds.SetProjection(orj)
for b in range(1,band+1): for b in range(1, band+1):
out_ds.GetRasterBand(b).WriteArray(ds.ReadAsArray(*srcWin,band_list=[b]),*(0,0)) out_ds.GetRasterBand(b).WriteArray(
ds.ReadAsArray(*srcWin, band_list=[b]), *(0, 0))
del out_ds del out_ds
@UNSUPER_CD.register @UNSUPER_CD.register
class BasicCD(AlgFrontend): class BasicCD(AlgFrontend):
@ -41,10 +46,14 @@ class BasicCD(AlgFrontend):
return '差分法' return '差分法'
@staticmethod @staticmethod
def run_alg(pth1:str,pth2:str,layer_parent:PairLayer,send_message = None,*args, **kargs): def get_icon():
return IconInstance().ARITHMETIC3
ds1:gdal.Dataset=gdal.Open(pth1) @staticmethod
ds2:gdal.Dataset=gdal.Open(pth2) def run_alg(pth1: str, pth2: str, layer_parent: PairLayer, send_message=None, *args, **kargs):
ds1: gdal.Dataset = gdal.Open(pth1)
ds2: gdal.Dataset = gdal.Open(pth2)
cell_size = layer_parent.cell_size cell_size = layer_parent.cell_size
xsize = layer_parent.size[0] xsize = layer_parent.size[0]
@ -56,35 +65,39 @@ class BasicCD(AlgFrontend):
driver = gdal.GetDriverByName('GTiff') driver = gdal.GetDriverByName('GTiff')
out_tif = os.path.join(Project().other_path, 'temp.tif') out_tif = os.path.join(Project().other_path, 'temp.tif')
out_ds = driver.Create(out_tif, xsize, ysize, 1, gdal.GDT_Float32) out_ds = driver.Create(out_tif, xsize, ysize, 1, gdal.GDT_Float32)
geo=layer_parent.grid.geo geo = layer_parent.grid.geo
proj=layer_parent.grid.proj proj = layer_parent.grid.proj
out_ds.SetGeoTransform(geo) out_ds.SetGeoTransform(geo)
out_ds.SetProjection(proj) out_ds.SetProjection(proj)
max_diff = 0 max_diff = 0
min_diff = math.inf min_diff = math.inf
start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start1x, start1y = geo2imageRC(ds1.GetGeoTransform(
end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
end1x, end1y = geo2imageRC(ds1.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start2x, start2y = geo2imageRC(ds2.GetGeoTransform(
end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
end2x, end2y = geo2imageRC(ds2.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
for j in range(yblocks + 1):#该改这里了 for j in range(yblocks + 1): # 该改这里了
if send_message is not None: if send_message is not None:
send_message.emit(f'计算{j}/{yblocks}') send_message.emit(f'计算{j}/{yblocks}')
block_xy1 = (start1x, start1y+j * cell_size[1]) block_xy1 = (start1x, start1y+j * cell_size[1])
block_xy2 = (start2x,start2y+j*cell_size[1]) block_xy2 = (start2x, start2y+j*cell_size[1])
block_xy=(0,j * cell_size[1]) block_xy = (0, j * cell_size[1])
if block_xy1[1] > end1y or block_xy2[1] > end2y: if block_xy1[1] > end1y or block_xy2[1] > end2y:
break break
block_size=(xsize, cell_size[1]) block_size = (xsize, cell_size[1])
block_size1 = (xsize, cell_size[1]) block_size1 = (xsize, cell_size[1])
block_size2 = (xsize,cell_size[1]) block_size2 = (xsize, cell_size[1])
if block_xy[1] + block_size[1] > ysize: if block_xy[1] + block_size[1] > ysize:
block_size = (xsize, ysize - block_xy[1]) block_size = (xsize, ysize - block_xy[1])
if block_xy1[1] + block_size1[1] > end1y: if block_xy1[1] + block_size1[1] > end1y:
block_size1 = (xsize,end1y - block_xy1[1]) block_size1 = (xsize, end1y - block_xy1[1])
if block_xy2[1] + block_size2[1] > end2y: if block_xy2[1] + block_size2[1] > end2y:
block_size2 = (xsize, end2y - block_xy2[1]) block_size2 = (xsize, end2y - block_xy2[1])
block_data1 = ds1.ReadAsArray(*block_xy1, *block_size1) block_data1 = ds1.ReadAsArray(*block_xy1, *block_size1)
@ -112,8 +125,10 @@ class BasicCD(AlgFrontend):
send_message.emit('归一化概率中...') send_message.emit('归一化概率中...')
temp_in_ds = gdal.Open(out_tif) temp_in_ds = gdal.Open(out_tif)
out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(layer_parent.name, int(np.random.rand() * 100000))) out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(
out_normal_ds = driver.Create(out_normal_tif, xsize, ysize, 1, gdal.GDT_Byte) layer_parent.name, int(np.random.rand() * 100000)))
out_normal_ds = driver.Create(
out_normal_tif, xsize, ysize, 1, gdal.GDT_Byte)
out_normal_ds.SetGeoTransform(geo) out_normal_ds.SetGeoTransform(geo)
out_normal_ds.SetProjection(proj) out_normal_ds.SetProjection(proj)
# hist = np.zeros(256, dtype=np.int32) # hist = np.zeros(256, dtype=np.int32)
@ -141,6 +156,7 @@ class BasicCD(AlgFrontend):
send_message.emit('差分法计算完成') send_message.emit('差分法计算完成')
return out_normal_tif return out_normal_tif
@UNSUPER_CD.register @UNSUPER_CD.register
class LSTS(AlgFrontend): class LSTS(AlgFrontend):
@ -148,6 +164,10 @@ class LSTS(AlgFrontend):
def get_name(): def get_name():
return 'LSTS' return 'LSTS'
@staticmethod
def get_icon():
return IconInstance().ARITHMETIC3
@staticmethod @staticmethod
def get_widget(parent=None): def get_widget(parent=None):
@ -157,12 +177,12 @@ class LSTS(AlgFrontend):
@staticmethod @staticmethod
def get_params(widget=None): def get_params(widget=None):
return dict(n=5, w_size=(3,3)) return dict(n=5, w_size=(3, 3))
@staticmethod @staticmethod
def run_alg(pth1:str,pth2:str,layer_parent:PairLayer,send_message=None,n=5,w_size=(3,3), *args, **kws): def run_alg(pth1: str, pth2: str, layer_parent: PairLayer, send_message=None, n=5, w_size=(3, 3), *args, **kws):
ds1:gdal.Dataset=gdal.Open(pth1) ds1: gdal.Dataset = gdal.Open(pth1)
ds2:gdal.Dataset=gdal.Open(pth2) ds2: gdal.Dataset = gdal.Open(pth2)
cell_size = layer_parent.cell_size cell_size = layer_parent.cell_size
xsize = layer_parent.size[0] xsize = layer_parent.size[0]
@ -172,46 +192,51 @@ class LSTS(AlgFrontend):
yblocks = ysize // cell_size[1] yblocks = ysize // cell_size[1]
driver = gdal.GetDriverByName('GTiff') driver = gdal.GetDriverByName('GTiff')
out_tif = os.path.join(Project().other_path, '%d.tif'%(int(datetime.now().timestamp() * 1000))) out_tif = os.path.join(Project().other_path, '%d.tif' % (
int(datetime.now().timestamp() * 1000)))
out_ds = driver.Create(out_tif, xsize, ysize, 1, gdal.GDT_Float32) out_ds = driver.Create(out_tif, xsize, ysize, 1, gdal.GDT_Float32)
geo=layer_parent.grid.geo geo = layer_parent.grid.geo
proj=layer_parent.grid.proj proj = layer_parent.grid.proj
out_ds.SetGeoTransform(geo) out_ds.SetGeoTransform(geo)
out_ds.SetProjection(proj) out_ds.SetProjection(proj)
pixnum=w_size[0]*w_size[1] pixnum = w_size[0]*w_size[1]
# send_message.emit('pixnum:'pixnum) # send_message.emit('pixnum:'pixnum)
max_diff = 0 max_diff = 0
min_diff = math.inf min_diff = math.inf
win_h=w_size[0]//2 #half hight of window win_h = w_size[0]//2 # half hight of window
win_w=w_size[1]//2 #half width of window win_w = w_size[1]//2 # half width of window
a=[[(i+1)**j for j in range(n+1)] for i in range(pixnum)] a = [[(i+1)**j for j in range(n+1)] for i in range(pixnum)]
A=np.array(a).astype(np.float64)# A = np.array(a).astype(np.float64)
k_=np.array(range(1,n+1)) k_ = np.array(range(1, n+1))
df1=np.zeros(pixnum).astype(np.float64) df1 = np.zeros(pixnum).astype(np.float64)
df2=np.zeros(pixnum).astype(np.float64) df2 = np.zeros(pixnum).astype(np.float64)
start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start1x, start1y = geo2imageRC(ds1.GetGeoTransform(
end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
end1x, end1y = geo2imageRC(ds1.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start2x, start2y = geo2imageRC(ds2.GetGeoTransform(
end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
end2x, end2y = geo2imageRC(ds2.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
for j in range(yblocks + 1): for j in range(yblocks + 1):
if send_message is not None: if send_message is not None:
send_message.emit(f'计算{j}/{yblocks}') send_message.emit(f'计算{j}/{yblocks}')
block_xy1 = (start1x, start1y+j * cell_size[1]) block_xy1 = (start1x, start1y+j * cell_size[1])
block_xy2 = (start2x,start2y+j*cell_size[1]) block_xy2 = (start2x, start2y+j*cell_size[1])
block_xy=(0,j * cell_size[1]) block_xy = (0, j * cell_size[1])
if block_xy1[1] > end1y or block_xy2[1] > end2y: if block_xy1[1] > end1y or block_xy2[1] > end2y:
break break
block_size=(xsize, cell_size[1]) block_size = (xsize, cell_size[1])
block_size1 = (xsize, cell_size[1]) block_size1 = (xsize, cell_size[1])
block_size2 = (xsize,cell_size[1]) block_size2 = (xsize, cell_size[1])
if block_xy[1] + block_size[1] > ysize: if block_xy[1] + block_size[1] > ysize:
block_size = (xsize, ysize - block_xy[1]) block_size = (xsize, ysize - block_xy[1])
if block_xy1[1] + block_size1[1] > end1y: if block_xy1[1] + block_size1[1] > end1y:
block_size1 = (xsize,end1y - block_xy1[1]) block_size1 = (xsize, end1y - block_xy1[1])
if block_xy2[1] + block_size2[1] > end2y: if block_xy2[1] + block_size2[1] > end2y:
block_size2 = (xsize, end2y - block_xy2[1]) block_size2 = (xsize, end2y - block_xy2[1])
block_data1 = ds1.ReadAsArray(*block_xy1, *block_size1) block_data1 = ds1.ReadAsArray(*block_xy1, *block_size1)
@ -222,33 +247,35 @@ class LSTS(AlgFrontend):
block_data2 = block_data2[None, ...] block_data2 = block_data2[None, ...]
# pdb.set_trace() # pdb.set_trace()
else: else:
block_data1=np.mean(block_data1,0) block_data1 = np.mean(block_data1, 0)
block_data2=np.mean(block_data2,0) block_data2 = np.mean(block_data2, 0)
block_diff=np.zeros(block_data1.shape).astype(np.float64) block_diff = np.zeros(block_data1.shape).astype(np.float64)
for i in range(win_h,block_size1[1]-win_h): for i in range(win_h, block_size1[1]-win_h):
for j_ in range(win_w,block_size1[0]-win_w): for j_ in range(win_w, block_size1[0]-win_w):
pix=0 pix = 0
#get b # get b
# b1=block_data[i+win_h:i+win_h] c in range(j_-win_w,j_+win_w+1) # b1=block_data[i+win_h:i+win_h] c in range(j_-win_w,j_+win_w+1)
b1=block_data1[i-win_h:i+win_h+1,j_-win_w:j_+win_w+1] b1 = block_data1[i-win_h:i+win_h+1, j_-win_w:j_+win_w+1]
b2=block_data2[i-win_h:i+win_h+1,j_-win_w:j_+win_w+1] b2 = block_data2[i-win_h:i+win_h+1, j_-win_w:j_+win_w+1]
b1=[b if (r+1)//2 else b[::-1] for r,b in enumerate(b1)] b1 = [b if (r+1)//2 else b[::-1] for r, b in enumerate(b1)]
b2=[b if (r+1)//2 else b[::-1] for r,b in enumerate(b2)] b2 = [b if (r+1)//2 else b[::-1] for r, b in enumerate(b2)]
b1=np.expand_dims(np.concatenate(b1,0),1) b1 = np.expand_dims(np.concatenate(b1, 0), 1)
b2=np.expand_dims(np.concatenate(b2,0),1) b2 = np.expand_dims(np.concatenate(b2, 0), 1)
x1=np.squeeze(np.linalg.pinv(A).dot(b1)) x1 = np.squeeze(np.linalg.pinv(A).dot(b1))
x2=np.squeeze(np.linalg.pinv(A).dot(b2)) x2 = np.squeeze(np.linalg.pinv(A).dot(b2))
#df # df
k_=range(1,n+1) k_ = range(1, n+1)
for pix in range(1,pixnum+1): for pix in range(1, pixnum+1):
df1[pix-1]=x1[1:n+1].dot(np.array([k*(pix**(k-1)) for k in k_])) df1[pix-1] = x1[1:n +
df2[pix-1]=x2[1:n+1].dot(np.array([k*(pix**(k-1)) for k in k_])) 1].dot(np.array([k*(pix**(k-1)) for k in k_]))
df2[pix-1] = x2[1:n +
1].dot(np.array([k*(pix**(k-1)) for k in k_]))
#distance 欧式距离 # distance 欧式距离
block_diff[i][j_]=np.dot(df1-df2,df1-df2)**0.5 block_diff[i][j_] = np.dot(df1-df2, df1-df2)**0.5
min_diff = min(min_diff, block_diff[block_diff > 0].min()) min_diff = min(min_diff, block_diff[block_diff > 0].min())
max_diff = max(max_diff, block_diff.max()) max_diff = max(max_diff, block_diff.max())
@ -263,8 +290,10 @@ class LSTS(AlgFrontend):
send_message.emit('归一化概率中...') send_message.emit('归一化概率中...')
temp_in_ds = gdal.Open(out_tif) temp_in_ds = gdal.Open(out_tif)
out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(layer_parent.name, int(np.random.rand() * 100000))) out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(
out_normal_ds = driver.Create(out_normal_tif, xsize, ysize, 1, gdal.GDT_Byte) layer_parent.name, int(np.random.rand() * 100000)))
out_normal_ds = driver.Create(
out_normal_tif, xsize, ysize, 1, gdal.GDT_Byte)
out_normal_ds.SetGeoTransform(geo) out_normal_ds.SetGeoTransform(geo)
out_normal_ds.SetProjection(proj) out_normal_ds.SetProjection(proj)
# hist = np.zeros(256, dtype=np.int32) # hist = np.zeros(256, dtype=np.int32)
@ -302,10 +331,14 @@ class CVAAlg(AlgFrontend):
return 'CVA' return 'CVA'
@staticmethod @staticmethod
def run_alg(pth1:str,pth2:str,layer_parent:PairLayer,send_message = None, *args, **kargs): def get_icon():
return IconInstance().ARITHMETIC3
ds1:gdal.Dataset=gdal.Open(pth1) @staticmethod
ds2:gdal.Dataset=gdal.Open(pth2) def run_alg(pth1: str, pth2: str, layer_parent: PairLayer, send_message=None, *args, **kargs):
ds1: gdal.Dataset = gdal.Open(pth1)
ds2: gdal.Dataset = gdal.Open(pth2)
cell_size = layer_parent.cell_size cell_size = layer_parent.cell_size
xsize = layer_parent.size[0] xsize = layer_parent.size[0]
@ -317,35 +350,38 @@ class CVAAlg(AlgFrontend):
driver = gdal.GetDriverByName('GTiff') driver = gdal.GetDriverByName('GTiff')
out_tif = os.path.join(Project().other_path, 'temp.tif') out_tif = os.path.join(Project().other_path, 'temp.tif')
out_ds = driver.Create(out_tif, xsize, ysize, 1, gdal.GDT_Float32) out_ds = driver.Create(out_tif, xsize, ysize, 1, gdal.GDT_Float32)
geo=layer_parent.grid.geo geo = layer_parent.grid.geo
proj=layer_parent.grid.proj proj = layer_parent.grid.proj
out_ds.SetGeoTransform(geo) out_ds.SetGeoTransform(geo)
out_ds.SetProjection(proj) out_ds.SetProjection(proj)
max_diff = 0 max_diff = 0
min_diff = math.inf min_diff = math.inf
start1x, start1y = geo2imageRC(ds1.GetGeoTransform(
), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
end1x, end1y = geo2imageRC(ds1.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start2x, start2y = geo2imageRC(ds2.GetGeoTransform(
end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
end2x, end2y = geo2imageRC(ds2.GetGeoTransform(
start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) ), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
for j in range(yblocks + 1): for j in range(yblocks + 1):
if send_message is not None: if send_message is not None:
send_message.emit(f'计算{j}/{yblocks}') send_message.emit(f'计算{j}/{yblocks}')
block_xy1 = (start1x, start1y+j * cell_size[1]) block_xy1 = (start1x, start1y+j * cell_size[1])
block_xy2 = (start2x,start2y+j*cell_size[1]) block_xy2 = (start2x, start2y+j*cell_size[1])
block_xy=(0,j * cell_size[1]) block_xy = (0, j * cell_size[1])
if block_xy1[1] > end1y or block_xy2[1] > end2y: if block_xy1[1] > end1y or block_xy2[1] > end2y:
break break
block_size=(xsize, cell_size[1]) block_size = (xsize, cell_size[1])
block_size1 = (xsize, cell_size[1]) block_size1 = (xsize, cell_size[1])
block_size2 = (xsize,cell_size[1]) block_size2 = (xsize, cell_size[1])
if block_xy[1] + block_size[1] > ysize: if block_xy[1] + block_size[1] > ysize:
block_size = (xsize, ysize - block_xy[1]) block_size = (xsize, ysize - block_xy[1])
if block_xy1[1] + block_size1[1] > end1y: if block_xy1[1] + block_size1[1] > end1y:
block_size1 = (xsize,end1y - block_xy1[1]) block_size1 = (xsize, end1y - block_xy1[1])
if block_xy2[1] + block_size2[1] > end2y: if block_xy2[1] + block_size2[1] > end2y:
block_size2 = (xsize, end2y - block_xy2[1]) block_size2 = (xsize, end2y - block_xy2[1])
block_data1 = ds1.ReadAsArray(*block_xy1, *block_size1) block_data1 = ds1.ReadAsArray(*block_xy1, *block_size1)
@ -355,7 +391,7 @@ class CVAAlg(AlgFrontend):
block_data1 = block_data1[None, ...] block_data1 = block_data1[None, ...]
block_data2 = block_data2[None, ...] block_data2 = block_data2[None, ...]
# pdb.set_trace() # pdb.set_trace()
block_diff=np.sum((block_data1-block_data2)**2,0)**0.5 block_diff = np.sum((block_data1-block_data2)**2, 0)**0.5
min_diff = min(min_diff, block_diff[block_diff > 0].min()) min_diff = min(min_diff, block_diff[block_diff > 0].min())
max_diff = max(max_diff, block_diff.max()) max_diff = max(max_diff, block_diff.max())
out_ds.GetRasterBand(1).WriteArray(block_diff, *block_xy) out_ds.GetRasterBand(1).WriteArray(block_diff, *block_xy)
@ -369,8 +405,10 @@ class CVAAlg(AlgFrontend):
send_message.emit('归一化概率中...') send_message.emit('归一化概率中...')
temp_in_ds = gdal.Open(out_tif) temp_in_ds = gdal.Open(out_tif)
out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(layer_parent.name, int(np.random.rand() * 100000))) out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(
out_normal_ds = driver.Create(out_normal_tif, xsize, ysize, 1, gdal.GDT_Byte) layer_parent.name, int(np.random.rand() * 100000)))
out_normal_ds = driver.Create(
out_normal_tif, xsize, ysize, 1, gdal.GDT_Byte)
out_normal_ds.SetGeoTransform(geo) out_normal_ds.SetGeoTransform(geo)
out_normal_ds.SetProjection(proj) out_normal_ds.SetProjection(proj)
# hist = np.zeros(256, dtype=np.int32) # hist = np.zeros(256, dtype=np.int32)
@ -398,6 +436,7 @@ class CVAAlg(AlgFrontend):
send_message.emit('欧式距离计算完成') send_message.emit('欧式距离计算完成')
return out_normal_tif return out_normal_tif
@UNSUPER_CD.register @UNSUPER_CD.register
class ACDAlg(AlgFrontend): class ACDAlg(AlgFrontend):
@ -406,7 +445,11 @@ class ACDAlg(AlgFrontend):
return 'ACD' return 'ACD'
@staticmethod @staticmethod
def run_alg(pth1:str,pth2:str,layer_parent:PairLayer,send_message = None, *args, **kargs): def get_icon():
return IconInstance().ARITHMETIC3
@staticmethod
def run_alg(pth1: str, pth2: str, layer_parent: PairLayer, send_message=None, *args, **kargs):
if send_message is None: if send_message is None:
class Empty: class Empty:
@ -418,39 +461,41 @@ class ACDAlg(AlgFrontend):
xsize = layer_parent.size[0] xsize = layer_parent.size[0]
ysize = layer_parent.size[1] ysize = layer_parent.size[1]
geo=layer_parent.grid.geo geo = layer_parent.grid.geo
proj=layer_parent.grid.proj proj = layer_parent.grid.proj
#提取公共部分 # 提取公共部分
send_message.emit('提取重叠区域数据.....') send_message.emit('提取重叠区域数据.....')
ds2:gdal.Dataset=gdal.Open(pth2) ds2: gdal.Dataset = gdal.Open(pth2)
temp_tif2 = os.path.join(Project().other_path,'temp2.tif') temp_tif2 = os.path.join(Project().other_path, 'temp2.tif')
start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start2x, start2y = geo2imageRC(ds2.GetGeoTransform(
end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
warp(temp_tif2,ds2,srcWin=[start2x,start2y,xsize,ysize]) end2x, end2y = geo2imageRC(ds2.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
warp(temp_tif2, ds2, srcWin=[start2x, start2y, xsize, ysize])
del ds2 del ds2
send_message.emit('图像二提取完成') send_message.emit('图像二提取完成')
ds1: gdal.Dataset = gdal.Open(pth1)
ds1:gdal.Dataset=gdal.Open(pth1)
temp_tif1 = os.path.join(Project().other_path, 'temp1.tif') temp_tif1 = os.path.join(Project().other_path, 'temp1.tif')
start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start1x, start1y = geo2imageRC(ds1.GetGeoTransform(
end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
warp(temp_tif1,ds1,srcWin=[start1x,start1y,xsize,ysize]) end1x, end1y = geo2imageRC(ds1.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
warp(temp_tif1, ds1, srcWin=[start1x, start1y, xsize, ysize])
del ds1 del ds1
send_message.emit('图像一提取完成') send_message.emit('图像一提取完成')
# 运算
#运算
send_message.emit('开始ACD计算.....') send_message.emit('开始ACD计算.....')
time.sleep(0.1) time.sleep(0.1)
out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(layer_parent.name, int(np.random.rand() * 100000))) out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(
ACD(temp_tif1,temp_tif2,out_normal_tif) layer_parent.name, int(np.random.rand() * 100000)))
#添加投影 ACD(temp_tif1, temp_tif2, out_normal_tif)
# 添加投影
send_message.emit('录入投影信息.....') send_message.emit('录入投影信息.....')
time.sleep(0.1) time.sleep(0.1)
ds=gdal.Open(out_normal_tif,1) ds = gdal.Open(out_normal_tif, 1)
ds.SetGeoTransform(geo) ds.SetGeoTransform(geo)
ds.SetProjection(proj) ds.SetProjection(proj)
del ds del ds
@ -466,7 +511,11 @@ class AHTAlg(AlgFrontend):
return 'AHT' return 'AHT'
@staticmethod @staticmethod
def run_alg(pth1:str,pth2:str,layer_parent:PairLayer,send_message = None, *args, **kargs): def get_icon():
return IconInstance().ARITHMETIC3
@staticmethod
def run_alg(pth1: str, pth2: str, layer_parent: PairLayer, send_message=None, *args, **kargs):
if send_message is None: if send_message is None:
class Empty: class Empty:
@ -477,39 +526,41 @@ class AHTAlg(AlgFrontend):
xsize = layer_parent.size[0] xsize = layer_parent.size[0]
ysize = layer_parent.size[1] ysize = layer_parent.size[1]
geo=layer_parent.grid.geo geo = layer_parent.grid.geo
proj=layer_parent.grid.proj proj = layer_parent.grid.proj
#提取公共部分 # 提取公共部分
send_message.emit('提取重叠区域数据.....') send_message.emit('提取重叠区域数据.....')
ds2:gdal.Dataset=gdal.Open(pth2) ds2: gdal.Dataset = gdal.Open(pth2)
temp_tif2 = os.path.join(Project().other_path,'temp2.tif') temp_tif2 = os.path.join(Project().other_path, 'temp2.tif')
start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start2x, start2y = geo2imageRC(ds2.GetGeoTransform(
end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
warp(temp_tif2,ds2,srcWin=[start2x,start2y,xsize,ysize]) end2x, end2y = geo2imageRC(ds2.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
warp(temp_tif2, ds2, srcWin=[start2x, start2y, xsize, ysize])
del ds2 del ds2
send_message.emit('图像二提取完成') send_message.emit('图像二提取完成')
ds1: gdal.Dataset = gdal.Open(pth1)
ds1:gdal.Dataset=gdal.Open(pth1)
temp_tif1 = os.path.join(Project().other_path, 'temp1.tif') temp_tif1 = os.path.join(Project().other_path, 'temp1.tif')
start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start1x, start1y = geo2imageRC(ds1.GetGeoTransform(
end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
warp(temp_tif1,ds1,srcWin=[start1x,start1y,xsize,ysize]) end1x, end1y = geo2imageRC(ds1.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
warp(temp_tif1, ds1, srcWin=[start1x, start1y, xsize, ysize])
del ds1 del ds1
send_message.emit('图像一提取完成') send_message.emit('图像一提取完成')
# 运算
#运算
send_message.emit('开始AHT计算.....') send_message.emit('开始AHT计算.....')
time.sleep(0.1) time.sleep(0.1)
out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(layer_parent.name, int(np.random.rand() * 100000))) out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(
AHT(temp_tif1,temp_tif2,out_normal_tif) layer_parent.name, int(np.random.rand() * 100000)))
#添加投影 AHT(temp_tif1, temp_tif2, out_normal_tif)
# 添加投影
send_message.emit('录入投影信息.....') send_message.emit('录入投影信息.....')
time.sleep(0.1) time.sleep(0.1)
ds=gdal.Open(out_normal_tif,1) ds = gdal.Open(out_normal_tif, 1)
ds.SetGeoTransform(geo) ds.SetGeoTransform(geo)
ds.SetProjection(proj) ds.SetProjection(proj)
del ds del ds
@ -525,7 +576,11 @@ class OCDAlg(AlgFrontend):
return 'OCD' return 'OCD'
@staticmethod @staticmethod
def run_alg(pth1:str,pth2:str,layer_parent:PairLayer,send_message = None, *args, **kargs): def get_icon():
return IconInstance().ARITHMETIC3
@staticmethod
def run_alg(pth1: str, pth2: str, layer_parent: PairLayer, send_message=None, *args, **kargs):
if send_message is None: if send_message is None:
class Empty: class Empty:
@ -536,45 +591,48 @@ class OCDAlg(AlgFrontend):
xsize = layer_parent.size[0] xsize = layer_parent.size[0]
ysize = layer_parent.size[1] ysize = layer_parent.size[1]
geo=layer_parent.grid.geo geo = layer_parent.grid.geo
proj=layer_parent.grid.proj proj = layer_parent.grid.proj
#提取公共部分 # 提取公共部分
send_message.emit('提取重叠区域数据.....') send_message.emit('提取重叠区域数据.....')
ds2:gdal.Dataset=gdal.Open(pth2) ds2: gdal.Dataset = gdal.Open(pth2)
temp_tif2 = os.path.join(Project().other_path,'temp2.tif') temp_tif2 = os.path.join(Project().other_path, 'temp2.tif')
start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start2x, start2y = geo2imageRC(ds2.GetGeoTransform(
end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
warp(temp_tif2,ds2,srcWin=[start2x,start2y,xsize,ysize]) end2x, end2y = geo2imageRC(ds2.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
warp(temp_tif2, ds2, srcWin=[start2x, start2y, xsize, ysize])
del ds2 del ds2
send_message.emit('图像二提取完成') send_message.emit('图像二提取完成')
ds1: gdal.Dataset = gdal.Open(pth1)
ds1:gdal.Dataset=gdal.Open(pth1)
temp_tif1 = os.path.join(Project().other_path, 'temp1.tif') temp_tif1 = os.path.join(Project().other_path, 'temp1.tif')
start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start1x, start1y = geo2imageRC(ds1.GetGeoTransform(
end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
warp(temp_tif1,ds1,srcWin=[start1x,start1y,xsize,ysize]) end1x, end1y = geo2imageRC(ds1.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
warp(temp_tif1, ds1, srcWin=[start1x, start1y, xsize, ysize])
del ds1 del ds1
send_message.emit('图像一提取完成') send_message.emit('图像一提取完成')
# 运算
#运算
send_message.emit('开始OCD计算.....') send_message.emit('开始OCD计算.....')
time.sleep(0.1) time.sleep(0.1)
out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(layer_parent.name, int(np.random.rand() * 100000))) out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(
OCD(temp_tif1,temp_tif2,out_normal_tif,Project().other_path) layer_parent.name, int(np.random.rand() * 100000)))
#添加投影 OCD(temp_tif1, temp_tif2, out_normal_tif, Project().other_path)
# 添加投影
send_message.emit('录入投影信息.....') send_message.emit('录入投影信息.....')
time.sleep(0.1) time.sleep(0.1)
ds=gdal.Open(out_normal_tif,1) ds = gdal.Open(out_normal_tif, 1)
ds.SetGeoTransform(geo) ds.SetGeoTransform(geo)
ds.SetProjection(proj) ds.SetProjection(proj)
del ds del ds
return out_normal_tif return out_normal_tif
@UNSUPER_CD.register @UNSUPER_CD.register
class LHBAAlg(AlgFrontend): class LHBAAlg(AlgFrontend):
@ -583,7 +641,11 @@ class LHBAAlg(AlgFrontend):
return 'LHBA' return 'LHBA'
@staticmethod @staticmethod
def run_alg(pth1:str,pth2:str,layer_parent:PairLayer,send_message = None, *args, **kargs): def get_icon():
return IconInstance().ARITHMETIC3
@staticmethod
def run_alg(pth1: str, pth2: str, layer_parent: PairLayer, send_message=None, *args, **kargs):
if send_message is None: if send_message is None:
class Empty: class Empty:
@ -592,40 +654,43 @@ class LHBAAlg(AlgFrontend):
print(args) print(args)
send_message = Empty() send_message = Empty()
xsize = layer_parent.size[0] xsize = layer_parent.size[0]
ysize = layer_parent.size[1] ysize = layer_parent.size[1]
geo=layer_parent.grid.geo geo = layer_parent.grid.geo
proj=layer_parent.grid.proj proj = layer_parent.grid.proj
#提取公共部分 # 提取公共部分
send_message.emit('提取重叠区域数据.....') send_message.emit('提取重叠区域数据.....')
ds2:gdal.Dataset=gdal.Open(pth2) ds2: gdal.Dataset = gdal.Open(pth2)
temp_tif2 = os.path.join(Project().other_path,'temp2.tif') temp_tif2 = os.path.join(Project().other_path, 'temp2.tif')
start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start2x, start2y = geo2imageRC(ds2.GetGeoTransform(
end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
warp(temp_tif2,ds2,srcWin=[start2x,start2y,xsize,ysize]) end2x, end2y = geo2imageRC(ds2.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
warp(temp_tif2, ds2, srcWin=[start2x, start2y, xsize, ysize])
del ds2 del ds2
send_message.emit('图像二提取完成') send_message.emit('图像二提取完成')
ds1: gdal.Dataset = gdal.Open(pth1)
ds1:gdal.Dataset=gdal.Open(pth1)
temp_tif1 = os.path.join(Project().other_path, 'temp1.tif') temp_tif1 = os.path.join(Project().other_path, 'temp1.tif')
start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start1x, start1y = geo2imageRC(ds1.GetGeoTransform(
end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
warp(temp_tif1,ds1,srcWin=[start1x,start1y,xsize,ysize]) end1x, end1y = geo2imageRC(ds1.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
warp(temp_tif1, ds1, srcWin=[start1x, start1y, xsize, ysize])
del ds1 del ds1
send_message.emit('图像一提取完成') send_message.emit('图像一提取完成')
#运算 # 运算
send_message.emit('开始LHBA计算.....') send_message.emit('开始LHBA计算.....')
time.sleep(0.1) time.sleep(0.1)
out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(layer_parent.name, int(np.random.rand() * 100000))) out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(
LHBA(temp_tif1,temp_tif2,out_normal_tif) layer_parent.name, int(np.random.rand() * 100000)))
#添加投影 LHBA(temp_tif1, temp_tif2, out_normal_tif)
# 添加投影
send_message.emit('录入投影信息.....') send_message.emit('录入投影信息.....')
time.sleep(0.1) time.sleep(0.1)
ds=gdal.Open(out_normal_tif,1) ds = gdal.Open(out_normal_tif, 1)
ds.SetGeoTransform(geo) ds.SetGeoTransform(geo)
ds.SetProjection(proj) ds.SetProjection(proj)
del ds del ds
@ -640,7 +705,11 @@ class SHAlg(AlgFrontend):
return 'SH' return 'SH'
@staticmethod @staticmethod
def run_alg(pth1:str,pth2:str,layer_parent:PairLayer,send_message = None, *args, **kargs): def get_icon():
return IconInstance().ARITHMETIC3
@staticmethod
def run_alg(pth1: str, pth2: str, layer_parent: PairLayer, send_message=None, *args, **kargs):
if send_message is None: if send_message is None:
class Empty: class Empty:
@ -649,41 +718,43 @@ class SHAlg(AlgFrontend):
print(args) print(args)
send_message = Empty() send_message = Empty()
xsize = layer_parent.size[0] xsize = layer_parent.size[0]
ysize = layer_parent.size[1] ysize = layer_parent.size[1]
geo=layer_parent.grid.geo geo = layer_parent.grid.geo
proj=layer_parent.grid.proj proj = layer_parent.grid.proj
#提取公共部分 # 提取公共部分
send_message.emit('提取重叠区域数据.....') send_message.emit('提取重叠区域数据.....')
ds2:gdal.Dataset=gdal.Open(pth2) ds2: gdal.Dataset = gdal.Open(pth2)
temp_tif2 = os.path.join(Project().other_path,'temp2.tif') temp_tif2 = os.path.join(Project().other_path, 'temp2.tif')
start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start2x, start2y = geo2imageRC(ds2.GetGeoTransform(
end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
warp(temp_tif2,ds2,srcWin=[start2x,start2y,xsize,ysize]) end2x, end2y = geo2imageRC(ds2.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
warp(temp_tif2, ds2, srcWin=[start2x, start2y, xsize, ysize])
del ds2 del ds2
send_message.emit('图像二提取完成') send_message.emit('图像二提取完成')
ds1: gdal.Dataset = gdal.Open(pth1)
ds1:gdal.Dataset=gdal.Open(pth1)
temp_tif1 = os.path.join(Project().other_path, 'temp1.tif') temp_tif1 = os.path.join(Project().other_path, 'temp1.tif')
start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start1x, start1y = geo2imageRC(ds1.GetGeoTransform(
end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
warp(temp_tif1,ds1,srcWin=[start1x,start1y,xsize,ysize]) end1x, end1y = geo2imageRC(ds1.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
warp(temp_tif1, ds1, srcWin=[start1x, start1y, xsize, ysize])
del ds1 del ds1
send_message.emit('图像一提取完成') send_message.emit('图像一提取完成')
#运算 # 运算
send_message.emit('开始SH计算.....') send_message.emit('开始SH计算.....')
time.sleep(0.1) time.sleep(0.1)
out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(layer_parent.name, int(np.random.rand() * 100000))) out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(
SH(temp_tif1,temp_tif2,out_normal_tif) layer_parent.name, int(np.random.rand() * 100000)))
#添加投影 SH(temp_tif1, temp_tif2, out_normal_tif)
# 添加投影
send_message.emit('录入投影信息.....') send_message.emit('录入投影信息.....')
time.sleep(0.1) time.sleep(0.1)
ds=gdal.Open(out_normal_tif,1) ds = gdal.Open(out_normal_tif, 1)
ds.SetGeoTransform(geo) ds.SetGeoTransform(geo)
ds.SetProjection(proj) ds.SetProjection(proj)
del ds del ds

View File

@ -3,7 +3,7 @@ from threading import Thread
from plugins.misc.main import AlgFrontend from plugins.misc.main import AlgFrontend
from rscder.gui.actions import ActionManager from rscder.gui.actions import ActionManager
from rscder.plugins.basic import BasicPlugin from rscder.plugins.basic import BasicPlugin
from PyQt5.QtWidgets import QAction, QToolBar, QMenu, QDialog, QHBoxLayout, QVBoxLayout, QPushButton,QWidget,QLabel,QLineEdit,QPushButton,QComboBox,QDialogButtonBox from PyQt5.QtWidgets import QAction, QToolBar, QMenu, QDialog, QHBoxLayout, QVBoxLayout, QPushButton, QWidget, QLabel, QLineEdit, QPushButton, QComboBox, QDialogButtonBox
from rscder.gui.layercombox import PairLayerCombox from rscder.gui.layercombox import PairLayerCombox
from rscder.utils.icons import IconInstance from rscder.utils.icons import IconInstance
@ -13,8 +13,9 @@ from thres import THRES
from misc import table_layer, AlgSelectWidget from misc import table_layer, AlgSelectWidget
from follow import FOLLOW from follow import FOLLOW
class VegtationCDMethod(QDialog): class VegtationCDMethod(QDialog):
def __init__(self,parent=None, alg:AlgFrontend=None): def __init__(self, parent=None, alg: AlgFrontend = None):
super(VegtationCDMethod, self).__init__(parent) super(VegtationCDMethod, self).__init__(parent)
self.alg = alg self.alg = alg
self.setWindowTitle('植被变化检测:{}'.format(alg.get_name())) self.setWindowTitle('植被变化检测:{}'.format(alg.get_name()))
@ -23,7 +24,7 @@ class VegtationCDMethod(QDialog):
self.setMinimumWidth(500) self.setMinimumWidth(500)
def initUI(self): def initUI(self):
#图层 # 图层
self.layer_combox = PairLayerCombox(self) self.layer_combox = PairLayerCombox(self)
layerbox = QHBoxLayout() layerbox = QHBoxLayout()
layerbox.addWidget(self.layer_combox) layerbox.addWidget(self.layer_combox)
@ -42,12 +43,12 @@ class VegtationCDMethod(QDialog):
self.cancel_button.setIcon(IconInstance().CANCEL) self.cancel_button.setIcon(IconInstance().CANCEL)
self.cancel_button.clicked.connect(self.reject) self.cancel_button.clicked.connect(self.reject)
self.cancel_button.setDefault(False) self.cancel_button.setDefault(False)
buttonbox=QDialogButtonBox(self) buttonbox = QDialogButtonBox(self)
buttonbox.addButton(self.ok_button,QDialogButtonBox.NoRole) buttonbox.addButton(self.ok_button, QDialogButtonBox.NoRole)
buttonbox.addButton(self.cancel_button,QDialogButtonBox.NoRole) buttonbox.addButton(self.cancel_button, QDialogButtonBox.NoRole)
buttonbox.setCenterButtons(True) buttonbox.setCenterButtons(True)
totalvlayout=QVBoxLayout() totalvlayout = QVBoxLayout()
totalvlayout.addLayout(layerbox) totalvlayout.addLayout(layerbox)
totalvlayout.addWidget(self.filter_select) totalvlayout.addWidget(self.filter_select)
if self.param_widget is not None: if self.param_widget is not None:
@ -62,6 +63,7 @@ class VegtationCDMethod(QDialog):
self.setLayout(totalvlayout) self.setLayout(totalvlayout)
@FOLLOW.register @FOLLOW.register
class VegetationCDFollow(AlgFrontend): class VegetationCDFollow(AlgFrontend):
@ -71,7 +73,7 @@ class VegetationCDFollow(AlgFrontend):
@staticmethod @staticmethod
def get_icon(): def get_icon():
return IconInstance().UNSUPERVISED return IconInstance().VEGETATION
@staticmethod @staticmethod
def get_widget(parent=None): def get_widget(parent=None):
@ -86,7 +88,7 @@ class VegetationCDFollow(AlgFrontend):
thres_select = AlgSelectWidget(widget, THRES) thres_select = AlgSelectWidget(widget, THRES)
thres_select.setObjectName('thres_select') thres_select.setObjectName('thres_select')
totalvlayout=QVBoxLayout() totalvlayout = QVBoxLayout()
totalvlayout.addWidget(layer_combox) totalvlayout.addWidget(layer_combox)
totalvlayout.addWidget(filter_select) totalvlayout.addWidget(filter_select)
totalvlayout.addWidget(unsupervised_select) totalvlayout.addWidget(unsupervised_select)
@ -98,16 +100,17 @@ class VegetationCDFollow(AlgFrontend):
return widget return widget
@staticmethod @staticmethod
def get_params(widget:QWidget=None): def get_params(widget: QWidget = None):
if widget is None: if widget is None:
return dict() return dict()
layer_combox = widget.findChild(PairLayerCombox, 'layer_combox') layer_combox = widget.findChild(PairLayerCombox, 'layer_combox')
filter_select = widget.findChild(AlgSelectWidget, 'filter_select') filter_select = widget.findChild(AlgSelectWidget, 'filter_select')
unsupervised_select = widget.findChild(AlgSelectWidget, 'unsupervised_select') unsupervised_select = widget.findChild(
AlgSelectWidget, 'unsupervised_select')
thres_select = widget.findChild(AlgSelectWidget, 'thres_select') thres_select = widget.findChild(AlgSelectWidget, 'thres_select')
layer1=layer_combox.layer1 layer1 = layer_combox.layer1
pth1 = layer_combox.layer1.path pth1 = layer_combox.layer1.path
pth2 = layer_combox.layer2.path pth2 = layer_combox.layer2.path
@ -120,27 +123,27 @@ class VegetationCDFollow(AlgFrontend):
return dict( return dict(
layer1=layer1, layer1=layer1,
pth1 = pth1, pth1=pth1,
pth2 = pth2, pth2=pth2,
falg = falg, falg=falg,
fparams = fparams, fparams=fparams,
cdalg = cdalg, cdalg=cdalg,
cdparams = cdparams, cdparams=cdparams,
thalg = thalg, thalg=thalg,
thparams = thparams, thparams=thparams,
) )
@staticmethod @staticmethod
def run_alg(layer1=None, def run_alg(layer1=None,
pth1 = None, pth1=None,
pth2 = None, pth2=None,
falg = None, falg=None,
fparams = None, fparams=None,
cdalg = None, cdalg=None,
cdparams = None, cdparams=None,
thalg = None, thalg=None,
thparams = None, thparams=None,
send_message = None): send_message=None):
if cdalg is None or thalg is None: if cdalg is None or thalg is None:
return return
@ -148,21 +151,21 @@ class VegetationCDFollow(AlgFrontend):
name = layer1.name name = layer1.name
if falg is not None: if falg is not None:
pth1 = falg.run_alg(pth1, name=name, send_message= send_message, **fparams) pth1 = falg.run_alg(
pth2 = falg.run_alg(pth2, name=name, send_message= send_message, **fparams) pth1, name=name, send_message=send_message, **fparams)
pth2 = falg.run_alg(
pth2, name=name, send_message=send_message, **fparams)
cdpth = cdalg.run_alg(pth1, pth2, layer1.layer_parent, send_message= send_message,**cdparams)
thpth = thalg.run_alg(cdpth, name=name, send_message= send_message, **thparams)
table_layer(thpth,layer1,name, send_message)
cdpth = cdalg.run_alg(pth1, pth2, layer1.layer_parent,
send_message=send_message, **cdparams)
thpth = thalg.run_alg(
cdpth, name=name, send_message=send_message, **thparams)
table_layer(thpth, layer1, name, send_message)
class VegtationPlugin(BasicPlugin): class VegtationPlugin(BasicPlugin):
@staticmethod @staticmethod
def info(): def info():
return { return {
@ -178,7 +181,7 @@ class VegtationPlugin(BasicPlugin):
# ActionManager().veg_menu.addMenu(veg_menu) # ActionManager().veg_menu.addMenu(veg_menu)
for key in VEG_CD.keys(): for key in VEG_CD.keys():
alg:AlgFrontend = VEG_CD[key] alg: AlgFrontend = VEG_CD[key]
if alg.get_name() is None: if alg.get_name() is None:
name = key name = key
else: else:
@ -190,7 +193,6 @@ class VegtationPlugin(BasicPlugin):
veg_menu.addAction(action) veg_menu.addAction(action)
def run_cd(self, alg): def run_cd(self, alg):
dialog = VegtationCDMethod(self.mainwindow, alg) dialog = VegtationCDMethod(self.mainwindow, alg)
dialog.show() dialog.show()
@ -199,9 +201,9 @@ class VegtationPlugin(BasicPlugin):
t = Thread(target=self.run_cd_alg, args=(dialog,)) t = Thread(target=self.run_cd_alg, args=(dialog,))
t.start() t.start()
def run_cd_alg(self, w:VegtationCDMethod): def run_cd_alg(self, w: VegtationCDMethod):
layer1=w.layer_combox.layer1 layer1 = w.layer_combox.layer1
pth1 = w.layer_combox.layer1.path pth1 = w.layer_combox.layer1.path
pth2 = w.layer_combox.layer2.path pth2 = w.layer_combox.layer2.path
name = layer1.layer_parent.name name = layer1.layer_parent.name
@ -215,12 +217,14 @@ class VegtationPlugin(BasicPlugin):
return return
if falg is not None: if falg is not None:
pth1 = falg.run_alg(pth1, name=name, send_message=self.send_message, **fparams) pth1 = falg.run_alg(
pth2 = falg.run_alg(pth2, name=name, send_message=self.send_message, **fparams) pth1, name=name, send_message=self.send_message, **fparams)
pth2 = falg.run_alg(
pth2, name=name, send_message=self.send_message, **fparams)
cdpth = cdalg.run_alg(pth1, pth2, layer1.layer_parent,
send_message=self.send_message, **cdparams)
thpth = thalg.run_alg(
cdpth, name=name, send_message=self.send_message, **thparams)
cdpth = cdalg.run_alg(pth1, pth2, layer1.layer_parent, send_message=self.send_message,**cdparams) table_layer(thpth, layer1, name, self.send_message)
thpth = thalg.run_alg(cdpth, name=name, send_message=self.send_message, **thparams)
table_layer(thpth,layer1,name,self.send_message)

View File

@ -1,38 +1,43 @@
from .SH import SH
from .LHBA import LHBA
from .OCD import OCD
from .AHT import AHT
from .ACD import ACD
import numpy as np
from datetime import datetime from datetime import datetime
from osgeo import gdal from osgeo import gdal
import math,os import math
import os
import time import time
from PyQt5 import QtWidgets from PyQt5 import QtWidgets
from sklearn.cluster import k_means from sklearn.cluster import k_means
from rscder.utils.geomath import geo2imageRC, imageRC2geo from rscder.utils.geomath import geo2imageRC, imageRC2geo
from rscder.utils.icons import IconInstance
from rscder.utils.project import Project, PairLayer from rscder.utils.project import Project, PairLayer
from misc import Register, AlgFrontend from misc import Register, AlgFrontend
VEG_CD = Register('植被变化检测方法') VEG_CD = Register('植被变化检测方法')
import numpy as np
from .ACD import ACD
from .AHT import AHT
from .OCD import OCD
from .LHBA import LHBA
from .SH import SH
def warp(file,ds:gdal.Dataset,srcWin=[0,0,0,0]): def warp(file, ds: gdal.Dataset, srcWin=[0, 0, 0, 0]):
driver = gdal.GetDriverByName('GTiff') driver = gdal.GetDriverByName('GTiff')
xsize=ds.RasterXSize xsize = ds.RasterXSize
ysize=ds.RasterYSize ysize = ds.RasterYSize
geo=ds.GetGeoTransform() geo = ds.GetGeoTransform()
orj=ds.GetProjection() orj = ds.GetProjection()
band=ds.RasterCount band = ds.RasterCount
if os.path.exists(file): if os.path.exists(file):
os.remove(file) os.remove(file)
out_ds:gdal.Dataset=driver.Create(file, xsize, ysize, band, gdal.GDT_Byte) out_ds: gdal.Dataset = driver.Create(
file, xsize, ysize, band, gdal.GDT_Byte)
out_ds.SetGeoTransform(geo) out_ds.SetGeoTransform(geo)
out_ds.SetProjection(orj) out_ds.SetProjection(orj)
for b in range(1,band+1): for b in range(1, band+1):
out_ds.GetRasterBand(b).WriteArray(ds.ReadAsArray(*srcWin,band_list=[b]),*(0,0)) out_ds.GetRasterBand(b).WriteArray(
ds.ReadAsArray(*srcWin, band_list=[b]), *(0, 0))
del out_ds del out_ds
@VEG_CD.register @VEG_CD.register
class BasicCD(AlgFrontend): class BasicCD(AlgFrontend):
@ -41,10 +46,14 @@ class BasicCD(AlgFrontend):
return '差分法' return '差分法'
@staticmethod @staticmethod
def run_alg(pth1:str,pth2:str,layer_parent:PairLayer,send_message = None,*args, **kargs): def get_icon():
return IconInstance().VEGETATION
ds1:gdal.Dataset=gdal.Open(pth1) @staticmethod
ds2:gdal.Dataset=gdal.Open(pth2) def run_alg(pth1: str, pth2: str, layer_parent: PairLayer, send_message=None, *args, **kargs):
ds1: gdal.Dataset = gdal.Open(pth1)
ds2: gdal.Dataset = gdal.Open(pth2)
cell_size = layer_parent.cell_size cell_size = layer_parent.cell_size
xsize = layer_parent.size[0] xsize = layer_parent.size[0]
@ -56,35 +65,39 @@ class BasicCD(AlgFrontend):
driver = gdal.GetDriverByName('GTiff') driver = gdal.GetDriverByName('GTiff')
out_tif = os.path.join(Project().other_path, 'temp.tif') out_tif = os.path.join(Project().other_path, 'temp.tif')
out_ds = driver.Create(out_tif, xsize, ysize, 1, gdal.GDT_Float32) out_ds = driver.Create(out_tif, xsize, ysize, 1, gdal.GDT_Float32)
geo=layer_parent.grid.geo geo = layer_parent.grid.geo
proj=layer_parent.grid.proj proj = layer_parent.grid.proj
out_ds.SetGeoTransform(geo) out_ds.SetGeoTransform(geo)
out_ds.SetProjection(proj) out_ds.SetProjection(proj)
max_diff = 0 max_diff = 0
min_diff = math.inf min_diff = math.inf
start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start1x, start1y = geo2imageRC(ds1.GetGeoTransform(
end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
end1x, end1y = geo2imageRC(ds1.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start2x, start2y = geo2imageRC(ds2.GetGeoTransform(
end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
end2x, end2y = geo2imageRC(ds2.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
for j in range(yblocks + 1):#该改这里了 for j in range(yblocks + 1): # 该改这里了
if send_message is not None: if send_message is not None:
send_message.emit(f'计算{j}/{yblocks}') send_message.emit(f'计算{j}/{yblocks}')
block_xy1 = (start1x, start1y+j * cell_size[1]) block_xy1 = (start1x, start1y+j * cell_size[1])
block_xy2 = (start2x,start2y+j*cell_size[1]) block_xy2 = (start2x, start2y+j*cell_size[1])
block_xy=(0,j * cell_size[1]) block_xy = (0, j * cell_size[1])
if block_xy1[1] > end1y or block_xy2[1] > end2y: if block_xy1[1] > end1y or block_xy2[1] > end2y:
break break
block_size=(xsize, cell_size[1]) block_size = (xsize, cell_size[1])
block_size1 = (xsize, cell_size[1]) block_size1 = (xsize, cell_size[1])
block_size2 = (xsize,cell_size[1]) block_size2 = (xsize, cell_size[1])
if block_xy[1] + block_size[1] > ysize: if block_xy[1] + block_size[1] > ysize:
block_size = (xsize, ysize - block_xy[1]) block_size = (xsize, ysize - block_xy[1])
if block_xy1[1] + block_size1[1] > end1y: if block_xy1[1] + block_size1[1] > end1y:
block_size1 = (xsize,end1y - block_xy1[1]) block_size1 = (xsize, end1y - block_xy1[1])
if block_xy2[1] + block_size2[1] > end2y: if block_xy2[1] + block_size2[1] > end2y:
block_size2 = (xsize, end2y - block_xy2[1]) block_size2 = (xsize, end2y - block_xy2[1])
block_data1 = ds1.ReadAsArray(*block_xy1, *block_size1) block_data1 = ds1.ReadAsArray(*block_xy1, *block_size1)
@ -112,8 +125,10 @@ class BasicCD(AlgFrontend):
send_message.emit('归一化概率中...') send_message.emit('归一化概率中...')
temp_in_ds = gdal.Open(out_tif) temp_in_ds = gdal.Open(out_tif)
out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(layer_parent.name, int(np.random.rand() * 100000))) out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(
out_normal_ds = driver.Create(out_normal_tif, xsize, ysize, 1, gdal.GDT_Byte) layer_parent.name, int(np.random.rand() * 100000)))
out_normal_ds = driver.Create(
out_normal_tif, xsize, ysize, 1, gdal.GDT_Byte)
out_normal_ds.SetGeoTransform(geo) out_normal_ds.SetGeoTransform(geo)
out_normal_ds.SetProjection(proj) out_normal_ds.SetProjection(proj)
# hist = np.zeros(256, dtype=np.int32) # hist = np.zeros(256, dtype=np.int32)
@ -141,6 +156,7 @@ class BasicCD(AlgFrontend):
send_message.emit('差分法计算完成') send_message.emit('差分法计算完成')
return out_normal_tif return out_normal_tif
@VEG_CD.register @VEG_CD.register
class LSTS(AlgFrontend): class LSTS(AlgFrontend):
@ -157,12 +173,12 @@ class LSTS(AlgFrontend):
@staticmethod @staticmethod
def get_params(widget=None): def get_params(widget=None):
return dict(n=5, w_size=(3,3)) return dict(n=5, w_size=(3, 3))
@staticmethod @staticmethod
def run_alg(pth1:str,pth2:str,layer_parent:PairLayer,send_message=None,n=5,w_size=(3,3), *args, **kws): def run_alg(pth1: str, pth2: str, layer_parent: PairLayer, send_message=None, n=5, w_size=(3, 3), *args, **kws):
ds1:gdal.Dataset=gdal.Open(pth1) ds1: gdal.Dataset = gdal.Open(pth1)
ds2:gdal.Dataset=gdal.Open(pth2) ds2: gdal.Dataset = gdal.Open(pth2)
cell_size = layer_parent.cell_size cell_size = layer_parent.cell_size
xsize = layer_parent.size[0] xsize = layer_parent.size[0]
@ -172,46 +188,51 @@ class LSTS(AlgFrontend):
yblocks = ysize // cell_size[1] yblocks = ysize // cell_size[1]
driver = gdal.GetDriverByName('GTiff') driver = gdal.GetDriverByName('GTiff')
out_tif = os.path.join(Project().other_path, '%d.tif'%(int(datetime.now().timestamp() * 1000))) out_tif = os.path.join(Project().other_path, '%d.tif' % (
int(datetime.now().timestamp() * 1000)))
out_ds = driver.Create(out_tif, xsize, ysize, 1, gdal.GDT_Float32) out_ds = driver.Create(out_tif, xsize, ysize, 1, gdal.GDT_Float32)
geo=layer_parent.grid.geo geo = layer_parent.grid.geo
proj=layer_parent.grid.proj proj = layer_parent.grid.proj
out_ds.SetGeoTransform(geo) out_ds.SetGeoTransform(geo)
out_ds.SetProjection(proj) out_ds.SetProjection(proj)
pixnum=w_size[0]*w_size[1] pixnum = w_size[0]*w_size[1]
# send_message.emit('pixnum:'pixnum) # send_message.emit('pixnum:'pixnum)
max_diff = 0 max_diff = 0
min_diff = math.inf min_diff = math.inf
win_h=w_size[0]//2 #half hight of window win_h = w_size[0]//2 # half hight of window
win_w=w_size[1]//2 #half width of window win_w = w_size[1]//2 # half width of window
a=[[(i+1)**j for j in range(n+1)] for i in range(pixnum)] a = [[(i+1)**j for j in range(n+1)] for i in range(pixnum)]
A=np.array(a).astype(np.float64)# A = np.array(a).astype(np.float64)
k_=np.array(range(1,n+1)) k_ = np.array(range(1, n+1))
df1=np.zeros(pixnum).astype(np.float64) df1 = np.zeros(pixnum).astype(np.float64)
df2=np.zeros(pixnum).astype(np.float64) df2 = np.zeros(pixnum).astype(np.float64)
start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start1x, start1y = geo2imageRC(ds1.GetGeoTransform(
end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
end1x, end1y = geo2imageRC(ds1.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start2x, start2y = geo2imageRC(ds2.GetGeoTransform(
end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
end2x, end2y = geo2imageRC(ds2.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
for j in range(yblocks + 1): for j in range(yblocks + 1):
if send_message is not None: if send_message is not None:
send_message.emit(f'计算{j}/{yblocks}') send_message.emit(f'计算{j}/{yblocks}')
block_xy1 = (start1x, start1y+j * cell_size[1]) block_xy1 = (start1x, start1y+j * cell_size[1])
block_xy2 = (start2x,start2y+j*cell_size[1]) block_xy2 = (start2x, start2y+j*cell_size[1])
block_xy=(0,j * cell_size[1]) block_xy = (0, j * cell_size[1])
if block_xy1[1] > end1y or block_xy2[1] > end2y: if block_xy1[1] > end1y or block_xy2[1] > end2y:
break break
block_size=(xsize, cell_size[1]) block_size = (xsize, cell_size[1])
block_size1 = (xsize, cell_size[1]) block_size1 = (xsize, cell_size[1])
block_size2 = (xsize,cell_size[1]) block_size2 = (xsize, cell_size[1])
if block_xy[1] + block_size[1] > ysize: if block_xy[1] + block_size[1] > ysize:
block_size = (xsize, ysize - block_xy[1]) block_size = (xsize, ysize - block_xy[1])
if block_xy1[1] + block_size1[1] > end1y: if block_xy1[1] + block_size1[1] > end1y:
block_size1 = (xsize,end1y - block_xy1[1]) block_size1 = (xsize, end1y - block_xy1[1])
if block_xy2[1] + block_size2[1] > end2y: if block_xy2[1] + block_size2[1] > end2y:
block_size2 = (xsize, end2y - block_xy2[1]) block_size2 = (xsize, end2y - block_xy2[1])
block_data1 = ds1.ReadAsArray(*block_xy1, *block_size1) block_data1 = ds1.ReadAsArray(*block_xy1, *block_size1)
@ -222,33 +243,35 @@ class LSTS(AlgFrontend):
block_data2 = block_data2[None, ...] block_data2 = block_data2[None, ...]
# pdb.set_trace() # pdb.set_trace()
else: else:
block_data1=np.mean(block_data1,0) block_data1 = np.mean(block_data1, 0)
block_data2=np.mean(block_data2,0) block_data2 = np.mean(block_data2, 0)
block_diff=np.zeros(block_data1.shape).astype(np.float64) block_diff = np.zeros(block_data1.shape).astype(np.float64)
for i in range(win_h,block_size1[1]-win_h): for i in range(win_h, block_size1[1]-win_h):
for j_ in range(win_w,block_size1[0]-win_w): for j_ in range(win_w, block_size1[0]-win_w):
pix=0 pix = 0
#get b # get b
# b1=block_data[i+win_h:i+win_h] c in range(j_-win_w,j_+win_w+1) # b1=block_data[i+win_h:i+win_h] c in range(j_-win_w,j_+win_w+1)
b1=block_data1[i-win_h:i+win_h+1,j_-win_w:j_+win_w+1] b1 = block_data1[i-win_h:i+win_h+1, j_-win_w:j_+win_w+1]
b2=block_data2[i-win_h:i+win_h+1,j_-win_w:j_+win_w+1] b2 = block_data2[i-win_h:i+win_h+1, j_-win_w:j_+win_w+1]
b1=[b if (r+1)//2 else b[::-1] for r,b in enumerate(b1)] b1 = [b if (r+1)//2 else b[::-1] for r, b in enumerate(b1)]
b2=[b if (r+1)//2 else b[::-1] for r,b in enumerate(b2)] b2 = [b if (r+1)//2 else b[::-1] for r, b in enumerate(b2)]
b1=np.expand_dims(np.concatenate(b1,0),1) b1 = np.expand_dims(np.concatenate(b1, 0), 1)
b2=np.expand_dims(np.concatenate(b2,0),1) b2 = np.expand_dims(np.concatenate(b2, 0), 1)
x1=np.squeeze(np.linalg.pinv(A).dot(b1)) x1 = np.squeeze(np.linalg.pinv(A).dot(b1))
x2=np.squeeze(np.linalg.pinv(A).dot(b2)) x2 = np.squeeze(np.linalg.pinv(A).dot(b2))
#df # df
k_=range(1,n+1) k_ = range(1, n+1)
for pix in range(1,pixnum+1): for pix in range(1, pixnum+1):
df1[pix-1]=x1[1:n+1].dot(np.array([k*(pix**(k-1)) for k in k_])) df1[pix-1] = x1[1:n +
df2[pix-1]=x2[1:n+1].dot(np.array([k*(pix**(k-1)) for k in k_])) 1].dot(np.array([k*(pix**(k-1)) for k in k_]))
df2[pix-1] = x2[1:n +
1].dot(np.array([k*(pix**(k-1)) for k in k_]))
#distance 欧式距离 # distance 欧式距离
block_diff[i][j_]=np.dot(df1-df2,df1-df2)**0.5 block_diff[i][j_] = np.dot(df1-df2, df1-df2)**0.5
min_diff = min(min_diff, block_diff[block_diff > 0].min()) min_diff = min(min_diff, block_diff[block_diff > 0].min())
max_diff = max(max_diff, block_diff.max()) max_diff = max(max_diff, block_diff.max())
@ -263,8 +286,10 @@ class LSTS(AlgFrontend):
send_message.emit('归一化概率中...') send_message.emit('归一化概率中...')
temp_in_ds = gdal.Open(out_tif) temp_in_ds = gdal.Open(out_tif)
out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(layer_parent.name, int(np.random.rand() * 100000))) out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(
out_normal_ds = driver.Create(out_normal_tif, xsize, ysize, 1, gdal.GDT_Byte) layer_parent.name, int(np.random.rand() * 100000)))
out_normal_ds = driver.Create(
out_normal_tif, xsize, ysize, 1, gdal.GDT_Byte)
out_normal_ds.SetGeoTransform(geo) out_normal_ds.SetGeoTransform(geo)
out_normal_ds.SetProjection(proj) out_normal_ds.SetProjection(proj)
# hist = np.zeros(256, dtype=np.int32) # hist = np.zeros(256, dtype=np.int32)
@ -302,10 +327,10 @@ class CVAAlg(AlgFrontend):
return 'CVA' return 'CVA'
@staticmethod @staticmethod
def run_alg(pth1:str,pth2:str,layer_parent:PairLayer,send_message = None, *args, **kargs): def run_alg(pth1: str, pth2: str, layer_parent: PairLayer, send_message=None, *args, **kargs):
ds1:gdal.Dataset=gdal.Open(pth1) ds1: gdal.Dataset = gdal.Open(pth1)
ds2:gdal.Dataset=gdal.Open(pth2) ds2: gdal.Dataset = gdal.Open(pth2)
cell_size = layer_parent.cell_size cell_size = layer_parent.cell_size
xsize = layer_parent.size[0] xsize = layer_parent.size[0]
@ -317,35 +342,38 @@ class CVAAlg(AlgFrontend):
driver = gdal.GetDriverByName('GTiff') driver = gdal.GetDriverByName('GTiff')
out_tif = os.path.join(Project().other_path, 'temp.tif') out_tif = os.path.join(Project().other_path, 'temp.tif')
out_ds = driver.Create(out_tif, xsize, ysize, 1, gdal.GDT_Float32) out_ds = driver.Create(out_tif, xsize, ysize, 1, gdal.GDT_Float32)
geo=layer_parent.grid.geo geo = layer_parent.grid.geo
proj=layer_parent.grid.proj proj = layer_parent.grid.proj
out_ds.SetGeoTransform(geo) out_ds.SetGeoTransform(geo)
out_ds.SetProjection(proj) out_ds.SetProjection(proj)
max_diff = 0 max_diff = 0
min_diff = math.inf min_diff = math.inf
start1x, start1y = geo2imageRC(ds1.GetGeoTransform(
), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
end1x, end1y = geo2imageRC(ds1.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start2x, start2y = geo2imageRC(ds2.GetGeoTransform(
end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
end2x, end2y = geo2imageRC(ds2.GetGeoTransform(
start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) ), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
for j in range(yblocks + 1): for j in range(yblocks + 1):
if send_message is not None: if send_message is not None:
send_message.emit(f'计算{j}/{yblocks}') send_message.emit(f'计算{j}/{yblocks}')
block_xy1 = (start1x, start1y+j * cell_size[1]) block_xy1 = (start1x, start1y+j * cell_size[1])
block_xy2 = (start2x,start2y+j*cell_size[1]) block_xy2 = (start2x, start2y+j*cell_size[1])
block_xy=(0,j * cell_size[1]) block_xy = (0, j * cell_size[1])
if block_xy1[1] > end1y or block_xy2[1] > end2y: if block_xy1[1] > end1y or block_xy2[1] > end2y:
break break
block_size=(xsize, cell_size[1]) block_size = (xsize, cell_size[1])
block_size1 = (xsize, cell_size[1]) block_size1 = (xsize, cell_size[1])
block_size2 = (xsize,cell_size[1]) block_size2 = (xsize, cell_size[1])
if block_xy[1] + block_size[1] > ysize: if block_xy[1] + block_size[1] > ysize:
block_size = (xsize, ysize - block_xy[1]) block_size = (xsize, ysize - block_xy[1])
if block_xy1[1] + block_size1[1] > end1y: if block_xy1[1] + block_size1[1] > end1y:
block_size1 = (xsize,end1y - block_xy1[1]) block_size1 = (xsize, end1y - block_xy1[1])
if block_xy2[1] + block_size2[1] > end2y: if block_xy2[1] + block_size2[1] > end2y:
block_size2 = (xsize, end2y - block_xy2[1]) block_size2 = (xsize, end2y - block_xy2[1])
block_data1 = ds1.ReadAsArray(*block_xy1, *block_size1) block_data1 = ds1.ReadAsArray(*block_xy1, *block_size1)
@ -355,7 +383,7 @@ class CVAAlg(AlgFrontend):
block_data1 = block_data1[None, ...] block_data1 = block_data1[None, ...]
block_data2 = block_data2[None, ...] block_data2 = block_data2[None, ...]
# pdb.set_trace() # pdb.set_trace()
block_diff=np.sum((block_data1-block_data2)**2,0)**0.5 block_diff = np.sum((block_data1-block_data2)**2, 0)**0.5
min_diff = min(min_diff, block_diff[block_diff > 0].min()) min_diff = min(min_diff, block_diff[block_diff > 0].min())
max_diff = max(max_diff, block_diff.max()) max_diff = max(max_diff, block_diff.max())
out_ds.GetRasterBand(1).WriteArray(block_diff, *block_xy) out_ds.GetRasterBand(1).WriteArray(block_diff, *block_xy)
@ -369,8 +397,10 @@ class CVAAlg(AlgFrontend):
send_message.emit('归一化概率中...') send_message.emit('归一化概率中...')
temp_in_ds = gdal.Open(out_tif) temp_in_ds = gdal.Open(out_tif)
out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(layer_parent.name, int(np.random.rand() * 100000))) out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(
out_normal_ds = driver.Create(out_normal_tif, xsize, ysize, 1, gdal.GDT_Byte) layer_parent.name, int(np.random.rand() * 100000)))
out_normal_ds = driver.Create(
out_normal_tif, xsize, ysize, 1, gdal.GDT_Byte)
out_normal_ds.SetGeoTransform(geo) out_normal_ds.SetGeoTransform(geo)
out_normal_ds.SetProjection(proj) out_normal_ds.SetProjection(proj)
# hist = np.zeros(256, dtype=np.int32) # hist = np.zeros(256, dtype=np.int32)
@ -398,6 +428,7 @@ class CVAAlg(AlgFrontend):
send_message.emit('欧式距离计算完成') send_message.emit('欧式距离计算完成')
return out_normal_tif return out_normal_tif
@VEG_CD.register @VEG_CD.register
class ACDAlg(AlgFrontend): class ACDAlg(AlgFrontend):
@ -406,7 +437,7 @@ class ACDAlg(AlgFrontend):
return 'ACD' return 'ACD'
@staticmethod @staticmethod
def run_alg(pth1:str,pth2:str,layer_parent:PairLayer,send_message = None, *args, **kargs): def run_alg(pth1: str, pth2: str, layer_parent: PairLayer, send_message=None, *args, **kargs):
if send_message is None: if send_message is None:
class Empty: class Empty:
@ -418,39 +449,41 @@ class ACDAlg(AlgFrontend):
xsize = layer_parent.size[0] xsize = layer_parent.size[0]
ysize = layer_parent.size[1] ysize = layer_parent.size[1]
geo=layer_parent.grid.geo geo = layer_parent.grid.geo
proj=layer_parent.grid.proj proj = layer_parent.grid.proj
#提取公共部分 # 提取公共部分
send_message.emit('提取重叠区域数据.....') send_message.emit('提取重叠区域数据.....')
ds2:gdal.Dataset=gdal.Open(pth2) ds2: gdal.Dataset = gdal.Open(pth2)
temp_tif2 = os.path.join(Project().other_path,'temp2.tif') temp_tif2 = os.path.join(Project().other_path, 'temp2.tif')
start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start2x, start2y = geo2imageRC(ds2.GetGeoTransform(
end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
warp(temp_tif2,ds2,srcWin=[start2x,start2y,xsize,ysize]) end2x, end2y = geo2imageRC(ds2.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
warp(temp_tif2, ds2, srcWin=[start2x, start2y, xsize, ysize])
del ds2 del ds2
send_message.emit('图像二提取完成') send_message.emit('图像二提取完成')
ds1: gdal.Dataset = gdal.Open(pth1)
ds1:gdal.Dataset=gdal.Open(pth1)
temp_tif1 = os.path.join(Project().other_path, 'temp1.tif') temp_tif1 = os.path.join(Project().other_path, 'temp1.tif')
start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start1x, start1y = geo2imageRC(ds1.GetGeoTransform(
end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
warp(temp_tif1,ds1,srcWin=[start1x,start1y,xsize,ysize]) end1x, end1y = geo2imageRC(ds1.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
warp(temp_tif1, ds1, srcWin=[start1x, start1y, xsize, ysize])
del ds1 del ds1
send_message.emit('图像一提取完成') send_message.emit('图像一提取完成')
# 运算
#运算
send_message.emit('开始ACD计算.....') send_message.emit('开始ACD计算.....')
time.sleep(0.1) time.sleep(0.1)
out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(layer_parent.name, int(np.random.rand() * 100000))) out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(
ACD(temp_tif1,temp_tif2,out_normal_tif) layer_parent.name, int(np.random.rand() * 100000)))
#添加投影 ACD(temp_tif1, temp_tif2, out_normal_tif)
# 添加投影
send_message.emit('录入投影信息.....') send_message.emit('录入投影信息.....')
time.sleep(0.1) time.sleep(0.1)
ds=gdal.Open(out_normal_tif,1) ds = gdal.Open(out_normal_tif, 1)
ds.SetGeoTransform(geo) ds.SetGeoTransform(geo)
ds.SetProjection(proj) ds.SetProjection(proj)
del ds del ds
@ -466,7 +499,7 @@ class AHTAlg(AlgFrontend):
return 'AHT' return 'AHT'
@staticmethod @staticmethod
def run_alg(pth1:str,pth2:str,layer_parent:PairLayer,send_message = None, *args, **kargs): def run_alg(pth1: str, pth2: str, layer_parent: PairLayer, send_message=None, *args, **kargs):
if send_message is None: if send_message is None:
class Empty: class Empty:
@ -477,39 +510,41 @@ class AHTAlg(AlgFrontend):
xsize = layer_parent.size[0] xsize = layer_parent.size[0]
ysize = layer_parent.size[1] ysize = layer_parent.size[1]
geo=layer_parent.grid.geo geo = layer_parent.grid.geo
proj=layer_parent.grid.proj proj = layer_parent.grid.proj
#提取公共部分 # 提取公共部分
send_message.emit('提取重叠区域数据.....') send_message.emit('提取重叠区域数据.....')
ds2:gdal.Dataset=gdal.Open(pth2) ds2: gdal.Dataset = gdal.Open(pth2)
temp_tif2 = os.path.join(Project().other_path,'temp2.tif') temp_tif2 = os.path.join(Project().other_path, 'temp2.tif')
start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start2x, start2y = geo2imageRC(ds2.GetGeoTransform(
end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
warp(temp_tif2,ds2,srcWin=[start2x,start2y,xsize,ysize]) end2x, end2y = geo2imageRC(ds2.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
warp(temp_tif2, ds2, srcWin=[start2x, start2y, xsize, ysize])
del ds2 del ds2
send_message.emit('图像二提取完成') send_message.emit('图像二提取完成')
ds1: gdal.Dataset = gdal.Open(pth1)
ds1:gdal.Dataset=gdal.Open(pth1)
temp_tif1 = os.path.join(Project().other_path, 'temp1.tif') temp_tif1 = os.path.join(Project().other_path, 'temp1.tif')
start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start1x, start1y = geo2imageRC(ds1.GetGeoTransform(
end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
warp(temp_tif1,ds1,srcWin=[start1x,start1y,xsize,ysize]) end1x, end1y = geo2imageRC(ds1.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
warp(temp_tif1, ds1, srcWin=[start1x, start1y, xsize, ysize])
del ds1 del ds1
send_message.emit('图像一提取完成') send_message.emit('图像一提取完成')
# 运算
#运算
send_message.emit('开始AHT计算.....') send_message.emit('开始AHT计算.....')
time.sleep(0.1) time.sleep(0.1)
out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(layer_parent.name, int(np.random.rand() * 100000))) out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(
AHT(temp_tif1,temp_tif2,out_normal_tif) layer_parent.name, int(np.random.rand() * 100000)))
#添加投影 AHT(temp_tif1, temp_tif2, out_normal_tif)
# 添加投影
send_message.emit('录入投影信息.....') send_message.emit('录入投影信息.....')
time.sleep(0.1) time.sleep(0.1)
ds=gdal.Open(out_normal_tif,1) ds = gdal.Open(out_normal_tif, 1)
ds.SetGeoTransform(geo) ds.SetGeoTransform(geo)
ds.SetProjection(proj) ds.SetProjection(proj)
del ds del ds
@ -525,7 +560,7 @@ class OCDAlg(AlgFrontend):
return 'OCD' return 'OCD'
@staticmethod @staticmethod
def run_alg(pth1:str,pth2:str,layer_parent:PairLayer,send_message = None, *args, **kargs): def run_alg(pth1: str, pth2: str, layer_parent: PairLayer, send_message=None, *args, **kargs):
if send_message is None: if send_message is None:
class Empty: class Empty:
@ -536,45 +571,48 @@ class OCDAlg(AlgFrontend):
xsize = layer_parent.size[0] xsize = layer_parent.size[0]
ysize = layer_parent.size[1] ysize = layer_parent.size[1]
geo=layer_parent.grid.geo geo = layer_parent.grid.geo
proj=layer_parent.grid.proj proj = layer_parent.grid.proj
#提取公共部分 # 提取公共部分
send_message.emit('提取重叠区域数据.....') send_message.emit('提取重叠区域数据.....')
ds2:gdal.Dataset=gdal.Open(pth2) ds2: gdal.Dataset = gdal.Open(pth2)
temp_tif2 = os.path.join(Project().other_path,'temp2.tif') temp_tif2 = os.path.join(Project().other_path, 'temp2.tif')
start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start2x, start2y = geo2imageRC(ds2.GetGeoTransform(
end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
warp(temp_tif2,ds2,srcWin=[start2x,start2y,xsize,ysize]) end2x, end2y = geo2imageRC(ds2.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
warp(temp_tif2, ds2, srcWin=[start2x, start2y, xsize, ysize])
del ds2 del ds2
send_message.emit('图像二提取完成') send_message.emit('图像二提取完成')
ds1: gdal.Dataset = gdal.Open(pth1)
ds1:gdal.Dataset=gdal.Open(pth1)
temp_tif1 = os.path.join(Project().other_path, 'temp1.tif') temp_tif1 = os.path.join(Project().other_path, 'temp1.tif')
start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start1x, start1y = geo2imageRC(ds1.GetGeoTransform(
end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
warp(temp_tif1,ds1,srcWin=[start1x,start1y,xsize,ysize]) end1x, end1y = geo2imageRC(ds1.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
warp(temp_tif1, ds1, srcWin=[start1x, start1y, xsize, ysize])
del ds1 del ds1
send_message.emit('图像一提取完成') send_message.emit('图像一提取完成')
# 运算
#运算
send_message.emit('开始OCD计算.....') send_message.emit('开始OCD计算.....')
time.sleep(0.1) time.sleep(0.1)
out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(layer_parent.name, int(np.random.rand() * 100000))) out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(
OCD(temp_tif1,temp_tif2,out_normal_tif,Project().other_path) layer_parent.name, int(np.random.rand() * 100000)))
#添加投影 OCD(temp_tif1, temp_tif2, out_normal_tif, Project().other_path)
# 添加投影
send_message.emit('录入投影信息.....') send_message.emit('录入投影信息.....')
time.sleep(0.1) time.sleep(0.1)
ds=gdal.Open(out_normal_tif,1) ds = gdal.Open(out_normal_tif, 1)
ds.SetGeoTransform(geo) ds.SetGeoTransform(geo)
ds.SetProjection(proj) ds.SetProjection(proj)
del ds del ds
return out_normal_tif return out_normal_tif
@VEG_CD.register @VEG_CD.register
class LHBAAlg(AlgFrontend): class LHBAAlg(AlgFrontend):
@ -583,7 +621,7 @@ class LHBAAlg(AlgFrontend):
return 'LHBA' return 'LHBA'
@staticmethod @staticmethod
def run_alg(pth1:str,pth2:str,layer_parent:PairLayer,send_message = None, *args, **kargs): def run_alg(pth1: str, pth2: str, layer_parent: PairLayer, send_message=None, *args, **kargs):
if send_message is None: if send_message is None:
class Empty: class Empty:
@ -592,40 +630,43 @@ class LHBAAlg(AlgFrontend):
print(args) print(args)
send_message = Empty() send_message = Empty()
xsize = layer_parent.size[0] xsize = layer_parent.size[0]
ysize = layer_parent.size[1] ysize = layer_parent.size[1]
geo=layer_parent.grid.geo geo = layer_parent.grid.geo
proj=layer_parent.grid.proj proj = layer_parent.grid.proj
#提取公共部分 # 提取公共部分
send_message.emit('提取重叠区域数据.....') send_message.emit('提取重叠区域数据.....')
ds2:gdal.Dataset=gdal.Open(pth2) ds2: gdal.Dataset = gdal.Open(pth2)
temp_tif2 = os.path.join(Project().other_path,'temp2.tif') temp_tif2 = os.path.join(Project().other_path, 'temp2.tif')
start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start2x, start2y = geo2imageRC(ds2.GetGeoTransform(
end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
warp(temp_tif2,ds2,srcWin=[start2x,start2y,xsize,ysize]) end2x, end2y = geo2imageRC(ds2.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
warp(temp_tif2, ds2, srcWin=[start2x, start2y, xsize, ysize])
del ds2 del ds2
send_message.emit('图像二提取完成') send_message.emit('图像二提取完成')
ds1: gdal.Dataset = gdal.Open(pth1)
ds1:gdal.Dataset=gdal.Open(pth1)
temp_tif1 = os.path.join(Project().other_path, 'temp1.tif') temp_tif1 = os.path.join(Project().other_path, 'temp1.tif')
start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start1x, start1y = geo2imageRC(ds1.GetGeoTransform(
end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
warp(temp_tif1,ds1,srcWin=[start1x,start1y,xsize,ysize]) end1x, end1y = geo2imageRC(ds1.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
warp(temp_tif1, ds1, srcWin=[start1x, start1y, xsize, ysize])
del ds1 del ds1
send_message.emit('图像一提取完成') send_message.emit('图像一提取完成')
#运算 # 运算
send_message.emit('开始LHBA计算.....') send_message.emit('开始LHBA计算.....')
time.sleep(0.1) time.sleep(0.1)
out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(layer_parent.name, int(np.random.rand() * 100000))) out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(
LHBA(temp_tif1,temp_tif2,out_normal_tif) layer_parent.name, int(np.random.rand() * 100000)))
#添加投影 LHBA(temp_tif1, temp_tif2, out_normal_tif)
# 添加投影
send_message.emit('录入投影信息.....') send_message.emit('录入投影信息.....')
time.sleep(0.1) time.sleep(0.1)
ds=gdal.Open(out_normal_tif,1) ds = gdal.Open(out_normal_tif, 1)
ds.SetGeoTransform(geo) ds.SetGeoTransform(geo)
ds.SetProjection(proj) ds.SetProjection(proj)
del ds del ds
@ -640,7 +681,7 @@ class SHAlg(AlgFrontend):
return 'SH' return 'SH'
@staticmethod @staticmethod
def run_alg(pth1:str,pth2:str,layer_parent:PairLayer,send_message = None, *args, **kargs): def run_alg(pth1: str, pth2: str, layer_parent: PairLayer, send_message=None, *args, **kargs):
if send_message is None: if send_message is None:
class Empty: class Empty:
@ -649,41 +690,43 @@ class SHAlg(AlgFrontend):
print(args) print(args)
send_message = Empty() send_message = Empty()
xsize = layer_parent.size[0] xsize = layer_parent.size[0]
ysize = layer_parent.size[1] ysize = layer_parent.size[1]
geo=layer_parent.grid.geo geo = layer_parent.grid.geo
proj=layer_parent.grid.proj proj = layer_parent.grid.proj
#提取公共部分 # 提取公共部分
send_message.emit('提取重叠区域数据.....') send_message.emit('提取重叠区域数据.....')
ds2:gdal.Dataset=gdal.Open(pth2) ds2: gdal.Dataset = gdal.Open(pth2)
temp_tif2 = os.path.join(Project().other_path,'temp2.tif') temp_tif2 = os.path.join(Project().other_path, 'temp2.tif')
start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start2x, start2y = geo2imageRC(ds2.GetGeoTransform(
end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
warp(temp_tif2,ds2,srcWin=[start2x,start2y,xsize,ysize]) end2x, end2y = geo2imageRC(ds2.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
warp(temp_tif2, ds2, srcWin=[start2x, start2y, xsize, ysize])
del ds2 del ds2
send_message.emit('图像二提取完成') send_message.emit('图像二提取完成')
ds1: gdal.Dataset = gdal.Open(pth1)
ds1:gdal.Dataset=gdal.Open(pth1)
temp_tif1 = os.path.join(Project().other_path, 'temp1.tif') temp_tif1 = os.path.join(Project().other_path, 'temp1.tif')
start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1]) start1x, start1y = geo2imageRC(ds1.GetGeoTransform(
end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3]) ), layer_parent.mask.xy[0], layer_parent.mask.xy[1])
warp(temp_tif1,ds1,srcWin=[start1x,start1y,xsize,ysize]) end1x, end1y = geo2imageRC(ds1.GetGeoTransform(
), layer_parent.mask.xy[2], layer_parent.mask.xy[3])
warp(temp_tif1, ds1, srcWin=[start1x, start1y, xsize, ysize])
del ds1 del ds1
send_message.emit('图像一提取完成') send_message.emit('图像一提取完成')
#运算 # 运算
send_message.emit('开始SH计算.....') send_message.emit('开始SH计算.....')
time.sleep(0.1) time.sleep(0.1)
out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(layer_parent.name, int(np.random.rand() * 100000))) out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(
SH(temp_tif1,temp_tif2,out_normal_tif) layer_parent.name, int(np.random.rand() * 100000)))
#添加投影 SH(temp_tif1, temp_tif2, out_normal_tif)
# 添加投影
send_message.emit('录入投影信息.....') send_message.emit('录入投影信息.....')
time.sleep(0.1) time.sleep(0.1)
ds=gdal.Open(out_normal_tif,1) ds = gdal.Open(out_normal_tif, 1)
ds.SetGeoTransform(geo) ds.SetGeoTransform(geo)
ds.SetProjection(proj) ds.SetProjection(proj)
del ds del ds

View File

@ -2,6 +2,7 @@ from PyQt5.QtGui import QIcon
from PyQt5.QtCore import QObject from PyQt5.QtCore import QObject
from .misc import singleton from .misc import singleton
@singleton @singleton
class IconInstance(QObject): class IconInstance(QObject):
@ -46,6 +47,10 @@ class IconInstance(QObject):
self.RASTER = QIcon('./icons/影像.png') self.RASTER = QIcon('./icons/影像.png')
self.VEGETATION = QIcon('./icons/植被变化.png') self.VEGETATION = QIcon('./icons/植被变化.png')
self.NOISE = QIcon('./icons/噪声处理.png') self.NOISE = QIcon('./icons/噪声处理.png')
self.ARITHMETIC1 = QIcon('./icons/Algorithm_icon/功能-01.png')
self.ARITHMETIC2 = QIcon('./icons/Algorithm_icon/功能-02.png')
self.ARITHMETIC3 = QIcon('./icons/Algorithm_icon/功能-03.png')
self.ARITHMETIC3.QSize()
self.DATA_LOAD = QIcon('./icons/数据加载.png') self.DATA_LOAD = QIcon('./icons/数据加载.png')

BIN
test-data/AAA.tif.ovr Normal file

Binary file not shown.

BIN
test-data/BBB.tif.ovr Normal file

Binary file not shown.

View File

@ -0,0 +1,22 @@
cell_size:
- 100
- 100
layers:
- enable: true
layers: []
name: AAA.-BBB.
pth1: E:/xhong/CVEOdemo/fourth/rscder/test-data/AAA.tif
pth2: E:/xhong/CVEOdemo/fourth/rscder/test-data/BBB.tif
style_info1:
NIR: 4
b: 3
g: 2
r: 1
style_info2:
NIR: 4
b: 3
g: 2
r: 1
max_memory: 100
max_threads: 4
root: E:\xhong\CVEOdemo\fourth\rscder\test-data\test01