สร้าง line (จุดสุดยอดที่ใกล้ที่สุดกับ line) โดยใช้ ArcGIS Desktop หรือไม่


11

ฉันใช้ ArcInfo 10 SP3

ฉันกำลังทำงานในการจัดระเบียบข้อมูลอรรถประโยชน์ของเราใหม่ สองปีที่ผ่านมาเราได้เริ่มเก็บรวบรวมท่อน้ำบริการส่วนตัว เรายังคงมีพวกมันจำนวนมากที่จะดึงออกมาจากบันทึกภาพวาดเก่า

ฉันสงสัยว่ามีวิธีการสร้างสายที่จะเข้าร่วมรอยเท้าอาคารของเรากับสาย WaterMain หรือไม่?

ฉันต้องการใช้จุดสุดยอดของอาคารที่อยู่ใกล้กับ Water main เป็นจุดเริ่มต้น

ป้อนคำอธิบายรูปภาพที่นี่

คำตอบ:


10

หากคุณกำลังมองหาโซลูชันที่ไม่ต้องการการพัฒนาเครื่องมือ. NET คุณสามารถใช้สคริปต์ไพ ธ อนด้านล่างเพื่อให้ได้สิ่งที่คุณต้องการอย่างแท้จริง ฉันมีความต้องการแบบเดียวกันและเขียนสคริปต์ต่อไปนี้เป็นวิธีแก้ปัญหา กำหนดค่าเป็นเครื่องมือ ArcCatalog ด้วยพารามิเตอร์ 4 ตัวหรือใส่เครื่องหมายข้อคิดเห็นพารามิเตอร์และยกเลิกการใส่เครื่องหมายในตัวแปรฮาร์ดโค้ดและรันโดยตรง

# 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

ดูวิธี "ใกล้ที่สุดคุณสมบัติ" บน IIndexQuery2

คุณสามารถใช้สิ่งนี้เพื่อรับคุณสมบัติหลักของน้ำที่ใกล้ที่สุดสำหรับแต่ละอาคาร ฉันเดาว่าคุณคงต้องวนรอบจุดยอดในแต่ละอาคารเพื่อค้นหาว่าอันไหนที่อยู่ใกล้กับสถานที่นี้มากที่สุดจากนั้นจึงสร้างโพลีไลน์ใหม่โดยใช้จุดยอดจากอาคารและสายน้ำเป็นจุดสิ้นสุด ครั้งเดียวที่ฉันทำสิ่งนี้คือการใช้ฟีเจอร์สองจุดหวังว่าฉันจะสามารถนำเสนอได้มากกว่านั้นจากด้านบนของหัวของฉัน .. : 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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.