답변:
.NET 도구를 개발할 필요가없는 솔루션을 찾고 있다면 아래의 python 스크립트를 사용하여 정확한 결과를 얻을 수 있습니다. 나는 정확히 똑같은 요구를했고 솔루션으로 다음 스크립트를 작성했습니다. 4 개의 매개 변수를 사용하여 ArcCatalog 도구로 구성하거나 매개 변수를 주석 처리하고 하드 코딩 된 변수의 주석을 해제 한 후 직접 실행하십시오.
# 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")
IIndexQuery2의 "NearestFeature"메소드를 살펴보십시오.
이를 사용하여 각 건물에 가장 가까운 물의 주요 기능을 얻을 수 있습니다. 그런 다음 각 건물의 정점을 통해 루프를 작성 하여이 기능과 가장 가까운 거리를 찾은 다음 건물의 정점을 사용하여 끝점으로 watermain을 사용하여 새 폴리 라인을 작성해야합니다. 이 작업을 수행 한 유일한 시점은 두 개의 포인트 기능 클래스를 사용하는 것이 었습니다.
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);