ডেস্কটপের জন্য আর্কজিআইএস ব্যবহার করে কেবল নির্দিষ্ট দিকে বাফার তৈরি করছেন? [বন্ধ]


9

আমি দক্ষিণ-পশ্চিমা অভিমুখগুলিতে বেশ কয়েকটি বহুভুজের জন্য বাফার তৈরি করার চেষ্টা করছি। আমি যতদূর জানি, এটি বাফার সরঞ্জামটি ব্যবহার করা সম্ভব নয় (আমি আর্কজিআইএস 10.3 ব্যবহার করি)। আমি এটি ম্যানুয়ালি করতে পারি তবে প্রায় 400+ বহুভুজের জন্য এটি অনেক বেশি সময় নিতে পারে।

কেউ কি আরও ভাল উপায় জানেন?

এটি আমি কমবেশি লক্ষ্য করছি:

এখানে চিত্র বর্ণনা লিখুন


1
আপনার বহুভুজ সমস্ত আয়তক্ষেত্র এবং স্কোয়ার হয়?
হারুন

না, দুর্ভাগ্যবশত না. তারা বিভিন্ন আকারে আসে
ব্যবহারকারীর নাম

আপনার প্রশ্নে সম্পাদনা করার জন্য এটি আপনার পক্ষে একটি গুরুত্বপূর্ণ ব্যাখ্যা ।
পলিজিও

উত্তর:


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

আমি আশা করি আপনি এটি ভালভাবে পড়তে পারেন, আমাকে মন্তব্য এবং ভেরিয়েবলগুলি অনুবাদ করতে হয়েছিল।


স্ক্রিপ্টের জন্য আপনাকে ধন্যবাদ। পাইথন সম্পর্কে আমি আসলে কিছুই জানি না তবে আমি আপনার স্ক্রিপ্টটি অনুলিপি করেছি এবং ওয়ার্কস্পেস এবং অবজেক্টের নাম পাশাপাশি দূরত্বও পরিবর্তন করেছি। বৈশিষ্ট্যগুলির ক্লাসগুলি তৈরি করা হয়েছে, তবে দৃশ্যত আমি একটি ভুল করেছি কারণ প্রতিটি "বৈশিষ্ট্য অনুসারে নির্বাচিত স্তর" ক্রিয়াকলাপের জন্য একটি ত্রুটি রয়েছে
ব্যবহারকারীর নাম

আমি স্ক্রিপ্টে কিছু পরিবর্তন করেছি, আপনি এখনই এটি চেষ্টা করতে পারেন। কর্মক্ষেত্র এবং আপনার শেফফিল সেট করুন এবং আমরা দেখতে পাব :)
ডেভিড_পি

তোমাকে অনেক অনেক ধন্যবাদ! আমি আশা করি ঠিক সেই ফলাফলটি আমাকে দেয়। এটি প্রথমে কাজ করেনি কারণ স্ক্রিপ্টের শেষ ব্লকে কিছু বন্ধনী অনুপস্থিত ছিল তবে এটি নিখুঁত। আমি মনে করি না আমি সম্পূর্ণ স্ক্রিপ্ট একটি মন্তব্যে পোস্ট করতে পারি তবে আমি এটি নীচে পোস্ট করব। আবার ধন্যবাদ!
ব্যবহারকারীর নাম

আপনাকে স্বাগত জানাই :) আমি আনন্দিত যে আমি আপনাকে সহায়তা করতে পারি!
ডেভিড_পি

5

এটিই স্ক্রিপ্ট যা সমস্যার সমাধান করে। ক্রেডিট এবং অনেক ধন্যবাদ ডেভিড_পি যারা এই লিখেছেন তাদের কাছে যান। আমি সবেমাত্র কয়েকটি অনুপস্থিত বন্ধনী যুক্ত করেছি।

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

বিকল্প একটি:

  1. বাফার সরঞ্জামটি ব্যবহার করে বাফার তৈরি করুন
  2. বাফার বৈশিষ্ট্য শ্রেণীর সমস্ত বৈশিষ্ট্য নির্বাচন করুন
  3. ওয়ার্পিং সরঞ্জামটি ব্যবহার করুন এবং কয়েকটি গুরুত্বপূর্ণ কোণ নির্ধারণ করুন এবং রেপিং সঞ্চালন করুন

বিকল্প বি:

  1. বাফার সরঞ্জামটি ব্যবহার করে বাফার তৈরি করুন
  2. সম্পাদনা সক্ষম করুন এবং বাফার বৈশিষ্ট্য শ্রেণীর সমস্ত বৈশিষ্ট্য নির্বাচন করুন
  3. 'মুভ' সরঞ্জামটি ব্যবহার করুন, উইন্ডোতে এক্স এবং ওয়াই অফসেটগুলি পূরণ করুন এবং আউটপুট সংরক্ষণ করুন

"সরানো" দ্বারা আপনি কী শিফট সরঞ্জামটি বোঝাচ্ছেন? যাইহোক আমি নিশ্চিত নই যে এটি আমার প্রয়োজনীয় ফলাফলটি দেবে কিনা। আমার বৈশিষ্ট্য শ্রেণীর সমস্ত বহুভুজ বিভিন্ন আকারে আসে তাই আমি সমস্ত বাফার বৈশিষ্ট্যগুলিকে একইভাবে স্থানান্তর করতে পারি না কারণ এটি প্রাথমিক বৈশিষ্ট্যগুলি থেকে বিভিন্ন দূরত্বের ফলস্বরূপ।
ব্যবহারকারীর নাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.