use crate::{ArcGISClient, ArcGISGeometry, Result};
use tracing::instrument;
use super::types::{
ExportImageParameters, ExportImageResult, HistogramParameters, HistogramResult,
IdentifyParameters, ImageIdentifyResult, RasterInfo, SampleParameters, SampleResult,
};
#[derive(Clone)]
pub struct ImageServiceClient<'a> {
url: String,
client: &'a ArcGISClient,
}
impl<'a> ImageServiceClient<'a> {
pub fn new(url: impl Into<String>, client: &'a ArcGISClient) -> Self {
ImageServiceClient {
url: url.into(),
client,
}
}
#[instrument(skip(self, params))]
pub async fn export_image(&self, params: ExportImageParameters) -> Result<ExportImageResult> {
tracing::debug!("Exporting image");
let export_url = format!("{}/exportImage", self.url);
let response = self
.client
.http()
.get(&export_url)
.query(¶ms)
.query(&[("f", "json")])
.send()
.await?;
let result: ExportImageResult = response.json().await?;
tracing::debug!(url = %result.href(), "Image exported");
Ok(result)
}
#[instrument(skip(self))]
pub async fn identify(&self, geometry: &ArcGISGeometry) -> Result<ImageIdentifyResult> {
tracing::debug!("Identifying pixel value");
let identify_url = format!("{}/identify", self.url);
let geometry_json = serde_json::to_string(geometry)?;
let geometry_type = match geometry {
ArcGISGeometry::Point(_) => "esriGeometryPoint",
ArcGISGeometry::Polygon(_) => "esriGeometryPolygon",
_ => "esriGeometryPoint",
};
let response = self
.client
.http()
.get(&identify_url)
.query(&[
("f", "json"),
("geometry", &geometry_json),
("geometryType", geometry_type),
])
.send()
.await?;
let result: ImageIdentifyResult = response.json().await?;
tracing::debug!("Identification complete");
Ok(result)
}
#[instrument(skip(self, params))]
pub async fn identify_with_params(
&self,
params: IdentifyParameters,
) -> Result<ImageIdentifyResult> {
tracing::debug!("Identifying with custom parameters");
let identify_url = format!("{}/identify", self.url);
let params_json = serde_json::to_string(¶ms)?;
let response = self
.client
.http()
.get(&identify_url)
.query(&[("f", "json"), ("params", ¶ms_json)])
.send()
.await?;
let result: ImageIdentifyResult = response.json().await?;
tracing::debug!("Identification complete");
Ok(result)
}
#[instrument(skip(self, params))]
pub async fn get_samples(&self, params: SampleParameters) -> Result<SampleResult> {
tracing::debug!("Getting samples");
let samples_url = format!("{}/getSamples", self.url);
let response = self
.client
.http()
.get(&samples_url)
.query(¶ms)
.query(&[("f", "json")])
.send()
.await?;
let result: SampleResult = response.json().await?;
tracing::debug!(count = result.samples().len(), "Samples retrieved");
Ok(result)
}
#[instrument(skip(self, params))]
pub async fn compute_histograms(&self, params: HistogramParameters) -> Result<HistogramResult> {
tracing::debug!("Computing histograms");
let histogram_url = format!("{}/computeHistograms", self.url);
let response = self
.client
.http()
.get(&histogram_url)
.query(¶ms)
.query(&[("f", "json")])
.send()
.await?;
let result: HistogramResult = response.json().await?;
tracing::debug!(bands = result.histograms().len(), "Histograms computed");
Ok(result)
}
#[instrument(skip(self))]
pub async fn get_raster_info(&self) -> Result<RasterInfo> {
tracing::debug!("Getting raster info");
let response = self
.client
.http()
.get(&self.url)
.query(&[("f", "json")])
.send()
.await?;
let info: RasterInfo = response.json().await?;
tracing::debug!("Raster info retrieved");
Ok(info)
}
}