import sys
from qgis.utils import iface
from qgis.core import *
from PyQt4 import QtGui
from PyQt4 import QtCore
FILES_FOLDER_PATH = "C:/Users/PawelW/Desktop/lab3/"
def main():
exercise_1()
exercise_2()
def exercise_1():
clear()
world_layer = load_layer('WORLD_RG/WORLD_RG_10M_2010.shp', "World")
province_layer = load_layer('POL_adm/POL_adm1.shp', 'Province')
country_layer = load_layer('POL_adm/POL_adm2.shp', 'Country')
set_color(world_layer, 15, 163, 42)
set_color(province_layer, 13, 76, 212)
set_color(country_layer, 232, 5, 5)
set_transparency(country_layer, 0.8)
province_layer.selectAll()
iface.mapCanvas().zoomToSelected(province_layer)
def exercise_2():
clear()
province_layer = load_layer('POL_adm/POL_adm1.shp', 'Province')
provinces_list = get_provinces_list(province_layer)
del_area(province_layer)
areas_sizes_list = calculate_areas_size(province_layer)
save_to_file(provinces_list, areas_sizes_list)
def error(info):
print >> sys.stderr, "Error:", info
def load_layer(sub_path, name):
layer = QgsVectorLayer(FILES_FOLDER_PATH + sub_path, name, "ogr")
if not layer.isValid(): error("Layer :" + sub_path + " failed to load!")
QgsMapLayerRegistry.instance().addMapLayer(layer)
layer.setCacheImage(None)
layer.triggerRepaint()
return layer
def clear():
for item in QgsMapLayerRegistry.instance().mapLayers().items():
layer_id = item[1].id()
QgsMapLayerRegistry.instance().removeMapLayer(layer_id)
def set_color(layer, r=0, g=0, b=0):
if r<0.0: r=0
if r>255.0: r=255
if g<0.0: g=0
if g>255.0: g=255
if b<0.0: b=0
if b>255.0: b=255
myRenderer = layer.rendererV2()
mySymbol = myRenderer.symbol()
mySymbol.setColor(QtGui.QColor(r,g,b))
layer.setCacheImage(None)
layer.triggerRepaint()
iface.mapCanvas().refresh()
def set_transparency(layer, tval=0.5):
if tval<0.0: tval=0
if tval>1.0: tval=1
tval = 1.0 - tval
myRenderer = layer.rendererV2()
mySymbol = myRenderer.symbol()
mySymbol.setAlpha(tval)
layer.setCacheImage(None)
layer.triggerRepaint()
iface.mapCanvas().refresh()
def get_provinces_list(layer):
provinces_list = []
provider = layer.dataProvider()
feature_list = provider.getFeatures()
feat = QgsFeature()
while feature_list.nextFeature(feat):
attrs = feat.attributes()
provinces_list.append(attrs[6].encode('utf-8'))
return provinces_list
def del_area(layer, nr=9):
if not layer.isEditable():
layer.startEditing()
res = layer.deleteAttribute( nr )
layer.commitChanges()
def calculate_areas_size(layer):
areas_list = []
if not layer.isEditable():
layer.startEditing()
lProvider = layer.dataProvider()
lProvider.addAttributes([QgsField('AREA', QtCore.QVariant.Double)])
layer.commitChanges()
layer.startEditing()
for feature in layer.getFeatures():
calculator = QgsDistanceArea()
calculator.computeAreaInit()
geometry = feature.geometry()
sum_area = 0
if not geometry.isMultipart():
polygon = geometry.asPolygon()
if len(polygon) > 0:
degrees = calculator.measurePolygon(polygon[0])
area = calculator.convertMeasurement(degrees, QGis.Degrees, QGis.Meters, True)
sum_area += area[0]
else:
multi_polygon = geometry.asMultiPolygon()
for sub_polygon in multi_polygon:
degrees = calculator.measurePolygon(sub_polygon[0])
area = calculator.convertMeasurement(degrees, QGis.Degrees, QGis.Meters, True)
sum_area += area[0]
layer.changeAttributeValue(len(areas_list), 9, sum_area)
areas_list.append(sum_area)
layer.commitChanges()
return areas_list
def save_to_file(names, areas):
result = open(FILES_FOLDER_PATH + 'result.txt', "w+")
result.write("Numer Nazwa Powierzchnia \n")
for i in range(len(names)):
result.write(str(i+1) + ". " + names[i] + " " + str(areas[i]/1000000) + " km kwadratowych\n")
result.close()
if __name__ == '__main__':
main()