#自动提取山脊线
import arcgisscripting
import os
import sys
#创建GP工具
gp=arcgisscripting.create(9.3)
#DEM参数设置
inputdemlyr=sys.argv[1]
#原始DEM最大值
demmaxvalue=sys.argv[2]
#生成山脊线所在文件夹
folderpath=sys.argv[3]
gp.CheckOutExtension("Spatial")
#生成坡向图层A
OutRaster = folderpath+"\sub_demA"
try:
# Check out ArcGIS Spatial Analyst extension license
# Process: Aspect
print "正在生成临时坡向图层A....."
gp.AddMessage("正在生成坡向图层A.....")
gp.Aspect_sa(inputdemlyr, OutRaster)
print "坡向图层A已生成"
gp.AddMessage("坡向图层A已生成")
#由A图层生成SOA1图层
InMeasurementType = "DEGREE"
soalyr1=folderpath+"\sub_demSOA1"
gp.AddMessage("正在生成SOA1图层....")
gp.Slope_sa(OutRaster,soalyr1,InMeasurementType)
gp.AddMessage("SOA1图层已生成")
#生成反地形DEM图层
gp.AddMessage("正在根据原始DEM最大高程值生成反地形DEM....")
outfandem=folderpath+"\sub_fandem"
gp.Minus_sa(demmaxvalue,inputdemlyr,outfandem)
gp.AddMessage("已生成反地形DEM")
#求反地形坡向变率SOA2
soalyr2=folderpath+"\sub_fandemA2"
gp.AddMessage("正在生成反地形坡向图层A.....")
gp.Aspect_sa(outfandem, soalyr2)
gp.AddMessage("反地形坡向图层A已生成")
outfandemSOA2=folderpath+"\sub_SOA2"
gp.AddMessage("正在生成反地形坡向变率SOA2.....")
gp.Slope_sa(soalyr2,outfandemSOA2,InMeasurementType)
gp.AddMessage("已生成反地形坡向变率SOA2")
#求取原始DEM中没有误差的坡向变率SOA
#求取SOA1+SOA2
gp.AddMessage("正在生成两图层相加....")
soa1plussoa2=folderpath+"\soa1p2"
gp.Plus_sa(soalyr1,outfandemSOA2,soa1plussoa2)
gp.AddMessage("已完成栅格叠加!")
#求取SOA1-SOA2的绝对值
gp.AddMessage("求取SOA1-SOA2的绝对值....")
soa1missoa2=folderpath+"\smis2"
gp.Minus_sa(soalyr1,outfandemSOA2,soa1missoa2)
gp.AddMessage("已完成SOA1-SOA2的绝对值")
abssoa1minussoa2=folderpath+"\absmis2"
gp.Abs_sa(soa1missoa2, abssoa1minussoa2)
outminuslyr=folderpath+"\minuslyr"
gp.Minus_sa(soa1plussoa2,abssoa1minussoa2,outminuslyr)
lastcorrectlyr=folderpath+"\laSOA"
#原始DEM中没有误差的坡向变率SOA
gp.Divide_sa(outminuslyr, 2, lastcorrectlyr)
#对原始DEM进行邻域平均值统计
OutRaster1=folderpath+"\demstat"
InNeighborhood = "Rectangle 11 11 Cell"
InStatisticsType = "MEAN"
# Check out Spatial Analyst extension license
gp.CheckOutExtension("Spatial")
# Process: BlockStatistics
gp.BlockStatistics_sa(inputdemlyr,OutRaster1, InNeighborhood, InStatisticsType)
#求取C图层
clyer=folderpath+"\clyer"
gp.Minus_sa(inputdemlyr,OutRaster1,clyer)
#提取山脊线
shanjilyer=folderpath+"\shanjixian"
#中间图层1
lyr1=folderpath+"\lyr1"
#中间图层2
lyr2=folderpath+"\lyr2"
gp.GreaterThan_sa(clyer,0,lyr1)
gp.GreaterThan_sa(lastcorrectlyr,70,lyr2)
gp.AddMessage("正在生成山脊线....")
gp.BooleanAnd_sa(lyr1,lyr2,shanjilyer)
gp.AddMessage("正在删除全部中间图层......")
#gp.delete_management(OutRaster)
#gp.delete_management(soalyr1)
#gp.delete_management(soalyr2)
#gp.delete_management(outfandemSOA2)
#gp.delete_management(soa1plussoa2)
#gp.delete_management(soa1missoa2)
#gp.delete_management(abssoa1minussoa2)
#gp.delete_management(outminuslyr)
#gp.delete_management(lastcorrectlyr)
#gp.delete_management(OutRaster1)
#gp.delete_management(clyer)
#gp.delete_management(lyr1)
#gp.delete_management(lyr2)
gp.AddMessage("山脊线生成结束")
except:
# If an error occurred while running a tool, then print the messages.
print gp.GetMessages()