Example #1
0
 def onConnectivityClicked(self):
     if self.NETWORK_DS is None:
         return
     network = gnm.CastToGenericNetwork(self.NETWORK_DS)
     if network is None:
         return
     if self.GFID_STARTFLAG == -1:
         self.showMsg(
             self.
             tr(u'The start point has not been set! Set it before any calculations'
                ))
         return
     for bl_gfid in self.GFIDS_BLOCKFLAGS:
         network.ChangeBlockState(bl_gfid, True)
     res_layer = network.GetPath(self.GFID_STARTFLAG, -1,
                                 gnm.GATConnectedComponents)
     if res_layer is None:
         self.showMsg(
             self.tr(
                 u'Unable to calculate shortest path! Some error occured'))
     elif res_layer.GetFeatureCount() == 0:
         self.showMsg(
             self.
             tr(u'The start feature has no connections to other features!'))
         network.ReleaseResultSet(res_layer)
     else:
         self.updateResultLayer(res_layer, self.LAYER_RESULT_CONNECTIVITY)
         network.ReleaseResultSet(res_layer)
     for bl_gfid in self.GFIDS_BLOCKFLAGS:
         network.ChangeBlockState(bl_gfid, False)
Example #2
0
def test_gnm_autoconnect():

    if not ogrtest.have_gnm:
        pytest.skip()

    ds = gdal.OpenEx('tmp/test_gnm')
    dgn = gnm.CastToGenericNetwork(ds)
    assert dgn is not None, 'cast to GNMGenericNetwork failed'

    ret = dgn.ConnectPointsByLines(['pipes', 'wells'], 0.000001, 1, 1, gnm.GNM_EDGE_DIR_BOTH)
    assert ret == 0, 'failed to connect'

    dgn = None
Example #3
0
def gnm_autoconnect():

    if not ogrtest.have_gnm:
        return 'skip'

    ds = gdal.OpenEx('tmp/test_gnm')
    dgn = gnm.CastToGenericNetwork(ds)
    if dgn is None:
        gdaltest.post_reason('cast to GNMGenericNetwork failed')
        return 'fail'

    ret = dgn.ConnectPointsByLines(['pipes', 'wells'], 0.000001, 1, 1, gnm.GNM_EDGE_DIR_BOTH)
    if ret != 0:
        gdaltest.post_reason('failed to connect')
        return 'fail'

    dgn = None
    return 'success'
Example #4
0
 def onPathsClicked(self):
     if self.NETWORK_DS is None:
         return
     network = gnm.CastToGenericNetwork(self.NETWORK_DS)
     if network is None:
         return
     if self.GFID_STARTFLAG == -1:
         self.showMsg(
             self.
             tr(u'The start point has not been set! Set it before any calculations'
                ))
         return
     if self.GFID_ENDFLAG == -1:
         self.showMsg(
             self.
             tr(u'The end point has not been set! Set it before calculating shortest paths'
                ))
         return
     for bl_gfid in self.GFIDS_BLOCKFLAGS:
         network.ChangeBlockState(bl_gfid, True)
     options = []
     options.append('num_paths=' + str(self.GNM_SETTING_K))
     res_layer = network.GetPath(self.GFID_STARTFLAG, self.GFID_ENDFLAG,
                                 gnm.GATKShortestPath, options)
     if res_layer is None:
         self.showMsg(
             self.tr(
                 u'Unable to calculate shortest path! Some error occured'))
     elif res_layer.GetFeatureCount() == 0:
         self.showMsg(
             self.tr(u'There is no path between start and end points!'))
         network.ReleaseResultSet(res_layer)
     else:
         self.updateResultLayers(res_layer, self.LAYERS_RESULT_PATHS)
         network.ReleaseResultSet(res_layer)
     for bl_gfid in self.GFIDS_BLOCKFLAGS:
         network.ChangeBlockState(bl_gfid, False)
Example #5
0
 def onPathClicked(self):
     if self.NETWORK_DS is None:
         return
     network = gnm.CastToGenericNetwork(self.NETWORK_DS)
     if network is None:
         return
     if self.GFID_STARTFLAG == -1:
         self.showMsg(
             self.
             tr(u'The start point has not been set! Set it before any calculations'
                ))
         return
     if self.GFID_ENDFLAG == -1:
         self.showMsg(
             self.
             tr(u'The end point has not been set! Set it before calculating shortest path'
                ))
         return
     for bl_gfid in self.GFIDS_BLOCKFLAGS:  # block required features
         network.ChangeBlockState(bl_gfid, True)
     res_layer = network.GetPath(self.GFID_STARTFLAG, self.GFID_ENDFLAG,
                                 gnm.GATDijkstraShortestPath)
     if res_layer is None:
         self.showMsg(
             self.tr(
                 u'Unable to calculate shortest path! Some error occured'))
     elif res_layer.GetFeatureCount() == 0:
         self.showMsg(
             self.tr(u'There is no path between start and end points!'))
         network.ReleaseResultSet(res_layer)
     else:
         self.updateResultLayer(
             res_layer,
             self.LAYER_RESULT_PATH)  # copy features to qgis layer
         network.ReleaseResultSet(res_layer)
     for bl_gfid in self.GFIDS_BLOCKFLAGS:  # unblock previously blocked features (anyway!)
         network.ChangeBlockState(bl_gfid, False)
Example #6
0
    def createGnmLayersGroup(self):
        """Create special set of layers for the QGIS GNM"""
        dataset = self.NETWORK_DS
        network = gnm.CastToGenericNetwork(self.NETWORK_DS)
        if network is None:
            self.showMsgBox(self.tr(u'Error working with network'))
            return False
        network_fullpath = self.NETWORK_FULLPATH
        self.NETWORK_NAME = network.GetName()
        network_srs = network.GetProjectionRef()

        # 0. Create root group.
        root_layer_tree = QgsProject.instance().layerTreeRoot()
        common_group = root_layer_tree.addGroup(self.NETWORK_NAME)

        # 1. Create flag layers.
        flags_group = common_group.addGroup('Flags')
        self.LAYER_STARTFLAG = self.createFlagsLayer(
            flags_group, '_flag_start',
            self.plugin_dir + '/styles/start_flag.svg', network_srs)
        if self.LAYER_STARTFLAG is None:
            self.showWarn(self.tr(u'Unable to create start flag\'s layer'))
        self.LAYER_ENDFLAG = self.createFlagsLayer(
            flags_group, '_flag_end', self.plugin_dir + '/styles/end_flag.svg',
            network_srs)
        if self.LAYER_ENDFLAG is None:
            self.showWarn(self.tr(u'Unable to create end flag\'s layer'))
        self.LAYER_BLOCKFLAGS = self.createFlagsLayer(
            flags_group, '_flags_block',
            self.plugin_dir + '/styles/block_flag.svg', network_srs)
        if self.LAYER_BLOCKFLAGS is None:
            self.showWarn(self.tr(u'Unable to create block flags\' layer'))

        # 2. Load data layers.
        layers_passed_count = 0
        data_group = common_group.addGroup('Data')
        data_layer_count = dataset.GetLayerCount()
        for i in range(0, data_layer_count):
            gdal_layer = dataset.GetLayer(i)
            data_layer = self.loadDataLayer(data_group, gdal_layer,
                                            network_fullpath)
            if data_layer is None:
                layers_passed_count = layers_passed_count + 1
                continue
            self.LAYERS_DATA.append(data_layer)
        if layers_passed_count != 0:
            self.showWarn(
                self.tr(u'Network layers skipped (unable to read): ') +
                str(layers_passed_count))

        # 3. Create result layers.
        results_group = common_group.addGroup('Results')

        self.LAYER_RESULT_PATH = self.createResultLayer(
            results_group, '_path_dijkstra', QColor(255, 0, 0), network_srs)
        if self.LAYER_RESULT_PATH is None:
            self.showWarn(
                self.
                tr(u'Unable to create result layer for shortest path calculations'
                   ))

        paths_group = results_group.addGroup('_paths_k')
        for i in range(self.GNM_SETTING_K):
            transp_coef = 255 / self.GNM_SETTING_K - 5
            layer_i = self.createResultLayer(
                paths_group, '_path_' + str(i),
                QColor(0, 133, 63, 255 - i * transp_coef), network_srs)
            if layer_i is None:
                self.showWarn(
                    self.
                    tr(u'Unable to create result layer for one of the K-paths calculation'
                       ))
                continue
            self.LAYERS_RESULT_PATHS.append(layer_i)

        self.LAYER_RESULT_CONNECTIVITY = self.createResultLayer(
            results_group, '_tree_connectivity', QColor(0, 157, 255),
            network_srs)
        if self.LAYER_RESULT_CONNECTIVITY is None:
            self.showWarn(
                self.
                tr(u'Unable to create result layer for connectivity tree calculations'
                   ))

        return True
Example #7
0
    def onCreateClicked(self):
        #gdal.SetConfigOption('CPL_DEBUG','ON');
        #gdal.SetConfigOption('CPL_LOG','D:/nextgis/gnmmanager/gdal_log.txt');
        #gdal.SetConfigOption('CPL_LOG_ERRORS','ON');

        # Start creating network.
        self.butCreate.setEnabled(False)
        self.msg(self.tr(u'Starting network creation...'))
        self.progress(0)
        
        # Obtain network parameters from the dialog.
# TODO: replace it with real saving params via according group of widgets:
        path = self.editFileParams.text()
# TODO: replace it with real format selection via combobox:
        format = self.comboFormat.currentText()
        gnm_format = self.GNM_CONST_FILEFORMAT 
        srs = self.comboSrs.currentText()
        name = self.editName.text()
        descr = self.editDescr.text()
        if self.isStrVoid(path):
            self.msgErr(self.tr(u'The network\'s saving path is set incorrectly!'))
            self.progress(0)
            return
        if self.isStrVoid(name):
            self.msgErr(self.tr(u'The network\'s name is set incorrectly!'))
            self.progress(0)
            return              
        options = []
        self.addOption(options,self.GNM_CONST_OPT_NAME,name)
        self.addOption(options,self.GNM_CONST_OPT_DESCR,descr)
        self.addOption(options,self.GNM_CONST_OPT_SRS,self.getSrsKeyname(srs))
        layer_other_paths = []
        layer_names = []
        cnt = self.listLayers.count()
        if cnt == 0:
            self.msgWarn(self.tr(u'No layers were defined for import. The network will be void!'))
        for i in range(0,cnt):
            #layer_other_name = str(self.listLayers.item(i).text())
            #layer_other_data = str(self.listLayers.item(i).data(Qt.UserRole))
            layer_other_paths.append(self.listLayers.item(i).text())
        try:
            tolerance = float(str(self.editTolerance.text()))
        except ValueError:
            tolerance = 0
        if tolerance < 0:
            self.msgWarn(self.tr(u'Tolerance for layers connection was set incorrectly [ = ')
                +self.editTolerance.text()+u']. '
                +self.tr(u'The default value [ = 0] will be used!'))
            tolerance = 0
        self.progress(5)
        
        # Initialize network via creation.
        self.msg(u'')
        self.msg(self.tr(u'Creating network dataset...'))
        self.msg(self.tr(u'Format: ')+format)
        self.msg(self.tr(u'Path: ')+path)
        self.msg(self.tr(u'SRS: ')+srs)
        driver = gdal.GetDriverByName(str(gnm_format))
        if driver is None:
            self.msgErr(self.tr(u'Unable to initialize network driver via GDAL'))
            self.progress(0)
            return
        dataset = driver.Create(str(path), 0, 0, 0, gdal.GDT_Unknown, options)
        network = gnm.CastToNetwork(dataset) 
        if network is None:
            self.msgErr(self.tr(u'Unable to initialize network dataset via GDAL'))
            self.progress(0)
            return
        gen_network = gnm.CastToGenericNetwork(dataset)  
        if gen_network is None:
            self.msgErr(self.tr(u'Unable to initialize (generic) network dataset via GDAL'))
            self.progress(0)
            return
        self.msg(self.tr(u'...done'))
        self.progress(20)
        
        # Fill network with layers.
        self.msg(u'')
        has_point_layer = False
        has_line_layer = False
        for layer_other_path in layer_other_paths:
            self.msg(self.tr(u'Importing layer: ')+layer_other_path)
            dataset_other = gdal.OpenEx(str(layer_other_path), gdal.OF_VECTOR)
            if dataset_other is None:
                self.msgErr(self.tr(u'Failed to open side dataset'))
                self.progress(0)
                return
            layer_other = dataset_other.GetLayerByIndex(0)
            if layer_other is None:
                self.msgErr(self.tr(u'Failed to fetch layer in a side dataset'))
                self.progress(0)
                return
            layer_name_other = layer_other.GetName()
            layer = network.CopyLayer(layer_other, layer_name_other)
            if layer is None:
                self.msgErr(self.tr(u'Failed to import layer to the network'))
                return
            layer_geom = layer.GetGeomType()
            if layer_geom == ogr.wkbPoint:
                has_point_layer = True
            elif layer_geom == ogr.wkbLineString:
                has_line_layer = True
            layer_names.append(layer.GetName())
            dataset_other = None
# TODO: we do not need such checks if there is some other algorithm of automatic topology creation:            
        if not has_point_layer:
            self.msgWarn(self.tr(u'No layer with point geometry was imported. ' 
                'At least one required to properly build network\'s topology'))
        if not has_line_layer:
            self.msgWarn(self.tr(u'No layer with line geometry was imported. ' 
                'At least one required to properly build network\'s topology'))    
        self.msg(self.tr(u'...done'))
        self.progress(55)
        
        # Establish network connectivity.
        self.msg(u'')
        self.msg(self.tr(u'Creating network\'s topology...'))
# TODO: get weights for the graph edges from the layer's fields via ChangeEdge method:       
        err = gen_network.ConnectPointsByLines(layer_names, tolerance, 1, 1, gnm.GNM_EDGE_DIR_BOTH)
        if err != 0:
            self.msgWarn(self.tr(u'Failed to create topology. Features in the network will be unconnected'))
        self.msg(self.tr(u'...done'))
        self.progress(85)
        
        # Close network for successfull saving all data.
        gen_network = None
        network = None
        dataset = None
        
        # Open network for further returning it outside the dialog.
        net_fullpath = path + '/' + name
        dataset = gdal.OpenEx(net_fullpath)
        network = gnm.CastToNetwork(dataset)
        if network is None:
            self.msgErr(self.tr(u'Network created successfully but it is not able to open it'))
            return        
        self.NETWORK_DS = dataset
        self.NETWORK_FULLPATH = net_fullpath
        self.butBack.setEnabled(False) # no way to return back
        self.butOk.show()
        self.msg(u'')
        self.msg(self.tr(u'Network was successfully created!'))
        self.progress(99)