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