Tính toán màu sắc của các hình vuông trong lưới vectơ trong QGIS 2.18.5


8

Tôi có một lớp với nhiều tòa nhà như các điểm trên bản đồ. Một trong những thuộc tính của mỗi tòa nhà là "download_speed".

Tôi muốn đặt một lưới vuông (100 x 100 mét) trên bản đồ. Các hình vuông nên hành xử như sau:

  1. Hình vuông chỉ nên được nhìn thấy nếu có ít nhất một tòa nhà trong hình vuông.

  2. Hình vuông phải có màu đỏ nếu không có tòa nhà nào trong hình vuông có "download_speed"trên 10 (Mbit / s).

  3. Hình vuông phải có màu xám nếu một số tòa nhà trong hình vuông có "download_speed"trên 10 (Mbit / s)

  4. Hình vuông phải có màu đen nếu tất cả các tòa nhà trong hình vuông có "download_speed"trên 10 (Mbit / s)

Tôi là một người mới hoàn toàn trên QGIS (và nói chung là phần mềm GIS), nhưng là một người dùng Python có kinh nghiệm về khoa học dữ liệu.

Kết quả cuối cùng sẽ trông giống như hình dưới đây:

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


Chào mừng bạn đến với GIS SE! Tôi có hai câu hỏi cho bạn: 1) bạn có thể tự tạo lưới không? Tôi không thấy bất kỳ tiêu chí nào cho sự sáng tạo của nó (ví dụ về mức độ). 2) Bạn có muốn duy trì các ô không lưu trữ bất kỳ thông tin nào không (ví dụ: nơi không có tòa nhà bên trong chúng)? Hoặc có thể bạn chỉ muốn không hiển thị chúng khi hiển thị màu sắc?
mgri

Tôi biết làm thế nào để tạo ra một vectorgrid với Qgis, nhưng có lẽ cách để đi là tạo ra các hình vuông với PyQgis hoặc một số cách khác? Tôi không phải duy trì các ô vuông mà không có các tòa nhà.
Roger Markussen

Xin vui lòng, xem câu trả lời của tôi và cho tôi biết nếu nó phù hợp với nhu cầu của bạn.
mgri

1
Cảm ơn rất nhiều @mgri. Đây chính xác là những gì tôi đang tìm kiếm :-)
Roger Markussen

ồ Tôi rất vui vì nó hữu ích!
mgri

Câu trả lời:


5

Cách đây một thời gian, tôi đã viết một bài đăng để tạo ra một lưới vectơ đa giác:

Cách tạo lưới vectơ đa giác trong QGIS bằng Python

đã truyền cảm hứng cho tôi để đề xuất một giải pháp.

Cách tiếp cận của tôi lặp lại tập lệnh tùy chỉnh từ Hộp công cụ xử lý (vui lòng tham khảo bài viết trên nếu bạn không biết cách thực hiện).

Là tham số đầu vào, nó yêu cầu:

  • lớp vectơ điểm;
  • phạm vi của lưới điện;
  • khoảng cách ngang, tức là chiều dài cạnh ngang cho các tính năng trong lưới;
  • khoảng cách dọc, tức là chiều dài cạnh dọc cho các tính năng trong lưới.

Giả sử tốc độ tải xuống được lưu trữ trong "download_speed"trường, bạn có thể sử dụng mã này:

##Point_layer=vector point
##Grid_extent=extent
##Horizontal_spacing=number 10
##Vertical_spacing=number 10

from qgis.core import *
from qgis.PyQt.QtCore import QVariant
from PyQt4.QtGui import QColor

layer = processing.getObject(Point_layer)
crs = layer.crs().toWkt()

extent = Grid_extent.split(',')
(xmin, xmax, ymin, ymax) = (float(extent[0]), float(extent[1]), float(extent[2]), float(extent[3]))
hspacing = Horizontal_spacing
vspacing = Vertical_spacing

# Create the grid layer
vector_grid = QgsVectorLayer('Polygon?crs='+ crs, 'vector_grid' , 'memory')
prov = vector_grid.dataProvider()

all_features = {}
index = QgsSpatialIndex() # Spatial index
for ft in layer.getFeatures():
    index.insertFeature(ft)
    all_features[ft.id()] = ft

# Add ids and coordinates fields
fields = QgsFields()
fields.append(QgsField('ID', QVariant.Int, '', 10, 0))
fields.append(QgsField('XMIN', QVariant.Double, '', 24, 6))
fields.append(QgsField('XMAX', QVariant.Double, '', 24, 6))
fields.append(QgsField('YMIN', QVariant.Double, '', 24, 6))
fields.append(QgsField('YMAX', QVariant.Double, '', 24, 6))
fields.append(QgsField('Color', QVariant.String, '', 10))
prov.addAttributes(fields)

# Generate the features for the vector grid
id = 0
y = ymax
while y >= ymin:
    x = xmin
    while x <= xmax:
        point1 = QgsPoint(x, y)
        point2 = QgsPoint(x + hspacing, y)
        point3 = QgsPoint(x + hspacing, y - vspacing)
        point4 = QgsPoint(x, y - vspacing)
        vertices = [point1, point2, point3, point4] # Vertices of the polygon for the current id
        inAttr = [id, x, x + hspacing, y - vspacing, y]
        tmp_geom = QgsGeometry().fromPolygon([vertices])
        idsList = index.intersects(tmp_geom.boundingBox())
        if idsList:
            tmp_list = [all_features[id]['download_speed'] for id in idsList]
            if max(tmp_list) <= 10:
                inAttr.append('Red')
            elif min(tmp_list) > 10:
                inAttr.append('Black')
            else:
                inAttr.append('Grey')
            feat = QgsFeature()
            feat.setGeometry(tmp_geom) # Set geometry for the current id
            feat.setAttributes(inAttr) # Set attributes for the current id
            prov.addFeatures([feat])
            id += 1
        x = x + hspacing
    y = y - vspacing

# Update fields for the vector grid
vector_grid.updateFields()

# define the lookup: value -> (color, label)
speeds_colors = {'Red': ('#e31a1c', 'Red'), 'Black': ('#000000', 'Black'), 'Grey': ('#82807f', 'Grey'),}

# create a category for each item in speeds_colors
categories = []
for speed_color, (color, label) in speeds_colors.items():
    symbol = QgsSymbolV2.defaultSymbol(vector_grid.geometryType())
    symbol.setColor(QColor(color))
    category = QgsRendererCategoryV2(speed_color, symbol, label)
    categories.append(category)
print categories
# create the renderer and assign it to the layer
expression = 'Color' # field name
renderer = QgsCategorizedSymbolRendererV2(expression, categories) # categorized symbol renderer
vector_grid.setRendererV2(renderer) # assign the renderer to the layer
vector_grid.triggerRepaint()

# Add the layer to the Layers panel
QgsMapLayerRegistry.instance().addMapLayer(vector_grid)

Là một người dùng Python có kinh nghiệm, bạn sẽ có thể dễ dàng hiểu được đoạn mã trên và điều chỉnh nó theo nhu cầu cụ thể của bạn (nếu không, hãy cho tôi biết nếu bạn cần bất kỳ lời giải thích nào). Một điều nữa: Tôi đã không kiểm tra sâu sắc các điều kiện cho việc gán màu, nhưng nó sẽ là một nhiệm vụ dễ dàng cho bạn.

Kiểm tra mã trên các điểm ngẫu nhiên này:

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

Tôi có được kết quả này:

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

đó dường như là những gì bạn đang tìm kiếm.

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.