pyhton 离散点数据转栅格img

# -*-coding:utf-8 -*-

import arcpy
import os
from dbcommon.views import OperateDB
from arcpy import env
import shutil
import numpy as np

class DataToImg(object):
    """
    :站点和格点数据转img图层公用算法
    """
    def __init__(self):
        #img文件临时存储路径
        self.OUTPATH = 'F:/arcgis_temp/raster/'
        #img文件存储路径
        self.IMGPATH = 'F:/arcgis_temp/img/'
        #环境变量设置   上下左右经纬度
        self.x_min = 104.250
        self.y_min = 35.200
        self.x_max = 107.700
        self.y_max = 39.400

    
    def station_to_img(self,data,out_path,file_name):
        """
        :站点数据转换为img图层
        :param  data  :数据    二维数据[[经度,纬度,数据],………]
                out_path :输出路径 例如:FGFP/
                file_name:文件名称
        """
        try:
            env.overwriteOutput = True
            #工作空间
            env.workspace = self.OUTPATH + out_path
            #环境变量设置   上下左右经纬度
            env.extent = arcpy.Extent( self.x_min, self.y_min, 
                                       self.x_max, self.y_max
                                      )
            #环境变量设置   上下左右经纬度
            img_path = self.discretePoint2raster(data, out_path, file_name)
            #如果路径不存在,新建目录
            if not os.path.exists(self.IMGPATH+out_path):
                os.makedirs(self.IMGPATH+out_path)
            file_name = self.IMGPATH+out_path+"/"+file_name+".img"
            #将文件永久保存
            shutil.copyfile(img_path,file_name)
            #删除所有的临时文件
            self.remove_all_file(self.OUTPATH+out_path)
            return file_name
        except:
            raise
        
    def grid_to_img(self,data,out_path,file_name,usecols=None):
        """
        :站点数据转换为img图层
        :param  data     :数据    二维数据[[经度,纬度,数据],………]
                out_path :输出路径 例如:FGFP/
                file_name:文件名称
                usecols  :文件参与绘图的列序号,判断传入数据是否为文件  例如(0,1,2)
        """
        try:
            env.overwriteOutput = True
            #工作空间
            env.workspace = self.OUTPATH + out_path
            #环境变量设置   上下左右经纬度
            env.extent = arcpy.Extent(
                self.x_min, self.y_min, self.x_max, self.y_max)
            #如果传入数据为文件路径则读取文件数据
            if usecols:
                context = np.genfromtxt(data, skip_header=1, usecols=usecols)
            #如果传入数据为数据,则删除第一行(文件头)
            else:
                context = data[1:]
            #将格点数据转化为img图层
            img_path = self.txt2raster(context, out_path, file_name)
            #如果路径不存在,新建目录
            if not os.path.exists(self.IMGPATH+out_path):
                os.makedirs(self.IMGPATH+out_path)
            file_name = self.IMGPATH+out_path+"/"+file_name+".img"
            #将文件永久保存
            shutil.copyfile(img_path,file_name)
            #删除所有的临时文件
            self.remove_all_file(self.OUTPATH+out_path)
            return file_name
        except:
            raise
        
        
    def discretePoint2raster(self,data,out_path,file_name,mark=None):
        """
        :离散点到img栅格图层转换        公共函数
        :params data     :待插值的离散点,列表类型
                out_path :输出路径 例如:FGFP/
                file_name:文件名称
                mark     :标识,判断是否重采样      1是  0否
        :return   :生成的img图层
        """
        try:
            #img文件输出路径
            filepath = self.OUTPATH + out_path
            #如果路径不存在,新建目录
            if not os.path.exists(filepath):
                os.makedirs(filepath)
            #输出1X1km的img栅格数据
            outRaster = filepath+"/"+file_name+".img"
            #输出重采样后100m*100m的img栅格数据
            outRasterRes=filepath+"/"+file_name+"_100.img"
            newfc= file_name+".shp"
            has_m = "DISABLED"
            has_z = "ENABLED"
            #指定空间参考坐标系
            sr = arcpy.SpatialReference("WGS 1984")
            #创建要素类(工作空间,要素类名称,要素类的几何类型,‘’,‘’,……
            arcpy.CreateFeatureclass_management(filepath, newfc, "POINT", "",  has_m, has_z, sr)
            #添加字段,(要素类名称,字段名称,字段类型,字段位数,字段小数位数)
            arcpy.AddField_management(newfc, 'z', 'double', '12', '8')
            #向要素类种插入行
            cur = arcpy.InsertCursor(newfc)
           
            min_value= 9999999.99
            max_value= -9999999.99 
            #遍历数据,插入到要素类种
            for item in data:
                x  = item[0]
                y  = item[1]
                z  = float(item[2])
                #插入及纬度
                pnt = arcpy.Point(float(x), float(y))
                if min_value>z:
                    min_value=z
                if max_value<z:
                    max_value=z
                #向要素类插入Z字段值(数据值)    
                row = cur.newRow()
                row.Shape = pnt 
                row.z  = z
                cur.insertRow(row)
                del row
            #清除
            del cur
            
            zField = "z"
            cellSize = "0.01"
            power=2
            # Set variables for search neighborhood
            majSemiaxis = 300000
            minSemiaxis = 300000
            angle = 0
            smoothFactor = 0.5
            #平滑插值
            searchNeighbourhood = arcpy.SearchNeighborhoodSmooth(
                                                                 majSemiaxis, minSemiaxis,
                                                                 angle, smoothFactor
                                                                 )
            #加权平均法插值(输入要素类,字段,‘’,输出要素类,像素大小,功率,平滑)
            arcpy.IDW_ga(
                         newfc, zField, "", outRaster, 
                         cellSize, power, 
                         searchNeighbourhood
                         )
            #判断是否进行重采样
            if mark:
                inRaster = arcpy.Raster(outRaster)
                # 重新采样,提供分辨率,100m分辨率
                arcpy.Resample_management(inRaster, outRasterRes, "0.001 0.001", "CUBIC")
                return outRasterRes
            else:
                return outRaster
        except:
            raise
    
    def remove_all_file(self,path):
        """
        :删除文件夹下多有文件
        """
        try:
            for i in os.listdir(path):
                path_file = os.path.join(path,i)  #取文件绝对路径
                os.remove(path_file)
        except:
            raise
    
    def txt2raster(self,data,file_path,file_name,mark=None):
        """
        :格点数据转换为img栅格图层  公共函数
        :param: data     :格点数据  <type 'numpy.ndarray'> [[经度,纬度,数据],……]
                file_path:输出路径 例如:FGFP/
                file_name:文件名称
                mark     :标识,判断是否重采样      1是  0否
        :return  out_raster_path :生成的img图层
        """
        # 定义ASCII文件头信息
        try:
            no_data = '-9999.00'
            #文件保存临时路径
            out_path = self.OUTPATH +  file_path + '/' + file_name + '.asc'
            out_raster_path = self.OUTPATH + file_path + '/' + file_name + '.img'
            if not os.path.exists(self.OUTPATH +  file_path):
                os.makedirs(self.OUTPATH +  file_path)
            context = data
            # 计算经纬度递增步长
            if context is not None and context[1][1] != context[0][1]:
                cellsize = context[1][1] - context[0][1]
            elif context is not None and context[1][0] != context[0][0]:
                cellsize = context[1][1] - context[0][1]
            cellsize = round(cellsize, 2)
            ncols = int(round(round((self.x_max - self.x_min),2) / cellsize,2)) + 1
            nrows = int(round(round((self.y_max - self.y_min),2) / cellsize,2)) + 1
            # 初始化二维数组,默认值为-9999.00,存储ASCII数值
            data = np.full((nrows, ncols), -9999.00, np.float64)
            for item in context:
                x = int(round(round((item[0] - self.x_min),2) / cellsize,2))
                y = int(round(round((item[1] - self.y_min),2) / cellsize,2))
                data[nrows - y][x] = item[2]
            # 设置文件头样式
            header =( "ncols\t{ncols}\nnrows\t{nrows}\nxllcorner\t{xllcorner}\nyllcorner\t{yllcorner}\n"
                      "cellsize\t{cellsize}\nNODATA_value\t{NODATA_value}")
            header = header.format(ncols=ncols, nrows=nrows, xllcorner=self.x_min, yllcorner=self.y_min,
                                   cellsize=cellsize, NODATA_value=no_data)
            # 写入ASCII文件
            np.savetxt(out_path, data, fmt='%.2f', delimiter='\t', header=header, comments='')
            # 栅格数据的 ASCII文件转换为栅格数据集
            # 指定坐标系为1984
            sr = arcpy.SpatialReference(4326)
            in_raster = arcpy.Raster(out_path)
            arcpy.DefineProjection_management(in_raster, sr)
            # 重新采样,提供分辨率,100m分辨率
            arcpy.Resample_management(in_raster,out_raster_path, "0.001 0.001", "CUBIC")
            return out_raster_path
        except:
            raise
        
        
if __name__=='__main__':
    di = DataToImg()
    
    """u站点数据转img示例"""
    
    sql = "select dss.longitude,dss.latitude ,ds.swwc from  dbcommon_soilday ds ,dbcommon_stationsite dss\
             where ds.station_id_c=dss.station_no\
             and date_time =to_date('20170813','yyyymmdd')\
             and ds.swwc !='None'   "
    op = OperateDB()
    data = op.select(sql)
    raster_path = di.station_to_img(data, 'test', 'test')
    
    """格点数据转img示例——输入参数为数据"""
    path = r'F:/dataStorage/BUNP/CDCF/20170406.txt'
    data = np.genfromtxt(path)
    di.grid_to_img(data, 'test','test')
    
    
    """格点数据文件转img示例——输入参数为格点文件的文件路径"""
    path = r'F:/dataStorage/BUNP/CDCF/20170406.txt'
    di.grid_to_img(path, 'test','test')







转载自:https://blog.csdn.net/qq_16645423/article/details/80359207

You may also like...