Solución para lo que describe en ausencia de analista espacial:
arcpy.Buffer_analysis("target","../buffer.shp", "100 Meters")
arcpy.FeatureVerticesToPoints_management("buffer","../points.shp","ALL")
arcpy.AddField_management("points", "PID", "LONG")
arcpy.CalculateField_management("points", "PID", "[FID]")
arcpy.Near_analysis("points", "target","LOCATION")
arcpy.MakeXYEventLayer_management("points","NEAR_X","NEAR_Y","points_Layer")
arcpy.CopyFeatures_management("points_Layer","../from_points.shp")
arcpy.Merge_management("from_points;points","../pairs.shp")
arcpy.PointsToLine_management("pairs","../lines_2D.shp", "PID")
arcpy.InterpolateShape_3d("DEM","lines_2D","../lines_3D.shp")
arcpy.AddField_management("lines_3D", "XY", "TEXT")
Ejecute esto en un nuevo campo (corregido el 02/05/2018):
def getPoint(shp):
part=shp.getPart(0)
n=len(part);L=0
for i in xrange(n):
p=part.getObject(i)
x=p.X;y=p.Y;z=p.Z
if i >0:
dX=X-x;dY=Y-y;dZ=Z-z;dL=pow((dX*dX+dY*dY+dZ*dZ),0.5);L+=dL
if L>=100: break
X,Y,Z=x,y,z
xNew=x+dX/dL*(L-100);yNew=y+dY/dL*(L-100)
return '%s %s' %(xNew,yNew)
#-----------------
getPoint( !Shape!)
Agregue los campos X e Y a lines_3D y complételos con:
!XY!.split(" ")[0] and !XY!.split(" ")[1]
Haga una capa XY de los 2 campos anteriores, cópiela en la clase de entidad de puntos y use punto a línea para crear una línea de búfer dentro del original:
SALIDA:
Conclusión:
A menos que su terreno sea extremadamente empinado, el búfer simple hará el trabajo, a menos que parezca muy probable que realmente esté hablando de la longitud del flujo. Mala suerte, porque para eso necesitas una caja de herramientas de análisis hidrológico de un analista espacial