Xác định các đường cong / cung thực sự trong ArcMap?


12

Cách tốt nhất để tạo các vòng tròn trong ArcMap là sử dụng cung tròn thực, (các đường cong ghép) nhưng tôi cần chuyển đổi chúng thành đỉnh (mật độ) vì vấn đề tương thích. Tôi cần thông tin cho cơ sở dữ liệu địa lý và SDO_geometry (arcsde)

và vâng, có một cách. Tôi sử dụng:

UPDATE layer1 a SET arctype = 'compound' WHERE has_compound_curves(a.shape) <> 0;

và sau đó sử dụng ET Geotools để tăng mật độ từng lớp.

Nhưng cần có cách dễ dàng hơn để thực hiện điều này một cách đơn giản trong Oracle hoặc ArcMap, và tôi chỉ muốn tăng cường các tính năng có vòng cung thực sự. Tôi không muốn bất kỳ đỉnh không cần thiết trên các đường thẳng và vân vân.

Làm cách nào tôi có thể xác định các cung tròn thực sự trong ArcMap và làm cách nào tôi có thể tăng cường chúng nhanh nhất và dễ dàng nhất có thể?

Tương tự đối với Oracle SQL.


Đây là một chủ đề từ năm 2006 sử dụng VBA để tìm các cung thực sự, nhưng vì ArcGIS không còn hỗ trợ VBA nữa, nên có cách Python hay UI để làm điều này không?
RyanKDalton

Tôi hy vọng rằng "Ý tưởng ArcGIS" này không có nghĩa là không thể tìm thấy các đường cong thực sự trong 10.0.
RyanKDalton

Câu trả lời:


8

Tôi đã được hỏi câu hỏi này ngày hôm nay ("Làm thế nào để tôi xác định nếu một chiếc featureclass có đường cong) và được đưa ra một số gợi ý mã phức tạp . Sửa đổi mã sau đây khi bạn thấy phù hợp (ví dụ một biến cờ thay vì thông báo)

geometries = arcpy.CopyFeatures_management("inputFeatures", arcpy.Geometry())
import json
for g in geometries:
    j = json.loads(g.JSON)
    if 'curve' in j: print "You have true curves!"
    else: print "No curves here"

No curves here
No curves here
You have true curves!
You have true curves!
No curves here
You have true curves!
No curves here
No curves here
You have true curves!
You have true curves!
You have true curves!
You have true curves!
You have true curves!

4

Bằng cách sử dụng Densify , các phân đoạn Đường cong được đơn giản hóa thông qua việc tăng mật độ bằng tham số Độ lệch tối đa hoặc Độ lệch lệch tối đa.

Vì vậy, các đoạn thẳng sẽ được giữ nguyên.


1
Mặc dù điều này sẽ không giúp xác định các đường cong thực sự, tôi đồng ý rằng sử dụng Densify với tham số Angle là một cách nhanh chóng và hiệu quả để tăng mật độ chúng rất nhanh. Việc sử dụng tham số Góc nhìn chung cũng sẽ chỉ làm tăng các đường cong thực, trong khi tùy chọn Khoảng cách sẽ tăng mật độ tất cả các ranh giới, dẫn đến (ít nhất là trong các thử nghiệm của tôi, sử dụng các tham số mặc định) tăng kích thước tệp lên gấp 10 lần.
RyanKDalton

ok, vì vậy có nhiều giải pháp khác nhau, nhưng vấn đề của tôi là tôi không thể sử dụng bất kỳ hộp công cụ nào trên lớp sde của mình, chúng tôi đang khóa các lớp để kiểm tra / kiểm tra, điều tôi muốn làm là chạy một công cụ / tập lệnh tìm thấy những đường cong này và sau đó tăng mật độ, nhưng nếu đó là những gì bạn đang nói rằng mật độ chỉ chạm vào các cung tròn thực sự, tôi có thể kiểm tra tất cả các tính năng, nhưng có bất kỳ công cụ chỉnh sửa nào có mật độ lớn hơn ET geotools
jonak activ 19/12/12

câu trả lời này gis.stackexchange.com/a/37082/2969 cố gắng trích xuất các đường thẳng, nhưng bạn có thể trích xuất các đường cong bằng cách trừ các đường thẳng từ toàn bộ lớp, để bạn có thể xác định vị trí các đường cong mà không cần chạm vào toàn bộ dữ liệu. nhưng tôi không biết làm thế nào ET geotools hoạt động.
geogeek

jonak activ, công cụ Densify mà @geogeek liên kết đến là một công cụ ArcGIS cốt lõi có sẵn với giấy phép ArcEditor hoặc ArcInfo, không phải là một phần của ET GeoWizards.
RyanKDalton

2

Tôi nghĩ rằng một khi bạn đã chọn chúng, bạn có thể tăng cường chúng. Mã (chưa được kiểm tra) dưới đây có thể được điều chỉnh để làm điều này. (Giả sử đường cong Bezier đủ điều kiện là cung).

public void SelectTrueArcFeatures()
{
    var editor = ArcMap.Application.FindExtensionByName("ESRI Object Editor") as IEditor;
    if (editor.EditState != esriEditState.esriStateEditing)
        throw new Exception("start editing first");
    var fLayer = ((IEditLayers)editor).CurrentLayer;
    if (fLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPoint)
        throw new Exception("current edit layer must have polylines or polygons");

    var fSel = fLayer as IFeatureSelection;
    fSel.Clear();
    var fCur = fLayer.FeatureClass.Search(null,false);
    IFeature feat;
    while ((feat = fCur.NextFeature()) != null)
    {
        if(HasAnArc(feat.Shape))    
            fSel.SelectionSet.Add(feat.OID);
    }
    fSel.SelectionChanged();
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(fCur);
    ArcMap.Document.ActiveView.Refresh();
}

private bool HasAnArc(IGeometry geom)
{
    var segcoll = geom as ISegmentCollection;
    if (segcoll == null)
        return false;
    for (int i = 0; i < segcoll.SegmentCount; i++)
    {
        if (segcoll.get_Segment(i) is ICircularArc 
          || segcoll.get_Segment(i) is IBezierCurve)
          return true;
    }
    return false;
}

kịch bản chỉnh sửa này là? Làm thế nào tôi sẽ đặt mã này vào arcmap? và làm thế nào để mã hoạt động, nó có tìm thấy các dấu phẩy hay chỉ làm đậm đặc những cái tôi đã tìm thấy (đã chọn)
jonak activ

Đó là c #. Nếu bạn chưa quen với c # (hoặc tùy chỉnh .net), bạn có thể yêu cầu ai đó viết tương đương với python. Để sử dụng mã này, bạn sẽ cần phải biên dịch nó với Visual Studio. Nó chọn tất cả các polylines (hoặc đa giác) trong lớp mục tiêu chỉnh sửa hiện tại có bất kỳ phân đoạn phi tuyến tính nào.
Kirk Kuykendall

@jonak activ Nếu bạn đang sử dụng 9.3.1, bạn có thể thực hiện việc này với VBA trong tập lệnh máy tính. Tính toán một thuộc tính cờ, sau đó chọn các tính năng có cờ. Nếu bạn đang sử dụng 8.3, bạn thực sự có thể cập nhật hình học bằng máy tính trường trực tiếp và không cần thuộc tính cờ.
Kirk Kuykendall

Tuyệt vời! Tôi rất biết ơn, tôi sợ điều đó là không thể
jonak activ

2

Dựa trên câu trả lời của @ KHibma, con trỏ truy cập dữ liệu có mã thông báo SHAPE@JSONcó thể được sử dụng để kiểm tra các đường cong mà không cần nhập jsonmô-đun.

with arcpy.da.SearchCursor ("InputFeatures", ["OID@", "SHAPE@JSON"]) as curs:
    for oid, json in curs:
        if "curve" in json:
            print "{} is curved".format (oid)

1

Tôi cũng đã tạo ra giải pháp của riêng mình cho việc này, dựa trên đề xuất của @geogeek. Tôi đã tạo một mô hình so sánh các đỉnh của các lớp nguồn với một đỉnh từ một bản sao dày đặc (sử dụng tùy chọn ANGLE) của lớp nguồn. Đầu ra là một lớp các đỉnh "không khớp" với nguồn. Bước cuối cùng chọn tất cả các tính năng nguồn giao nhau với các điểm chưa từng có, từ đó xác định các tính năng có chứa các đường cong thực sự.

Vì mô hình này không phân chia các tính năng tại điểm bắt đầu và điểm kết thúc của cung, toàn bộ tính năng sẽ được xuất. Do đó, nếu bạn có một hình học duy nhất được kết nối là "đường cong-đường cong-đường cong-đường cong-đường ngược", toàn bộ tính năng sẽ là đầu ra, không chỉ là các phần của đường cong. Sử dụng các điểm để xác định nơi (các) đường cong thực tế tồn tại.

Bạn có thể tải xuống mô hình có tên " Xác định đường cong thật " từ thư viện "Phân tích" của Trung tâm tài nguyên ArcGIS.


Cảm ơn TẤT CẢ, điều này thật tuyệt vời. chúng tôi có arcgis 9.3.1 nhưng tôi sẽ kiểm tra EDIT trên máy tính cá nhân của mình: nó là một công cụ rất tốt, nhưng không đủ nhanh: / điều tôi muốn là có thể trong môi trường chỉnh sửa để tìm / chọn các tính năng với các cung thực sự và sau đó kiểm tính năng của tôi với vòng cung chân thật và hãy tăng mật độ (là có bất kỳ công cụ tăng mật độ chỉnh sửa hơn et GeoTools, tại sao tôi không muốn getools et là bởi vì bạn phải lớp thay đổi mục tiêu, chúng tôi tăng mật độ có lẽ 10 lớp khác nhau.
jonaktiv

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.