Facebook
From Emerald Wolf, 4 Years ago, written in Python.
This paste is a reply to moje from ja - view diff
Embed
Download Paste or View Raw
Hits: 225
  1. import sys
  2. from qgis.utils import iface
  3. from qgis.core import *
  4. from PyQt4 import QtGui
  5. from PyQt4 import QtCore
  6.  
  7. FILES_FOLDER_PATH = "C:/Users/PawelW/Desktop/lab3/"
  8.  
  9. def main():
  10.     exercise_1()
  11.     exercise_2()
  12.  
  13. def exercise_1():
  14.     clear()
  15.     world_layer = load_layer('WORLD_RG/WORLD_RG_10M_2010.shp', "World")
  16.     province_layer = load_layer('POL_adm/POL_adm1.shp', 'Province')
  17.     country_layer = load_layer('POL_adm/POL_adm2.shp', 'Country')
  18.     set_color(world_layer, 15, 163, 42)
  19.     set_color(province_layer, 13, 76, 212)
  20.     set_color(country_layer, 232, 5, 5)
  21.     set_transparency(country_layer, 0.8)
  22.     province_layer.selectAll()
  23.     iface.mapCanvas().zoomToSelected(province_layer)
  24.  
  25. def exercise_2():
  26.     clear()
  27.     province_layer = load_layer('POL_adm/POL_adm1.shp', 'Province')
  28.     provinces_list = get_provinces_list(province_layer)
  29.     del_area(province_layer)
  30.     areas_sizes_list = calculate_areas_size(province_layer)
  31.     save_to_file(provinces_list, areas_sizes_list)
  32.  
  33. def error(info):
  34.     print >> sys.stderr, "Error:", info
  35.  
  36. def load_layer(sub_path, name):
  37.     layer = QgsVectorLayer(FILES_FOLDER_PATH + sub_path, name, "ogr")
  38.     if not layer.isValid(): error("Layer :" + sub_path + " failed to load!")
  39.     QgsMapLayerRegistry.instance().addMapLayer(layer)
  40.     layer.setCacheImage(None)
  41.     layer.triggerRepaint()
  42.     return layer
  43.  
  44. def clear():
  45.     for item in QgsMapLayerRegistry.instance().mapLayers().items():
  46.         layer_id = item[1].id()
  47.         QgsMapLayerRegistry.instance().removeMapLayer(layer_id)
  48.        
  49. def set_color(layer, r=0, g=0, b=0):
  50.     if r<0.0: r=0
  51.     if r>255.0: r=255
  52.     if g<0.0: g=0
  53.     if g>255.0: g=255
  54.     if b<0.0: b=0
  55.     if b>255.0: b=255
  56.     myRenderer = layer.rendererV2()
  57.     mySymbol = myRenderer.symbol()
  58.     mySymbol.setColor(QtGui.QColor(r,g,b))
  59.     layer.setCacheImage(None)
  60.     layer.triggerRepaint()
  61.     iface.mapCanvas().refresh()
  62.  
  63. def set_transparency(layer, tval=0.5):
  64.     if tval<0.0: tval=0
  65.     if tval>1.0: tval=1
  66.     tval = 1.0 - tval
  67.     myRenderer = layer.rendererV2()
  68.     mySymbol = myRenderer.symbol()
  69.     mySymbol.setAlpha(tval)
  70.     layer.setCacheImage(None)
  71.     layer.triggerRepaint()
  72.     iface.mapCanvas().refresh()
  73.  
  74. def get_provinces_list(layer):
  75.     provinces_list = []
  76.     provider = layer.dataProvider()
  77.     feature_list = provider.getFeatures()
  78.     feat = QgsFeature()
  79.     while feature_list.nextFeature(feat):
  80.         attrs = feat.attributes()
  81.         provinces_list.append(attrs[6].encode('utf-8'))
  82.     return provinces_list
  83.  
  84. def del_area(layer, nr=9):
  85.     if not layer.isEditable():
  86.         layer.startEditing()
  87.     res = layer.deleteAttribute( nr )
  88.     layer.commitChanges()
  89.  
  90. def calculate_areas_size(layer):
  91.     areas_list = []
  92.     if not layer.isEditable():
  93.         layer.startEditing()
  94.     lProvider = layer.dataProvider()
  95.     lProvider.addAttributes([QgsField('AREA', QtCore.QVariant.Double)])
  96.     layer.commitChanges()
  97.     layer.startEditing()
  98.     for feature in layer.getFeatures():
  99.         calculator = QgsDistanceArea()
  100.         calculator.computeAreaInit()
  101.         geometry = feature.geometry()
  102.         sum_area = 0
  103.         if not geometry.isMultipart():
  104.             polygon = geometry.asPolygon()
  105.             if len(polygon) > 0:
  106.                 degrees = calculator.measurePolygon(polygon[0])
  107.                 area = calculator.convertMeasurement(degrees, QGis.Degrees, QGis.Meters, True)
  108.                 sum_area += area[0]
  109.         else:
  110.             multi_polygon = geometry.asMultiPolygon()
  111.             for sub_polygon in multi_polygon:
  112.                 degrees = calculator.measurePolygon(sub_polygon[0])
  113.                 area = calculator.convertMeasurement(degrees, QGis.Degrees, QGis.Meters, True)
  114.                 sum_area += area[0]
  115.         layer.changeAttributeValue(len(areas_list), 9, sum_area)
  116.         areas_list.append(sum_area)
  117.     layer.commitChanges()
  118.     return areas_list
  119.  
  120. def save_to_file(names, areas):
  121.     result = open(FILES_FOLDER_PATH + 'result.txt', "w+")
  122.     result.write("Numer            Nazwa         Powierzchnia  \n")
  123.  
  124.     for i in range(len(names)):
  125.         result.write(str(i+1) + ".  " + names[i] + "   " + str(areas[i]/1000000) + " km kwadratowych\n")
  126.     result.close()
  127.  
  128. if __name__ == '__main__':
  129.     main()
  130.  
  131.