从Tif文件转为shp文件(ArcMap,代码)、gdal打包问题 |
您所在的位置:网站首页 › tif如何转化为pdf › 从Tif文件转为shp文件(ArcMap,代码)、gdal打包问题 |
从Tif文件转为shp文件(ArcMap,代码)
利用ArcMap来进行转换,以预测出来的滨海湿地图像为例
第一步:打开ArcMap中的栅格转面工具
ArcMap中的栅格转面工具 点击栅格转面之后,选择参数和输出文件路径,如下图所示 查看tif原图和生成的shp图的属性表。下方左侧为tif原图的属性表,右侧为生成的shp图的属性表
偶然间看到ArcMap中有融合工具,试用了一下感觉清清爽爽。下图为融合工具的位置 在属性表中点击左上角的表选项,然后点击添加字段。若打开后的添加字段为灰色(不可点击状态),则查看目前是否处于正在编辑状态,若在则需要停止编辑。 ArcPy 是一个 Python 站点包,可提供以实用高效的方式通过 Python 执行地理数据分析、数据转换、数据管理和地图自动化。点击 这里 可进入官网了解更多Arcpy的知识。 因在其他版本的python空间中很难导入arcpy库,即便处理好一部分后也会报*“ImportError: DLL load failed: %1 不是有效的 Win32 应用程序。”*这种错误,一查是导入的Arcpy库与python版本不一致。因我需要将python文件打包成exe应用程序,所以只需写出python代码来即可,于是便可在ArcGis的python27环境下打开python IDLE,其安装时自带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。 编辑人:云图 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |