Creazione di una linea (vertice più vicino a una linea) usando ArcGIS Desktop?


11

Sto usando ArcInfo 10 SP3.

Sto lavorando alla riorganizzazione dei nostri dati di utilità. Due anni fa, abbiamo iniziato a raccogliere la linea di galleggiamento del servizio privato. Ne abbiamo ancora molti da estrarre dai vecchi disegni dei record.

Mi chiedevo se esistesse un modo per creare una linea che potesse unire le impronte dei nostri edifici alla linea WaterMain?

Vorrei utilizzare il vertice dell'edificio più vicino alla rete idrica come punto di partenza.

inserisci qui la descrizione dell'immagine

Risposte:


10

Se stai cercando una soluzione che non richiede lo sviluppo di uno strumento .NET, puoi utilizzare lo script python di seguito per realizzare esattamente quello che stai cercando. Avevo esattamente lo stesso bisogno e ho scritto il seguente script della soluzione. Configuralo come strumento ArcCatalog con i 4 parametri oppure commenta i parametri e decommenta le variabili codificate ed eseguilo direttamente.

# 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

Cerca il metodo "ClosFeature" su IIndexQuery2.

Puoi usarlo per ottenere la caratteristica principale dell'acqua più vicina a ciascun edificio. Immagino che dovresti in qualche modo passare attraverso i vertici su ogni edificio per trovare qual è la distanza più vicina a questa funzione, quindi costruire una nuova polilinea usando i vertici dell'edificio e il watermain come punti finali. L'unica volta che l'ho fatto è stato usare due featurecglass a punta, vorrei poter offrire più di quello dalla parte superiore della mia testa ..: 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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.