Skip to content

Commit

Permalink
change to lla_to_utm_zone_number which returns u8
Browse files Browse the repository at this point in the history
  • Loading branch information
georgypv committed Jan 28, 2024
1 parent 79795c2 commit 057184e
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 27 deletions.
4 changes: 2 additions & 2 deletions polars_coord_transforms/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,10 +78,10 @@ def lla_to_utm(self) -> pl.Expr:
is_elementwise=True
)

def lla_to_utm_zone(self) -> pl.Expr:
def lla_to_utm_zone_number(self) -> pl.Expr:
return self._expr.register_plugin(
lib=lib,
symbol="lla_to_utm_zone",
symbol="lla_to_utm_zone_number",
is_elementwise=True
)

Expand Down
7 changes: 3 additions & 4 deletions src/coord_transforms.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
extern crate nalgebra as na;

use utm::{to_utm_wgs84_no_zone, lat_lon_to_zone_number, lat_to_zone_letter};
use utm::{to_utm_wgs84_no_zone, lat_lon_to_zone_number};
use na::{Vector3, Vector4, Quaternion, UnitQuaternion, Rotation3};
use map_3d::{ecef2geodetic, geodetic2ecef, rad2deg, deg2rad, Ellipsoid};

Expand Down Expand Up @@ -37,10 +37,9 @@ pub fn lla_to_ecef_elementwise(lon: f64, lat: f64, alt: f64) -> (f64, f64, f64)



pub fn lla_to_utm_zone_elementwise(lon: f64, lat: f64) -> (u8, char) {
pub fn lla_to_utm_zone_number_elementwise(lon: f64, lat: f64) -> u8 {
let zone_number = lat_lon_to_zone_number(lat, lon);
let zone_letter = lat_to_zone_letter(lat).expect("Unable to find UTM zone letter from latitude!");
(zone_number, zone_letter)
zone_number
}


Expand Down
25 changes: 4 additions & 21 deletions src/expressions.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
use itertools::Itertools;
use polars_core::chunked_array::builder::Utf8ChunkedBuilderCow;
use polars::prelude::*;
use polars::datatypes::DataType;
use pyo3_polars::derive::polars_expr;

use std::borrow::Cow;

use itertools::izip;
use serde::Deserialize;

Expand Down Expand Up @@ -457,48 +454,34 @@ fn lla_to_utm(inputs: &[Series]) -> PolarsResult<Series> {
}


fn utm_zone_output(_: &[Field]) -> PolarsResult<Field> {
let v: Vec<Field> = vec![
Field::new("utm_zone_number", DataType::UInt8),
Field::new("utm_zone_letter", DataType::Utf8),
];
Ok(Field::new("utm_zone", DataType::Struct(v)))
}

#[polars_expr(output_type_func=utm_zone_output)]
fn lla_to_utm_zone(inputs: &[Series]) -> PolarsResult<Series> {
#[polars_expr(output_type=UInt8)]
fn lla_to_utm_zone_number(inputs: &[Series]) -> PolarsResult<Series> {

let coords_ca = inputs[0].struct_()?;
let (lon_ser, lat_ser, _alt_ser) = unpack_xyz(coords_ca, true);


let mut utm_number_cb: PrimitiveChunkedBuilder<UInt8Type> =
PrimitiveChunkedBuilder::new("utm_zone_number", coords_ca.len());
let mut utm_letter_cb: Utf8ChunkedBuilderCow = Utf8ChunkedBuilderCow::new("utm_zone_letter", coords_ca.len());

for (lon_op, lat_op) in izip!(
lon_ser.f64()?,
lat_ser.f64()?,
) {
match (lon_op, lat_op) {
(Some(lon), Some(lat)) => {
let (utm_number, utm_letter,) = lla_to_utm_zone_elementwise(lon, lat);
let utm_number = lla_to_utm_zone_number_elementwise(lon, lat);
utm_number_cb.append_value(utm_number);
utm_letter_cb.append_value(Cow::Owned(String::from(utm_letter)));

},
_ => {
utm_number_cb.append_null();
utm_letter_cb.append_null();

}
}
}
let ser_utm_number = utm_number_cb.finish().into_series();
let ser_utm_letter = utm_letter_cb.finish().into_series();

let out_chunked: StructChunked = StructChunked::new("utm_zone", &[ser_utm_number, ser_utm_letter])?;
Ok(out_chunked.into_series())
Ok(ser_utm_number)

}

Expand Down

0 comments on commit 057184e

Please sign in to comment.