python2.x的一些解决方案积累(不断更新中......)

1、用Python实现IDW插值,并将环境设置中的输出范围设为指定图层

输出范围可以使用arcpy.env.extent,
具体参见:
http://resources.arcgis.com/zh-cn/help/main/10.1/index.html#//001w00000009000000

import arcpy
from arcpy import env  
from arcpy.sa import *
env.workspace = "F:/test/New File Geodatabase.gdb/zz_80t_point"
inPointFeatures = "zz_80t_point"
outIDW = Idw("zz_80t_point", "mj",  "1000", "2", "VARIABLE 12", "")
outIDW.save("C:/Users/zgl/Documents/ArcGIS/Default.gdb/Idw_zz_80t_p8")
arcpy.env.extent = "F:/10.3excise/ArcTutor10.3/Converted_Graphics.shp"

2、使用Python修改table of content下的图层名称

将TOC中的图层名为point的,修改为point1,运行前将mxd文档关闭,使用editor with IDLE运行,具体代码参见:

import arcpy
mxd = arcpy.mapping.MapDocument(r"E:\test\idw_2\idw.mxd")
for lyr in arcpy.mapping.ListLayers(mxd):
     if lyr.name == "point":
         lyr.name = "point1"
mxd.save()
del mxd

3、批量更改文件名、图层名、字段名

文件名:

https://my.oschina.net/oisanblog/blog/2873083

图层名:

其实很简单了,先列出所有图层名字,ListFeatureClasses,在用arcpy.Rename_management改名就行了
字段名:

http://zhihu.esrichina.com.cn/question/18370

4、arcpy如何获取有中文的mxd路径

字符串在Python内部的表示是unicode 编码,如果有中文,需要使用字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。

详情请参考:
python中文乱码问题大总结 - Python基础教程|Python教程|Python入门 - PythonTab中文网
http://www.pythontab.com/html/2013/pythonjichu_0702/473.html

5、如何判断searchcursor返回的结果是否有记录

import arcpy
fc = r"E:\testing\test.gdb\b1"
field = "NAME99"
cursor = arcpy.SearchCursor(fc)
if any(cursor):
	print "is not null..."
	for row in cursor:
		print(row.getValue(field))
else:
	print "null..."

6、将sde中的要素类输出到gdb

支持在arcmap或者arcgisserver的python环境下,将sde中的要素类输出到gdb。

链接:https://mp.weixin.qq.com/s/X7IdOOSXFcBJx893rJJCVw

import arcpy
import os

# Set environment settings
arcpy.env.workspace = r"E:\orcl.sde"

# Set local variables
outWorkspace = r"E:\test.gdb"

# Use ListFeatureClasses to generate a list of shapefiles in the
#  workspace shown above.
fcList = arcpy.ListFeatureClasses()

# Execute CopyFeatures for each input shapefile
for shapefile in fcList:
    # Determine the new output feature class path and name
    outFeatureClass = os.path.join(outWorkspace, shapefile.strip(".shp"))
    arcpy.CopyFeatures_management(shapefile, outFeatureClass)

7、移除图层组的图层

下述案例是移除图层组中的“laker”图层。

如果需要移除的图层是中文名称,则要考虑字符编码的问题。移除中文名称图层的具体代码见链接https://blog.csdn.net/gislaozhang/article/details/100528920

import arcpy
mxd = arcpy.mapping.MapDocument(r"E:\grouplayer.mxd")
df = arcpy.mapping.ListDataFrames(mxd, "Layers")[0]
secondGroupLayer = arcpy.mapping.ListLayers(mxd, "secondgrouplayer2", df)[0]
for lyr in secondGroupLayer:
    print lyr.name
    if lyr.name.lower() == "laker":
        arcpy.mapping.RemoveLayer(df, lyr)
mxd.saveACopy(r"E:\grouplayer1.mxd")
del mxd

8、将另一项目中的工具箱复制粘贴到指定的项目中,同时可以通过ImportToolbox导入工具箱以便访问工具箱中的相关工具

import shutil
import arcpy
import os
 
#将一个工具箱复制到另一个文件夹
result=shutil.copy('D:\\mytools\\geometrytools.tbx', 'G:/exercise/projects/ProPythonAnalysis')
print(result)
#将指定的工具箱导入到 ArcPy 中,以便访问工具箱中的相关工具。
result1=arcpy.ImportToolbox(result)
#打印工具箱中内容
print(result1)
#G:/exercise/projects/ProPythonAnalysis\geometrytools.tbx
#<module 'model'> 'model'是geometrytools.tbx工具箱中包含的模型

其中shutil.copy()支持将工具箱(例如,geometrytool.tbx)复制粘贴到指定的路径下;arcpy.ImportToolbox()函数用于将指定文件夹中的工具箱导入到Python中进行使用,可以通过print打印出工具箱中的工具(例如,模型名称为‘model’的模型)

参考资料:http://www.jb51.net/article/87984.htm 

9、使用第三方python编辑器报许可问题

使用pycharm运行如下代码,报ERROR 000824: The tool is not licensed.

import arcpy
from arcpy.sa import *
from arcpy import env
env.workspace = r"E:\test"
ExtractMultiValuesToPoints("bj.shp", [["bj.tif", "ELEV"],
                           ["bj.tif", "COST"], ["bj.tif", "DIR"]], "NONE")

 但是使用如下脚本却没有报许可问题,并且成功运行。

import arcpy
from arcpy import env
from arcpy.sa import *

# Set environment settings
env.workspace = r"E:\test"

# Set local variables
inPointFeatures = "bj.shp"
inRasterList = [["bj.tif", "bjoutput88"],]

# Check out the ArcGIS Spatial Analyst extension license
arcpy.CheckOutExtension("Spatial")

# Execute ExtractValuesToPoints
ExtractMultiValuesToPoints(inPointFeatures, inRasterList, "BILINEAR")

是因为在使用第三方python编辑器时如果用到扩展模块(例如:空间分析等模块)中的功能,则需要在代码中借出扩展模块的许可。

如果只想对一个栅格数据进行操作,则输入栅格的规范写法是 inRasterList = [["bj.tif", "bjoutput88"],]     如果使用inRasterList = ["bj.tif", "bjoutput88"]  则会报error 001268错误。

扩展:arcgispro中的python环境不需要在代码中借出扩展模块的许可,但是需要软件本身具有相应的扩展模块许可。

链接:https://pro.arcgis.com/en/pro-app/tool-reference/spatial-analyst/extract-multi-values-to-points.htm

参考链接:http://resources.arcgis.com/zh-cn/help/main/10.2/index.html#//009z0000002s000000

10.产品级别与扩展

如果在代码中要用到扩展模块中的功能,确保代码能成功运行,一般情景如下:

独立脚本,在第三方编辑器(pycharm)中通过代码设置,需要考虑使用的产品级别及扩展

Python脚本工具或者Python window使用extension对话框中的设置,无需在脚本中进行设置。

例如:下述代码是Python脚本工具,实现两个栅格数据相减运算,使用了空间分析的工具,但是无需在代码中进行扩展模块的检查,只需arcmap授权了空间分析许可,同时在arcmap勾选了空间分析的扩展模块。

import arcpy
import os
from arcpy import env
from arcpy.sa import *
out=arcpy.GetParameterAsText(0)
#arcpy.env.workspace=r"E:\testpython"
arcpy.env.workspace=out

rasters1 = arcpy.ListRasters("*", "tif")#遍历文件夹下所有的指定文件
out2=arcpy.GetParameterAsText(1)
#out2=r"E:\testpython\out\test"
i=0
D="\""
for raster in rasters1:#循环每一个栅格文件,双层嵌套相减
    A=D+raster+D
    print(A)
    for j in range (i+1,3):
        B=D+rasters1[j]+D
        print(B)
        CZ=A+"-"+B
        #print(CZ)
        out3=out2+ "\\"+str(i) +"-"+ str(j)+".tif" #栅格计算器处理语句
        print out3
        arcpy.gp.RasterCalculator_sa(CZ,out3)#栅格计算函数
    i=i+1
print "ok"

11、合并多个gdb中的同名图层

如果使用脚本的话,先需要在最终的gdb中有空的要素类的图层,且要素类的字段和源图层的字段结构需一致。

参考资料:https://blog.csdn.net/esrichinacd/article/details/14146653

import arcpy
import os
arcpy.env.workspace=r"D:\testdata"
worksapces=arcpy.ListWorkspaces("*","FileGDB")
for worksapce in worksapces:
    print(worksapce)
    arcpy.env.workspace=worksapce
    featureclass=arcpy.ListFeatureClasses()
    for fc in featureclass:
        print (fc)
        arcpy.Append_management(fc,os.path.join(r"D:\d.gdb",os.path.splitext(fc)[0]))

12、合并多个gdb(番外版) 

使用链接(https://www.cnblogs.com/EVELE/p/9227871.html)中的思路,能够成功将一个文件夹中的所有的gdb合并到指定的gdb中,

并且每个gdb中相同的要素类能够合并到一起,脚本见附件。

请将脚本中的下述部分替换成您那边的数据的路径,其中workspace是存放所有gdb的文件夹的路径,out是最终的输出的gdb,这个gdb需要您提前新建一个空的gdb即可。
workspace = r"D:\\testbj1010"
out = r"D:\\test.gdb"

import arcpy
import xlrd
import xlwt
import os


workspace = r"D:\testbj1010"
out = r"D:\test.gdb"


evefeature = []
feature_classes = []
walk = arcpy.da.Walk(workspace, datatype="FeatureClass")
for dirpath, dirnames, filenames in walk:
    for filename in filenames:
        evefeature.append(os.path.join(dirpath, filename))
        if filename not in feature_classes:
            feature_classes.append(filename)
            print filename

for featurename in feature_classes:
    ls1 = []
    for evefeatures in evefeature:
        int1 = len(featurename)
        int1 = int1 - int1 - int1
        if evefeatures[int1:] == featurename:
            ls1.append(evefeatures)
    arcpy.Merge_management(ls1,out+ "/%s"%featurename)
    get = featurename + "get"
    arcpy.AddMessage(get)

13、合并多个gdb(番外篇2)

一个文件夹下有多个gdb,每个gdb中有多个要素数据集,每个要素数据集中有多个要素类。而gdb与gdb之间的这些要素数据集和要素类的文件名和字段名是相同的,但是有些要素类的字段别名不一致的情况。

脚本:

链接:https://pan.baidu.com/s/1ddOpaIo5QRB5l6nc77yQPg  
提取码:xy4d 

import os
import sys
import arcpy
inpath = r"F:\DATA\STHX\new"
outgdb = r"F:\DATA\STHX\reslt\te.gdb"

evefeature = []
feature_classes = []
arcpy.env.workspace = inpath
# list all file geodatabases in the current workspace
workspaces = arcpy.ListWorkspaces("*", "FileGDB")
for j, workspace in enumerate(workspaces):
    print('processing: ' + workspace)
    walk = arcpy.da.Walk(workspace, datatype="FeatureClass")
    for dirpath, dirnames, filenames in walk:
        for filename in filenames:
            evefeature.append(os.path.join(dirpath, filename))
            if filename not in feature_classes:
                feature_classes.append(filename)
                print filename


for featurename in feature_classes:
    ls1 = []
    for evefeatures in evefeature:
        int1 = len(featurename)
        int1 = int1 - int1 - int1
        if evefeatures[int1:] == featurename:
            ls1.append(evefeatures)
    arcpy.Merge_management(ls1,outgdb+ "/%s"%featurename)
    get = featurename + "get"
    arcpy.AddMessage(get)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值