MoonGeoCodec is a MoonBit geometry interchange library for WKT, WKB, EWKB, and GeoJSON.
let geometry = match @moon_geocodec.parse_wkt(
"POLYGON ((0 0, 1 0, 1 1, 0 0))",
@moon_geocodec.GeoLimits::default(),
) {
Ok(value) => value
Err(err) => fail(err.to_string())
}
assert_eq(geometry.kind(), @moon_geocodec.GeometryKind::Polygon)let text = match @moon_geocodec.format_wkt(geometry) {
Ok(value) => value
Err(err) => fail(err.to_string())
}
assert_eq(text, "POLYGON ((0 0, 1 0, 1 1, 0 0))")let wkt2 = match @moon_geocodec.parse_wkt2(
"MULTIPOINT ((1 2), (3 4))",
@moon_geocodec.GeoLimits::default(),
) {
Ok(value) => value
Err(err) => fail(err.to_string())
}
assert_eq(
@moon_geocodec.format_wkt2(wkt2),
Ok("MULTIPOINT ((1 2), (3 4))"),
)
let ewkt = match @moon_geocodec.parse_ewkt(
"SRID=4326;POINT (1 2)",
@moon_geocodec.GeoLimits::default(),
) {
Ok(value) => value
Err(err) => fail(err.to_string())
}
assert_eq(ewkt.srid, Some(4326))
assert_eq(
@moon_geocodec.format_ewkt(ewkt),
Ok("SRID=4326;POINT (1 2)"),
)let geometry = match @moon_geocodec.parse_wkb(
bytes.exact_view(),
@moon_geocodec.GeoLimits::default(),
) {
Ok(value) => value
Err(err) => fail(err.to_string())
}let bytes = match @moon_geocodec.format_wkb(geometry) {
Ok(value) => value
Err(err) => fail(err.to_string())
}
let big_endian = match @moon_geocodec.format_wkb_with_order(
geometry,
@moon_geocodec.WkbByteOrder::BigEndian,
) {
Ok(value) => value
Err(err) => fail(err.to_string())
}let value = match @moon_geocodec.parse_ewkb(
ewkb_bytes.exact_view(),
@moon_geocodec.GeoLimits::default(),
) {
Ok(value) => value
Err(err) => fail(err.to_string())
}
let encoded = match @moon_geocodec.format_ewkb(value) {
Ok(bytes) => bytes
Err(err) => fail(err.to_string())
}let geometry = match @moon_geocodec.parse_geojson(
"{\"type\":\"Point\",\"coordinates\":[1,2]}",
@moon_geocodec.GeoLimits::default(),
) {
Ok(value) => value
Err(err) => fail(err.to_string())
}
assert_eq(
geometry,
@moon_geocodec.Geometry::Point(
@moon_geocodec.Coordinate::xy(1.0, 2.0),
),
)let text = match @moon_geocodec.format_geojson(geometry) {
Ok(value) => value
Err(err) => fail(err.to_string())
}
assert_eq(
text,
"{\"type\":\"Point\",\"coordinates\":[1,2]}",
)let normalized = match @moon_geocodec.normalize_geometry(geometry) {
Ok(value) => value
Err(err) => fail(err.to_string())
}
assert_eq(@moon_geocodec.validate_geometry(normalized), Ok(()))let bounds = geometry.bounds_3d()
let center = geometry.centroid()moon run cmd/main -- inspect wkt "POINT Z (1 2 3)"
moon run cmd/main -- validate wkt "POLYGON ((0 0, 1 0, 1 1, 0 0))"
moon run cmd/main -- convert wkt geojson "POINT (1 2)"
moon run cmd/main -- convert ewkt ewkb "SRID=4326;POINT (1 2)"python -m pip install -r interop/requirements.txt
python interop/verify_shapely.pymoon run examples/quickstartlet tokens = match @moon_geocodec.tokenize_wkt(
"POINT Z (1 2 3)",
@moon_geocodec.GeoLimits::default(),
) {
Ok(value) => value
Err(err) => fail(err.to_string())
}
assert_eq(tokens[0].text(), "POINT")
assert_eq(tokens[1].text(), "Z")moon add ggbond44439/moon_geocodec@0.2.0moon check --target all
moon test --target all
moon buildpub(all) enum GeoError {
InvalidWkt(String, Int)
InvalidWkb(String, Int)
InvalidGeoJson(String, Int)
InvalidCoordinate(String)
InvalidGeometry(String)
InvalidBoundary(String, Int)
UnsupportedGeometry(String)
InvalidLimit(String, Int)
LimitExceeded(String, Int, Int)
Truncated(String, Int)
TrailingBytes(Int)
InvalidSrid(Int)
} derive(Eq, Debug)pub(all) enum Geometry {
Point(Coordinate)
EmptyPoint
LineString(Array[Coordinate])
Polygon(Array[Array[Coordinate]])
MultiPoint(Array[Coordinate])
MultiLineString(Array[Array[Coordinate]])
MultiPolygon(Array[Array[Array[Coordinate]]])
GeometryCollection(Array[Geometry])
} derive(Eq, Debug)Install
Download zipMoonGeoCodec is a MoonBit geometry interchange library for WKT, WKB, EWKB, and GeoJSON.