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:
Tôi có được kết quả này:
đó dường như là những gì bạn đang tìm kiếm.