Tạo dòng (đỉnh gần nhất với dòng) bằng ArcGIS Desktop?


11

Tôi đang sử dụng ArcInfo 10 SP3.

Tôi đang làm việc trong việc sắp xếp lại dữ liệu tiện ích của chúng tôi. Hai năm trước, chúng tôi đã bắt đầu thu thập dòng nước Dịch vụ tư nhân. Chúng tôi vẫn còn rất nhiều trong số chúng để trích xuất từ ​​Bản vẽ cũ.

Tôi đã tự hỏi nếu có một cách để tạo ra dòng sẽ nối các dấu chân tòa nhà của chúng tôi với dòng WaterMain?

Tôi muốn sử dụng đỉnh tòa nhà gần với đường ống nước nhất làm điểm bắt đầu.

nhập mô tả hình ảnh ở đây

Câu trả lời:


10

Nếu bạn đang tìm kiếm một giải pháp không yêu cầu phát triển công cụ .NET, bạn có thể sử dụng tập lệnh python bên dưới để thực hiện chính xác những gì bạn đang theo đuổi. Tôi có cùng một nhu cầu và viết kịch bản sau đây là giải pháp. Định cấu hình nó như một công cụ ArcCatalog với 4 tham số hoặc nhận xét các tham số và bỏ ghi chú các biến được mã hóa cứng và chạy trực tiếp.

# 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

Hãy xem phương thức "RecentFeature" trên IIndexQuery2.

Bạn có thể sử dụng điều này để có được tính năng chính nước gần nhất với mỗi tòa nhà. Tôi đoán sau đó bạn sẽ cần phải lặp đi lặp lại các đỉnh trên mỗi tòa nhà để tìm ra cái nào là khoảng cách gần nhất với tính năng này, sau đó xây dựng một đa tuyến mới bằng cách sử dụng các đỉnh từ tòa nhà và lấy nước làm điểm cuối. Lần duy nhất tôi đã làm điều này là sử dụng hai điểm kỳ công, ước gì tôi có thể cung cấp nhiều hơn thế ngoài đỉnh đầu của tôi ..: 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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.