Bắt các thuộc tính điểm chạm chạm trở lại lớp đường bằng cách sử dụng QGIS?


12

Tôi đang sử dụng QGIS 2.14.4-Essen. Tôi có hai lớp:

  • points.shp có chứa các điểm với cột NĂM
  • lines.shp có chứa các đường kết nối chính xác các điểm từ points.shp

Tôi muốn lấy thuộc tính NĂM từ points.shp trở lại lines.shp. Mỗi dòng là một phân đoạn duy nhất với một điểm ở mỗi đầu (xem hình bên dưới). Những gì tôi muốn nhận được là NĂM ​​từ điểm đầu tiên và NĂM ​​từ điểm thứ hai trở lại vào từng thuộc tính dòng.

Ví dụ: dòng 1 chạm vào điểm đầu tiên với NĂM = 2010 và điểm thứ hai với NĂM = 2011. Tôi muốn lấy lại một cái gì đó như '2010-2011' vào thuộc tính dòng 1. Kết quả sẽ như thế này:

id  | points
----+-----------------
1   | 2010-2011
2   | 2011-2012
3   | 2012-2016

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

Có cách nào để đạt được điều này bằng cách sử dụng QGIS không?

Câu trả lời:


9

Mặc dù câu trả lời @radouxju là hợp lệ, tôi sẽ giải thích chi tiết hơn một chút.

  1. Bạn cần đảm bảo rằng tính năng đa tuyến được phân chia chính xác trên các vị trí điểm.
  2. Sử dụng Join attribute by location. Chọn tính năng đường phân chia tại các vị trí điểm làm lớp mục tiêu - trong trường hợp của tôi, tôi đặt tên cho nó là "phát nổ".
  3. Trong phần tóm tắt, chọn "Tóm tắt tính năng giao nhau". Ở đây, thay vì chạy công cụ hai lần; một lần cho Min và lần khác cho Max, bạn có thể chạy nó một lần và chọn cả Min và Max.

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

  1. Các tập tin ra sẽ có thuộc tính sau:

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

  1. Thêm trường mới của chuỗi loại có tên "Năm" vào shapefile mới từ bước 4.
  2. Sử dụng máy tính Trường và đi đến cập nhật trường hiện có. Chọn "Năm" và viết biểu thức sau:

    to_opes ("MINYEAR2") + '-' + to_opes ("MAXYEAR2")

  3. Thuộc tính đầu ra cuối cùng sẽ trông như thế này:

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

  1. Đầu ra cuối cùng sẽ như thế này:

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


Đây là đầu ra sau khi kiểm tra dữ liệu của bạn:

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

Bảng bên trái là dữ liệu điểm sau khi tạo trường số nguyên kiểu mới và bảng bên phải là sau khi nối dòng với dữ liệu điểm bằng bước 2 đã đề cập ở trên. Sau đó, tôi đã sử dụng các bước 5-6 để tạo dữ liệu cuối cùng.

Cập nhật

Tôi đã cố gắng chuyển đổi trường NĂM từ chuỗi sang số nguyên bằng biểu thức to_int () và nó đã hoạt động. Vì vậy, bạn không cần phải làm thủ công. Tuy nhiên, loại trường nên là loại Integerkhông Integer64. Đảm bảo rằng độ dài trường lên tới 9. Nếu bạn chọn độ dài trường là 10, nó sẽ được chuyển đổi thành Interger64và nó sẽ không hoạt động Interger64. Sau đó, bạn có thể làm theo quy trình từ bước 2-6

Đây là đầu ra cuối cùng sau khi sử dụng biểu thức to_int ():

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

Trong bảng thuộc tính ở trên bên trái, NĂM có kiểu chuỗi và YEAR2 là kiểu số nguyên được chuyển đổi bằng biểu thức to_int (). Bạn có thể thấy trong bảng thuộc tính ở bên phải sau khi làm theo các bước 2-6, tôi đã có MINYEAR2 và MAXYEAR2, sau đó chuyển đổi thành chuỗi trở lại để nối mọi thứ lại với nhau trong trường NĂM.


Cảm ơn rất nhiều! Đó chính xác là những gì tôi đã làm nhiều lần. Tôi đoán rằng các tính năng đa tuyến được phân chia chính xác trên các vị trí điểm vì tôi đã tạo các dòng từ các lớp điểm bằng cách sử dụng plugin Points2One. Bạn có thể thử với tập hợp dữ liệu này không: drive.google.com/file/d/0B7ZweFkkfYgheG92Q29sa0I3LW8/view ? Cảm ơn một lần nữa!
wiltomap

Trường NĂM trong bảng thuộc tính là kiểu chuỗi. Bạn cần thêm một trường số nguyên kiểu mới và nhập số năm theo cách thủ công. Sau khi tạo trường kiểu số nguyên và lưu các chỉnh sửa, hãy xóa trường chuỗi cũ. Sau đó, làm theo quy trình chi tiết trên.
ahmadhanb

Tôi đã cố gắng chuyển đổi trường NĂM từ chuỗi sang số nguyên bằng biểu thức to_int (), nhưng cũng không hoạt động. Khi tôi bước vào năm thủ công, nó hoạt động như mong đợi.
ahmadhanb

Giải thích rõ ràng @ahmadhanb
Shiko

Cảm ơn @ahmadhanb! Thực tế là dữ liệu tôi chia sẻ ở trên là một tập hợp con. Tôi có vài ngàn dòng và điểm vì vậy nhập năm thủ công sẽ khá nhiều công việc! Đây có phải là một lỗi?
wiltomap

5

Khi tham gia điểm tham gia để dòng bạn sẽ có nhiều mối quan hệ. Với "tham gia thuộc tính theo vị trí", bạn sẽ có thể yêu cầu một phương thức tóm tắt nhất định. Trong trường hợp của bạn, làm điều này hai lần: một lần với tối thiểu và một lần với tối đa. Sau đó, bạn có thể nối hai trường trong một trường mới và bạn kết thúc với những gì bạn cần.

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

Trong máy tính trường:

tostring(minYEAR) + '-' + tostring(maxYEAR)

Phương thức này trả về một cột bổ sung có tên COUNTvà chứa giá trị 2cho mỗi dòng. Các tùy chọn Min và Max trả về các thông tin này. Tôi đã chọn lớp dòng là lớp mục tiêu và lớp điểm là lớp tham gia, phải không?
wiltomap

bạn là trường năm số hay văn bản?
radouxju

Các YEARlĩnh vực là số nguyên. Tôi đã cố gắng tạo một cột mới với to_string("YEAR")nhưng kết quả hoàn toàn giống nhau ...
wiltomap

Tôi đã thực hiện một thử nghiệm nhanh để đảm bảo (QGIS 2.8.3) và nó đã hoạt động. Nếu số của bạn là 2, điều đó có nghĩa là bạn có 2 điểm cho mỗi phân đoạn, điều này là chính xác. Nhưng với tôi, tôi có các giá trị thuộc tính TỐI THIỂU TỐI THIỂU trong vectơ dòng mới được tạo bởi phép nối không gian. Tôi không hiểu tại sao nó không hoạt động trong trường hợp của bạn. Bạn có thể thử với một tập tin khác?
radouxju

4

Giả sử cấu trúc liên kết là hoàn hảo, tạo ra một trường 'WKT' với biểu thức

geom_to_wkt( $geometry) 

trong lớp điểm của bạn, bạn có thể sử dụng biểu thức:

min( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))||'-'|| max( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))

trong máy tính trường của lớp ống, tạo một chuỗi văn bản.

  • thuộc tính (tính năng, thuộc tính_name) Trả về giá trị của một thuộc tính được chỉ định từ một tính năng, ở đây, năm của tính năng điểm
    thu được.
  • get_feature (lớp, thuộc tính, giá trị) trả về tính năng đầu tiên của lớp khớp với giá trị thuộc tính đã cho. Ở đây, chúng tôi kiểm tra xem chúng tôi có thể tìm thấy một điểm có cùng tọa độ (ở định dạng WKT) như các
    điểm trên đỉnh bắt đầu và kết thúc của dòng của bạn không.
  • start_point (hình học) trả về nút đầu tiên từ hình học. Đây là đỉnh đầu tiên của dòng của bạn.
  • end_point (hình học) trả về nút cuối cùng từ hình học. Đây là đỉnh cuối cùng của dòng của bạn.
  • geom_to_wkt (hình học) trả về đại diện Văn bản được biết đến (WKT) của hình học. nhập mô tả hình ảnh ở đây

Bạn thậm chí có thể cập nhật nó thành:

CASE
WHEN attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year') = attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year')
THEN attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year')
ELSE min( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))||'-'|| max( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))
END

để hiển thị chỉ một năm nếu hai điểm có cùng năm được kết nối (nhận 200X thay vì 200X-200X).

Ưu điểm chính của phương pháp này là nếu dữ liệu của bạn thay đổi theo điểm của bạn, bạn có thể cập nhật nó rất nhanh chỉ bằng một máy tính trường.
Bạn thậm chí có thể thêm quy tắc này dưới dạng Tự động tạo khi bạn tạo dòng mới.
Chúc mừng

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.