Skip to content

Areas

Accessed via sdk.areas on an AspiaSpace instance.

Service wrapper for the Areas endpoints.

Source code in src/aspiaspace/services/areas.py
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
class AreasService:
    """
    Service wrapper for the Areas endpoints.
    """

    def __init__(self, client):
        self._client = client

    def all(self):
        """Retrieves a list of areas

        Raises:
            ValueError: If response is not successful and error message

        Returns:
            features (str): JSON string of areas.
        """
        params = {}

        response = self._client._request(
            "GET",
            "/customer/areas",
            params=params or None,
        )

        if response["success"]:
            return response["data"]
        else:
            raise ValueError("ERROR: " + response)



    def vigour(self, date: str="", start: str="", end:str =""):
        """Retrieve the average NVDI, GCVI and NDWI for all areas on a specific date or a list of areas.

        Args:
            date (str, optional): Single query date. Cannot be passed with start or end dates as well. Defaults to "".
            start (str, optional): Start of date range. Defaults to "".
            end (str, optional): End of date range. Defaults to "".

        Returns:
            results (pandas.DataFrame): Dataframe of results
        """

        if date == "" and start == "" and end == "":
            raise ValueError("Either a date or a date range must be provided (date, start, end) in this format YYYY-MM-DD")

        if date != "":

            if not re.fullmatch(r"\d{4}-\d{2}-\d{2}", date):
                raise ValueError("date must be in format 'yyyy-mm-dd'")

            logger.debug("Fetching area vigour metrics for date %s", date)

            response = self._client._request(
                "GET",
                "/customer/areas/vigour",
                params={"date": date},
            )

            if len(response["data"]) == 0:
                logger.warning(f"No vigour data for date {date}")
                return None

            return json_normalize(response["data"])

        if start != "" and end != "":
            if not re.fullmatch(r"\d{4}-\d{2}-\d{2}", start):
                raise ValueError("date must be in format 'yyyy-mm-dd'")
            if not re.fullmatch(r"\d{4}-\d{2}-\d{2}", end):
                raise ValueError("date must be in format 'yyyy-mm-dd'")
            response = self._client._request(
                "GET",
                "/customer/areas/vigour",
                params={"start_date": start, "end_date": end}, 
            )

            if len(response["data"]) == 0:
                logger.warning(f"No vigour data between {start} and {end}")
                return None

            df = json_normalize(response["data"])

            df["ndvi"] = df["ndvi"].astype(float)
            df["gcvi"] = df["gcvi"].astype(float)
            df["ndwi"] = df["ndwi"].astype(float)

            return df

all()

Retrieves a list of areas

Raises:

Type Description
ValueError

If response is not successful and error message

Returns:

Name Type Description
features str

JSON string of areas.

Source code in src/aspiaspace/services/areas.py
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
def all(self):
    """Retrieves a list of areas

    Raises:
        ValueError: If response is not successful and error message

    Returns:
        features (str): JSON string of areas.
    """
    params = {}

    response = self._client._request(
        "GET",
        "/customer/areas",
        params=params or None,
    )

    if response["success"]:
        return response["data"]
    else:
        raise ValueError("ERROR: " + response)

vigour(date='', start='', end='')

Retrieve the average NVDI, GCVI and NDWI for all areas on a specific date or a list of areas.

Parameters:

Name Type Description Default
date str

Single query date. Cannot be passed with start or end dates as well. Defaults to "".

''
start str

Start of date range. Defaults to "".

''
end str

End of date range. Defaults to "".

''

Returns:

Name Type Description
results DataFrame

Dataframe of results

Source code in src/aspiaspace/services/areas.py
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
def vigour(self, date: str="", start: str="", end:str =""):
    """Retrieve the average NVDI, GCVI and NDWI for all areas on a specific date or a list of areas.

    Args:
        date (str, optional): Single query date. Cannot be passed with start or end dates as well. Defaults to "".
        start (str, optional): Start of date range. Defaults to "".
        end (str, optional): End of date range. Defaults to "".

    Returns:
        results (pandas.DataFrame): Dataframe of results
    """

    if date == "" and start == "" and end == "":
        raise ValueError("Either a date or a date range must be provided (date, start, end) in this format YYYY-MM-DD")

    if date != "":

        if not re.fullmatch(r"\d{4}-\d{2}-\d{2}", date):
            raise ValueError("date must be in format 'yyyy-mm-dd'")

        logger.debug("Fetching area vigour metrics for date %s", date)

        response = self._client._request(
            "GET",
            "/customer/areas/vigour",
            params={"date": date},
        )

        if len(response["data"]) == 0:
            logger.warning(f"No vigour data for date {date}")
            return None

        return json_normalize(response["data"])

    if start != "" and end != "":
        if not re.fullmatch(r"\d{4}-\d{2}-\d{2}", start):
            raise ValueError("date must be in format 'yyyy-mm-dd'")
        if not re.fullmatch(r"\d{4}-\d{2}-\d{2}", end):
            raise ValueError("date must be in format 'yyyy-mm-dd'")
        response = self._client._request(
            "GET",
            "/customer/areas/vigour",
            params={"start_date": start, "end_date": end}, 
        )

        if len(response["data"]) == 0:
            logger.warning(f"No vigour data between {start} and {end}")
            return None

        df = json_normalize(response["data"])

        df["ndvi"] = df["ndvi"].astype(float)
        df["gcvi"] = df["gcvi"].astype(float)
        df["ndwi"] = df["ndwi"].astype(float)

        return df