Создание многоугольника буфера после возвышений с использованием ArcGIS Desktop?

14

То, что я хочу сделать, это поместить 100-миллиметровый буфер на многоугольник, но вместо того, чтобы буфер находился на фиксированной ширине «по прямой линии», я хочу, чтобы он следовал склонам моей лидаровой ЦМР.

У меня есть ArcMap (с 3D Analyst). К сожалению, нет пространственного или сетевого аналитического расширения с ArcMap.

Я как бы повернулся к Интернету, изучая анализ близости, анализ расстояний и анизотропную совокупную стоимость. Похоже, мне нужно как-то составить временную сетку и выяснить, сколько времени потребуется, чтобы добраться до 100 м от полигона, но это выглядит довольно задом наперед. Кажется, что подавляющее большинство этих инструментов сделано для того, чтобы найти самый простой маршрут между двумя точками.

Кто-нибудь делал это раньше?

Р. Лейрд
источник
1
Когда вы говорите, что хотите «следовать по уклонам», вы имеете в виду, что если ячейка матрицы высот на 1 м по ее наклону плоская, вы будете считать это 1 м в своем буфере, но если одна сторона на 1 м выше другой, вы будет считать это как 1,41 м (расстояние по поверхности)?
Дан С
Точно, в этом случае мы должны показать 100 м от заболоченного места, и рядом с ним есть горный хребет. Я полагаю, что я мог бы использовать QGIS Raster Calculator для преобразования процента наклона в метры на основе размера ячейки растра. Я бы не знал, как добавить их на расстояние до 100 м без проверки каждого пикселя вручную, но да, именно об этом я и говорю.
Р. Лэрд

Ответы:

7

Обходной путь для того, что вы описываете в отсутствие пространственного аналитика:

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")

Запустите это на новом поле (исправлено 05/02/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!)

Добавьте поля X и Y в lines_3D и заполните их, используя:

!XY!.split(" ")[0] and !XY!.split(" ")[1]

Создайте слой XY из 2 полей выше, скопируйте его в класс объектов точек и используйте пункт в линию, чтобы создать строку буфера внутри оригинала:

ВЫХОД:

введите описание изображения здесь

Вывод:

Если ваш рельеф местности не очень крутой, простой буфер будет выполнять эту работу, если, скорее всего, вы не говорите о длине потока. Не повезло, потому что для этого вам нужен инструментарий гидрологического анализа от пространственного аналитика

FelixIP
источник