केवल डेस्कटॉप के लिए आर्कजीआईएस का उपयोग करके विशिष्ट दिशा में बफर बनाना? [बन्द है]


9

मैं दक्षिण-पश्चिमी अभिविन्यास में कई बहुभुजों के लिए एक बफर बनाने की कोशिश कर रहा हूं। जहां तक ​​मुझे पता है, यह बफर टूल (मैं आर्कजीआईएस 10.3 का उपयोग करता हूं) का उपयोग करना संभव नहीं है। मैं इसे मैन्युअल रूप से कर सकता था लेकिन कुछ 400+ बहुभुजों के लिए यह बहुत लंबा लगेगा।

क्या कोई बेहतर तरीका जानता है?

यह कम या ज्यादा है जिसका मैं लक्ष्य कर रहा हूं:

यहां छवि विवरण दर्ज करें


1
क्या आपके बहुभुज सभी आयतें और वर्ग हैं?
हारून

नहीं बदकिस्मती से नहीं। वे विभिन्न आकारों में आते हैं
प्रयोक्ता नाम

अपने प्रश्न में संपादित करने के लिए यह एक महत्वपूर्ण स्पष्टीकरण है ।
PolyGeo

जवाबों:


8

यदि आप arcpyपाइथन के साथ थोड़ा सा काम कर सकते हैं , तो आप इन क्षेत्रों को विशिष्ट दिशा में उत्पन्न करने के लिए कुछ स्क्रिप्ट का उपयोग कर सकते हैं। मैंने कुछ हफ्ते पहले कुछ ऐसा ही किया था, मैं आपकी मदद करने के लिए अपनी स्क्रिप्ट का हिस्सा पोस्ट करूंगा।

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

मुझे आशा है कि आप इसे अच्छी तरह से पढ़ सकते हैं, मुझे टिप्पणियों और चर का अनुवाद करना था।


स्क्रिप्ट के लिए धन्यवाद। मैं वास्तव में अजगर के बारे में कुछ नहीं जानता, लेकिन मैंने आपकी स्क्रिप्ट की नकल की है और कार्यक्षेत्र और ऑब्जेक्ट के नाम के साथ-साथ दूरी भी बदल दी है। सुविधाएँ कक्षाएं बनाई जाती हैं, लेकिन जाहिर है मैंने एक गलती की है क्योंकि प्रत्येक "विशेषता द्वारा परत का चयन करें" ऑपरेशन के लिए एक त्रुटि है
प्रयोक्ता नाम

मैंने स्क्रिप्ट में कुछ बदलाव किए हैं, आप इसे अभी आज़मा सकते हैं। कार्यक्षेत्र और अपना आकार निर्धारित करें और हम देखेंगे :)
david_p

बहुत बहुत धन्यवाद! इससे मुझे वह परिणाम मिलता है जिसकी मैं उम्मीद कर रहा था। यह पहली बार में काम नहीं किया क्योंकि स्क्रिप्ट के अंतिम ब्लॉक में कुछ कोष्ठक गायब थे लेकिन इसके अलावा यह एकदम सही है। मुझे नहीं लगता कि मैं पूरी स्क्रिप्ट को एक टिप्पणी में पोस्ट कर सकता हूं लेकिन मैं इसे नीचे पोस्ट करूंगा। एक बार फिर धन्यवाद!
यूजरनेम

आपका स्वागत है :) मुझे खुशी है कि मैं आपकी मदद कर सकता हूँ!
david_p

5

यह वह स्क्रिप्ट है जो समस्या को हल करती है। श्रेय और बहुत धन्यवाद david_p को जाता है जिन्होंने इसे लिखा है। मैंने अभी कुछ लापता कोष्ठक जोड़े हैं।

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

0

विकल्प A:

  1. बफर टूल का उपयोग करके बफर बनाएं
  2. बफ़र सुविधा वर्ग में सभी सुविधाओं का चयन करें
  3. युद्ध उपकरण का उपयोग करें और कुछ महत्वपूर्ण कोनों को नामित करें और युद्ध का प्रदर्शन करें

विकल्प बी:

  1. बफर टूल का उपयोग करके बफर बनाएं
  2. संपादन सक्षम करें और बफ़र सुविधा वर्ग में सभी सुविधाओं का चयन करें
  3. 'मूव' टूल का उपयोग करें, विंडो में X और Y अपराध भरें और आउटपुट सेव करें

"हटो" से क्या आपका मतलब है Shift टूल? वैसे भी मुझे यकीन नहीं है कि यह मुझे मेरी ज़रूरत का परिणाम देगा। मेरे फीचर क्लास के सभी पॉलीगॉन अलग-अलग शेप में आते हैं इसलिए मैं सभी बफर फीचर्स को उसी तरह नहीं बढ़ा सकता हूं क्योंकि इससे शुरुआती फीचर्स अलग-अलग हो जाएंगे।
यूजरनेम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.