Créer une ligne (sommet le plus proche de la ligne) à l'aide d'ArcGIS Desktop?


11

J'utilise ArcInfo 10 SP3.

Je travaille à la réorganisation de nos données d'utilité. Il y a deux ans, nous avons commencé à collecter la canalisation d'eau du service privé. Nous en avons encore beaucoup à extraire d'anciens dessins de disques.

Je me demandais s'il y avait un moyen de créer une ligne qui joindrait nos empreintes de construction à la ligne WaterMain?

Je voudrais utiliser le sommet du bâtiment le plus proche de la conduite d'eau principale comme point de départ.

entrez la description de l'image ici

Réponses:


10

Si vous recherchez une solution qui ne nécessite pas de développer un outil .NET, vous pouvez utiliser le script python ci-dessous pour accomplir exactement ce que vous recherchez. J'avais exactement le même besoin et j'ai écrit le script suivant comme solution. Configurez-le en tant qu'outil ArcCatalog avec les 4 paramètres, ou commentez les paramètres et décommentez les variables codées en dur et exécutez-le directement.

# 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

Recherchez la méthode "NearestFeature" sur IIndexQuery2.

Vous pouvez l'utiliser pour obtenir la conduite principale d'eau la plus proche de chaque bâtiment. Je suppose que vous auriez alors besoin de faire une boucle entre les sommets de chaque bâtiment pour trouver celui qui est le plus proche de cette fonctionnalité, puis de construire une nouvelle polyligne en utilisant les sommets du bâtiment et la conduite d'eau comme points de terminaison. La seule fois où j'ai fait cela, c'était en utilisant des lunettes à deux points, j'aimerais pouvoir offrir plus que cela du haut de ma tête ..: 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);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.