Làm một phần đa tuyến từ đa tuyến?


11

Tôi có một đa tuyến được chia thành nhiều phần và các phần này không được sắp xếp tốt để ID của đỉnh không tuân theo âm mưu của đa tuyến.

Polyline này là một đại diện cho một tuyến xe buýt và tôi cần phải có âm mưu theo cách lái xe buýt. Tôi muốn biết làm thế nào để hợp nhất các đa tuyến của polyline này?

Tôi đã cố gắng phân tách và Unsplit, cũng như Multipart thành Single Part, Union, Merge, v.v. nhưng không ai cho tôi kết quả tôi muốn.


@bmoussea, bạn đã sử dụng công cụ Dissolve chưa?
nghệ thuật21

@ tác phẩm nghệ thuật21 Có tôi đã làm, nhưng nó không thay đổi bất cứ điều gì: đa tuyến vẫn được chia thành nhiều phần ...
bmoussea

Kiểm tra Hình học xác minh rằng phần đa được ra lệnh một cách chính xác đầu tiên help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//... sau đó hòa tan một artwork21 đề cập
Mapperz

Tôi đã kiểm tra hình học và không có vấn đề báo cáo. Các đa bội không xuất hiện trong kiểm tra hình học vì chúng đã là một phần của đa tuyến.
bmoussea

Đa bội của đa tuyến của tôi xuất hiện khi chỉnh sửa lớp có đa tuyến của tôi, sau đó bấm vào bên phải -> Chỉnh sửa các đỉnh và tìm trong Thuộc tính phác thảo. Dưới đây là các phần khác nhau (nhiều phần) của đa tuyến của tôi mà tôi muốn hợp nhất.
bmoussea

Câu trả lời:


5

Tôi thấy từ các thẻ của bạn rằng bạn đang chạy ArcGIS 10. Tôi đã sử dụng phương pháp sau cho một tác vụ tương tự:

1) Sử dụng Multipart để một phần

2) Sử dụng Unsplit

Để làm việc này (nghĩa là bạn có các dòng theo đúng thứ tự), bạn có thể cần phải ngắt dòng thành các điểm kết thúc cấu thành và sau đó thay đổi hướng dựa trên một thuộc tính (ví dụ 1 = start, 2 = end) - bạn có thể sử dụng điều này để chỉ kết nối có điều kiện những điểm khác nhau (Nếu 1 + 2 thì tạo các đường kết nối).

Nếu bạn đang làm việc với IDE, mã để thực hiện việc này khá dài, nhưng tôi sẽ cố gắng hết sức để giúp bạn nếu bạn có câu hỏi cụ thể.


1
"Unsplit Line" yêu cầu giấy phép ArcInfo. Nếu bạn không có cấp giấy phép này thì hãy sử dụng "Hòa tan", nó có tùy chọn Unsplit Line.
klewis

1

Tôi đã phải làm chính xác như vậy trong một thời gian trước khi sử dụng AV 3.x và Avenue. Tôi đã xem nhanh mã nhưng không thể tìm thấy nó. Nếu tôi nhớ chính xác thì logic đã diễn ra như sau: (Tôi cũng có các điểm dừng xe buýt và thiết bị đầu cuối như một shapefile điểm khác để tôi có thể xác định phần bắt đầu và kết thúc):

  1. Tạo một đa tuyến trống để nhận các phần được sắp xếp. Hãy gọi nó là 'đa tuyến được sắp xếp'
  2. Để có được phần đầu tiên:

    2a. Lấy phần gần nhất để bắt đầu terminal

    2b. Lấy khoảng cách của nút bắt đầu và kết thúc của phần này đến thiết bị đầu cuối bắt đầu. Nếu đỉnh bắt đầu là đỉnh gần nhất, hãy thêm phần này vào 'đa tuyến được sắp xếp'. Nếu nó kết thúc - FLIP nó và sau đó thêm nó.

  3. Để có được phần giữa và phần cuối, hãy bắt đầu với phần (polyline) mà bạn đã tạo ở bước trước và trong vòng lặp while (true), bắt đầu so sánh khoảng cách giữa nút cuối của phần đầu tiên với phần khác trong đầu vào đa tuyến. Phần gần nhất là 'phần tiếp theo'. So sánh khoảng cách của nút bắt đầu và kết thúc của phần tiếp theo để xác định xem có nên lật nó hay không trước khi thêm nó vào 'đa tuyến được sắp xếp'
  4. Thoát khỏi vòng lặp khi số phần trong 'đa tuyến được sắp xếp' giống như trong đa tuyến đầu vào.

... hoặc điều tương tự! :-)

Hãy cho tôi biết nếu điều này có ý nghĩa với bạn và tôi có thể đi tìm mã Avenue ban đầu của mình.


1

Tôi đã làm việc trong một dự án tương tự như thế này, tôi đã sử dụng ArcObjects. Mục tiêu của tôi là kết nối hai polylines liền kề nếu một trong những điểm cuối của nó là điểm bắt đầu của một người khác để biến hai polylines ngắn thành một polyline duy nhất. Quá trình của tôi là:

1. Dictionary<PointKey, FeatureDataList> polylineDictionary;
  • PointKey là một lớp có chứa một điểm.
  • FeatureDataList là một lớp có chứa Danh sách IFeatures.
  • Cả hai lớp đều ghi đè các phương thức "Bằng" và "GetHashCode".

    Dictionary<PointKey, FeatureDataList> ToPointDictionary;
    Dictionary<PointKey, FeatureDataList> FromPointDictionary;
    public void CreateDictionary(IFeatureLayer featureLayer)
    {
        var featureFunctionality = new FeatureFunctionality();
        List<IFeature> features = GetAllFeatures(featureLayer.FeatureClass);
    
        foreach (var feature in features)
        {
            IPolyline polyline = GetPolylineFromFeature(feature);
            AddFeatureInDictionary(ToPointDictionary, feature, polyline.ToPoint);
            AddFeatureInDictionary(FromPointDictionary, feature, polyline.FromPoint);
        }
    }
    
    
    
    void AddFeatureInDictionary(Dictionary<PointKey, FeatureDataList> polylineDictionary, IFeature feature, IPoint point)
    {
        FeatureDataList featureDataList;
        PointKey key = PointKey.GetKey(point);
        if (!polylineDictionary.ContainsKey(key))
        {
            featureDataList = new FeatureDataList();
            featureDataList.Add(feature);
            polylineDictionary.Add(key, featureDataList);
        }
        else
        {
            featureDataList = polylineDictionary[key];
            featureDataList.Add(feature);
        }
    }
    

Bằng các quá trình này, tôi đã thực hiện hai từ điển. Sau khi tạo từ điển, tôi kiểm tra xem cả hai từ điển có cùng một điểm và trong cả hai từ điển, khóa đó chỉ có một tính năng trong danh sách tính năng, sau đó tôi đã tạo một đa tuyến mới với hai polylines đó và xóa hai polylines ngắn.

Để nối hai polylines thành một:

   private IPolyline GetJoinedPolylineFromFeatures(List<IFeature> features)
   {
        IPolyline newPolyline = null;
        if (features.Count == 2)
        {
            IPolyline polyline1 = feature1.Shape as IPolyline;
            IPolyline polyline2 = feature2.Shape as IPolyline;
            if (PointKey.GetKey(polyline1.ToPoint).Equals(PointKey.GetKey(polyline2.FromPoint)))
            {
                var topoOperator2 = polyline1 as ITopologicalOperator2;
                if (topoOperator2 != null)
                    newPolyline = topoOperator2.Union(polyline2) as IPolyline;
            }
            else if (PointKey.GetKey(polyline1.FromPoint).Equals(PointKey.GetKey(polyline2.ToPoint)))
            {
                var topoOperator2 = polyline2 as ITopologicalOperator2;
                if (topoOperator2 != null)
                    newPolyline = topoOperator2.Union(polyline1) as IPolyline;
            }
        }
        return newPolyline;
  }

1

Tôi đã có chính xác vấn đề tương tự do các bản cập nhật tôi đã thực hiện cho các tuyến xe buýt bằng Công cụ "Tính năng định hình lại". Hòa tan, Hợp nhất và Unsplit không hoạt động vì các tính năng nhiều phần không trùng nhau.

Nếu bây giờ bạn chưa nhận thấy điều này, hãy xem xét kỹ hơn các đỉnh phải trùng giữa các tính năng nhiều phần của bạn. Mở rộng, cắt hoặc định hình lại khi cần thiết và sau đó sử dụng bất kỳ công cụ nào được nêu ở trên.


Ồ, và nhân tiện: Bằng cách "nhìn gần hơn", ý tôi là RẤT RẤT ĐÓNG.
Áp-ra-ham

1
Tôi đã có cùng một vấn đề và đã xem xét kỹ hơn rất nhiều về các đỉnh cuối của phần như Áp-ra-ham gợi ý. Trên thực tế, chúng không được kết nối. Bật snappoint endpoint và snap các đỉnh kết thúc với nhau, vấn đề đã được giải quyết .. đối với tôi anyhoo.
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.