วาดเส้นขนานในรูปหลายเหลี่ยม (Well Paths) โดยใช้ ArcGIS Desktop?


11

ฉันต้องการใช้คลาสคุณลักษณะรูปหลายเหลี่ยมที่มีรูปหลายเหลี่ยมไม่สม่ำเสมอหลายรูปแบบและมีส่วนโค้งที่ลากเส้นภายในของรูปหลายเหลี่ยมแต่ละอัน เป็นการดีที่มันจะดีสำหรับอาร์คที่จะหามุมของด้านที่ยาวที่สุดของรูปหลายเหลี่ยมและวาดเส้นขนานไปยังด้านนั้น แต่เพื่อให้มันง่ายฉันคิดว่าถ้าฉันสามารถป้อนหนึ่งมุมสำหรับเส้นขนานทั้งหมดนั่น จะง่ายขึ้น

มุมของเส้นความกว้างระหว่างเส้นความยาวต่ำสุด / สูงสุดและความกว้างของบัฟเฟอร์จากด้านข้างของรูปหลายเหลี่ยมเป็นเกณฑ์พื้นฐานของฉัน

ภาพที่แนบถ้าช่วยได้

ป้อนคำอธิบายรูปภาพที่นี่


มันเป็นข้อกำหนดสำหรับเส้นที่จะสิ้นสุดระยะทางที่แน่นอนจากขอบรูปหลายเหลี่ยม?
cndnflyr

ใช่ฉันต้องมีบัฟเฟอร์อยู่ห่างจากขอบ ถ้าฉันสามารถประกาศค่านั้นมันจะดี ขอบคุณ
Tx_Dan

คำตอบ:


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

นี่เป็นการใช้วิธีต่าง ๆ ในวัตถุ SHAPE มันสวยงาม สิ่งเดียวที่ขาดหายไปคือการตั้งค่ามุมของเส้น ตามที่เป็นอยู่มันจะลากเส้นไปทางด้านที่ยาวที่สุดของรูปหลายเหลี่ยม
cndnflyr

4

สิ่งนี้สามารถทำได้ด้วย Python แต่ใช้เวลาสักครู่ในการเขียน

ฉันคิดว่าวิธีที่รวดเร็วที่สุดในการใช้งานโดยไม่มี Python คือการมีไฟล์ SHP แม่แบบของเส้นคู่ขนานเหล่านี้ มีบางอย่างถ้าคุณต้องการความกว้างที่แตกต่างกันและใช้ความกว้างที่เหมาะสมกับรูปหลายเหลี่ยมนั้น ทำให้บรรทัดแม่แบบครอบคลุมพื้นที่เพียงพอที่จะครอบคลุมรูปหลายเหลี่ยมที่ใหญ่ที่สุดที่คุณจะได้พบ

  1. ขณะแก้ไขให้เลื่อนเส้นไปเหนือรูปหลายเหลี่ยม
  2. ใช้เครื่องมือหมุนย้ายจุดยึดไปยังตำแหน่งที่ขนานกับเส้นขอบรูปหลายเหลี่ยมและหมุนเส้นเพื่อให้เส้นยึดกับขอบรูปหลายเหลี่ยมที่คุณเรียงไว้
  3. แปลงรูปหลายเหลี่ยมเป็นรูปหลายเหลี่ยม
  4. บัฟเฟอร์ Polyline ไม่ว่าระยะทางใดที่คุณต้องการให้เส้นขนานนั้นมาจากขอบรูปหลายเหลี่ยม
  5. ใช้เครื่องมือลบเพื่อลบ Polylines ที่ครอบคลุมโดย Buffered Polygon Edge
  6. เลือกตามตำแหน่งทุกบรรทัดที่ไม่ได้อยู่ในรูปหลายเหลี่ยมแล้วลบออก หรือฉันคิดว่าเครื่องมือคลิปจะทำงานด้วย
  7. เลือกตามคุณสมบัติทุกบรรทัดที่น้อยกว่าความยาวที่กำหนด (สั้นเกินกว่าที่จะเก็บไว้แม้ว่าคุณอาจจะต้องเพิ่มฟิลด์และคำนวณรูปทรงเรขาคณิตก่อน) และมากกว่าความยาวที่แน่นอน ) ลบออก
  8. ล้างและทำซ้ำ ...

ขั้นตอนที่ 3 ถึง 7 อาจเป็นแบบอย่างโดยไม่ต้องเขียนโค้ดใด ๆ

กระบวนการเดียวกันมากสามารถใช้สำหรับการเข้ารหัสกระบวนการ แต่แทนที่จะมีบรรทัดแม่แบบคุณสามารถให้รหัสวาดเส้นที่มุมฉากระยะทางห่างกัน ฯลฯ ฉันไม่ได้ทำสิ่งนี้มาสักพัก แต่ฉันคิดว่า ห้องสมุด Python อย่างดีจะช่วยได้ ตรวจสอบให้แน่ใจว่าครอบคลุมพื้นที่ใหญ่กว่ารูปหลายเหลี่ยมและใช้เครื่องมือในการแปลงเป็นรูปหลายเหลี่ยมบัฟเฟอร์ลบเลือกบรรทัดที่ไม่ได้อยู่ในรูปหลายเหลี่ยมและลบออกโดยอัตโนมัติ


ขอบคุณสำหรับคำตอบโดยละเอียด ฉันจะลองและดูว่ามันทำงานอย่างไร ขอบคุณ!
Tx_Dan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.