Wednesday 25 November 2015

Creating buffer only in specific direction using ArcGIS for Desktop?




I am trying to create a buffer for several polygons in a south-western orientation. As far as I know, this is not possible using the buffer tool (I use ArcGIS 10.3). I could do it manually but for some 400+ polygons it would take far too long.


Does anybody know a better way?


This is more or less what I am aiming for:


enter image description here



Answer



If you can work with arcpy in Python a little bit, then you could use some script to generate these zones in specific direction. I made some similar few weeks ago, I will post part of my script to help you.


import arcpy, math, gc
# Workspace, overwrite
arcpy.env.workspace = r"YOUR_WORKSPACE"
arcpy.env.overwriteOutput = True


# INPUTS
objects_input = "objects.shp" # must be polygons
objects = "objects_lyr.shp"
arcpy.MakeFeatureLayer_management(objects_input, objects)

# OUTPUTS, most temporal
result = "result.shp"
result_erase = "in_memory" + "\\" + "result_erase"
polygon = "in_memory" + "\\" + "polygon"

polygon_dissolve = "in_memory" + "\\" + "polygon_dissolve"

arcpy.CreateFeatureclass_management(arcpy.env.workspace, result, "POLYGON")

# Parameters
distance = 300 # distance for move in direction
direction = 90 # direction in degrees (90 is from north to south)
index = 0

# Set UpdateCursor

cur_objects = arcpy.da.UpdateCursor(objects, ("FID"))
for row_objects in cur_objects:
try:
fid = row_objects[0]
sql = '"FID" = ' + str(index)
index += 1

# Initialize lists
lines_list = []
lines_created = []


# Select current feature
arcpy.SelectLayerByAttribute_management(objects, "NEW_SELECTION", sql)
vertexes = "in_memory" + "\\" + "vertexes"

# Convert object to vertexes
arcpy.FeatureVerticesToPoints_management(objects, vertexes, "ALL")
index_vertex = 0

# Set SearchCursor for vertexes

cur_vertexes = arcpy.da.SearchCursor(vertexes, ("SHAPE@XY"))
for row_vertexes in cur_vertexes:
vertex_coords_x = row_vertexes[0][0]
vertex_coords_y = row_vertexes[0][1]

# Define points coordinates
point_move_x = vertex_coords_x - (distance) * math.cos(math.radians(direction))
point_move_y = vertex_coords_y - (distance) * math.cos(math.radians(90 - direction))

# Make list of points

new_line = ([[vertex_coords_x, vertex_coords_y], [point_move_x, point_move_y]])
lines_list.append(new_line)

# From second cycle
if index_vertex > 0:
lines_vertexes = ([[vertex_coords_x, vertex_coords_y], start_line])
lines_ends = ([[point_move_x, point_move_y], end_line])
lines_list.append(lines_vertexes)
lines_list.append(lines_ends)
start_line = [vertex_coords_x, vertex_coords_y]

end_line = [point_move_x, point_move_y]
index_vertex = index_vertex + 1

# Cycle that makes polylines from points
for lines_step in lines_list:
lines_created.append(arcpy.Polyline(arcpy.Array([arcpy.Point(*sour) for sour in lines_step])))

arcpy.FeatureToPolygon_management(lines_created, polygon)
arcpy.AggregatePolygons_cartography(polygon, polygon_dissolve, 1)


# Final editing
arcpy.Erase_analysis(polygon_dissolve, objects, result_erase)
arcpy.Append_management(result_erase, result, "NO_TEST")
arcpy.Delete_management("in_memory")
arcpy.Delete_management(vertexes)
start_line = []

# Clear selection, memory and deleting temps
arcpy.SelectLayerByAttribute_management(objects, "CLEAR_SELECTION")
print "Object number: " + str(index - 1) + " -- done."

gc.collect()


# Catch errors
except Exception as e:
pass
print "Error:"
print e
print "\n"
index += 1


I hope you can read it well, I had to translate comments and variables.


No comments:

Post a Comment

arcpy - Changing output name when exporting data driven pages to JPG?

Is there a way to save the output JPG, changing the output file name to the page name, instead of page number? I mean changing the script fo...