예제 #1
0
파일: importer.py 프로젝트: faunalia/gem-mt
	def run(self):
		# layer base name and dir path
		base_name = QFileInfo(self._fn).baseName()
		dir_path = QFileInfo(self._fn).absoluteDir()

		# create the uri for the delimitedtext provider
		from .settings_dlg import Settings
		csvUrl = QUrl.fromLocalFile( self._fn )
		csvUrl.setQueryItems( [
			( "delimiter", Settings.delimiter() ),
			( "delimiterType", "plain"),
			( "xField", Settings.longitudeField() ),
			( "yField", Settings.latitudeField() )
		] )

		# load the layer
		from qgis.core import QgsVectorLayer
		csvVl = QgsVectorLayer(csvUrl.toString(), base_name, "delimitedtext")
		if not csvVl.isValid():	# invalid layer
			csvVl.deleteLater()
			QMessageBox.warning( self.parent(), "Invalid layer", 
								u"Unable to load the layer %s" % self._fn )
			return (self.INVALID_INPUT, None)

		# check the layer geometry type
		from qgis.core import QGis
		if csvVl.geometryType() != QGis.Point:
			csvVl.deleteLater()
			QMessageBox.warning( self.parent(), "Invalid layer", 
								u"Unable to get data from the selected file. \nSetup Lat/Long field names and delimiter from the Settings dialog, \nthen try again." )
			return (self.INVALID_LATLON, None)

		# check whether the CSV file has to be imported to SL db
		if not Settings.importCsvToSl():
			return (self.OK, csvVl)

		# uri pointing to the new SL database
		from qgis.core import QgsDataSourceURI
		sqlite_path = dir_path.absoluteFilePath( u"%s.sqlite" % base_name )
		slUri = QgsDataSourceURI()
		slUri.setDatabase( sqlite_path )
		slUri.setDataSource( "", base_name, "GEOMETRY" )

		importer = Ogr2ogrImporter(csvVl, slUri, self.parent())
		#importer = QGisLayerImporter(csvVl, slUri, self.parent())
		ret = importer.start()

		# get the importer exit code
		if not ret:
			if importer.wasCanceled():
				ret = self.CANCELED
			else:
				ret = self.ERROR
				QMessageBox.warning( self.parent(), "Error", importer.errorMessage() )
		else:
			ret = self.OK

		# cleanup
		importer.deleteLater()
		importer = None

		csvVl.deleteLater()
		csvVl = None

		if ret != self.OK:
			return (ret, None)

		# load the layer from the SL database
		slVl = QgsVectorLayer(slUri.uri(), slUri.table(), "spatialite")
		if not slVl.isValid():	# invalid layer
			slVl.deleteLater()
			QMessageBox.warning( self.parent(),	"Invalid layer",
								u"Unable to load the layer %s" % slUri.database() )
			return (self.ERROR, None)

		# check the layer geometry type
		if slVl.geometryType() != QGis.Point:
			slVl.deleteLater()
			return (self.ERROR, None)

		return (self.OK, slVl)
예제 #2
0
    def run(self):
        # layer base name and dir path
        base_name = QFileInfo(self._fn).baseName()
        dir_path = QFileInfo(self._fn).absoluteDir()

        # create the uri for the delimitedtext provider
        from .settings_dlg import Settings
        csvUrl = QUrl.fromLocalFile(self._fn)
        csvUrl.setQueryItems([("delimiter", Settings.delimiter()),
                              ("delimiterType", "plain"),
                              ("xField", Settings.longitudeField()),
                              ("yField", Settings.latitudeField())])

        # load the layer
        from qgis.core import QgsVectorLayer
        csvVl = QgsVectorLayer(csvUrl.toString(), base_name, "delimitedtext")
        if not csvVl.isValid():  # invalid layer
            csvVl.deleteLater()
            QMessageBox.warning(self.parent(), "Invalid layer",
                                u"Unable to load the layer %s" % self._fn)
            return (self.INVALID_INPUT, None)

        # check the layer geometry type
        from qgis.core import QGis
        if csvVl.geometryType() != QGis.Point:
            csvVl.deleteLater()
            QMessageBox.warning(
                self.parent(), "Invalid layer",
                u"Unable to get data from the selected file. \nSetup Lat/Long field names and delimiter from the Settings dialog, \nthen try again."
            )
            return (self.INVALID_LATLON, None)

        # check whether the CSV file has to be imported to SL db
        if not Settings.importCsvToSl():
            return (self.OK, csvVl)

        # uri pointing to the new SL database
        from qgis.core import QgsDataSourceURI
        sqlite_path = dir_path.absoluteFilePath(u"%s.sqlite" % base_name)
        slUri = QgsDataSourceURI()
        slUri.setDatabase(sqlite_path)
        slUri.setDataSource("", base_name, "GEOMETRY")

        importer = Ogr2ogrImporter(csvVl, slUri, self.parent())
        #importer = QGisLayerImporter(csvVl, slUri, self.parent())
        ret = importer.start()

        # get the importer exit code
        if not ret:
            if importer.wasCanceled():
                ret = self.CANCELED
            else:
                ret = self.ERROR
                QMessageBox.warning(self.parent(), "Error",
                                    importer.errorMessage())
        else:
            ret = self.OK

        # cleanup
        importer.deleteLater()
        importer = None

        csvVl.deleteLater()
        csvVl = None

        if ret != self.OK:
            return (ret, None)

        # load the layer from the SL database
        slVl = QgsVectorLayer(slUri.uri(), slUri.table(), "spatialite")
        if not slVl.isValid():  # invalid layer
            slVl.deleteLater()
            QMessageBox.warning(
                self.parent(), "Invalid layer",
                u"Unable to load the layer %s" % slUri.database())
            return (self.ERROR, None)

        # check the layer geometry type
        if slVl.geometryType() != QGis.Point:
            slVl.deleteLater()
            return (self.ERROR, None)

        return (self.OK, slVl)