Beispiel #1
0
def gnm_filenetwork_create():

    try:
        shutil.rmtree('tmp/test_gnm')
    except OSError:
        pass

    ogrtest.drv = None
    ogrtest.have_gnm = 0

    ogrtest.drv = gdal.GetDriverByName('GNMFile')

    if ogrtest.drv is None:
        return 'skip'

    ds = ogrtest.drv.Create('tmp/', 0, 0, 0, gdal.GDT_Unknown, options=['net_name=test_gnm', 'net_description=Test file based GNM', 'net_srs=EPSG:4326'])
    # cast to GNM
    dn = gnm.CastToNetwork(ds)
    if dn is None:
        gdaltest.post_reason('fail')
        return 'fail'
    if dn.GetVersion() != 100:
        gdaltest.post_reason('GNM: Check GNM version failed')
        return 'fail'
    if dn.GetName() != 'test_gnm':
        gdaltest.post_reason('GNM: Check GNM name failed')
        return 'fail'
    if dn.GetDescription() != 'Test file based GNM':
        gdaltest.post_reason('GNM: Check GNM description failed')
        return 'fail'

    dn = None
    ogrtest.have_gnm = 1
    return 'success'
Beispiel #2
0
def test_gnm_filenetwork_create():

    try:
        shutil.rmtree('tmp/test_gnm')
    except OSError:
        pass

    ogrtest.drv = None
    ogrtest.have_gnm = 0

    ogrtest.drv = gdal.GetDriverByName('GNMFile')

    if ogrtest.drv is None:
        pytest.skip()

    ds = ogrtest.drv.Create('tmp/', 0, 0, 0, gdal.GDT_Unknown, options=['net_name=test_gnm', 'net_description=Test file based GNM', 'net_srs=EPSG:4326'])
    # cast to GNM
    dn = gnm.CastToNetwork(ds)
    assert dn is not None
    assert dn.GetVersion() == 100, 'GNM: Check GNM version failed'
    assert dn.GetName() == 'test_gnm', 'GNM: Check GNM name failed'
    assert dn.GetDescription() == 'Test file based GNM', \
        'GNM: Check GNM description failed'

    dn = None
    ogrtest.have_gnm = 1
Beispiel #3
0
 def onReadClicked(self):
     self.teditMain.clear()
     fullpath = self.editFile.text()
     if fullpath == '':
         self.butLoad.setEnabled(False)
         return
     dataset = gdal.OpenEx(str(fullpath))
     network = gnm.CastToNetwork(dataset)
     if network is None:
         self.butLoad.setEnabled(False)
         self.teditMain.append(
             self.tr(u'Unable to read network at the given path'))
         return
     self.teditMain.append(self.tr(u'Network read successfully!'))
     self.teditMain.append(self.tr(u'Information: '))
     self.teditMain.append(self.tr(u'    Path: ') + fullpath)
     self.teditMain.append(
         self.tr(u'    GNM version: ') + str(network.GetVersion()))
     #self.teditMain.append(self.tr(u'    Format: ') + )
     self.teditMain.append(self.tr(u'    Name: ') + network.GetName())
     self.teditMain.append(
         self.tr(u'    Description: ') + network.GetDescription())
     #self.teditMain.append(self.tr(u'    Rules: '))
     self.NETWORK_DS = dataset
     self.NETWORK_FULLPATH = fullpath
     self.butLoad.setEnabled(True)
Beispiel #4
0
def test_gnm_filenetwork_open():

    if not ogrtest.have_gnm:
        pytest.skip()

    ds = gdal.OpenEx('tmp/test_gnm')
    # cast to GNM
    dn = gnm.CastToNetwork(ds)
    assert dn is not None
    assert dn.GetVersion() == 100, 'GNM: Check GNM version failed'
    assert dn.GetName() == 'test_gnm', 'GNM: Check GNM name failed'
    assert dn.GetDescription() == 'Test file based GNM', \
        'GNM: Check GNM description failed'

    dn = None
Beispiel #5
0
def test_gnm_graph_connectedcomponents():

    if not ogrtest.have_gnm:
        pytest.skip()

    ds = gdal.OpenEx('tmp/test_gnm')
    dn = gnm.CastToNetwork(ds)
    assert dn is not None, 'cast to GNMNetwork failed'

    lyr = dn.GetPath(61, 50, gnm.GATConnectedComponents)
    assert lyr is not None, 'failed to get path'

    if lyr.GetFeatureCount() == 0:
        dn.ReleaseResultSet(lyr)
        pytest.fail('failed to get path')

    dn.ReleaseResultSet(lyr)
    dn = None
Beispiel #6
0
def test_gnm_graph_kshortest():

    if not ogrtest.have_gnm:
        pytest.skip()

    ds = gdal.OpenEx('tmp/test_gnm')
    dn = gnm.CastToNetwork(ds)
    assert dn is not None, 'cast to GNMNetwork failed'

    lyr = dn.GetPath(61, 50, gnm.GATKShortestPath, options=['num_paths=3'])
    assert lyr is not None, 'failed to get path'

    if lyr.GetFeatureCount() < 20:
        dn.ReleaseResultSet(lyr)
        pytest.fail('failed to get path')

    dn.ReleaseResultSet(lyr)
    dn = None
Beispiel #7
0
def gnm_graph_kshortest():

    if not ogrtest.have_gnm:
        return 'skip'

    ds = gdal.OpenEx('tmp/test_gnm')
    dn = gnm.CastToNetwork(ds)
    if dn is None:
        gdaltest.post_reason('cast to GNMNetwork failed')
        return 'fail'

    lyr = dn.GetPath(61, 50, gnm.GATKShortestPath, options=['num_paths=3'])
    if lyr is None:
        gdaltest.post_reason('failed to get path')
        return 'fail'

    if lyr.GetFeatureCount() < 20:
        gdaltest.post_reason('failed to get path')
        return 'fail'

    dn.ReleaseResultSet(lyr)
    dn = None
    return 'success'
Beispiel #8
0
def gnm_filenetwork_open():

    if not ogrtest.have_gnm:
        return 'skip'

    ds = gdal.OpenEx('tmp/test_gnm')
    # cast to GNM
    dn = gnm.CastToNetwork(ds)
    if dn is None:
        gdaltest.post_reason('fail')
        return 'fail'
    if dn.GetVersion() != 100:
        gdaltest.post_reason('GNM: Check GNM version failed')
        return 'fail'
    if dn.GetName() != 'test_gnm':
        gdaltest.post_reason('GNM: Check GNM name failed')
        return 'fail'
    if dn.GetDescription() != 'Test file based GNM':
        gdaltest.post_reason('GNM: Check GNM description failed')
        return 'fail'

    dn = None
    return 'success'
Beispiel #9
0
def gnm_graph_connectedcomponents():

    if not ogrtest.have_gnm:
        return 'skip'

    ds = gdal.OpenEx('tmp/test_gnm')
    dn = gnm.CastToNetwork(ds)
    if dn is None:
        gdaltest.post_reason('cast to GNMNetwork failed')
        return 'fail'

    lyr = dn.GetPath(61, 50, gnm.GATConnectedComponents)
    if lyr is None:
        gdaltest.post_reason('failed to get path')
        return 'fail'

    if lyr.GetFeatureCount() == 0:
        dn.ReleaseResultSet(lyr)
        gdaltest.post_reason('failed to get path')
        return 'fail'

    dn.ReleaseResultSet(lyr)
    dn = None
    return 'success'
Beispiel #10
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)