gán và di chuyển trọng tâm đến đa giác của họ


9

Tôi đang sử dụng QGIS 1.8 Lisboa. Sau khi tính toán trọng tâm từ một shapefile đa giác, nếu một số trong số chúng nằm ngoài đường viền đa giác, tôi muốn di chuyển chúng trên đa giác mà chúng đến. Tiêu chí nên không theo tiêu chí vì tôi phải sử dụng chúng để trích xuất tọa độ được sử dụng làm mã nhận dạng của chính đa giác. Do đó, quy trình sẽ xuất ra cùng một vị trí điểm mỗi lần nó chạy cho cùng một đa giác (không phải là vị trí ngẫu nhiên như vị trí được cho bởi hàm "điểm ngẫu nhiên", sẽ cho kết quả mới mỗi lần nó chạy).


1
Âm thanh như hai câu hỏi. Nếu tôi hiểu chính xác, bạn muốn (a) thêm các điểm ngẫu nhiên bên trong một đa giác và (b) cung cấp cho họ hoặc đa giác một ID duy nhất dựa trên điều này. Điều đơn giản nhất mà bạn nghĩ đến (a) là sử dụng các khả năng điểm ngẫu nhiên hiện có trong QGIS và sau đó chỉ giao cắt đám mây điểm đó với đa giác của bạn.
lynxlynxlynx

sử dụng hàm "điểm ngẫu nhiên" thời gian khác nhau với cùng một đa giác dẫn đến kết quả khác nhau (cụ thể là vị trí của các điểm xuất phát từ mỗi đa giác là khác nhau ở mỗi lần sử dụng mới của hàm) và tôi muốn tạo một phương thức mang lại cho tôi luôn luôn cùng một điểm cho đa giác từ nơi tôi có thể trích xuất tọa độ mà tôi muốn sử dụng làm mã nhận dạng cho chính đa giác.
umbe1987

sử dụng công cụ fTools 'true centroid' trong các công cụ hình học - docs.qgis.org/html/en/docs/user_manual/plugins/ trộm
Mapperz

nó chỉ mang lại cho tôi trọng tâm, nhưng điều này cũng có thể nằm ngoài poligon, điều mà tôi phải tránh. Tôi cần di chuyển chúng trên đa giác mà chúng xuất phát, sử dụng hàm như khoảng cách tối thiểu (nhưng tôi không quan tâm đến khoảng cách, tôi muốn nó được di chuyển). Trong một blog khác, ai đó đã bảo tôi sử dụng ST_PointOnSurface của PostGIS (nhưng tôi đang sử dụng QGIS).
umbe1987

2
đây có phải là bản sao của gis.stackexchange.com/questions/50029/ trên bây giờ không?
underdark

Câu trả lời:


7

Bạn có thể sử dụng thư viện python Shapely, cung cấp một chức năng representative_point()được đảm bảo nằm trong đa giác.

Đây là tập lệnh Python có thể chạy trong bảng điều khiển Python của Python. Lớp đa giác mà bạn muốn tạo thuộc tính nên được chọn. Hàm lấy tên của thuộc tính bạn muốn cập nhật. Thuộc tính phải tồn tại trong lớp của bạn, nó phải là kiểu chuỗi và nó phải đủ dài (30 ký tự).

Đây là một ví dụ về các điểm mà thuật toán tìm thấy:

import shapely.wkb

def setIDPoint(attributename):
 layer = qgis.utils.iface.activeLayer()
 provider = layer.dataProvider()
 fields = provider.fields()
 provider.select(provider.attributeIndexes() )
 attributeID = provider.fieldNameIndex(attributename)
 feature = QgsFeature()
 layer.startEditing()
 while provider.nextFeature(feature):
  wkb = feature.geometry().asWkb()
  polygon = shapely.wkb.loads(wkb)
  reprPoint = ','.join([str(polygon.representative_point().x), str(polygon.representative_point().y)] )
  feature.changeAttribute(attributeID, reprPoint)
  layer.updateFeature(feature)
 layer.commitChanges()

Tôi đang cố gắng kiểm tra nó, dường như chính xác những gì tôi đang tìm kiếm. Tôi sẽ cho bạn biết ngay khi tôi chạy nó!
umbe1987

một điều tôi không hiểu về nó là ý của bạn là "nó phải là kiểu chuỗi và nó phải đủ dài (30 ký tự)". Là thư viện này làm việc trực tiếp trên các shpfiles đa giác? Nếu vậy, tôi có nên tạo trường loại chuỗi mới trong Tab Att với ít nhất 30 ký tự không và đây có phải là loại được cập nhật không?
umbe1987

@ user9518: Có, cách viết hàm tại thời điểm bạn phải tự tạo thuộc tính trong bảng và sau đó chỉ chuyển tên của trường cho hàm. Kịch bản cũng có thể dễ dàng được điều chỉnh để tự tạo trường bắt buộc, nếu đó là điều cần thiết.
Jake

Tôi chỉ bỏ lỡ một điều. Có vẻ như bây giờ tôi đang xác định một hàm (hoặc một lớp) bằng cách gõ "def", nhưng sau đó khi tôi kết thúc việc viết kịch bản thì nó không xảy ra gì cả. Làm thế nào cuối cùng tôi có thể có kết quả trong bảng của tôi?
umbe1987

1
Nó hoạt động hoàn hảo !!! Tôi tưởng tượng các tọa độ được viết theo hệ tọa độ của lớp và nếu tôi muốn có các điểm tôi cần tạo một shp với các tọa độ đó, phải không? Nếu bạn ở đây, tôi sẽ cung cấp cho bạn ít nhất 3 loại bia! Cảm ơn bạn rất nhiều vì những nỗ lực của bạn !!!
umbe1987

5

Công cụ centroid ftools có thể đặt centroid bên ngoài đa giác nếu nó lõm.

ST_PointOnSurfacechắc chắn sẽ làm những gì bạn muốn Bạn có thể sử dụng lệnh từ bên trong QGIS nếu bạn đã cài đặt bằng cách sử dụng SPIT để đưa shapefile của bạn vào PostGIS và sau đó sử dụng plugin PGQuery để chạy truy vấn.

Ngoài ra, nếu cài đặt PostGIS là một chút để sử dụng một lần, bạn có thể sử dụng Spatialite từ bên trong QGIS. Sau đó, bạn có thể sử dụng plugin QSpatiaLite để nhập dữ liệu của mình vào SpatiaLite và chạy truy vấn (SpatialLite honors ST_PointOnSurface).


2

khi tôi hiểu đúng về bạn, hãy sử dụng: Vector-> Công cụ nghiên cứu_> Điểm ngẫu nhiên. Bây giờ, chọn trong "Thiết kế lấy mẫu được phân tầng (Đa giác riêng)" giá trị sử dụng từ trường đầu vào và sử dụng trường approriate, cung cấp giá trị số của các điểm, nên được tạo ra cho mỗi đa giác khác nhau


Bạn có ý nghĩa gì với "lĩnh vực thích hợp"? Tôi đã suy nghĩ để sử dụng trọng tâm và sau đó liên kết nó với phần gần nhất của đa giác mà nó đề cập, nếu nó nằm ngoài phác thảo, bằng cách (ví dụ) tính khoảng cách tối thiểu của điểm đó với đa giác gần nhất. Mục đích sau đó là trích xuất tọa độ điểm đó để sử dụng chúng làm mã nhận dạng cụ thể duy nhất của đa giác.
umbe1987

Về cơ bản những gì tôi đang cố gắng làm là gán từng centroid cho đa giác tương đối của nó và di chuyển nó nằm bên trong đa giác của nó (hoặc ít nhất là chạm vào đường biên của nó).
umbe1987

@ user9518: xin lỗi, tôi đã hiểu nhầm câu hỏi của bạn. Tôi nghĩ rằng bạn muốn có một số điểm ngẫu nhiên cụ thể trong mỗi poly, ví dụ 2 điểm fpr poly 1, 10 điểm trong poly2, v.v. do đó, thuật ngữ "trường thích hợp". tất nhiên bạn có thể chọn 1 cho "sử dụng số điểm này" để chỉ tạo một điểm cho mỗi poly. điểm này nằm trong poly hoặc ít nhất chạm vào đường biên của nó. nhưng điểm này vẫn được tìm thấy ngẫu nhiên, vì vậy khi bạn làm lại quy trình, bạn sẽ nhận được các điểm khác :-(
Kurt

1

Plugin realcentroids, có sẵn để cài đặt thông qua Plugins> Manage and Install Plugins làm việc cho tôi trong QGIS 2.2 để tạo các điểm giống như centroid, bị buộc bên trong mỗi đa giác nếu lõm (điểm sẽ nằm rất gần cạnh). Tôi đã thử công cụ Điểm ngẫu nhiên theo đề xuất của Kurt và mặc dù tôi đã chỉ định 1 điểm cho mỗi đa giác, nhưng nó tạo ra hai điểm thay thế. Một nhược điểm nữa là trong hầu hết các trường hợp, các điểm không đại diện cho trọng tâm vì chúng là ngẫu nhiên.

http://www.agt.bme.hu/gis/qgis/realcentroid/

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.