def test_get_platform_tracks(self):
        result = q.get_platform_tracks(self.session,
                                       quantum="hour",
                                       platform_types=["drifter"])
        self.assertEqual(len(result), 101)

        array = np.array(result)

        self.assertEqual(np.unique(array[:, 0]), 1)
        self.assertEqual(np.unique(array[0, 1]), Platform.Type.drifter)
Ejemplo n.º 2
0
def observation_track_v1_0(query: str):
    """
    API Format: /api/v1.0/observation/track/<string:query>.json

    <string:query> : List of key=value pairs, seperated by ;
        valid query keys are: start_date, end_date, datatype, platform_type,
            meta_key, meta_value, mindepth, maxdepth, area, radius, quantum

    Observational query for tracks

    **Used in ObservationSelector**
    """
    query_dict = {
        key: value
        for key, value in [q.split('=') for q in query.split(';')]
    }
    data = []
    max_age = 86400
    params = {}

    MAPPING = {
        'start_date': 'starttime',
        'end_date': 'endtime',
        'platform_type': 'platform_types',
        'meta_key': 'meta_key',
        'meta_value': 'meta_value',
    }
    for k, v in query_dict.items():
        if k not in MAPPING:
            continue

        if k in ['start_date', 'end_date']:
            params[MAPPING[k]] = dateparse(v)
        elif k in ['datatype', 'meta_key', 'meta_value']:
            if k == 'meta_key' and v == 'Any':
                continue
            if k == 'meta_value' and query_dict.get('meta_key') == 'Any':
                continue

            params[MAPPING[k]] = v
        elif k == 'platform_type':
            params[MAPPING[k]] = v.split(',')
        else:
            params[MAPPING[k]] = float(v)

    if 'area' in query_dict:
        area = json.loads(query_dict.get('area'))
        if len(area) > 1:
            lats = [c[0] for c in area]
            lons = [c[1] for c in area]
            params['minlat'] = min(lats)
            params['minlon'] = min(lons)
            params['maxlat'] = max(lats)
            params['maxlon'] = max(lons)
        else:
            params['latitude'] = area[0][0]
            params['longitude'] = area[0][1]
            params['radius'] = float(query_dict.get('radius', 10))

        platforms = ob_queries.get_platforms(DB.session, **params)
        for param in [
                'minlat', 'maxlat', 'minlon', 'maxlon', 'latitude',
                'longitude', 'radius'
        ]:
            if param in params:
                del params[param]

        params['platforms'] = platforms

    coordinates = ob_queries.get_platform_tracks(
        DB.session, query_dict.get("quantum", "day"), **params)

    if len(coordinates) > 1:
        df = pd.DataFrame(np.array(coordinates),
                          columns=['id', 'type', 'lon', 'lat'])
        df['id'] = df.id.astype(int)

        vc = df.id.value_counts()
        for p_id in vc.where(vc > 1).dropna().index:
            d = {
                'type': "Feature",
                'geometry': {
                    'type':
                    "LineString",
                    'coordinates':
                    df[['lon', 'lat']][df.id == p_id].values.tolist()
                },
                'properties': {
                    'id': int(p_id),
                    'type': df.type[df.id == p_id].values[0].name,
                    'class': 'observation',
                }
            }
            data.append(d)

    result = {
        'type': "FeatureCollection",
        'features': data,
    }
    resp = jsonify(result)
    resp.cache_control.max_age = max_age
    return resp
Ejemplo n.º 3
0
def observation_track_v1_0(query: str):
    """
    API Format: /api/v1.0/observation/track/<string:query>.json

    <string:query> : List of key=value pairs, seperated by ;
        valid query keys are: start_date, end_date, datatype, platform_type,
            meta_key, meta_value, mindepth, maxdepth, area, radius, quantum

    Observational query for tracks

    **Used in ObservationSelector**
    """
    query_dict = {key: value for key, value in [q.split("=") for q in query.split(";")]}
    data = []
    max_age = 86400
    params = {}

    MAPPING = {
        "start_date": "starttime",
        "end_date": "endtime",
        "platform_type": "platform_types",
        "meta_key": "meta_key",
        "meta_value": "meta_value",
    }
    for k, v in query_dict.items():
        if k not in MAPPING:
            continue

        if k in ["start_date", "end_date"]:
            params[MAPPING[k]] = dateparse(v)
        elif k in ["datatype", "meta_key", "meta_value"]:
            if k == "meta_key" and v == "Any":
                continue
            if k == "meta_value" and query_dict.get("meta_key") == "Any":
                continue

            params[MAPPING[k]] = v
        elif k == "platform_type":
            params[MAPPING[k]] = v.split(",")
        else:
            params[MAPPING[k]] = float(v)

    if "area" in query_dict:
        area = json.loads(query_dict.get("area"))
        if len(area) > 1:
            lats = [c[0] for c in area]
            lons = [c[1] for c in area]
            params["minlat"] = min(lats)
            params["minlon"] = min(lons)
            params["maxlat"] = max(lats)
            params["maxlon"] = max(lons)
        else:
            params["latitude"] = area[0][0]
            params["longitude"] = area[0][1]
            params["radius"] = float(query_dict.get("radius", 10))

        platforms = ob_queries.get_platforms(DB.session, **params)
        for param in [
            "minlat",
            "maxlat",
            "minlon",
            "maxlon",
            "latitude",
            "longitude",
            "radius",
        ]:
            if param in params:
                del params[param]

        params["platforms"] = platforms

    coordinates = ob_queries.get_platform_tracks(
        DB.session, query_dict.get("quantum", "day"), **params
    )

    if len(coordinates) > 1:
        df = pd.DataFrame(np.array(coordinates), columns=["id", "type", "lon", "lat"])
        df["id"] = df.id.astype(int)
        df["lon"] = (df["lon"] + 360) % 360

        vc = df.id.value_counts()
        for p_id in vc.where(vc > 1).dropna().index:
            d = {
                "type": "Feature",
                "geometry": {
                    "type": "LineString",
                    "coordinates": df[["lon", "lat"]][df.id == p_id].values.tolist(),
                },
                "properties": {
                    "id": int(p_id),
                    "type": df.type[df.id == p_id].values[0].name,
                    "class": "observation",
                },
            }
            data.append(d)

    result = {
        "type": "FeatureCollection",
        "features": data,
    }
    resp = jsonify(result)
    resp.cache_control.max_age = max_age
    return resp