def _get_multipolygon_geometry_from_row(self, row):
     if row.geom_type.django == 'PolygonField':
         geom = OGRGeometry(OGRGeomType('MultiPolygon'))
         geom.add(row.geom)
         geom.coord_dim = 2
         return geom
     elif row.geom_type.django == 'MultiPolygonField':
         return geom
Beispiel #2
0
def process(key, metadata):

    defaults = {}

    if 'geometry' in metadata:

        geom = OGRGeometry(json.dumps(metadata['geometry']))
        geom.coord_dim = 2

        defaults['geom'] = geom.geos
        # del metadata['geometry']

    if 'acquired' in metadata:
        defaults['acquired'] = parse(metadata['acquired'])

    if 'archived' in metadata:
        defaults['published'] = parse(metadata['archived'])

    if 'published' in metadata:
        defaults['published'] = parse(metadata['published'])

    if 'processed' in metadata:
        defaults['processed'] = datetime.utcfromtimestamp(metadata['processed'])

    if 'file_sizes' in metadata:
        defaults['bytes'] = functools.reduce(operator.add, metadata['file_sizes'])

    if 'raster_size' in metadata:
        defaults['pixels'] = functools.reduce(operator.mul, metadata['raster_size'])

    if 'cloud_fraction' in metadata:
        defaults['cloud_fraction'] = float(metadata['cloud_fraction'])

    if 'fill_fraction' in metadata:
        defaults['fill_fraction'] = float(metadata['fill_fraction'])

    defaults['data'] = metadata

    product_id = metadata.get('product','N/A')

    product, created = Product.objects.get_or_create(name=product_id, defaults={'groups':['public']})

    defaults['groups'] = product.groups

    instance, created = Metadata.objects.update_or_create(key=key, product=product, defaults=defaults)

    return instance, created
Beispiel #3
0
def convert_shapefile(shapefilename, srid=4674):
    """
    shapefilename: considera nomenclatura de shapefile do IBGE para determinar se é UF 
                   ou Municípios.
                   ex. 55UF2500GC_SIR.shp para UF e 55MU2500GC_SIR.shp para Municípios
    srid: 4674 (Projeção SIRGAS 2000)
    """
    # /home/nando/Desktop/IBGE/2010/55MU2500GC_SIR.shp
    ds = DataSource(shapefilename)

    is_uf = shapefilename.upper().find('UF') != -1

    transform_coord = None
    if srid != SRID:
        transform_coord = CoordTransform(SpatialReference(srid), SpatialReference(SRID))

    if is_uf:
        model = UF
    else:
        model = Municipio

    ct = 0
    for f in ds[0]:

        # 3D para 2D se necessário
        if f.geom.coord_dim != 2:
            f.geom.coord_dim = 2

        # converte para MultiPolygon se necessário
        if isinstance(f.geom, Polygon):
            g = OGRGeometry(OGRGeomType('MultiPolygon'))
            g.add(f.geom)
        else:
            g = f.geom

        # transforma coordenadas se necessário
        if transform_coord:
            g.transform(transform_coord)

        # força 2D
        g.coord_dim = 2
        kwargs = {}

        if is_uf:
            kwargs['nome'] = capitalize_name(unicode(f.get(CAMPO_NOME_UF),'latin1'))
            kwargs['geom'] = g.ewkt
            kwargs['id_ibge'] = f.get(CAMPO_GEOCODIGO_UF)
            kwargs['regiao'] = capitalize_name(unicode(f.get(CAMPO_REGIAO_UF), 'latin1'))
            kwargs['uf'] = UF_SIGLAS_DICT.get(kwargs['id_ibge'])
        else:
            kwargs['nome'] = capitalize_name(unicode(f.get(CAMPO_NOME_MU),'latin1'))
            kwargs['geom'] = g.ewkt
            kwargs['id_ibge'] = f.get(CAMPO_GEOCODIGO_MU)
            kwargs['uf'] = UF.objects.get(pk=f.get(CAMPO_GEOCODIGO_MU)[:2])
            kwargs['uf_sigla'] = kwargs['uf'].uf
            kwargs['nome_abreviado'] = slugify(kwargs['nome'])
            # tenta corrigir nomes duplicados, são em torno de 242 nomes repetidos
            # adicionando a sigla do estado no final
            if Municipio.objects.filter(nome_abreviado=kwargs['nome_abreviado']).count() > 0:
                kwargs['nome_abreviado'] = u'%s-%s' % (kwargs['nome_abreviado'], kwargs['uf_sigla'].lower())

        instance = model(**kwargs)
        instance.save()

        ct += 1

    print(ct, (is_uf and "Unidades Federativas criadas" or "Municipios criados"))
Beispiel #4
0
 def clean_geom(self):
     """ Tricks to add default Z dimension into geometry """
     geom = self.cleaned_data["geom"]
     ogr = OGRGeometry(geom.wkt)
     ogr.coord_dim = 3
     return ogr.geos
Beispiel #5
0
print(f'\nReading input data from the following file:\n {geojson_path}\n')
data_source = DataSource(geojson_path)
layer = data_source[0]

feature_count = len(layer)
i = 1
for feature in layer:
    try:
        feature_data = {
            key: feature.get(value) for (key, value) in model_layer_mapping.items()
        }

        # Use OGRGeometry to strip z-values from polyline vertices
        geometry = OGRGeometry(feature.geom.ewkt)
        geometry.coord_dim = 2
        feature_data['the_geom'] = geometry.ewkt
        feature_data['diff_id'] = diff_id

        if feature_data['type'] == 'way':
            feature_data['type'] = OsmDiff.WAY
        if feature_data['type'] == 'node':
            feature_data['type'] = OsmDiff.NODE
        if feature_data['type'] == 'relation':
            feature_data['type'] = OsmDiff.RELATION

        if isinstance(feature_data['tags'], str):
            feature_data['tags'] = json.loads(feature_data['tags'])
        if isinstance(feature_data['meta'], str):
            feature_data['meta'] = json.loads(feature_data['meta'])
Beispiel #6
0
def load_osm_diff(diff_id, logger=None):
    start_time = datetime.datetime.now()
    if not logger:
        logger = initialize_logger()

    logger.info(f'Executing script:   {os.path.abspath(__file__)}')
    logger.info(f'Execution start at: {start_time}')

    model_layer_mapping = {
        'osm_id': 'id',
        'tags': 'tags',
        'meta': 'meta',
        'tainted': 'tainted',
        'type': 'type',
    }

    geojson_path = r'D:\OpenStreetMap\diff_data\{diff_id}\{diff_id}.geojson'.format(
        diff_id=diff_id)
    logger.debug(f'Input geoJSON file: {geojson_path}')

    try:
        data_source = DataSource(geojson_path)
        layer = data_source[0]

        feature_count = len(layer)
        i = 1
        for feature in layer:
            try:
                feature_data = {
                    key: feature.get(value)
                    for (key, value) in model_layer_mapping.items()
                }

                # Use OGRGeometry to strip z-values from polyline vertices
                geometry = OGRGeometry(feature.geom.ewkt)
                geometry.coord_dim = 2
                feature_data['the_geom'] = geometry.ewkt
                feature_data['diff_id'] = diff_id

                if feature_data['type'] == 'way':
                    feature_data['type'] = OsmDiff.WAY
                if feature_data['type'] == 'node':
                    feature_data['type'] = OsmDiff.NODE
                if feature_data['type'] == 'relation':
                    feature_data['type'] = OsmDiff.RELATION

                if isinstance(feature_data['tags'], str):
                    feature_data['tags'] = json.loads(feature_data['tags'])
                if isinstance(feature_data['meta'], str):
                    feature_data['meta'] = json.loads(feature_data['meta'])

                route = OsmDiff(**feature_data)
                route.save()

                if i % 10 == 0:
                    logger.debug(f'Processed {i} of {feature_count} features')
                if i == feature_count:
                    logger.debug(f'Processed {i} of {feature_count} features')
                i += 1
            except Exception as exc:
                logger.error(f'\n\nFailed on feautre {i} of {feature_count}')
                logger.error(feature_data)
                logger.exception(exc)
                i += 1

        logger.debug(
            '\nCreating buffer polygons of the newly generated ways and saving to database'
        )
        ways = OsmDiff.objects.filter(type=OsmDiff.WAY).filter(diff_id=diff_id)

        polys = [LineString(way.the_geom).buffer(0.01) for way in ways]
        multi_polys = cascaded_union(polys)

        logger.debug('Saving polygons to database')
        feature_count = len(multi_polys)
        i = 0
        for poly in multi_polys:
            osm_diff_buffer = OsmDiffBuffer(
                diff_id=diff_id,
                created_date=datetime.datetime.today(),
                the_geom=poly.wkt)
            osm_diff_buffer.save()

            if i % 10 == 0:
                logger.debug(f'Processed {i} of {feature_count} features')
            if i == feature_count:
                logger.debug(f'Processed {i} of {feature_count} features')
            i += 1

        end_time = datetime.datetime.now()

        logger.info(f'Execution complete at:  {end_time}')
        logger.info(f'Execution run time:     {end_time-start_time}')
        return True
    except Exception as exc:
        logger.error(f'An error occurred: load_osm_diff: {diff_id}')
        logger.exception(exc)
        return False