ArcGIS Desktop kullanarak çokgenler (Kuyu Yolları) içinde paralel çizgiler mi çiziyorsunuz?


11

Birden çok düzensiz çokgen içeren bir çokgen özellik sınıfı almak ve her bir çokgenin içine paralel çizgiler çizmek istiyorum. İdeal olarak, Arc'ın çokgenin en uzun tarafının açısını bulması ve o tarafa paralel çizgiler çizmesi iyi olurdu, ancak basit tutmak için, tüm paralel çizgiler için sadece bir açı girebilsem, daha kolay olurdu.

Yani çizgi açısı, çizgiler arasındaki genişlik, min / maks uzunluk ve çokgenlerin kenarlarındaki tampon genişliği temel kriterlerimdir.

Yardımcı olursa resim eklenir.

resim açıklamasını buraya girin


Çizgilerin çokgen kenarından belirli bir mesafeyi bitirmesi bir gereklilik mi?
cndnflyr

evet, kenarlardan uzak bir tampon olmalı. Bu değeri beyan edebilseydim, bu harika olurdu. Teşekkürler.
Tx_Dan

Yanıtlar:


9

@Cndnflyr'den bahsedildiği gibi, bu Python'da yazılabilir.

Komut Dosyası Aracı Arayüzü:

resim açıklamasını buraya girin

Örnek Çıktı: resim açıklamasını buraya girin

# 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

Vay bu güzel phloem! Bir bakacak. Çok teşekkür ederim!
Tx_Dan

Bu, SHAPE nesnesindeki yöntemlerin büyük bir kullanımıdır. Zarif. Eksik olan tek şey çizgilerin açısını ayarlamaktır. Olduğu gibi, çokgenin en uzun kenarı boyunca çizgiler çizecektir.
cndnflyr

4

Bu Python ile yapılabilir, ancak yazmak biraz zaman alabilir.

Python olmadan uygulamak için en hızlı yolu, bu paralel çizgiler bir şablon SHP dosyaya sahip olduğunu düşünüyorum. Değişen genişliklere ihtiyacınız varsa birkaç tane alın ve bu Çokgen için uygun olanı kullanın. Şablon çizgilerinin, karşılaşacağınız en büyük Çokgeni kapsayacak kadar alanı kaplamasını sağlayın.

  1. Düzenleme sırasında çizgileri çokgenin üzerine getirin.
  2. Döndürme aracını kullanın, bağlantı noktasını bir Paralel çizginin ve Çokgen kenarının eşleştiği yere taşıyın ve çizgileri, üzerinde hizaladığınız Çokgen kenarına yaslanacak şekilde döndürün.
  3. Çokgeni Çok Çizgiye Dönüştür
  4. Çoklu Çizgiyi, Paralel çizgilerin çokgen kenarından olmasını istediğiniz mesafe kadar arabelleğe alın.
  5. Arabellek Çokgen Kenarının kapsadığı Çoklu Hatları silmek için Sil aracını kullanın
  6. Çokgenin içinde olmayan tüm satırları konuma göre seçin ve silin. Ya da Klip aracının da işe yarayacağını düşünüyorum.
  7. Belirli bir uzunluktan daha az olan tüm satırları (önce bir alan eklemeniz ve önce geometriyi hesaplamanız gerekebilse de) tüm satırları ve belirli bir uzunluktan daha fazlasını (istediğiniz şeyse tutmak için çok uzun) özelliğe göre seçin ), onları sil.
  8. Durulayın ve Tekrarlayın ...

3 ile 7 arasındaki adımlar herhangi bir kod yazmak zorunda kalmadan modellenebilir.

İşlemi kodlamak için çok aynı süreç kullanılabilir, ancak şablon satırları yerine, kodu doğru açıda çizgiler çizebilirsiniz, mesafe, vb. Bunu bir süredir yapmadım, ama bence bir Python kütüphanesi gibi düzgün yardımcı olur. Çokgenden daha geniş bir alanı kapladığından emin olun ve araçları otomatik olarak çoklu çizgiye dönüştürmek, arabelleğe almak, silmek, çokgenin içinde olmayan satırları seçmek ve silmek için kullanın.


Detaylı cevap için teşekkürler. Bunu bir deneyeceğim ve nasıl çalıştığını göreceğim. Teşekkürler!
Tx_Dan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.