Erstellen einer Linie (der der Linie am nächsten liegt) mit ArcGIS Desktop?


11

Ich verwende ArcInfo 10 SP3.

Ich arbeite daran, unsere Versorgungsdaten neu zu organisieren. Vor zwei Jahren haben wir begonnen, die Wasserleitung von Private Service zu sammeln. Wir haben noch viele davon aus alten Rekordzeichnungen zu extrahieren.

Ich habe mich gefragt, ob es eine Möglichkeit gibt, eine Linie zu erstellen, die unsere Gebäudegrundrisse mit der WaterMain-Linie verbindet.

Ich möchte den Scheitelpunkt des Gebäudes, der der Wasserleitung am nächsten liegt, als Ausgangspunkt verwenden.

Geben Sie hier die Bildbeschreibung ein

Antworten:


10

Wenn Sie nach einer Lösung suchen, für die kein .NET-Tool entwickelt werden muss, können Sie das folgende Python-Skript verwenden, um genau das zu erreichen, wonach Sie suchen. Ich hatte genau das gleiche Bedürfnis und schrieb das folgende Skript als Lösung. Konfigurieren Sie es als ArcCatalog-Tool mit den 4 Parametern oder kommentieren Sie die Parameter aus, kommentieren Sie die fest codierten Variablen aus und führen Sie sie direkt aus.

# CreateLineFromNearestVertexToFeature.py
# Author: Jeff Berry
# Description: Creates a line between the nearest vertext on source features
# to the nearest feature in target feature class.
# ---------------------------------------------------------------------------

# Import arcpy module
import arcpy
from arcpy import env

# Local variables:
# 1. SourceFC - Feature Class 
# 2. TargetFC - Feature Class
# 3. Output_gdb - Geodatabase
# 4. Output_fc - String

SourceFC = arcpy.GetParameterAsText(0)
TargetFC = arcpy.GetParameterAsText(1)
Output_gdb = arcpy.GetParameterAsText(2)
Output_fc = arcpy.GetParameterAsText(3)

## Alternatively setup hardcoded variables    
##SourceFC = "Buildings"
##TargetFC = "WaterMains"
##Output_gdb = "D:\\New File Geodatabase.gdb"
##Output_fc = "lines_output"

SourceFeaturePoints = "SrcFtrPoints"
arcpy.env.workspace = Output_gdb

# Process: Feature Vertices To Points
arcpy.FeatureVerticesToPoints_management(SourceFC, SourceFeaturePoints, "ALL")

# Process: Near
arcpy.Near_analysis(SourceFeaturePoints, TargetFC, "1000 Feet", "LOCATION", "NO_ANGLE")

# Process: Create Feature Class...
#arcpy.CreateFeatureclass_management(Output_gdb, Output_fc, "POLYLINE", "", "DISABLED", "DISABLED", "", "", "0", "0", "0")
rows = arcpy.SearchCursor(SourceFeaturePoints)

lstIDs = []

for row in rows:
    lstIDs.append(row.ORIG_FID)

uniqueOBJIDS = set(lstIDs)
newLineList = []
shapeName = arcpy.Describe(SourceFeaturePoints).shapeFieldName

for objID in uniqueOBJIDS:
    rows = arcpy.SearchCursor(SourceFeaturePoints, "\"NEAR_DIST\" = (SELECT MIN( \"NEAR_DIST\") FROM SrcFtrPoints WHERE \"ORIG_FID\"  = " + str(objID) + ")")
    for row in rows:
        arrayLine = arcpy.Array()
        ftr = row.getValue(shapeName)
        pointStart = ftr.firstPoint
        pointEnd = arcpy.Point(row.NEAR_X, row.NEAR_Y)
        arrayLine.add(pointStart)
        arrayLine.add(pointEnd)
        plyLine = arcpy.Polyline(arrayLine)
        newLineList.append(plyLine)


arcpy.CopyFeatures_management(newLineList, Output_fc)
arcpy.Delete_management(SourceFeaturePoints, "FeatureClass")

del rows
del row
del SourceFeaturePoints
del Output_fc
del Output_gdb
arcpy.ClearEnvironment("workspace")

2

Schauen Sie sich die "NearestFeature" -Methode auf IIndexQuery2 an.

Sie können dies verwenden, um das nächstgelegene Wasserhauptmerkmal zu jedem Gebäude zu erhalten. Ich denke, Sie müssten dann irgendwie die Scheitelpunkte jedes Gebäudes durchlaufen, um herauszufinden, welcher Abstand zu diesem Feature am nächsten liegt, und dann eine neue Polylinie erstellen, wobei Sie die Scheitelpunkte vom Gebäude und der Wasserversorgung als Endpunkte verwenden. Das einzige Mal, dass ich dies getan habe, war die Verwendung von Zwei-Punkt-Feature-Classes. Ich wünschte, ich könnte mehr als das auf den ersten Blick anbieten ..: D.

IFeatureCursor pDepthCursor = pDepthSoundings.Search(null, false);
IFeatureIndex2 pFtrInd = new FeatureIndexClass();
pFtrInd.FeatureClass = pDepthSoundings.FeatureClass;
pFtrInd.FeatureCursor = pDepthCursor;
pFtrInd.Index(null, pCombinedEnvelope);
IIndexQuery2 pIndQry = pFtrInd as IIndexQuery2;

int FtdID = 0;
double dDist2Ftr = 0;
pIndQry.NearestFeature(ppoint, out FtdID, out dDist2Ftr);

IFeature pCloseFeature = pDepthSoundings.FeatureClass.GetFeature(FtdID);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.