示例#1
0
 def openJob(self):
     '''Open an existing job.'''
     
     selectedFileName = execFileDialog('*.sqlite')
     if selectedFileName:
         carhabLayer = CarhabLayer(selectedFileName)
         CarhabLayerRegistry.instance().addCarhabLayer(carhabLayer)
示例#2
0
    def run(self ):
        print 'run worker'
        try:
            print 'begin try'
            if CarhabLayerRegistry.instance().getCurrentCarhabLayer():
                
                # Connect to db.
                self.db = DbManager(CarhabLayerRegistry.instance().getCurrentCarhabLayer().dbPath)
                
                # To let import geos invalid geometries.
                self.layer.setValid(True)
                layerFeatCount = self.layer.featureCount()
                
                # Initialisation of useful variables to calculate progression.
                lastDecimal = 0
                i = 0
                
                for feature in self.layer.getFeatures():
                    if not self.stop:
                        featGeom = feature.geometry()
                        if featGeom.type() == 2: # Polygons case
                            if featGeom.isMultipart(): # Split multipolygons
                                for part in featGeom.asGeometryCollection():
                                    if not part.isGeosValid(): # May be a problem...
                                        print 'part not valid'
                                    self.insertPolygon(part)
                            else:
                                self.insertPolygon(feature.geometry())
                            
                            # Calculate and emit new progression value (each percent only).
                            newDecimal = int(100*i/layerFeatCount)
                            if lastDecimal != newDecimal:
                                self.progress.emit(newDecimal)
                                lastDecimal = newDecimal
                            i = i + 1

                    else: # Thread has been aborted
                        print 'abort'
                        # Cancel inserts already done
                        self.db.conn.rollback()
                        self.finished.emit(False, 2)
                        break
                self.db.commit()
                self.db.close()
                self.finished.emit(True, 0)
            else: # None current carhab layer (error code 1)
                self.finished.emit(False, 1)
            
        except:
            print 'exception'
            import traceback
            print traceback.format_exc()
            self.error.emit(traceback.format_exc())
            self.finished.emit(False, 0)
示例#3
0
    def create_carhab_lyr(self, file_name):
        carhabLayer = CarhabLayer(file_name)
        CarhabLayerRegistry.instance().removeCarhabLayer(carhabLayer)

        if os.path.exists(file_name):
            os.remove(file_name)
        emptyDb = os.path.join(pluginDirectory, 'empty.sqlite')
        shutil.copy(emptyDb, file_name)

        carhabLayer = CarhabLayer(file_name)
        CarhabLayerRegistry.instance().addCarhabLayer(carhabLayer)
        return carhabLayer
示例#4
0
 def _check_state(self):
     if self.uvc_form and self.uvc_form.ui.isVisible():
         return False
     cur_carhab_lyr = CarhabLayerRegistry.instance().getCurrentCarhabLayer()
     if not cur_carhab_lyr:
         no_carhab_lyr_msg()
         return False
     if self._get_selected_feature() == 0:
         no_vector_lyr_msg()
         return False
     if self._get_selected_feature() == 1:
         one_only_selected_feat_msg()
         return False
     return True
示例#5
0
    def insertPolygon(self, geometry):
        
        # Convert geometry
        wktGeom = geometry.exportToWkt()
        # To force 2D geometry
        if len(wktGeom.split('Z')) > 1:
            wktGeom = wktGeom.split('Z')[0] + wktGeom.split('Z')[1]
            wktGeom = wktGeom.replace(" 0,", ",")
            wktGeom = wktGeom.replace(" 0)", ")")
        geom = "GeomFromText('"
        geom += wktGeom
        geom += "', 2154)"

        geomObj = {}
        geomObj['the_geom'] = geom
        
        db = DbManager(CarhabLayerRegistry.instance().getCurrentCarhabLayer().dbPath)
        
        r = Recorder(db, 'polygon')
        r.input(geomObj)
        
        db.commit()
        db.close()
示例#6
0
 def get_db(self):
     cur_carhab_lyr = CarhabLayerRegistry.instance().getCurrentCarhabLayer()
     db = DbManager(cur_carhab_lyr.dbPath)
     return db
示例#7
0
文件: fse.py 项目: IGNF/saisie_carhab
    def run(self):
        """Specific stuff at tool activating."""

        cur_carhab_lyr = CarhabLayerRegistry.instance().getCurrentCarhabLayer()
        if not cur_carhab_lyr:
            no_carhab_lyr_msg()
            return
        csv_dir = QFileDialog.getExistingDirectory(None, "Select a folder:", None, QFileDialog.ShowDirsOnly)
        if csv_dir:
            now = time.strftime("%Y-%m-%d-%H%M%S")
            directory = os.path.join(csv_dir, cur_carhab_lyr.getName() + "_" + now)
            if not os.path.exists(directory):
                os.makedirs(directory)

            for tbl_name, desc in Config.DB_STRUCTURE:
                file_name = desc.get("std_name")
                tbl_fields = desc.get("fields")
                if file_name:
                    if not desc.get("spatial"):
                        csv_name = file_name if file_name.endswith(".csv") else file_name + ".csv"
                        csv_path = os.path.join(directory, csv_name)
                        field_names = [row[1].get("std_name") for row in tbl_fields if row[1].get("std_name")]
                        db = DbManager(cur_carhab_lyr.dbPath)
                        r = Recorder(db, tbl_name)
                        tbl_rows = r.select_all()
                        csv_rows = []
                        for tbl_row in tbl_rows:
                            csv_row = {}
                            for dbf, value in tbl_row.items():
                                for field in desc.get("fields"):
                                    if dbf == field[0] and field[1].get("std_name"):
                                        csv_row[encode(field[1].get("std_name"))] = encode(value)
                                        break
                            csv_rows.append(csv_row)

                        with open(csv_path, "wb") as csv_file:
                            writer = csv.DictWriter(csv_file, field_names)
                            writer.writeheader()
                            writer.writerows(csv_rows)
                    else:
                        for vlyr in cur_carhab_lyr.getQgisLayers():
                            vlyr_tbl = QgsDataSourceURI(vlyr.dataProvider().dataSourceUri()).table()
                            if tbl_name == vlyr_tbl:
                                shp_name = file_name if file_name.endswith(".shp") else file_name + ".shp"
                                shp_path = os.path.join(directory, shp_name)
                                QgsVectorFileWriter.writeAsVectorFormat(vlyr, shp_path, "utf-8", None)
                                shp_lyr = QgsVectorLayer(shp_path, "", "ogr")
                                shapefile = shp_lyr.dataProvider()
                                features = shapefile.getFeatures()
                                attrs_to_del = []
                                for attr, attr_desc in tbl_fields:
                                    std_attr = attr_desc.get("std_name")
                                    if not std_attr == attr:
                                        if std_attr:
                                            cur_field = shapefile.fields().field(attr)
                                            new_field = QgsField(cur_field)
                                            new_field.setName(std_attr)
                                            shapefile.addAttributes([new_field])
                                            for feat in features:
                                                idx = shapefile.fields().indexFromName(std_attr)
                                                update_map = {feat.id(): {idx: feat[attr]}}
                                                shapefile.changeAttributeValues(update_map)
                                        attrs_to_del.append(shapefile.fields().indexFromName(attr))
                                shapefile.deleteAttributes(attrs_to_del)
            popup("Export effectué")