Vẽ các đường song song bên trong đa giác (Đường dẫn tốt) bằng ArcGIS Desktop?


11

Tôi muốn tham gia một lớp tính năng đa giác với nhiều đa giác không đều và có Arc vẽ các đường song song bên trong mỗi đa giác. Lý tưởng nhất là Arc sẽ rất tuyệt khi tìm ra góc của cạnh dài nhất của đa giác và vẽ các đường thẳng song song sang cạnh đó, nhưng để đơn giản, tôi nghĩ rằng nếu tôi có thể chỉ cần nhập một góc cho tất cả các đường song song, đó là sẽ dễ dàng hơn

Vì vậy, góc đường, chiều rộng giữa các đường, chiều dài tối thiểu / tối đa và chiều rộng bộ đệm từ các cạnh của đa giác là những tiêu chí cơ bản của tôi.

Hình ảnh đính kèm nếu điều đó giúp.

nhập mô tả hình ảnh ở đây


Có phải là một yêu cầu cho các dòng kết thúc một khoảng cách nhất định từ cạnh đa giác?
cndnflyr

vâng, tôi cần phải có một bộ đệm từ các cạnh. Nếu tôi có thể tuyên bố giá trị đó, đó sẽ là tuyệt vời. Cảm ơn.
Tx_Dan

Câu trả lời:


9

Như @cndnflyr đề cập, điều này có thể được viết theo kịch bản trong Python.

UI Công cụ tập lệnh:

nhập mô tả hình ảnh ở đây

Đầu ra mẫu: nhập mô tả hình ảnh ở đây

# 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

Wow này thật đẹp, phloem! Sẽ xem xét. Cảm ơn bạn rất nhiều!
Tx_Dan

Đây là một cách sử dụng tuyệt vời của các phương thức trong đối tượng SHAPE. Thật thanh lịch. Điều duy nhất nó thiếu là thiết lập góc của các đường. Như vậy, nó sẽ vẽ các đường dọc theo cạnh dài nhất của đa giác.
cndnflyr

4

Điều này có thể được thực hiện với Python, nhưng sẽ mất một chút thời gian để viết nó ra.

Tôi nghĩ cách nhanh nhất để thực hiện nó mà không cần Python là có tệp SHP mẫu của các đường song song này. Có một vài nếu bạn có chiều rộng khác nhau cần thiết, và chỉ cần sử dụng chiều rộng thích hợp cho Đa giác đó. Làm cho các dòng mẫu bao phủ đủ diện tích để bao phủ Đa giác lớn nhất mà bạn sẽ gặp.

  1. Trong khi chỉnh sửa, di chuyển các dòng trên đa giác.
  2. Sử dụng công cụ Xoay, di chuyển điểm neo đến vị trí Đường song song và cạnh Đa giác khớp và xoay các đường sao cho khớp với cạnh Đa giác mà bạn xếp hàng.
  3. Chuyển đổi Đa giác thành Đa tuyến
  4. Bộ đệm cho Polyline bất kỳ khoảng cách nào bạn muốn các đường Parallel nằm từ cạnh đa giác.
  5. Sử dụng công cụ Erase để xóa Polylines được bao phủ bởi Buffered Polygon Edge
  6. Chọn theo vị trí tất cả các dòng không nằm trong đa giác và xóa chúng. Hoặc tôi nghĩ rằng công cụ Clip cũng sẽ hoạt động.
  7. Chọn theo thuộc tính tất cả các dòng có độ dài nhỏ hơn (quá ngắn để giữ, mặc dù bạn có thể cần thêm trường và tính toán hình học trước) và hơn một độ dài nhất định (quá dài để giữ nếu đó là điều bạn muốn ), xóa chúng.
  8. Rửa sạch và lặp lại ...

Bước 3 đến 7 có thể được Mô hình hóa, mà không phải viết bất kỳ mã nào.

Rất nhiều quá trình tương tự có thể được sử dụng để mã hóa quy trình, nhưng thay vì có các dòng mẫu, bạn có thể có mã vẽ các đường thẳng ở góc bên phải, cách xa nhau, v.v. Tôi đã không làm điều này một lúc, nhưng tôi nghĩ rằng Thư viện Python như hình dạng sẽ giúp. Chỉ cần đảm bảo rằng nó có diện tích lớn hơn Đa giác và sử dụng các công cụ để tự động chuyển đổi thành đa tuyến, bộ đệm, xóa, chọn các dòng không nằm trong đa giác và xóa chúng.


Cảm ơn các câu trả lời chi tiết. Tôi sẽ thử cái này và xem nó hoạt động như thế nào. Cảm ơn!
Tx_Dan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.