¿Crear línea (vértice más cercano a la línea) usando ArcGIS Desktop?

11

Estoy usando ArcInfo 10 SP3.

Estoy trabajando en reorganizar nuestros datos de utilidad. Hace dos años, comenzamos a recolectar la línea de agua del Servicio Privado. Todavía tenemos muchos de ellos para extraer de viejos dibujos de registros.

Me preguntaba si había una manera de crear una línea que uniera las huellas de nuestro edificio a la línea WaterMain.

Me gustaría utilizar el vértice del edificio más cercano al agua principal como punto de partida.

ingrese la descripción de la imagen aquí

Dom
fuente

Respuestas:

10

Si está buscando una solución que no requiera el desarrollo de una herramienta .NET, puede usar el script de Python a continuación para lograr exactamente lo que busca. Tenía exactamente la misma necesidad y escribí el siguiente script como solución. Configúrelo como una herramienta ArcCatalog con los 4 parámetros, o comente los parámetros y descomente las variables codificadas y ejecútelo directamente.

# 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")
Jeff Berry
fuente
2

Busque el método "NearestFeature" en IIndexQuery2.

Puede usar esto para obtener la característica principal de agua más cercana a cada edificio. Supongo que de alguna manera necesitarías recorrer los vértices de cada edificio para encontrar cuál es la distancia más cercana a esta característica, luego construir una nueva polilínea usando los vértices del edificio y el agua principal como puntos finales. La única vez que hice esto fue usando clases de características de dos puntos, ojalá pudiera ofrecer más que eso en la parte superior de mi cabeza ...: 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);
ericoneal
fuente