使用ArcGIS Desktop在多边形(孔路径)内绘制平行线?


11

我想使用具有多个不规则多边形的多边形要素类,并让Arc在每个多边形内部绘制平行线。理想情况下,对于Arc来说,找出多边形最长边的角度并在该边上绘制平行线会很好,但是为了简单起见,我想如果我可以为所有平行线输入一个角度,那会更容易。

因此,线的角度,线之间的宽度,最小/最大长度以及从多边形侧面开始的缓冲区宽度是我的基本标准。

如果有帮助,请附上图像。

在此处输入图片说明


线要终止于距多边形边缘一定距离的要求吗?
cndnflyr 2014年

是的,我需要远离边缘的缓冲区。如果我可以声明该值,那就太好了。谢谢。
Tx_Dan 2014年

Answers:


9

正如@cndnflyr提到的那样,可以使用Python编写脚本。

脚本工具用户界面:

在此处输入图片说明

样本输出: 在此处输入图片说明

# 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 2014年

这是SHAPE对象中方法的很好用。优雅 它唯一缺少的是设置线条的角度。它将沿多边形的最长边绘制直线。
cndnflyr 2014年

4

这可以使用Python完成,但要花费一些时间才能写出来。

我认为没有Python来实现它的最快方法是拥有这些平行行的模板SHP文件。如果需要改变宽度,可以设置一些,然后仅将适当的宽度用于该多边形。使模板线覆盖足够的区域,以覆盖您将遇到的最大的多边形。

  1. 编辑时,将线移到多边形上。
  2. 使用“旋转”工具,将锚点移动到平行线和“多边形”边相匹配的位置,然后旋转这些线,使其捕捉到您在其上对齐的“多边形”边。
  3. 将多边形转换为折线
  4. 缓冲多段线,使其与平行线到多边形边缘的距离相等。
  5. 使用“擦除”工具擦除缓冲多边形边所覆盖的折线
  6. 通过位置选择不在多边形内的所有线并将其删除。或者我认为剪辑工具也可以使用。
  7. 通过属性选择所有小于一定长度的线(虽然可能需要先添加一个字段并首先计算几何形状,但要保留的时间太短)和大于特定长度(如果要保留的时间太长)的所有线),将其删除。
  8. 冲洗并重复...

可以对第3步到第7步进行建模,而无需编写任何代码。

可以使用几乎相同的过程来对过程进行编码,但是除了使用模板行之外,您还可以使代码以正确的角度,相距的距离等来绘制行。我已经有一段时间没有这样做了,但是我认为像身材匀称的 Python库会有所帮助。只需确保它覆盖的区域比Polygon大,然后使用工具自动将其转换为折线,缓冲,擦除,选择不在多边形内部的线并将其删除即可。


感谢您的详细回答。我将尝试一下,看看它是如何工作的。谢谢!
Tx_Dan 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.