Làm cách nào để tạo Atlas dựa trên các thuộc tính điểm?


9

Về cơ bản, tôi muốn tạo ra một tập bản đồ dựa trên một trường phân loại trong một lớp điểm.

tức là tôi có một lớp điểm của các nhà cung cấp dịch vụ chăm sóc trẻ em với lĩnh vực phân loại "Dự phòng". Tôi đã phân loại từng tính năng trong lĩnh vực này với "Câu lạc bộ sau giờ học", "Câu lạc bộ ăn sáng", v.v. và bây giờ tôi muốn tạo ra một bộ bản đồ lặp qua từng danh mục và chỉ hiển thị các điểm cho mỗi loại. Một bản đồ của các câu lạc bộ sau giờ học, một bản đồ của các câu lạc bộ ăn sáng, vv Các khu vực có thể khác nhau một cách tinh tế.

Tôi có thể làm từng cái một nhưng có vẻ như nên có một cách để tạo ra một tập bản đồ dựa trên mức độ của từng loại? (Tôi cảm thấy mình đang thiếu thứ gì đó rõ ràng :))

Hoặc cách khác là có cách tự động hóa việc tạo ra một lớp đa giác và sử dụng nó như một phạm vi bảo hiểm ẩn cho tập bản đồ?

EDIT: Tôi đã có một chút tiến bộ với điều này - bạn có thể sử dụng kiểu dáng dựa trên quy tắc để bật và tắt các tính năng có liên quan đến tính năng bao phủ bản đồ hiện tại. nó thực sự hoạt động tốt nếu tất cả những gì bạn muốn làm là hiển thị một tập hợp các điểm khác nhau. Bây giờ tôi đang xem việc buộc nó trở lại một bảng màu và huyền thoại phản ứng.


1
Về cơ bản, đây là bản sao của gis.stackexchange.com/questions/155143
Chris W

Cảm ơn Chris - nhưng không chắc chắn nếu nó là. Người ta có vẻ đang hỏi liệu bạn có thể làm một tập bản đồ phụ cho từng khu vực trong tập bản đồ gốc không? ví dụ 4 khu vực mỗi khu vực có 4 trang? (Mặc dù tôi đã đấu tranh để làm theo những gì được yêu cầu)
JonoPatterson 21/07/2015

1
Không, về cơ bản cả hai bạn đều muốn tạo một loạt bản đồ. Sê-ri cho thấy phạm vi bản đồ và thông tin cơ sở giống nhau, nhưng các tính năng khác nhau trong mỗi loại. Nhận xét của tôi ở đó nói về và liên kết để thực hiện nó trong ArcGIS thông qua cái được gọi là truy vấn định nghĩa trang - nghĩa là, mỗi trang trong tập bản đồ / bản đồ có một truy vấn định nghĩa xác định lớp / tính năng nào được hiển thị trên trang đó. Anh ấy muốn một loạt loạt, trong đó bạn chỉ muốn một loạt duy nhất. Tuy nhiên tôi không biết liệu QGIS có cung cấp chức năng như vậy không (tôi nghĩ rằng tôi đã đọc câu trả lời / nhận xét rằng nó không có, nhưng tôi không thể tìm thấy điều đó ngay bây giờ).
Chris W

Ngoài ra, trong trường hợp của bạn, bạn có thể tạo các hộp giới hạn dựa trên phạm vi của từng điểm chia sẻ cùng một thuộc tính và sau đó sử dụng chúng làm tính năng chỉ mục của bạn, nhưng bạn vẫn gặp phải vấn đề tự động bật và tắt các nhóm điểm khác nhau . Ngay cả khi bạn tách chúng thành các lớp riêng biệt, không có một số loại truy vấn định nghĩa, không có cách nào để tắt các điểm đó trên bất kỳ trang nào.
Chris W

Có bạn chết trên. Nó cũng là một sự lặp lại của một gis.stackexchange.com/questions/121802/ - vì vậy tôi có thể phải dùng đến cách làm thủ công.
JonoPatterson 21/07/2015

Câu trả lời:


9

Cuối cùng tôi đã giải quyết vấn đề này cho mục đích của mình vì vậy đây là giải pháp tôi đã đưa ra nếu nó giúp được ai:

Viết một kịch bản python (của tôi ở cuối này) về cơ bản thực hiện điều này:

  1. xác định danh mục duy nhất trong trường điểm quan tâm
  2. đối với mỗi danh mục, chọn tất cả các điểm phù hợp và thiết lập phạm vi của bộ này
  3. cho mỗi phạm vi, tạo một đa giác mới trong lớp phủ bản đồ trống với thuộc tính khóa "CategoryName"

Điều này đã cho tôi lớp phủ bản đồ với một đa giác cho mỗi loại sở thích trông như thế này: Lớp phủ Atlas

Định cấu hình tập bản đồ và trình soạn thảo in như bình thường - chỉ để lại vấn đề tắt và bật các tính năng.

Đối với điều này, đó là một chút thử nghiệm và lỗi để tìm ra bộ tùy chọn chính xác:

  1. Biểu thức bên dưới cho phép bạn nhận được giá trị hiện được giữ trong trường CategoryName cho tính năng tập bản đồ hiện tại

    attribute ($atlasfeature, 'CategoryName') 
    
  2. Sử dụng công cụ này để tạo kiểu dựa trên quy tắc cho lớp điểm dọc theo dòng

    attribute ($atlasfeature, 'CategoryName') = PointCategory AND PointCategory = "RedDots"
    
  3. Tôi cũng có một quy tắc để đảm bảo tất cả những người khác trở nên minh bạch

    attribute ($atlasfeature, 'CategoryName') IS NOT PointCategory
    

Quy tắc hiển thị

Kiểm tra điều này với atlas hoạt động thực sự tốt. Cuối cùng chỉ cần sử dụng cùng một cách tiếp cận để thao tác các nhãn được hiển thị, làm cho các nhãn động và các bảng bộ lọc một cách thích hợp. Việc gõ 'chú thích bộ lọc theo nội dung bản đồ' cũng rất hiệu quả nếu bạn không muốn tất cả các mục chú thích trên tất cả các bản đồ.

Tập bản đồ cuối cùng:

Tính năng dựa trên Atlas

Chỉnh sửa - như đã được yêu cầu, đây là kịch bản của tôi:

    from PyQt4.QtCore import *

#main script----------------------------------------------
    #set up the layer references - you will need to change this
targetlayer=QgsMapLayerRegistry.instance().mapLayer("AtlasExtents20150727154732521")
eylayer = QgsMapLayerRegistry.instance().mapLayer("Early_Years_Providers20150727152919862")

#establish the unique categories 
names = getUniqueAttributes(eylayer, 'Mapping_La')

#get a set of boxes
boxset = getBoundings(eylayer, names)

#ensure layer is emptied, then add bounding boxes
deleteBoxes(targetlayer)
createBoxes(targetlayer, boxset)
 #end main script----------------------------------------------   


 #------functions-------#
#gets unique set of attributes - returns a set()
def getUniqueAttributes(layer, fieldname):
    values = set()
    for feature in layer.getFeatures():
        values.add(feature[fieldname])
    return values

#quickly selects all points on a layer, given a query 
def selectionQuick(layer, queryitem):
    layer.removeSelection ()

    #hardcoded field name
    expr = QgsExpression( "\"Mapping_La\" = '" + queryitem +"'")
    it = layer.getFeatures( QgsFeatureRequest( expr ) )
    ids = [i.id() for i in it]
    layer.setSelectedFeatures( ids )

#for a set of unique items, get bounding boxes 
def getBoundings(layer, itemset):
    bboxes = {}
    for itemname in itemset:
        selectionQuick(layer,itemname)
        box = layer.boundingBoxOfSelected()
        bboxes[itemname] = box
    return bboxes

#for a layer create a bunch of boxes
def createBoxes(layer, boxes):
    id=0
    for boxkey in boxes:
        id = id +1
        box=boxes[boxkey]
        feat = QgsFeature(layer.pendingFields())
        geom = QgsGeometry.fromRect(box)
        feat.setAttribute('id', id)
        #hardcoded field name
        feat.setAttribute('CareType', boxkey)
        feat.setGeometry(geom)
        (res, outFeats) = layer.dataProvider().addFeatures([feat])

def deleteBoxes(layer):
        ids = [f.id() for f in layer.getFeatures()]
        layer.dataProvider().deleteFeatures( ids )

3
@JonoPatterson nếu bây giờ bạn cũng sẽ chia sẻ tập lệnh python của bạn được đề cập trong tài khoản, đây sẽ là câu trả lời hay nhất từ ​​trước đến nay;)
Bernd V.

Ok sẽ làm điều này - mặc dù phần thô của nó đã sẵn sàng nên nó sẽ cần một số điều chỉnh (chưa thực hiện bất kỳ mã hóa nào trong nhiều năm!). Cách tốt nhất để làm điều đó - chỉ cần dán vào một codebox là gì?
JonoPatterson

@JonoPatterson Cảm ơn bạn rất nhiều về kịch bản. Đối với tôi là người mới bắt đầu, điều này có vẻ rất tốt rồi :). Tôi chắc chắn tôi sẽ cần điều này sớm.
Bernd V.

Biểu thức ví dụ của bạn hơi sai - đó phải là "$ atlasfeature", không phải "$ atlasfeatureid"
ndawson
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.