Menggambar garis paralel di dalam poligon (Well Paths) menggunakan ArcGIS Desktop?


11

Saya ingin mengambil kelas fitur poligon dengan beberapa poligon tidak beraturan, dan membuat Arc menggambar garis paralel di dalam setiap poligon. Idealnya, akan lebih baik bagi Arc untuk mengetahui sudut sisi terpanjang poligon dan menggambar garis paralel ke sisi itu, tetapi untuk membuatnya tetap sederhana, saya pikir jika saya bisa memasukkan satu sudut untuk semua garis paralel, yang akan lebih mudah.

Jadi sudut garis, lebar antara garis, panjang min / maks, dan lebar penyangga dari sisi poligon adalah kriteria dasar saya.

Gambar terlampir jika itu membantu.

masukkan deskripsi gambar di sini


Apakah ini merupakan persyaratan bagi garis untuk mengakhiri jarak tertentu dari tepi poligon?
cndnflyr

ya, saya perlu memiliki penyangga jauh dari tepi. Jika saya bisa mendeklarasikan nilai itu, itu akan bagus. Terima kasih.
Tx_Dan

Jawaban:


9

Seperti @cndnflyr menyebutkan, ini dapat ditulis dalam Python.

UI Alat Skrip:

masukkan deskripsi gambar di sini

Output sampel: masukkan deskripsi gambar di sini

# 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

Wah ini indah, floem! Akan lihat. Terima kasih banyak!
Tx_Dan

Ini adalah penggunaan metode di objek SHAPE. Elegan. Satu-satunya hal yang hilang adalah mengatur sudut garis. Karena itu akan menarik garis sepanjang sisi terpanjang poligon.
cndnflyr

4

Ini bisa dilakukan dengan Python, tetapi akan butuh waktu untuk menuliskannya.

Saya pikir cara tercepat untuk mengimplementasikannya tanpa Python adalah memiliki file template SHP dari garis paralel ini. Miliki beberapa jika Anda memiliki lebar yang berbeda-beda yang dibutuhkan, dan cukup gunakan yang sesuai untuk Polygon itu. Buat garis templat menutupi area yang cukup untuk menutupi Polygon terbesar yang akan Anda temui.

  1. Saat mengedit, pindahkan garis di atas poligon.
  2. Gunakan alat Putar, pindahkan titik jangkar ke tempat garis Paralel dan tepi Polygon cocok, dan putar garis sehingga terkunci ke tepi Polygon tempat Anda berbaris.
  3. Ubah Polygon menjadi Polyline
  4. Buffer Polyline berapa pun jarak yang Anda inginkan dari garis Paralel dari ujung poligon.
  5. Gunakan alat Erase untuk menghapus Polylines yang dicakup oleh Buffered Polygon Edge
  6. Pilih berdasarkan lokasi semua garis yang tidak ada di dalam poligon dan hapus. Atau saya pikir alat Klip akan bekerja juga.
  7. Pilih dengan atribut semua garis yang kurang dari panjang tertentu (terlalu pendek untuk disimpan, meskipun Anda mungkin perlu menambahkan bidang dan menghitung geometri terlebih dahulu), dan lebih dari panjang tertentu (terlalu panjang untuk disimpan jika itu yang Anda inginkan) ), Hapus mereka.
  8. Bilas dan Ulangi ...

Langkah 3 hingga 7 dapat dimodelkan, tanpa harus menulis kode apa pun.

Banyak proses yang sama dapat digunakan untuk pengkodean proses, tetapi alih-alih memiliki garis templat, Anda dapat meminta kode menggambar garis pada sudut yang tepat, jarak terpisah, dll. Saya belum melakukan ini untuk sementara, tapi saya pikir Pustaka python seperti rupawan akan membantu. Pastikan itu mencakup area yang lebih besar daripada Polygon, dan gunakan alat-alat untuk secara otomatis mengkonversi ke polyline, buffer, hapus, pilih garis-garis yang tidak di dalam poligon, dan hapus.


Terima kasih atas jawaban terinci. Saya akan mencoba ini dan melihat cara kerjanya. Terima kasih!
Tx_Dan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.