Esempio n. 1
0
    def __init__(self, iface):
        # Save reference to the QGIS interface
        self.iface = iface
        # Create the dialog and keep reference
        self.dlg = RasterisePolygonsDialog()
        # initialize plugin directory
        self.plugin_dir = QFileInfo(QgsApplication.qgisUserDbFilePath()).path(
        ) + "/python/plugins/rasterisepolygons"
        # initialize locale
        localePath = ""
        locale = QSettings().value("locale/userLocale").toString()[0:2]

        if QFileInfo(self.plugin_dir).exists():
            localePath = self.plugin_dir + "/i18n/rasterisepolygons_" + locale + ".qm"

        if QFileInfo(localePath).exists():
            self.translator = QTranslator()
            self.translator.load(localePath)

            if qVersion() > '4.3.3':
                QCoreApplication.installTranslator(self.translator)
	def __init__(self, iface):
		# Save reference to the QGIS interface
		self.iface = iface
		# Create the dialog and keep reference
		self.dlg = RasterisePolygonsDialog()
		# initialize plugin directory
		self.plugin_dir = QFileInfo(QgsApplication.qgisUserDbFilePath()).path() + "/python/plugins/rasterisepolygons"
		# initialize locale
		localePath = ""
		locale = QSettings().value("locale/userLocale").toString()[0:2]
	   
		if QFileInfo(self.plugin_dir).exists():
			localePath = self.plugin_dir + "/i18n/rasterisepolygons_" + locale + ".qm"

		if QFileInfo(localePath).exists():
			self.translator = QTranslator()
			self.translator.load(localePath)

			if qVersion() > '4.3.3':
				QCoreApplication.installTranslator(self.translator)
Esempio n. 3
0
class RasterisePolygons:
    def __init__(self, iface):
        # Save reference to the QGIS interface
        self.iface = iface
        # Create the dialog and keep reference
        self.dlg = RasterisePolygonsDialog()
        # initialize plugin directory
        self.plugin_dir = QFileInfo(QgsApplication.qgisUserDbFilePath()).path(
        ) + "/python/plugins/rasterisepolygons"
        # initialize locale
        localePath = ""
        locale = QSettings().value("locale/userLocale").toString()[0:2]

        if QFileInfo(self.plugin_dir).exists():
            localePath = self.plugin_dir + "/i18n/rasterisepolygons_" + locale + ".qm"

        if QFileInfo(localePath).exists():
            self.translator = QTranslator()
            self.translator.load(localePath)

            if qVersion() > '4.3.3':
                QCoreApplication.installTranslator(self.translator)

    def initGui(self):
        # Create action that will start plugin configuration
        self.action = QAction(QIcon(":/plugins/rasterisepolygons/icon.png"), \
         u"Rasterise Polygons", self.iface.mainWindow())
        # connect the action to the run method
        QObject.connect(self.action, SIGNAL("triggered()"), self.run)
        QObject.connect(self.dlg.ui.polygonsChooseFromFilePushButton,
                        SIGNAL("clicked()"), self.openPolygons)
        QObject.connect(self.dlg.ui.backgroundLayerChooseFromFilePushButton,
                        SIGNAL("clicked()"), self.openBackgroundLayer)

        QObject.connect(self.dlg.ui.backgroundLayerChooseFromFileRadioButton,
                        SIGNAL("toggled(bool)"),
                        self.toggleBackgroundLayerChooseFromFile)
        QObject.connect(self.dlg.ui.backgroundLayerChooseFromLayerRadioButton,
                        SIGNAL("toggled(bool)"),
                        self.toggleBackgroundLayerChooseFromLayer)
        QObject.connect(self.dlg.ui.singlePolygonLayerRadioButton,
                        SIGNAL("toggled(bool)"), self.toggleSinglePolygonLayer)
        QObject.connect(self.dlg.ui.polygonsChooseFromFileRadioButton,
                        SIGNAL("toggled(bool)"),
                        self.togglePolygonsChooseFromFile)

        # Add toolbar button and menu item
        self.iface.addToolBarIcon(self.action)
        self.iface.addPluginToMenu(u"&Rasterise Polygons", self.action)

    """
	Set up toggle.
	"""

    def toggleBackgroundLayerChooseFromFile(self):
        if self.dlg.ui.backgroundLayerChooseFromFileRadioButton.isChecked():
            self.dlg.ui.backgroundLayerLineEdit.setEnabled(True)
            self.dlg.ui.backgroundLayerChooseFromFilePushButton.setEnabled(
                True)
        else:
            self.dlg.ui.backgroundLayerLineEdit.setEnabled(False)
            self.dlg.ui.backgroundLayerChooseFromFilePushButton.setEnabled(
                False)

    def toggleBackgroundLayerChooseFromLayer(self):
        if self.dlg.ui.backgroundLayerChooseFromLayerRadioButton.isChecked():
            self.dlg.ui.backgroundLayerDropDown.setEnabled(True)
        else:
            self.dlg.ui.backgroundLayerDropDown.setEnabled(False)

    def toggleSinglePolygonLayer(self):
        if self.dlg.ui.singlePolygonLayerRadioButton.isChecked():
            self.dlg.ui.singlePolygonLayerDropDown.setEnabled(True)
        else:
            self.dlg.ui.singlePolygonLayerDropDown.setEnabled(False)

    def togglePolygonsChooseFromFile(self):
        if self.dlg.ui.polygonsChooseFromFileRadioButton.isChecked():
            self.dlg.ui.polygonsChooseFromFileLineEdit.setEnabled(True)
            self.dlg.ui.polygonsChooseFromFilePushButton.setEnabled(True)
        else:
            self.dlg.ui.polygonsChooseFromFileLineEdit.setEnabled(False)
            self.dlg.ui.polygonsChooseFromFilePushButton.setEnabled(False)

    """
	Set up the browse files buttons.
	"""

    def openPolygons(self):
        self.polygonsCaption = QString("Open Polygons Shapefile")
        self.polygonsFilter = QString("Shapefiles (*.shp)")
        self.polygonsFileName = QFileDialog.getOpenFileName(
            caption=self.polygonsCaption, filter=self.polygonsFilter)
        self.dlg.ui.polygonsChooseFromFileLineEdit.setText(
            self.polygonsFileName)

    def openBackgroundLayer(self):
        self.backgroundLayerCaption = QString("Open Background Layer NetCDF")
        self.backgroundLayerFilter = QString("NetCDF Files (*.nc)")
        self.backgroundLayerChooseFileName = QFileDialog.getOpenFileName(
            caption=self.backgroundLayerCaption,
            filter=self.backgroundLayerFilter)
        self.dlg.ui.backgroundLayerLineEdit.setText(
            self.backgroundLayerChooseFileName)

    def getBackgroundValue(self):
        self.backgroundValue = self.dlg.ui.backgroundValueLineEdit.text()

    """
	Get the active canvas layers and establish the drop-down menus.
	"""

    def getActiveLayers(self):
        self.qgisCanvas = qgis.utils.iface.mapCanvas()
        self.activeLayers = self.qgisCanvas.layers()
        return self.activeLayers

    def setDropDownOptions(self):
        self.dlg.ui.singlePolygonLayerDropDown.clear()
        self.dlg.ui.backgroundLayerDropDown.clear()

        for layer in self.activeLayers:
            if '.shp' in str(layer.source()):
                self.dlg.ui.singlePolygonLayerDropDown.addItem(
                    layer.name(), QVariant(str(layer.source())))

        for layer in self.activeLayers:
            if '.nc' in str(layer.source()):
                self.dlg.ui.backgroundLayerDropDown.addItem(
                    layer.name(), QVariant(str(layer.source())))

    """
	Function for retrieving the user selections from the drop-downs.
	"""

    def getDropDownOptions(self):
        self.singlePolygonText = self.dlg.ui.singlePolygonLayerDropDown.currentText(
        )
        self.singlePolygonIndex = self.dlg.ui.singlePolygonLayerDropDown.findText(
            self.singlePolygonText)
        self.singlePolygonFileName = self.dlg.ui.singlePolygonLayerDropDown.itemData(
            self.singlePolygonIndex).toString()

        self.backgroundLayerText = self.dlg.ui.backgroundLayerDropDown.currentText(
        )
        self.backgroundLayerIndex = self.dlg.ui.backgroundLayerDropDown.findText(
            self.backgroundLayerText)
        self.backgroundLayerFileName = self.dlg.ui.backgroundLayerDropDown.itemData(
            self.backgroundLayerIndex).toString()

    """
	Used to retrieve all of the active shapefile layers if the user selects this option.
	"""

    def getAllPolygons(self):
        self.activePolygons = []
        for layer in self.activeLayers:
            if '.shp' in str(layer.source()):
                self.activePolygons.append(
                    [layer.name(), QVariant(str(layer.source()))])

    """
	The actual code. It is broken into three if statements depending on the user's selection. Read the first if for a detailed description, the further 	two use a similar code but with exceptions made for file source etc.
	"""

    def rasterisePolygons(self):
        # Example of system call: gdal_rasterize -a id -ts 270 220 -l boundtest-line-nodes /home/sml110/UROP/QGIS/boundtest-line-nodes.shp
        call = ["gdal_rasterize", "--version"]
        out = subprocess.Popen(call, stdout=subprocess.PIPE)
        result = out.communicate()
        result = result[0]
        result = result.split(",")
        result = result[0][5:-2]
        version = float(result)
        error = False
        if version < 1.8:
            QMessageBox.warning(
                None, "GDAL Error",
                "This plugin requires gdal_rasterize version 1.8.0 or above.")
            error = True

        if error != True:
            try:
                type(eval(str(self.backgroundValue))) == int
                error = False
            except:
                QMessageBox.warning(
                    None, "Value Error",
                    "The background value needs to be an integer.")
                error = True

            if error != True:

                # Depending on user option, open the background NetCDF.
                if self.dlg.ui.backgroundLayerChooseFromLayerRadioButton.isChecked(
                ):
                    try:
                        file = NetCDF.NetCDFFile(
                            str(self.backgroundLayerFileName), 'r')
                        error = False
                    except:
                        QMessageBox.warning(None, "Read Error",
                                            "No NetCDF layer visible.")
                        error = True

                if self.dlg.ui.backgroundLayerChooseFromFileRadioButton.isChecked(
                ):
                    try:
                        file = NetCDF.NetCDFFile(
                            str(self.backgroundLayerChooseFileName), 'r')
                        error = False
                    except:
                        QMessageBox.warning(None, "Read Error",
                                            "No NetCDF file selected.")
                        error = True

                if error != True:
                    # Retrieve the number of columns and rows of the background mesh so the rasterised polygons layers will be of the same resolution.
                    # XY and Lon/lat NetCDF files are slightly different in their file structure hence the two options.
                    try:
                        # If the file is in xy space.
                        if len(file.variables) == 6:
                            cols = str(file.variables['dimension'][0])
                            rows = str(file.variables['dimension'][1])

                        # If the file is in lat/lon.
                        if len(file.variables) == 3:
                            try:
                                cols = str(file.dimensions['lon'])
                                rows = str(file.dimensions['lat'])

                            except:
                                cols = str(file.dimensions['x'])
                                rows = str(file.dimensions['y'])

                        error = False

                    except:
                        QMessageBox.warning(
                            None, "Read Error",
                            "Could not read rows and columns of data source.")
                        error = True

                    if error != True:
                        # Get the extent of x and y min and max so the rasterised polygons will be of the same dimensions.
                        for layer in self.activeLayers:
                            if str(self.backgroundLayerText) in str(
                                    layer.name()):
                                extent = str(layer.extent().toString())

                        minimum = extent.split(':')[0]
                        maximum = extent.split(':')[1]
                        xMin = minimum.split(',')[0]
                        yMin = minimum.split(',')[1]
                        xMax = maximum.split(',')[0]
                        yMax = maximum.split(',')[1]

                        print xMin, xMax, yMin, yMax

                        # Rasterise the given polygons.
                        if error != True:
                            if self.dlg.ui.allVisiblePolygonLayersRadioButton.isChecked(
                            ):
                                try:
                                    self.getAllPolygons()

                                    if len(list(self.activePolygons)) == 0:
                                        error = True
                                        raise ValueError("No active polygons.")

                                    for i in range(
                                            len(list(self.activePolygons))):
                                        saveName = str(
                                            list(self.activePolygons)[i][0])
                                        saveFileName = str(
                                            list(self.activePolygons)[i]
                                            [1].toString())
                                        saveFileNameTif = saveFileName.replace(
                                            ".shp", ".tif")
                                        saveFileNameNC = saveFileName.replace(
                                            ".shp", ".nc")

                                        # Have to rasterise to .tif and then convert to .nc as the .nc format when done directly will not import into QGIS.
                                        # Use initial value of 10000000 otherwise it is set to 0 and therefore when the minimum calculation is carried out in other
                                        # plugins it will not produce the correct results.
                                        subprocess.call(["gdal_rasterize", "-a", "id", "-init", str(self.backgroundValue), "-ts", cols, rows, "-te", \
                                        xMin, yMin, xMax, yMax, "-l", \
                                        saveName, str(list(self.activePolygons)[i][1].toString()), saveFileNameTif])

                                        # Convert into a QGIS-readable .nc.
                                        subprocess.call([
                                            "gdal_translate", "-of", "GMT",
                                            saveFileNameTif, saveFileNameNC
                                        ])

                                        # Get the layer information and import into QGIS.
                                        fileInfo = QFileInfo(saveFileNameNC)
                                        baseName = fileInfo.baseName()
                                        self.iface.addRasterLayer(
                                            saveFileNameNC, baseName)

                                        # Refresh canvas so can change the newly added layer to pseudocolour.
                                        self.qgisCanvas = qgis.utils.iface.mapCanvas(
                                        )
                                        self.activeLayers = self.qgisCanvas.layers(
                                        )

                                        for layer in self.activeLayers:
                                            if saveFileNameNC in str(
                                                    layer.source()):
                                                layer.setDrawingStyle(
                                                    QgsRasterLayer.
                                                    SingleBandPseudoColor)
                                                layer.setColorShadingAlgorithm(
                                                    QgsRasterLayer.
                                                    FreakOutShader)
                                                if hasattr(
                                                        layer,
                                                        "setCacheImage"):
                                                    layer.setCacheImage(None)
                                                layer.triggerRepaint()
                                except ValueError:
                                    QMessageBox.warning(
                                        None, "Read Error",
                                        "No visible polygon layers.")
                                except:
                                    QMessageBox.warning(
                                        None, "Error",
                                        "Unable to rasterise layers. Ensure the NetCDF file is of GMT NetCDF Grid Format."
                                    )

                            # Same operations as above but only for a single polygon.
                            if self.dlg.ui.singlePolygonLayerRadioButton.isChecked(
                            ):
                                try:
                                    fileName = str(self.singlePolygonFileName)
                                    saveFileNameTif = fileName.replace(
                                        ".shp", ".tif")
                                    saveFileNameNC = fileName.replace(
                                        ".shp", ".nc")

                                    try:
                                        subprocess.call(["gdal_rasterize", "-a", "id", "-init", str(self.backgroundValue), "-ts", cols, rows, "-te", xMin, yMin, \
                                       xMax, yMax, "-l", \
                                       str(self.singlePolygonText), str(self.singlePolygonFileName), saveFileNameTif])
                                        error = False
                                    except:
                                        error = True
                                        QMessageBox.warning(
                                            None, "Read Error",
                                            "Unable to rasterise layer. Ensure the NetCDF file is of GMT NetCDF Grid Format."
                                        )
                                    if error != True:
                                        subprocess.call([
                                            "gdal_translate", "-of", "GMT",
                                            saveFileNameTif, saveFileNameNC
                                        ])

                                        fileInfo = QFileInfo(saveFileNameNC)
                                        baseName = fileInfo.baseName()
                                        self.iface.addRasterLayer(
                                            saveFileNameNC, baseName)

                                        self.qgisCanvas = qgis.utils.iface.mapCanvas(
                                        )
                                        self.activeLayers = self.qgisCanvas.layers(
                                        )

                                        for layer in self.activeLayers:
                                            if saveFileNameNC in str(
                                                    layer.source()):
                                                layer.setDrawingStyle(
                                                    QgsRasterLayer.
                                                    SingleBandPseudoColor)
                                                layer.setColorShadingAlgorithm(
                                                    QgsRasterLayer.
                                                    FreakOutShader)
                                                if hasattr(
                                                        layer,
                                                        "setCacheImage"):
                                                    layer.setCacheImage(None)
                                                layer.triggerRepaint()

                                except:
                                    QMessageBox.warning(
                                        None, "Read Error",
                                        "No polygon layer selected.")

                            # And again for if the user selects a .nc from file.
                            if self.dlg.ui.polygonsChooseFromFileRadioButton.isChecked(
                            ):
                                try:
                                    fileName = str(self.polygonsFileName)
                                    if len(filename) == 0:
                                        error = True
                                        raise ValueError

                                    if error != True:
                                        saveFileNameTif = fileName.replace(
                                            ".shp", ".tif")
                                        saveFileNameNC = fileName.replace(
                                            ".shp", ".nc")

                                        subprocess.call(["gdal_rasterize", "-a", "id", "-init", str(self.backgroundValue), "-ts", cols, rows, "-te", xMin, \
                                        yMin, xMax, yMax, \
                                        str(self.polygonsFileName), saveFileNameTif])

                                        subprocess.call([
                                            "gdal_translate", "-of", "GMT",
                                            saveFileNameTif, saveFileNameNC
                                        ])

                                        fileInfo = QFileInfo(saveFileNameNC)
                                        baseName = fileInfo.baseName()
                                        self.iface.addRasterLayer(
                                            saveFileNameNC, baseName)

                                        self.qgisCanvas = qgis.utils.iface.mapCanvas(
                                        )
                                        self.activeLayers = self.qgisCanvas.layers(
                                        )

                                        for layer in self.activeLayers:
                                            if saveFileNameNC in str(
                                                    layer.source()):
                                                layer.setDrawingStyle(
                                                    QgsRasterLayer.
                                                    SingleBandPseudoColor)
                                                layer.setColorShadingAlgorithm(
                                                    QgsRasterLayer.
                                                    FreakOutShader)
                                                if hasattr(
                                                        layer,
                                                        "setCacheImage"):
                                                    layer.setCacheImage(None)
                                                layer.triggerRepaint()
                                except ValueError:
                                    QMessageBox.warning(
                                        None, "Read Error",
                                        "No polygon file selected.")
                                except:
                                    QMessageBox.warning(
                                        None, "Read Error",
                                        "Unable to rasterise layer. Ensure the NetCDF file is of GMT NetCDF Grid Format."
                                    )

    def unload(self):
        # Remove the plugin menu item and icon
        self.iface.removePluginMenu(u"&Rasterise Polygons", self.action)
        self.iface.removeToolBarIcon(self.action)

    # run method that performs all the real work
    def run(self):
        # show the dialog
        self.getActiveLayers()
        self.setDropDownOptions()
        # Set the default radio buttons.
        self.dlg.ui.backgroundLayerChooseFromLayerRadioButton.setChecked(True)
        self.dlg.ui.allVisiblePolygonLayersRadioButton.setChecked(True)
        self.dlg.ui.singlePolygonLayerDropDown.setEnabled(False)
        self.dlg.ui.polygonsChooseFromFileLineEdit.setEnabled(False)
        self.dlg.ui.polygonsChooseFromFilePushButton.setEnabled(False)
        self.dlg.ui.backgroundValueLineEdit.setText(QString("10000000"))
        self.dlg.show()
        # Run the dialog event loop
        result = self.dlg.exec_()
        # See if OK was pressed
        if result == 1:
            self.getBackgroundValue()
            self.getDropDownOptions()
            self.rasterisePolygons()
class RasterisePolygons:

	def __init__(self, iface):
		# Save reference to the QGIS interface
		self.iface = iface
		# Create the dialog and keep reference
		self.dlg = RasterisePolygonsDialog()
		# initialize plugin directory
		self.plugin_dir = QFileInfo(QgsApplication.qgisUserDbFilePath()).path() + "/python/plugins/rasterisepolygons"
		# initialize locale
		localePath = ""
		locale = QSettings().value("locale/userLocale").toString()[0:2]
	   
		if QFileInfo(self.plugin_dir).exists():
			localePath = self.plugin_dir + "/i18n/rasterisepolygons_" + locale + ".qm"

		if QFileInfo(localePath).exists():
			self.translator = QTranslator()
			self.translator.load(localePath)

			if qVersion() > '4.3.3':
				QCoreApplication.installTranslator(self.translator)
   

	def initGui(self):
		# Create action that will start plugin configuration
		self.action = QAction(QIcon(":/plugins/rasterisepolygons/icon.png"), \
			u"Rasterise Polygons", self.iface.mainWindow())
		# connect the action to the run method
		QObject.connect(self.action, SIGNAL("triggered()"), self.run)
		QObject.connect(self.dlg.ui.polygonsChooseFromFilePushButton, SIGNAL("clicked()"), self.openPolygons)
		QObject.connect(self.dlg.ui.backgroundLayerChooseFromFilePushButton, SIGNAL("clicked()"), self.openBackgroundLayer)

		QObject.connect(self.dlg.ui.backgroundLayerChooseFromFileRadioButton, SIGNAL("toggled(bool)"),self.toggleBackgroundLayerChooseFromFile)
		QObject.connect(self.dlg.ui.backgroundLayerChooseFromLayerRadioButton, SIGNAL("toggled(bool)"),self.toggleBackgroundLayerChooseFromLayer)
		QObject.connect(self.dlg.ui.singlePolygonLayerRadioButton, SIGNAL("toggled(bool)"),self.toggleSinglePolygonLayer)
		QObject.connect(self.dlg.ui.polygonsChooseFromFileRadioButton, SIGNAL("toggled(bool)"),self.togglePolygonsChooseFromFile)



		

		# Add toolbar button and menu item
		self.iface.addToolBarIcon(self.action)
		self.iface.addPluginToMenu(u"&Meshing", self.action)

	"""
	Set up toggle.
	"""
	def toggleBackgroundLayerChooseFromFile(self):
		if self.dlg.ui.backgroundLayerChooseFromFileRadioButton.isChecked():
			self.dlg.ui.backgroundLayerLineEdit.setEnabled(True)
			self.dlg.ui.backgroundLayerChooseFromFilePushButton.setEnabled(True)
		else:
			self.dlg.ui.backgroundLayerLineEdit.setEnabled(False)
			self.dlg.ui.backgroundLayerChooseFromFilePushButton.setEnabled(False)

	def toggleBackgroundLayerChooseFromLayer(self):
		if self.dlg.ui.backgroundLayerChooseFromLayerRadioButton.isChecked():
			self.dlg.ui.backgroundLayerDropDown.setEnabled(True)
		else:
			self.dlg.ui.backgroundLayerDropDown.setEnabled(False)

	def toggleSinglePolygonLayer(self):
		if self.dlg.ui.singlePolygonLayerRadioButton.isChecked():
			self.dlg.ui.singlePolygonLayerDropDown.setEnabled(True)
		else:
			self.dlg.ui.singlePolygonLayerDropDown.setEnabled(False)

	def togglePolygonsChooseFromFile(self):
		if self.dlg.ui.polygonsChooseFromFileRadioButton.isChecked():
			self.dlg.ui.polygonsChooseFromFileLineEdit.setEnabled(True)
			self.dlg.ui.polygonsChooseFromFilePushButton.setEnabled(True)
		else:
			self.dlg.ui.polygonsChooseFromFileLineEdit.setEnabled(False)
			self.dlg.ui.polygonsChooseFromFilePushButton.setEnabled(False)

	"""
	Set up the browse files buttons.
	"""
	def openPolygons(self):
		self.polygonsCaption = QString("Open Polygons Shapefile")
		self.polygonsFilter = QString("Shapefiles (*.shp)")
		self.polygonsFileName = QFileDialog.getOpenFileName(caption = self.polygonsCaption, filter = self.polygonsFilter)
		self.dlg.ui.polygonsChooseFromFileLineEdit.setText(self.polygonsFileName)

	def openBackgroundLayer(self):
		self.backgroundLayerCaption = QString("Open Background Layer NetCDF")
		self.backgroundLayerFilter = QString("NetCDF Files (*.nc)")
		self.backgroundLayerChooseFileName = QFileDialog.getOpenFileName(caption = self.backgroundLayerCaption, filter = self.backgroundLayerFilter)
		self.dlg.ui.backgroundLayerLineEdit.setText(self.backgroundLayerChooseFileName)

	def getBackgroundValue(self):
		self.backgroundValue = self.dlg.ui.backgroundValueLineEdit.text()
	
	"""
	Get the active canvas layers and establish the drop-down menus.
	"""
	def getActiveLayers(self):
		self.qgisCanvas = qgis.utils.iface.mapCanvas()
		self.activeLayers = self.qgisCanvas.layers()
		return self.activeLayers

	def setDropDownOptions(self):
		self.dlg.ui.singlePolygonLayerDropDown.clear()
		self.dlg.ui.backgroundLayerDropDown.clear()

		for layer in self.activeLayers:
			if '.shp' in str(layer.source()):
				self.dlg.ui.singlePolygonLayerDropDown.addItem(layer.name(), QVariant(str(layer.source())))
	
		for layer in self.activeLayers:
			if '.nc' in str(layer.source()):
				self.dlg.ui.backgroundLayerDropDown.addItem(layer.name(), QVariant(str(layer.source())))

	"""
	Function for retrieving the user selections from the drop-downs.
	"""
	def getDropDownOptions(self):
		self.singlePolygonText = self.dlg.ui.singlePolygonLayerDropDown.currentText()
		self.singlePolygonIndex = self.dlg.ui.singlePolygonLayerDropDown.findText(self.singlePolygonText)
		self.singlePolygonFileName = self.dlg.ui.singlePolygonLayerDropDown.itemData(self.singlePolygonIndex).toString()

		self.backgroundLayerText = self.dlg.ui.backgroundLayerDropDown.currentText()
		self.backgroundLayerIndex = self.dlg.ui.backgroundLayerDropDown.findText(self.backgroundLayerText)
		self.backgroundLayerFileName = self.dlg.ui.backgroundLayerDropDown.itemData(self.backgroundLayerIndex).toString()

	"""
	Used to retrieve all of the active shapefile layers if the user selects this option.
	"""
	def getAllPolygons(self):
		self.activePolygons = []
		for layer in self.activeLayers:
			if '.shp' in str(layer.source()):
				self.activePolygons.append([layer.name(), QVariant(str(layer.source()))])

	"""
	The actual code. It is broken into three if statements depending on the user's selection. Read the first if for a detailed description, the further 	two use a similar code but with exceptions made for file source etc.
	"""
	def rasterisePolygons(self):
		# Example of system call: gdal_rasterize -a id -ts 270 220 -l boundtest-line-nodes /home/sml110/UROP/QGIS/boundtest-line-nodes.shp
		call = ["gdal_rasterize", "--version"]
		out = subprocess.Popen(call, stdout = subprocess.PIPE)
		result = out.communicate()
		result = result[0]
		result = result.split(",")
		result = result[0][5:-2]
		version = float(result)
		error = False
		if version < 1.8:
			QMessageBox.warning(None,"GDAL Error","This plugin requires gdal_rasterize version 1.8.0 or above.")
			error = True

		if error != True:
			try:
				type(eval(str(self.backgroundValue))) == int
				error = False
			except:
				QMessageBox.warning(None,"Value Error","The background value needs to be an integer.")
				error = True

			if error != True:

				# Depending on user option, open the background NetCDF.
				if self.dlg.ui.backgroundLayerChooseFromLayerRadioButton.isChecked():
					try:
						file = NetCDF.NetCDFFile(str(self.backgroundLayerFileName), 'r')
						error = False
					except:
						QMessageBox.warning(None,"Read Error","No NetCDF layer visible.")
						error = True
		
				if self.dlg.ui.backgroundLayerChooseFromFileRadioButton.isChecked():
					try:
						file = NetCDF.NetCDFFile(str(self.backgroundLayerChooseFileName), 'r')
						error = False
					except:
						QMessageBox.warning(None,"Read Error","No NetCDF file selected.")
						error = True

				if error != True:
					# Retrieve the number of columns and rows of the background mesh so the rasterised polygons layers will be of the same resolution. 
					# XY and Lon/lat NetCDF files are slightly different in their file structure hence the two options.
					try:
						# If the file is in xy space.
						if len(file.variables) == 6:
							cols = str(file.variables['dimension'][0])
							rows = str(file.variables['dimension'][1])
					
						# If the file is in lat/lon.
						if len(file.variables) == 3:
							try:
								cols = str(file.dimensions['lon'])
								rows = str(file.dimensions['lat'])

							except:
								cols = str(file.dimensions['x'])
								rows = str(file.dimensions['y'])

						error = False

					except:
						QMessageBox.warning(None,"Read Error","Could not read rows and columns of data source.")
						error = True

					if error != True:
						# Get the extent of x and y min and max so the rasterised polygons will be of the same dimensions.
						for layer in self.activeLayers:
							if str(self.backgroundLayerText) in str(layer.name()):
								extent = str(layer.extent().toString())

						minimum = extent.split(':')[0]; maximum = extent.split(':')[1]
						xMin = minimum.split(',')[0]; yMin = minimum.split(',')[1]
						xMax = maximum.split(',')[0]; yMax = maximum.split(',')[1]

						print xMin, xMax, yMin, yMax

						# Rasterise the given polygons.
						if error != True:
							if self.dlg.ui.allVisiblePolygonLayersRadioButton.isChecked():
								try:
									self.getAllPolygons()
									
									if len(list(self.activePolygons)) == 0:
										error = True
										raise ValueError ("No active polygons.")

									for i in range(len(list(self.activePolygons))):
										saveName = str(list(self.activePolygons)[i][0])
										saveFileName = str(list(self.activePolygons)[i][1].toString())
										saveFileNameTif = saveFileName.replace(".shp", ".tif")
										saveFileNameNC = saveFileName.replace(".shp", ".nc")

										# Have to rasterise to .tif and then convert to .nc as the .nc format when done directly will not import into QGIS.
										# Use initial value of 10000000 otherwise it is set to 0 and therefore when the minimum calculation is carried out in other
										# plugins it will not produce the correct results.
										subprocess.call(["gdal_rasterize", "-a", "id", "-init", str(self.backgroundValue), "-ts", cols, rows, "-te", \
										xMin, yMin, xMax, yMax, "-l", \
										saveName, str(list(self.activePolygons)[i][1].toString()), saveFileNameTif])

										# Convert into a QGIS-readable .nc.
										subprocess.call (["gdal_translate", "-of", "GMT", saveFileNameTif, saveFileNameNC])

										# Get the layer information and import into QGIS.
										fileInfo = QFileInfo(saveFileNameNC)
										baseName = fileInfo.baseName()
										self.iface.addRasterLayer(saveFileNameNC, baseName)
				
										# Refresh canvas so can change the newly added layer to pseudocolour.
										self.qgisCanvas = qgis.utils.iface.mapCanvas()
										self.activeLayers = self.qgisCanvas.layers()

										for layer in self.activeLayers:
											if saveFileNameNC in str(layer.source()):
												layer.setDrawingStyle(QgsRasterLayer.SingleBandPseudoColor)
												layer.setColorShadingAlgorithm(QgsRasterLayer.FreakOutShader)
												if hasattr(layer, "setCacheImage"): layer.setCacheImage(None)
												layer.triggerRepaint()
								except ValueError:
									QMessageBox.warning(None,"Read Error","No visible polygon layers.")
								except:
									QMessageBox.warning(None,"Error","Unable to rasterise layers. Ensure the NetCDF file is of GMT NetCDF Grid Format.")
				

							# Same operations as above but only for a single polygon.
							if self.dlg.ui.singlePolygonLayerRadioButton.isChecked():
								try:
									fileName = str(self.singlePolygonFileName)
									saveFileNameTif = fileName.replace(".shp", ".tif")
									saveFileNameNC = fileName.replace(".shp", ".nc")
									
									try:	
										subprocess.call(["gdal_rasterize", "-a", "id", "-init", str(self.backgroundValue), "-ts", cols, rows, "-te", xMin, yMin, \
									xMax, yMax, "-l", \
									str(self.singlePolygonText), str(self.singlePolygonFileName), saveFileNameTif])
										error = False
									except:
										error = True
										QMessageBox.warning(None,"Read Error","Unable to rasterise layer. Ensure the NetCDF file is of GMT NetCDF Grid Format.")
									if error != True:
											subprocess.call (["gdal_translate", "-of", "GMT", saveFileNameTif, saveFileNameNC])

											fileInfo = QFileInfo(saveFileNameNC)
											baseName = fileInfo.baseName()
											self.iface.addRasterLayer(saveFileNameNC, baseName)

											self.qgisCanvas = qgis.utils.iface.mapCanvas()
											self.activeLayers = self.qgisCanvas.layers()

											for layer in self.activeLayers:
												if saveFileNameNC in str(layer.source()):
													layer.setDrawingStyle(QgsRasterLayer.SingleBandPseudoColor)
													layer.setColorShadingAlgorithm(QgsRasterLayer.FreakOutShader)
													if hasattr(layer, "setCacheImage"): layer.setCacheImage(None)
													layer.triggerRepaint()

								except:
									QMessageBox.warning(None,"Read Error","No polygon layer selected.")

							# And again for if the user selects a .nc from file.
							if self.dlg.ui.polygonsChooseFromFileRadioButton.isChecked():
								try:
									fileName = str(self.polygonsFileName)
									if len(filename) == 0:
										error = True
										raise ValueError

									if error != True:
											saveFileNameTif = fileName.replace(".shp", ".tif")
											saveFileNameNC = fileName.replace(".shp", ".nc")

											subprocess.call(["gdal_rasterize", "-a", "id", "-init", str(self.backgroundValue), "-ts", cols, rows, "-te", xMin, \
											yMin, xMax, yMax, \
											str(self.polygonsFileName), saveFileNameTif])

											subprocess.call (["gdal_translate", "-of", "GMT", saveFileNameTif, saveFileNameNC])

											fileInfo = QFileInfo(saveFileNameNC)
											baseName = fileInfo.baseName()
											self.iface.addRasterLayer(saveFileNameNC, baseName)

											self.qgisCanvas = qgis.utils.iface.mapCanvas()
											self.activeLayers = self.qgisCanvas.layers()

											for layer in self.activeLayers:
												if saveFileNameNC in str(layer.source()):
													layer.setDrawingStyle(QgsRasterLayer.SingleBandPseudoColor)
													layer.setColorShadingAlgorithm(QgsRasterLayer.FreakOutShader)
													if hasattr(layer, "setCacheImage"): layer.setCacheImage(None)
													layer.triggerRepaint()
								except ValueError:
									QMessageBox.warning(None,"Read Error","No polygon file selected.")
								except:
									QMessageBox.warning(None,"Read Error","Unable to rasterise layer. Ensure the NetCDF file is of GMT NetCDF Grid Format.")


	def unload(self):
		# Remove the plugin menu item and icon
		self.iface.removePluginMenu(u"&Rasterise Polygons",self.action)
		self.iface.removeToolBarIcon(self.action)

	# run method that performs all the real work
	def run(self):
		# show the dialog
		self.getActiveLayers()
		self.setDropDownOptions()
		# Set the default radio buttons.
		self.dlg.ui.backgroundLayerChooseFromLayerRadioButton.setChecked(True)
		self.dlg.ui.allVisiblePolygonLayersRadioButton.setChecked(True)
		self.dlg.ui.singlePolygonLayerDropDown.setEnabled(False)
		self.dlg.ui.polygonsChooseFromFileLineEdit.setEnabled(False)
		self.dlg.ui.polygonsChooseFromFilePushButton.setEnabled(False)
		self.dlg.ui.backgroundValueLineEdit.setText(QString("10000000"))
		self.dlg.show()
		# Run the dialog event loop
		result = self.dlg.exec_()
		# See if OK was pressed
		if result == 1:
			self.getBackgroundValue()
			self.getDropDownOptions()
			self.rasterisePolygons()