从Tif文件转为shp文件(ArcMap,代码)、gdal打包问题

从Tif文件转为shp文件(ArcMap,代码)

利用ArcMap来进行转换,以预测出来的滨海湿地图像为例

第一步:打开ArcMap中的栅格转面工具

ArcMap中的栅格转面工具从Tif文件转为shp文件(ArcMap,代码)、gdal打包问题_第1张图片

点击栅格转面之后,选择参数和输出文件路径,如下图所示
从Tif文件转为shp文件(ArcMap,代码)、gdal打包问题_第2张图片
得到的结果即为
从Tif文件转为shp文件(ArcMap,代码)、gdal打包问题_第3张图片
在选择的文件夹下会生成如下文件
从Tif文件转为shp文件(ArcMap,代码)、gdal打包问题_第4张图片

第二步:属性归并

查看tif原图和生成的shp图的属性表。下方左侧为tif原图的属性表,右侧为生成的shp图的属性表
从Tif文件转为shp文件(ArcMap,代码)、gdal打包问题_第5张图片 从Tif文件转为shp文件(ArcMap,代码)、gdal打包问题_第6张图片
尚未知道栅格转面的具体原理,看到这样一种说法:“在属性表中,因为栅格转矢量是1度1度转的,所以,属性表中的坡度值是从0度开始一直到很大的坡度的。因此,需要按照相关标准进行归并。”

尚未知道融合工具前的笨方法:

从Tif文件转为shp文件(ArcMap,代码)、gdal打包问题_第7张图片
第一步在属性表中点击按属性选择,在语句框中根据需求写入sql语句,如GRIDCODE=0(注意看上面还有句:SELECT * FROM test_new WHERE:),然后点击应用
第二步点击编辑器的下拉箭头,点击合并,为属性值相同的多要素进行合并
从Tif文件转为shp文件(ArcMap,代码)、gdal打包问题_第8张图片
现在GRIDCODE=0的要素便被集中到了一个要素中,然后再对其他值进行合并

融合工具:

偶然间看到ArcMap中有融合工具,试用了一下感觉清清爽爽。下图为融合工具的位置
从Tif文件转为shp文件(ArcMap,代码)、gdal打包问题_第9张图片
点击融合,进入融合界面,输入要素即为需要融合的图像,输出要素类即为融合之后的shp图像,融合字段即为你需要它融合的字段(在本例中为GRIDCODE)
从Tif文件转为shp文件(ArcMap,代码)、gdal打包问题_第10张图片
以下为融合后的shp图像的属性表,可以看到融合工具将GRIDCODE相同的要素融合到了一起
从Tif文件转为shp文件(ArcMap,代码)、gdal打包问题_第11张图片

第三步:根据需求添加字段并显示

在属性表中点击左上角的表选项,然后点击添加字段。若打开后的添加字段为灰色(不可点击状态),则查看目前是否处于正在编辑状态,若在则需要停止编辑。
从Tif文件转为shp文件(ArcMap,代码)、gdal打包问题_第12张图片
按照需求给添加的字段赋予相关参数,如下图所示,新建了名词为class,属性为文本,长度为20的新字段
从Tif文件转为shp文件(ArcMap,代码)、gdal打包问题_第13张图片
点击确定后,属性表为下图所示
从Tif文件转为shp文件(ArcMap,代码)、gdal打包问题_第14张图片
接下来则需要为新添加的字段进行赋值。普通状态下无法对字段的值进行操作,此时需要进入编辑要素状态,点击需要操作的字段进行操作。
从Tif文件转为shp文件(ArcMap,代码)、gdal打包问题_第15张图片
在属性表中添加了新字段后便可根据此字段来显示shp图。右键点击shp图像——>属性——>符号系统
在显示那一栏中点击类别——>唯一值——>值字段(选择你添加的新字段,此处为class)——>添加所有值
若无错误,应如下图所示。
从Tif文件转为shp文件(ArcMap,代码)、gdal打包问题_第16张图片
点击确定后便可看到shp图已有了多种颜色。右键shp图——>标注要素。如下图所示
从Tif文件转为shp文件(ArcMap,代码)、gdal打包问题_第17张图片
有时点击标注要素后它可能还是不显示class中的值,而显示GRIDCODE的值,将其移除并重新导入即可正常显示。

利用Arcpy来进行转换

ArcPy 是一个 Python 站点包,可提供以实用高效的方式通过 Python 执行地理数据分析、数据转换、数据管理和地图自动化。点击 这里 可进入官网了解更多Arcpy的知识。
因在其他版本的python空间中很难导入arcpy库,即便处理好一部分后也会报*“ImportError: DLL load failed: %1 不是有效的 Win32 应用程序。”*这种错误,一查是导入的Arcpy库与python版本不一致。因我需要将python文件打包成exe应用程序,所以只需写出python代码来即可,于是便可在ArcGis的python27环境下打开python IDLE,其安装时自带arcpy库。
从Tif文件转为shp文件(ArcMap,代码)、gdal打包问题_第18张图片
进入后先看是否可以导入arcpy库,如图所示不报错便可新建python文件开始相关操作。
从Tif文件转为shp文件(ArcMap,代码)、gdal打包问题_第19张图片
最终目的是将写好的arcpy打包成一个exe程序,但arcpy打包时遇到很多问题,几经折腾终于找到了如何使用py2exe打包arcpy脚本?教程,其利用py2exe来将带有arcpy库的python文件进行打包。关于py2exe打包的用法,可以自行搜索,其与pyinstaller各有优劣,有兴趣自己查找即可。
根据以上教程,首先将准备工作做好后才能进行import arcpy,具体原因请看上面教程

from site import addsitedir  
from sys import executable  
from os import path 
from sys import argv 
interpreter = executable  
sitepkg = path.dirname(interpreter) + "\\site-packages" 
print(sitepkg) 
addsitedir(sitepkg)
import arcpy

以我们预测的滨海湿地图像为例,其预测出来的是个单波段的灰度图,在ArcMap中可对其进行符号系统的修改后便可创建属性表并用不同颜色来进行展示,但若是要工程化项目,这样肯定不行。

于是第一步便是为栅格数据创建属性表,应用的函数为BuildRasterAttributeTable_management,点击 这里
可进入官网关于此函数的详细介绍界面。

 # 此处为预测出来的tif图像的保存路径
 path = r'G:\newtest\new8\pre_image\test1_chipTest.tif'
 # 此Overwrite用于覆盖现有栅格属性表或向其追加列和行。
 arcpy.BuildRasterAttributeTable_management(path,"Overwrite")

接下来便可进行栅格转面操作,应用到的函数为RasterToPolygon_conversion,点击 这里 可进入官网关于此函数的详细介绍界面。

# 栅格转面   tif->shp 
 arcpy.RasterToPolygon_conversion(path,shp_path,"NO_SIMPLIFY")

之后便需要对属性相同的要素进行合并,合并函数为Dissolve_management,但其参数需要输入
要聚合的要素,类型为Feature Layer,具体要求可点击 这里 进入官网关于此函数的详细介绍界面,于是在合并之前需要创建一个要素图层。

创建要素图层用的函数为MakeFeatureLayer_management,具体应用可点击 这里 进入官网关于此函数的详细介绍界面。

 # 创建要素图层
 arcpy.MakeFeatureLayer_management(shp_path, "shp_lyr")
 # 基于指定属性聚合要素,new_shp_path 为新shp文件路径,why? 看官网函数介绍,"GRIDCODE"为需要合并字段
 arcpy.Dissolve_management("shp_lyr",new_shp_path,["GRIDCODE"])

合并完要素后便可为属性表添加新字段,函数为AddField_management,具体要求可点击 这里 进入官网关于此函数的详细介绍界面。

# 添加新字段class,类型为文本TEXT,长度为20
arcpy.AddField_management(new_shp_path,"class","TEXT","","",20)

添加完新字段后便可对其进行赋值,此时需要用到UpdateCursor函数,具体要求可点击 这里 进入官网关于此函数的详细介绍界面。

 # 给新字段赋值 ['FID','Shape','GRIDCODE','class']为shp中属性表的字段
 # 每行为GRIDCODE中为0的要素赋值class为“芦苇草甸”,注意row[]从0开始,类推
    with arcpy.da.UpdateCursor(new_shp_path,['FID','Shape','GRIDCODE','class']) as cursor:
        for row in cursor:
            if(row[2] == 0):
                row[3] = "芦苇草甸"
            elif(row[2] == 1):
                row[3] = "互花米草"
            elif(row[2] == 2):
                row[3] = "柽柳"
            elif(row[2] == 3):
                row[3] = "潮滩"
            elif(row[2] == 4):
                row[3] = "水域"
            cursor.updateRow(row)

此时,采用arcpy对tif文件转换为shp文件已完成。把新创建的shp导入到Arcmap上,进行符号系统的修改后便可正常展示。
以下为完整代码

from site import addsitedir  
from sys import executable  
from os import path 
from sys import argv 
interpreter = executable  
sitepkg = path.dirname(interpreter) + "\\site-packages" 
print(sitepkg) 
addsitedir(sitepkg)
import arcpy

def main():
    # path = argv[1]
    # colormap_path = argv[2]
    path = r'G:\newtest\new8\pre_image\test1_chipTest.tif'
    shp_path = r'G:\newtest\new8\shp\test2.shp'
    new_shp_path = shp_path.split('.')[0] + 'New.shp'
    lyr_path = r'G:\newtest\Conver_shp\273_test1New.lyr'
    
    arcpy.BuildRasterAttributeTable_management(path,"Overwrite")

	# 刚开始不知如何操作时走了很多弯路,又是导入图层,导入颜色映射模板的,最后都被自己一一否决。
	# 放在这里也算记个用法
    # shp_name = shp_path.split('\\')[-1].split('.')[0]
    # new_shp_path = r'G:\newtest\new8\shp\New_test2.shp'
    # 给tif传入一个颜色映射模板
    # colormap_path = r'G:\newtest\new8\new_color.clr'
    # arcpy.AddColormap_management(path,"#",colormap_path)
    # 创建临时的栅格图层,会话结束后不会继续存在
    # a = arcpy.MakeRasterLayer_management(path,"test_lyr")
    # 保存至图层文件工具
    # arcpy.SaveToLayerFile_management(a,r"G:\newtest\arc\test.lyr","ABSOLUTE")
    # inputLayer = "test2.lyr"
    # inputLayer = a
    # symbologyLayer = "testTif.lyr"
    # 将来自图层的符号系统应用到输入图层
    # arcpy.ApplySymbologyFromLayer_management(inputLayer,symbologyLayer)
    # 按属性选择图层
    # arcpy.SelectLayerByAttribute_management("shp_lyr","ADD_TO_SELECTION",'GRIDCODE = 0')
   

    # 栅格转面   tif->shp 
    arcpy.RasterToPolygon_conversion(path,shp_path,"NO_SIMPLIFY")
    # 创建要素图层
    arcpy.MakeFeatureLayer_management(shp_path, "shp_lyr")
    # 基于指定属性聚合要素
    arcpy.Dissolve_management("shp_lyr",new_shp_path,["GRIDCODE"])
    # 添加新字段
    arcpy.AddField_management(new_shp_path,"class","TEXT","","",20)
    # 给新字段赋值
    with arcpy.da.UpdateCursor(new_shp_path,['FID','Shape','GRIDCODE','class']) as cursor:
        for row in cursor:
            if(row[2] == 0):
                row[3] = "芦苇草甸"
            elif(row[2] == 1):
                row[3] = "互花米草"
            elif(row[2] == 2):
                row[3] = "柽柳"
            elif(row[2] == 3):
                row[3] = "潮滩"
            elif(row[2] == 4):
                row[3] = "水域"
            cursor.updateRow(row)
            
    # 因项目的系统中无法修改符号系统,便又加入以下导入其他图层的符号系统并保存图层
    # 打开图层便正常显示符号系统
    a = arcpy.MakeFeatureLayer_management(new_shp_path, "new_shp_lyr")
    b = arcpy.ApplySymbologyFromLayer_management(a,lyr_path)
    arcpy.SaveToLayerFile_management(a,r"G:\newtest\new8\shp\XXXXXXX.shp","ABSOLUTE")

    print("done")
   
print('Start Processing ...')
main()

关于gdal打包的问题

为了使得预测出来的图像与原图有一样的地理环境和像元大小,需要用到gdal库,写入投影、仿射变换等操作。但对于打包导入gdal库的python文件,常遇到错误。其中有个错误为:“ImportError:No module named ‘_gdal’”。注意是**“_gdal”**。
解决方法:用pyinstaller打包是不使用-F参数,直接pyinstaller test.py,然后在生成的dist文件夹下找到osgeo._gdal.pyd文件,将其重命名为_gdal。

编辑人:云图

你可能感兴趣的:(教程,Arcmap,arcpy)