Skip to main content

A python library for interacting with the OpenEPI data

Project description

openepi-client

A python client for accessing data from OpenEPI. Can be installed from PyPI on https://pypi.org/project/openepi-client/

Table of Contents

Weather

Sync usage

from openepi_client import GeoLocation
from openepi_client.weather import WeatherClient

# Getting the sunrise and sunset times for a location
sunrise_sunset = WeatherClient.get_sunrise(geolocation=GeoLocation(lat=51.5074, lon=0.1278))

# Getting the weather forecast for a location
forecast = WeatherClient.get_location_forecast(geolocation=GeoLocation(lat=51.5074, lon=0.1278, alt=0))

Async usage

from openepi_client import GeoLocation
from openepi_client.weather import AsyncWeatherClient

# Getting the sunrise and sunset times for a location
sunrise_sunset = await AsyncWeatherClient.get_sunrise(geolocation=GeoLocation(lat=51.5074, lon=0.1278))

# Getting the weather forecast for a location
forecast = await AsyncWeatherClient.get_location_forecast(geolocation=GeoLocation(lat=51.5074, lon=0.1278, alt=0))

Geocoding

Sync usage

from openepi_client import GeoLocation
from openepi_client.geocoding import GeocodeClient

# Searching for the coordinates to a named place
feature_collection = GeocodeClient.geocode(q="Kigali, Rwanda")

# Geocode with priority to a lat and lon
feature_collection = GeocodeClient.geocode(q="Kigali, Rwanda", geolocation=GeoLocation(lat=51.5074, lon=0.1278))

# Reverse geocode
feature_collection = GeocodeClient.reverse_geocode(geolocation=GeoLocation(lat=51.5074, lon=0.1278))

Async usage

from openepi_client import GeoLocation
from openepi_client.geocoding import AsyncGeocodeClient

# Searching for coordinates for a location
feature_collection = await AsyncGeocodeClient.geocode(q="Kigali, Rwanda")

# Geocode with priority to a lat and lon
feature_collection = await AsyncGeocodeClient.geocode(q="Kigali, Rwanda", geolocation=GeoLocation(lat=51.5074, lon=0.1278))

# Reverse geocode
feature_collection = await AsyncGeocodeClient.reverse_geocode(geolocation=GeoLocation(lat=51.5074, lon=0.1278))

Flood

Sync usage

from openepi_client import GeoLocation, BoundingBox
from openepi_client.flood import FloodClient
from datetime import date, timedelta

# Get the return period thresholds for a given geolocation
thresholds = FloodClient.get_threshold(geolocation=GeoLocation(lat=-3.422, lon=30.075))

# Get the return period thresholds for a given bounding box
thresholds = FloodClient.get_threshold(bounding_box=BoundingBox(min_lat=4.764412, min_lon=22.0, max_lat=5.015732, max_lon=23.05))

# Get a summary flood forecast for a given coordinate
summary = FloodClient.get_summary(geolocation=GeoLocation(lat=-3.422, lon=30.075))

# Get a summary flood forecast for a given coordinate and include neighboring cells
summary = FloodClient.get_summary(geolocation=GeoLocation(lat=-3.422, lon=30.075), include_neighbors=True)

# Get a summary flood forecast for a given bounding box
summary = FloodClient.get_summary(bounding_box=BoundingBox(min_lat=4.764412, min_lon=22.0, max_lat=5.015732, max_lon=23.05))

# Get a detailed flood forecast for a given coordinate
detailed = FloodClient.get_detailed(geolocation=GeoLocation(lat=-3.422, lon=30.075))

# Get a detailed flood forecast for a given coordinate and timeframe (inclusive bounds)
start_date = date.today()
end_date = start_date + timedelta(days=4)
detailed = FloodClient.get_detailed(geolocation=GeoLocation(lat=-3.422, lon=30.075), start_date=start_date, end_date=end_date)

# Get a detailed flood forecast for a given bounding box
detailed = FloodClient.get_detailed(bounding_box=BoundingBox(min_lat=4.764412, min_lon=22.0, max_lat=5.015732, max_lon=23.05))

Async usage

from openepi_client import GeoLocation, BoundingBox
from openepi_client.flood import AsyncFloodClient
from datetime import date, timedelta

# Get the return period thresholds for a given geolocation
thresholds = await AsyncFloodClient.get_threshold(geolocation=GeoLocation(lat=-3.422, lon=30.075))

# Get the return period thresholds for a given bounding box
thresholds = await AsyncFloodClient.get_threshold(bounding_box=BoundingBox(min_lat=4.764412, min_lon=22.0, max_lat=5.015732, max_lon=23.05))

# Get a summary flood forecast for a given coordinate
summary = await AsyncFloodClient.get_summary(geolocation=GeoLocation(lat=-3.422, lon=30.075))

# Get a summary flood forecast for a given coordinate and include neighboring cells
summary = await AsyncFloodClient.get_summary(geolocation=GeoLocation(lat=-3.422, lon=30.075), include_neighbors=True)

# Get a summary flood forecast for a given bounding box
summary = await AsyncFloodClient.get_summary(bounding_box=BoundingBox(min_lat=4.764412, min_lon=22.0, max_lat=5.015732, max_lon=23.05))

# Get a detailed flood forecast for a given coordinate
detailed = await AsyncFloodClient.get_detailed(geolocation=GeoLocation(lat=-3.422, lon=30.075))

# Get a detailed flood forecast for a given coordinate and timeframe (inclusive bounds)
start_date = date.today()
end_date = start_date + timedelta(days=4)
detailed = await AsyncFloodClient.get_detailed(geolocation=GeoLocation(lat=-3.422, lon=30.075), start_date=start_date, end_date=end_date)

# Get a detailed flood forecast for a given bounding box
detailed = await AsyncFloodClient.get_detailed(bounding_box=BoundingBox(min_lat=4.764412, min_lon=22.0, max_lat=5.015732, max_lon=23.05))

Deforestation

Sync usage

from openepi_client import GeoLocation, BoundingBox
from openepi_client.deforestation import DeforestationClient

# Get the yearly forest cover loss within a river basin for a given geolocation
forest_loss = DeforestationClient.get_basin(geolocation=GeoLocation(lat=5.175, lon=37.124))

# Get yearly forest cover loss for all river basins within the given bounding box
forest_loss = DeforestationClient.get_basin(bounding_box=BoundingBox(min_lat=30.909622, min_lon=28.850951, max_lat=-1.041395, max_lon=-2.840114))

Async usage

from openepi_client import GeoLocation, BoundingBox
from openepi_client.deforestation import AsyncDeforestationClient

# Get the yearly forest cover loss within a river basin for a given geolocation
forest_loss = await AsyncDeforestationClient.get_basin(geolocation=GeoLocation(lat=5.175, lon=37.124))

# Get yearly forest cover loss for all river basins within the given bounding box
forest_loss = await AsyncDeforestationClient.get_basin(bounding_box=BoundingBox(min_lat=30.909622, min_lon=28.850951, max_lat=-1.041395, max_lon=-2.840114))

Soil

Sync usage

from openepi_client import GeoLocation, BoundingBox
from openepi_client.soil import SoilClient

# Get the most probable soil type at the queried location
# and the probability of the top 4 most probable soil types
soil_type = SoilClient.get_soil_type(
  geolocation=GeoLocation(lat=60.1, lon=9.58),
  top_k=4
)

# Get the mean and the 0.05 quantile of the soil 
# properties at the queried location and depths       
properties = ["clay", "silt"]
depths = ["0-5cm", "5-15cm"]
values = ["mean", "Q0.05"]
soil_property = SoilClient.get_soil_property(
  geolocation=GeoLocation(lat=60.1, lon=9.58), 
  depths=depths, 
  properties=properties, 
  values=values
)

# Get a summary of the soil types in the queried bounding box, 
# represented by a mapping of each soil type to the number 
# of occurrences in the bounding box
soil_type_summary = SoilClient.get_soil_type_summary(
  bounding_box=BoundingBox(
    min_lat=60.1,
    max_lat=60.12,
    min_lon=9.58,
    max_lon=9.6,
  )
)

Async usage

from openepi_client import GeoLocation, BoundingBox
from openepi_client.soil import AsyncSoilClient

# Get the most probable soil type at the queried location
# and the probability of the top 4 most probable soil types
soil_type = await AsyncSoilClient.get_soil_type(
  geolocation=GeoLocation(lat=60.1, lon=9.58),
  top_k=4
)

# Get the mean and the 0.05 quantile of the soil 
# properties at the queried location and depths       
properties = ["clay", "silt"]
depths = ["0-5cm", "5-15cm"]
values = ["mean", "Q0.05"]
soil_property = await AsyncSoilClient.get_soil_property(
  geolocation=GeoLocation(lat=60.1, lon=9.58), 
  depths=depths, 
  properties=properties, 
  values=values
)

# Get a summary of the soil types in the queried bounding box, 
# represented by a mapping of each soil type to the number 
# of occurrences in the bounding box
soil_type_summary = await AsyncSoilClient.get_soil_type_summary(
  bounding_box=BoundingBox(
    min_lat=60.1,
    max_lat=60.12,
    min_lon=9.58,
    max_lon=9.6,
  )
)

Crop Health

Sync usage

import os
from openepi_client.crop_health import CropHealthClient

image_path = os.path.abspath("cocoa.jpg")

# Get the predicted health of the crop pictured in cocoa.jpg with the binary model.
health = CropHealthClient.get_binary_health_prediction(image_path)

# Get the predicted health of the crop and a probability of what diseases it might be, based on the singleHLT model.
health = CropHealthClient.get_singleHLT_health_prediction(image_path)

# Get the predicted health of the crop and a probability of what diseases it might be, based on the multiHLT model.
health = CropHealthClient.get_multiHLT_health_prediction(image_path)

Async usage

import os
from openepi_client.crop_health import AsyncCropHealthClient

image_path = os.path.abspath("cocoa.jpg")

# Get the predicted health of the crop pictured in cocoa.jpg with the binary model.
health = await AsyncCropHealthClient.get_binary_health_prediction(image_path)

# Get the predicted health of the crop and a probability of what diseases it might be, based on the singleHLT model.
health = await AsyncCropHealthClient.get_singleHLT_health_prediction(image_path)

# Get the predicted health of the crop and a probability of what diseases it might be, based on the multiHLT model.
health = await AsyncCropHealthClient.get_multiHLT_health_prediction(image_path)

Updating the client

The following commands are used to update the client types. The commands are run from the root of the project.

poetry run datamodel-codegen --url https://api-test.openepi.io/weather/openapi.json --output openepi_client/weather/_weather_types.py --enum-field-as-literal all --output-model-type pydantic_v2.BaseModel --input-file-type "openapi"
poetry run datamodel-codegen --url https://api-test.openepi.io/geocoding/openapi.json --output openepi_client/geocoding/_geocoding_types.py --enum-field-as-literal all --output-model-type pydantic_v2.BaseModel --input-file-type "openapi"
poetry run datamodel-codegen --url https://api-test.openepi.io/flood/openapi.json --output openepi_client/flood/_flood_types.py --enum-field-as-literal all --output-model-type pydantic_v2.BaseModel --input-file-type "openapi"
poetry run datamodel-codegen --url https://api-test.openepi.io/deforestation/openapi.json --output openepi_client/deforestation/_deforestation_types.py --enum-field-as-literal all --output-model-type pydantic_v2.BaseModel --input-file-type "openapi"
poetry run datamodel-codegen --url https://api-test.openepi.io/soil/openapi.json --output openepi_client/soil/_soil_types.py --enum-field-as-literal all --output-model-type pydantic_v2.BaseModel --input-file-type "openapi"
poetry run datamodel-codegen --url https://api-test.openepi.io/crop-health/openapi.json --output openepi_client/crop_health/_crop_health_types.py --enum-field-as-literal all --output-model-type pydantic_v2.BaseModel --input-file-type "openapi"

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

openepi_client-0.1.11.tar.gz (24.2 kB view hashes)

Uploaded Source

Built Distribution

openepi_client-0.1.11-py3-none-any.whl (31.6 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page