def test_utm(self, patch_config):
        lats = [0.2, 0.8, 0.6]
        lons = [10.2, 10.8, 11.5]

        dataset = config.load_datasets()[SRTM_DATASET_NAME]
        z = backend.get_elevation(lats, lons, dataset)

        dataset_utm = config.load_datasets()[SRTM_UTM_DATASET_NAME]
        z_utm = backend.get_elevation(lats, lons, dataset_utm)

        assert np.allclose(z, z_utm)
    def test_dataset_crs_format_equivalence(self, patch_config):
        lats = [43.597009, 45.534601]
        lons = [1.455697, 10.698698]

        dataset_epsg = config.load_datasets()[EU_DEM_DATASET_NAME]
        z_epsg = backend.get_elevation(lats, lons, dataset_epsg)

        dataset_wkt = config.load_datasets()[EU_DEM_NO_EPSG_DATASET_NAME]
        z_wkt = backend.get_elevation(lats, lons, dataset_wkt)

        assert np.allclose(z_epsg, z_wkt)
 def test_srtm_tiles(self, patch_config):
     lats = [0.1, 0.9]
     lons = [10.5, 11.5]
     dataset = config.load_datasets()[SRTM_DATASET_NAME]
     z = backend.get_elevation(lats, lons, dataset)
     assert all(z)
     assert all(np.isfinite(z))
Exemple #4
0
 def test_single_dataset(self, patch_config):
     lats = [0.1, 0.9]
     lons = [10.5, 11.5]
     dataset = config.load_datasets()[SRTM_DATASET_NAME]
     z, names = backend.get_elevation(lats, lons, [dataset])
     assert all(z)
     assert all(np.isfinite(z))
     assert names == [SRTM_DATASET_NAME] * len(lats)
 def test_single_file_dataset(self):
     lats = [0.1, -9]
     lons = [-50.5, 12.11]
     interpolation = "cubic"
     dataset = config.load_datasets()[ETOPO1_DATASET_NAME]
     elevations_by_dataset = backend.get_elevation(lats, lons, dataset,
                                                   interpolation)
     elevations_by_path = backend._get_elevation_from_path(
         lats, lons, ETOPO1_GEOTIFF_PATH, interpolation)
     assert elevations_by_dataset == elevations_by_path
Exemple #6
0
def get_elevation_bunch(dataset_name):
    """Calculate the elevation for the given locations.

    Args:
        dataset_name: String matching a dataset in the config file.

    Json Body:
        inerpolation: Interpolation mode.
        nodata_value: Value which should be returned if no data is found for a location.
        locations: String with locations

    Returns:
        Response.
    """

    try:
        # Parse inputs.
        interpolation = _parse_interpolation(request.json.get("interpolation"))
        nodata_value = _parse_nodata_value(request.json.get("nodata_value"))
        lats, lons = _parse_locations(
            request.json["locations"], _load_config()["max_locations_per_request"]
        )

        # Get the z values.
        datasets = _get_datasets(dataset_name)
        elevations, dataset_names = backend.get_elevation(
            lats, lons, datasets, interpolation, nodata_value
        )

        # Build response.
        results = []
        for z, dataset_name, lat, lon in zip(elevations, dataset_names, lats, lons):
            results.append(
                {
                    "elevation": z,
                    "dataset": dataset_name,
                    "location": {"lat": lat, "lng": lon},
                }
            )
        data = {"status": "OK", "results": results}
        return jsonify(data)

    except (ClientError, backend.InputError) as e:
        return jsonify({"status": "INVALID_REQUEST", "error": str(e)}), 400
    except config.ConfigError as e:
        return (
            jsonify({"status": "SERVER_ERROR", "error": "Config Error: {}".format(e)}),
            500,
        )
    except Exception as e:
        if app.debug:
            raise e
        app.logger.error(e)
        msg = "Unhandled server error, see server logs for details."
        return jsonify({"status": "SERVER_ERROR", "error": msg}), 500
Exemple #7
0
 def test_multi_dataset_mask(self, patch_config):
     lats = [47.625765, 0.1, 70]
     lons = [9.418759, 10.5, 150]
     datasets = [
         config.load_datasets()[ETOPO1_RESAMPLED_DATASET_NAME],
         config.load_datasets()[EU_DEM_DATASET_NAME],
         config.load_datasets()[SRTM_DATASET_NAME],
     ]
     z, dataset_names = backend.get_elevation(lats, lons, datasets)
     assert all(np.isfinite(z))
     assert dataset_names == [ETOPO1_RESAMPLED_DATASET_NAME] * len(lats)
Exemple #8
0
def get_elevation(dataset_name):
    """Calculate the elevation for the given locations.

    Args:
        dataset_name: String matching a dataset in the config file.

    Returns:
        Response.
    """

    try:
        # Parse inputs.
        interpolation = request.args.get("interpolation",
                                         DEFAULT_INTERPOLATION_METHOD)
        interpolation = _validate_interpolation(interpolation)
        locations = request.args.get("locations")
        lats, lons = _parse_locations(
            locations,
            _load_config()["max_locations_per_request"])

        # Get the z values.
        dataset = _get_dataset(dataset_name)
        elevations = backend.get_elevation(lats, lons, dataset, interpolation)

        # Build response.
        results = []
        for z, lat, lon in zip(elevations, lats, lons):
            results.append({
                "elevation": z,
                "location": {
                    "lat": lat,
                    "lng": lon
                }
            })
        data = {"status": "OK", "results": results}
        return jsonify(data)

    except (ClientError, backend.InputError) as e:
        return jsonify({"status": "INVALID_REQUEST", "error": str(e)}), 400
    except config.ConfigError as e:
        return (
            jsonify({
                "status": "SERVER_ERROR",
                "error": "Config Error: {}".format(e)
            }),
            500,
        )
    except Exception as e:
        if app.debug:
            raise e
        app.logger.error(e)
        msg = "Server error, please retry request."
        return jsonify({"status": "SERVER_ERROR", "error": msg}), 500
 def test_alternate_tiled_dataset(self, patch_config):
     lats = [47.625765]
     lons = [9.418759]
     dataset = config.load_datasets()[EU_DEM_DATASET_NAME]
     z = backend.get_elevation(lats, lons, dataset)
     assert np.isfinite(z)
 def test_out_of_srtm_bounds_utm(self, patch_config):
     lats = [70]
     lons = [10.5]
     dataset = config.load_datasets()[SRTM_DATASET_NAME]
     z = backend.get_elevation(lats, lons, dataset)[0]
     assert z is None
 def test_oob(self, patch_config):
     lats = [1.5, -0.5, 0.5, 0.5]
     lons = [10.5, 11.5, 9.5, 12.5]
     dataset = config.load_datasets()[SRTM_DATASET_NAME]
     z = backend.get_elevation(lats, lons, dataset)
     assert all([x is None for x in z])
Exemple #12
0
def get_elevation(dataset_name):
    """Calculate the elevation for the given locations.

    Args:
        dataset_name: String matching a dataset in the config file.

    Returns:
        Response.
    """

    try:
        # Parse inputs.
        interpolation = _parse_interpolation(
            _find_request_argument(request, "interpolation"))
        nodata_value = _parse_nodata_value(
            _find_request_argument(request, "nodata_value"))
        lats, lons = _parse_locations(
            _find_request_argument(request, "locations"),
            _load_config()["max_locations_per_request"],
        )

        # Check if need to do sampling.
        n_samples = _parse_n_samples(
            _find_request_argument(request, "samples"),
            _load_config()["max_locations_per_request"],
        )
        if n_samples:
            lats, lons = utils.sample_points_on_path(lats, lons, n_samples)

        # Get the z values.
        datasets = _get_datasets(dataset_name)
        elevations, dataset_names = backend.get_elevation(
            lats, lons, datasets, interpolation, nodata_value)

        # Build response.
        results = []
        for z, dataset_name, lat, lon in zip(elevations, dataset_names, lats,
                                             lons):
            results.append({
                "elevation": z,
                "dataset": dataset_name,
                "location": {
                    "lat": lat,
                    "lng": lon
                },
            })
        data = {"status": "OK", "results": results}
        return jsonify(data)

    except (ClientError, backend.InputError) as e:
        return jsonify({"status": "INVALID_REQUEST", "error": str(e)}), 400
    except config.ConfigError as e:
        return (
            jsonify({
                "status": "SERVER_ERROR",
                "error": "Config Error: {}".format(e)
            }),
            500,
        )
    except Exception as e:
        if app.debug:
            raise e
        app.logger.error(e)
        msg = "Unhandled server error, see server logs for details."
        return jsonify({"status": "SERVER_ERROR", "error": msg}), 500
Exemple #13
0
def get_elevation_auto(status='OK'):
    """Calculate the elevation for the given locations.

    Args:
        dataset_name: String matching a dataset in the config file.

    Returns:
        Response.
    """

    try:
        # Parse inputs.
        interpolation = request.args.get("interpolation",
                                         DEFAULT_INTERPOLATION_METHOD)
        interpolation = _validate_interpolation(interpolation)
        locations = request.args.get("locations")
        if locations == None:
            locations = request.args.get("region")
            lats, lons = _parse_region(
                locations,
                _load_config()["max_locations_per_request"])
        else:
            lats, lons = _parse_locations(
                locations,
                _load_config()["max_locations_per_request"])
            #data = {"status": "FAIL", "reason": "supports only region"}
            #return jsonify(data)

        # Get the z values.
        #dataset = _get_dataset(dataset_name)
        datasets = _load_datasets()
        numdatasets = len(list(datasets))
        if 'maxres' in request.args:
            i = 0
        elif 'dataset' in request.args:
            reqdataset = request.args.get("dataset")
            for i in range(0, numdatasets):
                if (datasets[list(datasets)[i]].name == reqdataset):
                    break
            i = i - 1
            if i < 0: i = 0

        else:
            minres = min(abs(lats[1] - lats[0]),
                         abs(np.unique(lons)[1] - np.unique(lons)[0])) * 3600
            for i in range(0, numdatasets):
                if (datasets[list(datasets)[i]].resolution > minres):
                    break
            i = i - 1
            if i < 0: i = 0

        keepgoing = True
        while keepgoing:
            try:
                elevations = backend.get_elevation(lats, lons,
                                                   datasets[list(datasets)[i]],
                                                   interpolation)
            except (ClientError, backend.InputError):
                i = i + 1
                continue
            datasetused = list(datasets)[i]

            if [
                    elevations[i] == elevations[i]
                    for i in range(len(elevations))
            ].count(False):
                i = i + 1
            else:
                keepgoing = False
            if i >= numdatasets:
                status = 'MISSING DATA'
                keepgoing = False

            #if i<numdatasets-1 and [elevations[i]==elevations[i] for i in range(len(elevations))].count(False): # of nans
            #    return(get_elevation('srtm30m', status='FALLBACK')) ;

        ## Build response.
        results = []
        if 'verbose' in request.args:
            for z, lat, lon in zip(elevations, lats, lons):
                results.append({
                    "elevation": z,
                    "location": {
                        "lat": lat,
                        "lng": lon
                    }
                })
        else:
            results.append({"elevation": elevations})

        data = {"status": status, "dataset": datasetused, "results": results}
        return jsonify(data)

    except (ClientError, backend.InputError) as e:
        return jsonify({"status": "INVALID_REQUEST", "error": str(e)}), 400
    except config.ConfigError as e:
        return (
            jsonify({
                "status": "SERVER_ERROR",
                "error": "Config Error: {}".format(e)
            }),
            500,
        )
    except Exception as e:
        if app.debug:
            raise e
        app.logger.error(e)
        msg = "Server error, please retry request."
        return jsonify({"status": "SERVER_ERROR", "error": msg}), 500