ArcGIS for Desktopを使用して特定の方向にのみバッファーを作成しますか?[閉まっている]


9

南西向きのいくつかのポリゴンのバッファを作成しようとしています。私の知る限り、これはバッファツールを使用して行うことはできません(私はArcGIS 10.3を使用しています)。手動で行うこともできましたが、400以上のポリゴンの場合、非常に時間がかかりすぎます。

誰かがより良い方法を知っていますか?

これは多かれ少なかれ私が目指していることです:

ここに画像の説明を入力してください


1
ポリゴンはすべて長方形と正方形ですか?
アーロン

残念ながら、そうではありません。彼らはさまざまな形をしています
ユーザー名

これは、質問に編集するための重要な説明です。
PolyGeo

回答:


8

arcpyPythonで少し作業できる場合は、スクリプトを使用して、これらのゾーンを特定の方向に生成できます。数週間前に似たようなものをいくつか作りました。私はあなたを助けるために私のスクリプトの一部を投稿します。

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

私はあなたがそれをよく読むことができることを望みます、私はコメントと変数を翻訳しなければなりませんでした。


台本ありがとうございます。Pythonについては何も知りませんが、スクリプトをコピーして、ワークスペースとオブジェクトの名前と距離を変更しました。フィーチャクラスが作成されましたが、「属性によるレイヤーの選択」操作ごとにエラーがあるため、間違いを犯したようです
ユーザー名

スクリプトに変更を加えました。今すぐ試すことができます。ワークスペースとシェープファイルを設定すると、次のようになります。:)
david_p

本当にありがとう!それはまさに私が望んでいた結果を私に与えます。スクリプトの最後のブロックで括弧がいくつか欠落していたため、最初は機能しませんでしたが、それ以外は完璧です。スクリプト全体をコメントで投稿することはできないと思いますが、以下に投稿します。再度、感謝します!
ユーザー名

どういたしまして:)お役に立ててうれしいです!
david_p 2015

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. ワーピングツールを使用して、いくつかの重要なコーナーを指定し、ワーピングを実行します

オプションB:

  1. バッファツールを使用してバッファを作成する
  2. 編集を有効にして、バッファフィーチャクラスのすべてのフィーチャを選択します
  3. 「移動」ツールを使用して、ウィンドウにXおよびYオフセットを入力し、出力を保存します

「移動」とは、Shiftツールを意味しますか?とにかく、これで必要な結果が得られるかどうかはわかりません。フィーチャクラスのすべてのポリゴンの形状が異なるため、最初のフィーチャからの距離が異なるため、すべてのバッファフィーチャを同じ方法で移動することはできません。
ユーザ名
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.