Menghitung warna kotak dalam kotak vektor di QGIS 2.18.5

8

Saya memiliki lapisan dengan banyak bangunan sebagai titik pada peta. Salah satu atribut dari setiap bangunan adalah "download_speed".

Saya ingin meletakkan kotak persegi (100 x 100 meter) di atas peta. Kotak harus berperilaku sebagai berikut:

  1. Alun-alun hanya akan terlihat jika ada setidaknya satu bangunan di alun-alun.

  2. Kotak harus berwarna merah jika tidak ada bangunan di alun-alun yang memiliki di "download_speed"atas 10 (Mbit / dtk).

  3. Alun-alun harus berwarna abu-abu jika beberapa bangunan di alun-alun memiliki di "download_speed"atas 10 (Mbit / s)

  4. Kotak harus berwarna hitam jika semua bangunan di alun-alun memiliki di "download_speed"atas 10 (Mbit / s)

Saya seorang pemula yang lengkap tentang QGIS (dan GIS-software umumnya), tetapi pengguna berpengalaman Python dalam ilmu data.

Hasil akhirnya akan terlihat seperti gambar di bawah ini:

masukkan deskripsi gambar di sini

Roger Markussen
sumber
Selamat datang di GIS SE! Saya punya dua pertanyaan untuk Anda: 1) apakah Anda dapat membuat grid sendiri? Saya tidak melihat kriteria untuk pembuatannya (tentang luasnya, misalnya). 2) Apakah Anda ingin mempertahankan sel yang tidak menyimpan informasi apa pun (yaitu di mana tidak ada bangunan di dalamnya)? Atau mungkin Anda hanya ingin tidak menampilkannya saat menampilkan warna?
mgri
Saya tahu cara membuat vektorgrid dengan Qgis, tapi mungkin cara untuk pergi adalah membuat kotak dengan PyQgis atau cara lain? Saya tidak perlu memelihara kotak tanpa bangunan.
Roger Markussen
Tolong, lihat jawaban saya dan beri tahu saya jika itu sesuai dengan kebutuhan Anda.
mgri
1
Terima kasih banyak @mgri. Ini persis apa yang saya cari :-)
Roger Markussen
Baiklah! Saya senang itu membantu!
mgri

Jawaban:

5

Beberapa waktu lalu saya menulis posting untuk membuat kotak vektor poligon:

Cara menghasilkan kotak vektor poligon di QGIS menggunakan Python

yang mengilhami saya untuk mengusulkan solusi.

Pendekatan saya berulang ke skrip khusus dari Toolbox Pemrosesan (tolong, lihat posting di atas jika Anda tidak tahu bagaimana melakukannya).

Sebagai parameter input, diperlukan:

  • lapisan vektor titik;
  • luasnya grid;
  • jarak horizontal, yaitu panjang sisi horizontal untuk fitur dalam kisi;
  • jarak vertikal, yaitu panjang sisi vertikal untuk fitur dalam kisi.

Dengan asumsi bahwa kecepatan unduhan disimpan di "download_speed"lapangan, Anda dapat menggunakan kode ini:

##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)

Sebagai pengguna Python yang berpengalaman, Anda harus dapat dengan mudah memahami kode di atas dan menyesuaikannya dengan kebutuhan spesifik Anda (jika tidak, beri tahu saya jika Anda memerlukan penjelasan). Satu hal lagi: Saya tidak menguji kondisional untuk penetapan warna secara mendalam, tetapi itu seharusnya menjadi tugas yang mudah bagi Anda.

Menguji kode pada poin acak ini:

masukkan deskripsi gambar di sini

Saya mendapatkan hasil ini:

masukkan deskripsi gambar di sini

yang tampaknya menjadi apa yang Anda cari.

mgri
sumber