ArcGIS Desktopを使用してポリゴン(ウェルパス)内に平行線を描画しますか?


11

複数の不規則なポリゴンを持つポリゴンフィーチャクラスを取得し、Arcに各ポリゴンの内側に平行線を描画させたいと思います。理想的には、Arcが多角形の最も長い辺の角度を把握し、その辺に平行線を引くのがいいと思いますが、単純にするために、すべての平行線に1つの角度を入力できると思います。簡単になります。

したがって、ポリゴンの側面からのライン角度、ライン間の幅、最小/最大長、およびバッファ幅が基本的な基準です。

それが役立つ場合に添付される画像。

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


ラインがポリゴンエッジから一定の距離で終了する必要がありますか?
cndnflyr 14

はい、エッジから離れた場所にバッファが必要です。その値を宣言できれば、それは素晴らしいことです。ありがとう。
Tx_Dan 14

回答:


9

@cndnflyrが言及しているように、これはPythonでスクリプト化できます。

スクリプトツールUI:

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

サンプル出力: ここに画像の説明を入力してください

# import libraries
import arcpy

# set input/output parameters
polyFC = arcpy.GetParameterAsText(0)        # input polygons
outParallel = arcpy.GetParameterAsText(1)   # output parallel lines
lineSpacing = arcpy.GetParameterAsText(2)   # line spacing
buffDist = arcpy.GetParameterAsText(3)      # inner buffer distance

# parse numbers from parameters
lineSpaceNum = float(lineSpacing.split(' ')[0])
buffNum = float(buffDist.split(' ')[0])

# establish spatial reference
desc = arcpy.Describe(polyFC)
SR = desc.spatialReference

# set overwrite environment
arcpy.env.overwriteOutput = True
arcpy.env.outputCoordinateSystem = SR

parallels = []
# loop through each input shape
for row in arcpy.da.SearchCursor(polyFC, ["SHAPE@"], spatial_reference=SR):

    # create inner buffer
    polyBuff = row[0].buffer(buffNum * -1)

    # create hull rectangle to establish a rotated area of interest
    coordSplit = row[0].hullRectangle.split(' ')

    # collect corner coordinates
    coordList = arcpy.Array([arcpy.Point(coordSplit[0],coordSplit[1]),arcpy.Point(coordSplit[2],coordSplit[3]),arcpy.Point(coordSplit[4],coordSplit[5]),arcpy.Point(coordSplit[6],coordSplit[7]),arcpy.Point(coordSplit[0],coordSplit[1])])

    # create lines from hull rectangle
    currentLines = []
    for pointNum in range(0,4):
        arcpy.Array([coordList.getObject(pointNum),coordList.getObject(pointNum+1)])
        hullRecLine = arcpy.Polyline(arcpy.Array([coordList.getObject(pointNum),coordList.getObject(pointNum+1)]))
        currentLines.append(hullRecLine)

    # compare first and second line to determine if first line is short or long
    firstLong = 0
    if currentLines[0].length > currentLines[1].length:
        firstLong = 1

    # calculate number of points needed along short axis
    numPoints = int(math.floor(currentLines[firstLong].length/lineSpaceNum))

    # create and join points to create parallel lines
    for point in range(1,numPoints+1):
        shortPoint1 = currentLines[firstLong].positionAlongLine(lineSpaceNum*point)
        shortPoint2 = currentLines[firstLong + 2].positionAlongLine(currentLines[firstLong + 2].length - (lineSpaceNum*point))
        parallel = arcpy.Polyline(arcpy.Array([shortPoint1.centroid,shortPoint2.centroid]), SR)

        # intersect parallel lines with buffer
        parallelBuff = parallel.intersect(polyBuff,2)
        parallels.append(parallelBuff)

# write geometries to disk
arcpy.CopyFeatures_management(parallels, outParallel)

# add to map
mxd = arcpy.mapping.MapDocument("CURRENT")
dataFrame = arcpy.mapping.ListDataFrames(mxd, "*")[0]
addLayer = arcpy.mapping.Layer(outParallel)
arcpy.mapping.AddLayer(dataFrame, addLayer)

del row

この美しい師部、すごい!見てみましょう。どうもありがとうございます!
Tx_Dan 14

これは、SHAPEオブジェクトのメソッドの優れた使用法です。エレガントです。欠けているのは、線の角度を設定することだけです。そのままで、ポリゴンの最も長い辺に沿って線を描画します。
cndnflyr 14

4

これはPythonで実行できますが、書き出すには時間がかかります。

Pythonなしでそれを実装する最も簡単な方法は、これらの平行線のテンプレートSHPファイルを持つことだと思います。さまざまな幅が必要な場合はいくつか用意し、そのポリゴンに適したものを使用してください。テンプレート行は、遭遇する最大のポリゴンをカバーするのに十分な領域をカバーします。

  1. 編集中に、ポリゴン上で線を移動します。
  2. 回転ツールを使用して、平行線とポリゴンエッジが一致する場所にアンカーポイントを移動し、ラインを回転させて、整列したポリゴンエッジにスナップします。
  3. ポリゴンをポリラインに変換する
  4. 多角形の端から平行線までの距離に関係なく、ポリラインをバッファリングします。
  5. 消去ツールを使用して、バッファーポリゴンエッジで覆われているポリラインを消去します
  6. ポリゴン内にないすべてのラインを場所で選択し、削除します。または、クリップツールも機能すると思います。
  7. 特定の長さより短いすべての行(フィールドを追加してジオメトリを最初に計算する必要があるかもしれませんが、保持するには短すぎます)と、特定の長さより長いすべてを保持します)、それらを削除します。
  8. すすぎと繰り返し...

手順3〜7は、コードを記述することなくモデル化できます。

プロセスのコーディングにはほとんど同じプロセスを使用できますが、テンプレートの線を使用する代わりに、コードに直角、距離などで線を描画させることができます。私はしばらくこれをしていませんが、shapelyのようなPythonライブラリが役立ちます。ポリゴンよりも広い領域をカバーしていることを確認し、ツールを使用して自動的にポリラインに変換し、バッファリングし、消去し、ポリゴンの内側にないラインを選択して削除します。


詳細な回答をありがとう。これを試して、どのように機能するかを確認します。ありがとう!
Tx_Dan 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.