KAMI911/osm_poi_matchmaker

View on GitHub
osm_poi_matchmaker/libs/geo.py

Summary

Maintainability
F
3 days
Test Coverage
# -*- coding: utf-8 -*-

try:
    import logging
    import sys
    import re
    from geoalchemy2 import WKTElement
    from osm_poi_matchmaker.utils import config
except ImportError as err:
    logging.error('Error %s import module: %s', __name__, err)
    logging.exception('Exception occurred')

    sys.exit(128)

PATTERN_COORDINATE = re.compile('[\d]{1,3}.[\d]{2,5}')


def geom_point(latitude, longitude, projection):
    if latitude is not None and longitude is not None:
        return WKTElement('POINT({} {})'.format(latitude, longitude), srid=projection)
    else:
        return None


def check_geom(latitude, longitude, proj=config.get_geo_default_projection()):
    """
    Basic check of latitude and longitude geom point
    Are both coordinates are exist and extract only the right format

    :param latitude: Coordinate latitude part of geom
    :param longitude: Coordinate longitude part of geom
    :param proj: Projection of geom
    :return: Validated coordinates or None on error
    """
    if (latitude is not None and latitude != '') and (longitude is not None and longitude != ''):
        if not isinstance(latitude, float):
            la = PATTERN_COORDINATE.search(latitude.replace(',', '.').strip())
            try:
                if la is not None:
                    lat = la.group()
                else:
                    return None
            except (AttributeError, IndexError) as e:
                logging.error('%s;%s', latitude, longitude)
                logging.error(e)
                logging.exception('Exception occurred')

                return None
        else:
            lat = latitude
        if not isinstance(longitude, float):
            lo = PATTERN_COORDINATE.search(longitude.replace(',', '.').strip())
            try:
                if lo is not None:
                    lon = lo.group()
                else:
                    return None
            except (AttributeError, IndexError) as e:
                logging.error('%s;%s', latitude, longitude)
                logging.error(e)
                logging.exception('Exception occurred')

                return None
        else:
            lon = longitude
        return geom_point(lat, lon, proj)
    else:
        return None


def check_hu_boundary(latitude, longitude):
    if (latitude is not None and latitude != '' and latitude != 0.0) and (
            longitude is not None and longitude != '' and longitude != 0.0):
        # This is a workaround because original datasource may contains swapped lat / lon parameters
        if float(latitude) < 44:
            logging.warning(
                'Latitude-longitude replacement. Originally was: latitude: %s, longitude: %s.',
                latitude, longitude)
            longitude, latitude = latitude, longitude
        # Another workaround to insert missing decimal point
        if float(longitude) > 200:
            longitude = '{}.{}'.format(longitude[:2], longitude[3:])
            if longitude.count('.') > 1:
                lon_tmp = longitude.split('.')
                longitude = '.'.join(lon_tmp[0:1])
        if float(latitude) > 200:
            latitude = '{}.{}'.format(latitude[:2], latitude[3:])
            if latitude.count('.') > 1:
                lat_tmp = latitude.split('.')
                latitude = '.'.join(lat_tmp[0:1])
        return latitude, longitude
    else:
        return None, None