def create_grid(size):
    """Create a polygonal grid using Processing.

    :param size: The cell size.
    :type size: int

    :return: The grid layer in memory.
    :rtype: QgsVectorLayer
    """
    output_filename = unique_filename(prefix='grid', suffix='.shp')

    result = processing.runalg(
        'qgis:vectorgrid',
        '336199.970553,352338.397991,7636164.67975,7648562.41208',
        size,  # X spacing
        size,  # Y spacing
        0,  # Output as polygons
        output_filename)

    layer = QgsVectorLayer(output_filename, 'grid', 'ogr')
    layer.setCrs(QgsCoordinateReferenceSystem(32740))

    remove_fields(layer, ['xmin', 'xmax', 'ymin', 'ymax'])

    # Make a copy in memory
    memory = create_memory_layer(
        'grid', layer.geometryType(), layer.crs(), layer.fields())
    copy_layer(layer, memory)

    print "NB cells : %s" % layer.featureCount()

    return memory
Example #2
0
def create_grid(size):
    """Create a polygonal grid using Processing.

    :param size: The cell size.
    :type size: int

    :return: The grid layer in memory.
    :rtype: QgsVectorLayer
    """
    output_filename = unique_filename(prefix='grid', suffix='.shp')

    result = processing.runalg(
        'qgis:vectorgrid',
        '336199.970553,352338.397991,7636164.67975,7648562.41208',
        size,  # X spacing
        size,  # Y spacing
        0,  # Output as polygons
        output_filename)

    layer = QgsVectorLayer(output_filename, 'grid', 'ogr')
    layer.setCrs(QgsCoordinateReferenceSystem(32740))

    remove_fields(layer, ['xmin', 'xmax', 'ymin', 'ymax'])

    # Make a copy in memory
    memory = create_memory_layer(
        'grid', layer.geometryType(), layer.crs(), layer.fields())
    copy_layer(layer, memory)
def reproject(layer, output_crs):
    """Reproject a vector layer to a specific CRS.

    Issue https://github.com/inasafe/inasafe/issues/3183

    :param layer: The layer to reproject.
    :type layer: QgsVectorLayer

    :param output_crs: The destination CRS.
    :type output_crs: QgsCoordinateReferenceSystem

    :return: Reprojected memory layer.
    :rtype: QgsVectorLayer
    """
    input_crs = layer.crs()
    input_fields = layer.fields()

    reprojected = create_memory_layer(
        'reprojected', layer.geometryType(), output_crs, input_fields)
    reprojected.startEditing()

    crs_transform = QgsCoordinateTransform(input_crs, output_crs)

    out_feature = QgsFeature()

    for feature in layer.getFeatures():
        geom = feature.geometry()
        geom.transform(crs_transform)
        out_feature.setGeometry(geom)
        out_feature.setAttributes(feature.attributes())
        reprojected.addFeature(out_feature)

    reprojected.commitChanges()
    return reprojected
Example #4
0
def reproject(layer, output_crs):
    """Reproject a vector layer to a specific CRS.

    Issue https://github.com/inasafe/inasafe/issues/3183

    :param layer: The layer to reproject.
    :type layer: QgsVectorLayer

    :param output_crs: The destination CRS.
    :type output_crs: QgsCoordinateReferenceSystem

    :return: Reprojected memory layer.
    :rtype: QgsVectorLayer
    """
    input_crs = layer.crs()
    input_fields = layer.fields()

    reprojected = create_memory_layer('reprojected', layer.geometryType(),
                                      output_crs, input_fields)
    reprojected.startEditing()

    crs_transform = QgsCoordinateTransform(input_crs, output_crs)

    out_feature = QgsFeature()

    for feature in layer.getFeatures():
        geom = feature.geometry()
        geom.transform(crs_transform)
        out_feature.setGeometry(geom)
        out_feature.setAttributes(feature.attributes())
        reprojected.addFeature(out_feature)

    reprojected.commitChanges()
    return reprojected
Example #5
0
def centroids(layer):
    """Create centroids."""
    centroids_layer = create_memory_layer(
        'centroids',
        Qgis.Point,
        layer.crs(),
        layer.fields())

    centroids_layer.startEditing()

    for feature in layer.getFeatures():
        new_feature = QgsFeature(feature)
        new_feature.setGeometry(feature.geometry().centroid())
        centroids_layer.addFeature(new_feature)
    centroids_layer.commitChanges()
    return centroids_layer
def centroids(layer):
    """Create centroids."""
    centroids_layer = create_memory_layer(
        'centroids',
        QGis.Point,
        layer.crs(),
        layer.fields())

    centroids_layer.startEditing()

    for feature in layer.getFeatures():
        new_feature = QgsFeature(feature)
        new_feature.setGeometry(feature.geometry().centroid())
        centroids_layer.addFeature(new_feature)
    centroids_layer.commitChanges()
    return centroids_layer
Example #7
0
def show_qgis_feature(feature, crs=None):
    """Show a QGIS feature.

    :param feature: The feature to display.
    :type feature: QgsFeature

    :param crs: The CRS of the geometry. 4326 by default.
    :type crs: QgsCoordinateReferenceSystem
    """
    if crs is None:
        crs = QgsCoordinateReferenceSystem(4326)
    layer = create_memory_layer('Debug', feature.geometry().type(), crs)
    data_provider = layer.dataProvider()

    for i, attr in enumerate(feature.attributes()):
        data_provider.addAttributes(
            [QgsField('attribute %s' % i, QVariant.String)])

    layer.updateFields()

    data_provider.addFeatures([feature])
    layer.updateExtents()
    show_qgis_layer(layer)
Example #8
0
def assign_cost_to_cells(network_graph, source, destination, id_field):
    """Assign the nearest destination point from the source layer.

    :param network_graph: The network graph.
    :type network_graph: Graph

    :param source: Grid as a polygon vector layer
    :type source: QgsVectorLayer

    :param destination: The destination point layer.
    :type destination: QgsVectorLayer

    :param id_field: The ID field in the destination layer.
    :type id_field: basestring
    """
    spatial_index = create_spatial_index(destination)
    destination_features = {}
    for feature in destination.getFeatures():
        destination_features[feature.id()] = feature
    index_id_field = destination.fields().indexFromName(id_field)

    fields = [QgsField('distance', QVariant.Int)]
    routes = create_memory_layer(
        'routes', Qgis.Line, destination.crs(), fields)
    routes.startEditing()

    source.startEditing()
    source.addAttribute(
        QgsField('destination_id', QVariant.Int, len=5, prec=0))
    dest_id_field = source.fields().indexFromName('destination_id')
    source.addAttribute(QgsField('distance', QVariant.Int, len=5, prec=0))
    distance_field = source.fields().indexFromName('distance')
    source.commitChanges()

    request = QgsFeatureRequest()
    request.setFilterExpression('"has_road" = \'true\'')
    # request.setLimit(20)  # Hack for now to speedup development
    i = 0
    for source_cell in source.getFeatures(request):
        source_geometry_point = source_cell.geometry().centroid().asPoint()
        desination_id = source_cell['destination_id']
        if desination_id is None or isinstance(desination_id, QPyNullVariant):
            source.startEditing()
            nearest_health_points = spatial_index.nearestNeighbor(
                source_geometry_point, 5)
            minimum_distance = None
            minimal_geom = None
            for health_point in nearest_health_points:
                try:
                    i += 1
                    p = destination_features[health_point].geometry().asPoint()
                    geom, distance, _ = network_graph.route(
                        source_geometry_point, p)
                except:
                    distance = -1

                if minimum_distance is None or (
                                minimum_distance > distance >= 0):
                    minimal_geom = geom
                    minimum_distance = distance

            if minimum_distance:
                feature = QgsFeature()
                feature.setGeometry(minimal_geom)
                feature.setAttributes([minimum_distance])
                routes.addFeatures([feature])

                index_id = destination_features[health_point][index_id_field]
                destination_value = index_id
            else:
                destination_value = '-1'
                minimum_distance = '-1'

            source.changeAttributeValue(
                source_cell.id(), dest_id_field, destination_value)
            source.changeAttributeValue(
                source_cell.id(), distance_field, minimum_distance)
            intersecting_blocks(minimal_geom, destination_value, grid)
            source.commitChanges()

        else:
            # fix_print_with_import
            print('speedup')
            geom, distance, _ = network_graph.route(
                source_geometry_point,
                destination_features[desination_id].geometry().asPoint())

    source.commitChanges()
    # source.commitErrors()
    routes.commitChanges()
def assign_cost_to_cells(network_graph, source, destination, id_field):
    """Assign the nearest destination point from the source layer.

    :param network_graph: The network graph.
    :type network_graph: Graph

    :param source: Grid as a polygon vector layer
    :type source: QgsVectorLayer

    :param destination: The destination point layer.
    :type destination: QgsVectorLayer

    :param id_field: The ID field in the destination layer.
    :type id_field: basestring
    """
    spatial_index = create_spatial_index(destination)
    destination_features = {}
    for feature in destination.getFeatures():
        destination_features[feature.id()] = feature
    index_id_field = destination.fieldNameIndex(id_field)

    fields = [QgsField('distance', QVariant.Int)]
    routes = create_memory_layer(
        'routes', QGis.Line, destination.crs(), fields)
    routes.startEditing()

    source.startEditing()
    source.addAttribute(
        QgsField('destination_id', QVariant.Int, len=5, prec=0))
    dest_id_field = source.fieldNameIndex('destination_id')
    source.addAttribute(QgsField('distance', QVariant.Int, len=5, prec=0))
    distance_field = source.fieldNameIndex('distance')
    source.commitChanges()

    request = QgsFeatureRequest()
    request.setFilterExpression('"has_road" = \'true\'')
    # request.setLimit(20)  # Hack for now to speedup development
    i = 0
    for source_cell in source.getFeatures(request):
        source_geometry_point = source_cell.geometry().centroid().asPoint()
        desination_id = source_cell['destination_id']
        if desination_id is None or isinstance(desination_id, QPyNullVariant):
            source.startEditing()
            nearest_health_points = spatial_index.nearestNeighbor(
                source_geometry_point, 5)
            minimum_distance = None
            minimal_geom = None
            for health_point in nearest_health_points:
                try:
                    i += 1
                    p = destination_features[health_point].geometry().asPoint()
                    geom, distance, _ = network_graph.route(
                        source_geometry_point, p)
                except:
                    distance = -1

                if minimum_distance is None or (
                                minimum_distance > distance >= 0):
                    minimal_geom = geom
                    minimum_distance = distance

            if minimum_distance:
                feature = QgsFeature()
                feature.setGeometry(minimal_geom)
                feature.setAttributes([minimum_distance])
                routes.addFeatures([feature])

                index_id = destination_features[health_point][index_id_field]
                destination_value = index_id
            else:
                destination_value = '-1'
                minimum_distance = '-1'

            source.changeAttributeValue(
                source_cell.id(), dest_id_field, destination_value)
            source.changeAttributeValue(
                source_cell.id(), distance_field, minimum_distance)
            intersecting_blocks(minimal_geom, destination_value, grid)
            source.commitChanges()

        else:
            print 'speedup'
            geom, distance, _ = network_graph.route(
                source_geometry_point,
                destination_features[desination_id].geometry().asPoint())

    source.commitChanges()
    # source.commitErrors()
    routes.commitChanges()
    print 'Call : %s' % i
    return routes, source