So sánh các dòng tương tự và các lớp cập nhật


16

Ở đây có hai lớp với sự thể hiện của các đường phố và ý tưởng là: Chúng tôi muốn cập nhật lớp gần đây nhất (với đường màu đỏ) với một số dữ liệu được lưu trữ trong lớp kia (màu xanh nhạt), nhưng các lớp này là tương tự ở vị trí Địa lý có thể rất gần và xa hơn một chút tùy thuộc vào vị trí trên bản đồ và chỉ có một thuộc tính khớp trong trường hợp một dòng giống nhau trong một dòng khác (codlog x codlog5).

Các lớp Qgis.

Ví dụ: Ở giữa hình ảnh, có một hình vuông ở cả hai lớp, nhưng tôi phải làm thế nào để nhận ra cái màu xanh giống như cái màu xanh lá cây và cập nhật lớp gần đây?

Tôi làm nó như thế nào? Có plugin hay công cụ nào giúp được không?


Bạn muốn cập nhật lớp màu đỏ với các thuộc tính từ lớp màu xanh hoặc với các tính năng bổ sung từ lớp màu xanh?
dmh126

Các thuộc tính. Tình huống: Lớp màu đỏ chứa các cột (a, b, c, d) và lớp màu xanh là các cột (d, e, f). Tôi muốn thêm vào lớp màu đỏ các cột (e, f) từ lớp khác và kết quả của nó phù hợp.
Jhonatan Oliveira

Có một số tài liệu ở đây cho một plugin conflation. Không chắc chắn nếu sự phát triển đã được hoàn thành.
Barbarossa

1
bạn đã thử nhảy chưa?
radouxju 16/07/2015

Nhưng cột "d" của dòng blu và "d" của màu đỏ là một id chung duy nhất? Chúng chứa gì?
Sergio

Câu trả lời:


6

Đây là một câu hỏi hay, tôi đã phải làm một cái gì đó tương tự gần đây nhưng với một bộ dữ liệu nhỏ hơn nhiều, vì vậy tôi có thể sử dụng một giao điểm đơn giản với một số kiểm tra chất lượng hình ảnh bổ sung và nó vẫn ổn.

Nhưng đây là một ý tưởng cho việc này, mặc dù tôi không có mã, và đó là một quá trình nặng nề. Chắc chắn kiểm tra với một mẫu từ bộ dữ liệu đầy đủ đầu tiên. Bạn có thể có thể một số mã hữu ích xung quanh đây. (Phần lõm có một chút kỳ lạ bên dưới.):

  1. lấy bộ hình học tốt (nơi bạn muốn có các thuộc tính kết thúc) và tạo bộ đệm của nó *

  2. Lặp lại qua từng tính năng của bộ đệm:

    2a. tính toán định hướng chung của tính năng (max_y - min_y / max_x - min_x hoặc đại loại như thế)

    2b. thực hiện lựa chọn theo truy vấn vị trí trên lớp khác bằng tính năng này

    1. bạn sẽ có nhiều hơn một tính năng phù hợp với lựa chọn theo truy vấn vị trí, vì vậy hãy lặp qua các tính năng được chọn này và tính toán hướng của từng tính năng

    2. lấy các thuộc tính từ bất kỳ tính năng nào có định hướng gần nhất với tính năng của bộ đệm.

* Tôi sẽ bắt đầu với một khoảng cách rất nhỏ (một đơn vị bản đồ hoặc thứ gì đó) và sau đó chạy quy trình này với khoảng cách ngày càng tăng, cẩn thận không ghi đè lên bất kỳ thuộc tính nào mà bạn đã chuyển.

** Bạn thực sự có thể từ bỏ việc tạo các tính năng bộ đệm và chỉ cần chọn theo truy vấn vị trí với khoảng cách bộ đệm trong đó. Tôi không quen thuộc lắm với QGIS, nhưng tôi chắc chắn bạn sẽ có thể làm điều đó.

Không có cách nào điều này sẽ hoạt động hoàn hảo cho tất cả các tính năng của bạn, nhưng đó là một sự khởi đầu, và sau đó nó bắt đầu phát triển một chiến lược QA / QC tốt để kiểm tra và hoàn thành việc chuyển tiền.

EDIT Suy nghĩ về điều này nhiều hơn, đây là một ví dụ cơ bản sẽ phá vỡ hoàn toàn hệ thống nếu bạn bắt đầu với khoảng cách bộ đệm rất nhỏ và chọn tính năng có hướng phù hợp nhất như tôi khuyên:

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

Các thuộc tính từ dòng màu đỏ sai sẽ được thực hiện. Để tránh điều này, bạn có thể muốn tạo một số loại dung sai và chỉ lấy các thuộc tính của tính năng nếu hướng của nó (khi so sánh với hướng của tính năng màu xanh ban đầu) nằm trong dung sai đó.

EDIT 2 Rất tiếc, đây có phải là đa giác không? Tôi đoán tôi chỉ cho rằng chúng là các đường trên nền màu xám. Nếu chúng là đa giác, tôi thực sự không biết liệu khái niệm định hướng này có tốt không. Nhưng bạn có thể chọn tất cả các tính năng giao nhau và tìm ra tính năng nào trùng lặp nhất (chạy công cụ loại Liên minh, sau đó sử dụng đa giác với diện tích lớn nhất ...).


Logic đó là âm thanh. Tôi đã sử dụng một cách tiếp cận tương tự trong C # / ArcObjects để sao chép các thuộc tính từ một tập dữ liệu không chính xác với các thuộc tính sang một tập dữ liệu chính xác mà không có thuộc tính ... đúng 95%. Kiểm tra / sửa chữa thủ công là cần thiết trong các khu vực chật hẹp nhưng chắc chắn là nhanh hơn so với thực hiện thủ công.
Michael Promotionson

2

Nếu bạn muốn thêm một số thuộc tính từ lớp màu đỏ sang lớp màu xanh và một thuộc tính phổ biến trong cả hai lớp, bạn phải sử dụng Thêm Vector Tham gia .

Tôi đã viết về điều đó ở đây .

  1. Nhấp chuột phải vào lớp shapefile màu đỏ của bạn trên Bảng điều khiển lớp và chọn Thuộc tính .
  2. Sau đó vào tab Joins .
  3. Nhấn nút + , nó sẽ tạo ra sự tham gia mới.
  4. Lớp tham gia là lớp shapefile màu đỏ của bạn. Trường tham gia là trường với các giá trị chung trong cả hai. Trường mục tiêu là trường bạn muốn tham gia từ lớp màu xanh.
  5. Sau đó, bạn sẽ nhận được một thuộc tính mới trong bảng shapefiles của bạn.

Đó là nó.

Ở đây bạn có một ví dụ với ảnh chụp màn hình.


1

Tôi rất thích câu trả lời từ @ dmh126 vì phương pháp của anh ấy cho phép lớp red_line của bạn được cập nhật khá dễ dàng.

Chỉ cần thêm một lựa chọn thay thế, bạn có thể sử dụng công cụ bảng thuộc tính Tham gia từ Hộp công cụ xử lý và chọn các lớp của bạn với trường chung. Lưu ý rằng phương pháp này tạo ra một shapefile mới thay vì cập nhật một phương thức hiện có:

Tham gia bảng thuộc tính


0

Nếu bạn có một số ID duy nhất trong cả hai lớp mà bạn có thể sử dụng để dễ dàng nối các giá trị với lớp mới từ lớp cũ, thì đó là miếng bánh. Nhưng điều này không giống như trường hợp đó.

Nếu không, nó là vấn đề khá khó khăn. Tôi tự hỏi tại sao bình luận từ user49584 đề nghị sử dụng OpenJUMP và plugin http://www.vividsolutions.com/products.asp?catg=spaapp&code=roadmatcher không được đăng thay vì câu trả lời vì nó nghe hoàn toàn hợp pháp với tôi trong trường hợp này.

Nếu không, tôi không nghĩ rằng bạn có thể làm điều này mà không cần một số mã hóa. Với QGIS, bạn có thể sử dụng một cách dễ dàng và khi kết hợp bộ đệm và giao nhau, bạn sẽ có thể thực hiện một số kiểm tra tự động quan trọng.

Một cách tiếp cận có thể là so sánh một số vùng đệm màu đỏ hợp lý với các đường màu xanh lam và nhận các thuộc tính và tỷ lệ phù hợp với mức độ phù hợp của nó. Trong mã giả:

for r_line in red_lines:
  r_line_buf = r_line.buffer()
  intersecting_b_lines = []
  for b_line in blue_lines:
    if r_line_buf.intersects(b_line):
      intersect_length = calculateIntersectionLength(r_line_buf,b_line)
      b_line_values = getAttributes(b_line)
      intersecting_b_lines.append((b_line_values,intersect_length))
  b_line_best_fit = findLongestLineWithinIntersected(intersecting_b_lines)
  r_line_length = r_line.length
  b_vs_r_line_ratio = compareLength(r_line_length,b_line_best_fit)
  saveToNewColumns(r_line, b_line_best_fit.Atribute1, b_line_best_fit.Atribute2..., b_vs_r_line_ratio)
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.