MoonBit geophysical field toolkit for gravity, magnetic field, gridded data, profiles, CSV and GeoJSON.
moon add 2515050243qyf/moonbit-geofield
moon check --deny-warn --target all
moon test --deny-warn --target all
moon run --target native cmd/main///|
test {
let station : GeoPoint = { lat: 32.0, lon: 118.0, elevation_m: 25.0 }
let gravity = normal_gravity_mgal(station.lat)
assert_true(gravity > 979000.0 && gravity < 980000.0)
let grid = make_grid(
origin_lat=32.0,
origin_lon=118.0,
lat_step=0.5,
lon_step=0.5,
rows=2,
cols=2,
values=[10.0, 12.0, 18.0, 22.0],
)
let value = grid.sample_bilinear({ lat: 32.25, lon: 118.25, elevation_m: 0.0 })
assert_true(value is Some(15.5))
}pub(all) struct CoefficientTable {
reference_radius_m : Double
scale : Double
terms : Array[HarmonicTerm]
source : String
} derive(Eq, Debug)pub(all) struct QualitySample {
sample : FieldSample
flag : QualityFlag
uncertainty : Double
source : String
} derive(Eq, Debug)pub(all) struct SeriesPoint {
coordinate : Double
value : Double
flag : QualityFlag
} derive(Eq, Debug)pub(all) struct SphericalHarmonicModel {
reference_radius_m : Double
scale : Double
terms : Array[HarmonicTerm]
} derive(Eq, Debug)fn bouguer_anomaly_mgal(observed_mgal : Double, latitude_deg : Double, height_m : Double, density_kg_m3? : Double) -> Doublefn bouguer_slab_correction_mgal(height_m : Double, density_kg_m3? : Double) -> Doublefn coefficient_table(reference_radius_m~ : Double, scale~ : Double, terms~ : Array[HarmonicTerm], source? : String) -> CoefficientTablefn cubic_hermite(y0 : Double, y1 : Double, y2 : Double, y3 : Double, fraction : Double) -> Doublefn degrees_longitude_to_metres(degrees : Double, latitude_deg : Double) -> Doublefn detrend_spatial_samples(samples : ArrayView[FieldSample], origin : GeoPoint) -> Array[FieldSample]fn empirical_variogram(samples : ArrayView[FieldSample], maximum_distance_m : Double, bins : Int) -> Array[VariogramBin]fn fit_scale_offset(observed : ArrayView[Double], reference : ArrayView[Double]) -> LeastSquaresResultfn free_air_anomaly_mgal(observed_mgal : Double, latitude_deg : Double, height_m : Double) -> Doublefn free_air_correction_mgal(height_m : Double) -> Doublefn golden_section_minimize(objective : (Double) -> Double, minimum : Double, maximum : Double, iterations : Int) -> (Double, Double)fn gravity_anomaly_series(observed : ArrayView[FieldSample], density_kg_m3? : Double) -> FieldSeriesfn gravity_apply_reference(observed : ArrayView[FieldSample], reference_mgal : Double) -> Array[FieldSample]fn gravity_components(observed_mgal : Double, point : GeoPoint, density_kg_m3? : Double, terrain_mgal? : Double) -> GravityComponentsfn gravity_height_gradient_mgal_per_m(latitude_deg : Double, height_m : Double) -> Doublefn gravity_latitude_correction_mgal(observed_mgal : Double, from_latitude_deg : Double, to_latitude_deg : Double) -> Doublefn gravity_normal_gradient_mgal_per_degree(latitude_deg : Double) -> Doublefn gravity_uncertainty_mgal(height_uncertainty_m : Double, density_uncertainty_kg_m3 : Double, height_m : Double) -> Doublefn grid_from_samples_idw(grid : Grid, samples : ArrayView[FieldSample], power? : Double, radius_m? : Double) -> Gridfn idw_estimate(samples : ArrayView[FieldSample], point : GeoPoint, power? : Double, radius_m? : Double) -> PointEstimatefn interpolate_grid_profile(grid : Grid, points : ArrayView[GeoPoint], nearest : Bool) -> Array[PointEstimate]fn k_nearest_samples(samples : ArrayView[FieldSample], point : GeoPoint, k : Int) -> Array[FieldSample]fn kriging_like_estimate(samples : ArrayView[FieldSample], point : GeoPoint, model : VariogramModel) -> PointEstimatefn kriging_like_weights(samples : ArrayView[FieldSample], point : GeoPoint, model : VariogramModel) -> Array[Double]fn latitude_band_area_m2(min_lat : Double, max_lat : Double, min_lon : Double, max_lon : Double) -> Doublefn linear_interpolate_clamped(left_x : Double, left_y : Double, right_x : Double, right_y : Double, query : Double) -> Doublefn local_weighted_mean(samples : ArrayView[FieldSample], point : GeoPoint, radius_m : Double) -> Doublefn magnetic_components(total_nt : Double, declination_deg : Double, inclination_deg : Double) -> (Double, Double, Double)fn magnetic_components_to_samples(points : ArrayView[GeoPoint], total_nt : Double, declination_deg : Double, inclination_deg : Double) -> Array[FieldSample]fn magnetic_declination_deg(latitude_deg : Double, longitude_deg : Double) -> Doublefn magnetic_field_from_components(north_nt : Double, east_nt : Double, down_nt : Double) -> MagneticFieldfn magnetic_field_from_direction(total_nt : Double, declination_deg : Double, inclination_deg : Double) -> MagneticFieldfn magnetic_inclination_deg(latitude_deg : Double) -> Doublefn metres_to_degrees_longitude(metres : Double, latitude_deg : Double) -> Doublefn normal_gravity_at_height_mgal(latitude_deg : Double, height_m : Double) -> Doublefn normal_gravity_latitude_profile(start_latitude_deg : Double, finish_latitude_deg : Double, count : Int) -> FieldSeriesfn normal_gravity_mgal(latitude_deg : Double) -> Doublefn parse_coefficient_table(text : String, reference_radius_m? : Double, scale? : Double, source? : String) -> CoefficientTable raisefn parse_grid_values_csv(text : String, origin_lat : Double, origin_lon : Double, lat_step : Double, lon_step : Double, rows : Int, cols : Int) -> Grid raisefn polynomial_fit(coordinates : ArrayView[Double], values : ArrayView[Double], degree : Int) -> LeastSquaresResultfn profile_between(grid : Grid, start : GeoPoint, finish : GeoPoint, samples : Int) -> Array[ProfileSample]fn profile_filter_range(profile : ArrayView[ProfileSample], range : NumericRange) -> Array[ProfileSample]fn profile_slice(profile : ArrayView[ProfileSample], start : Int, end : Int) -> Array[ProfileSample]fn quality_apply_offset(samples : ArrayView[QualitySample], offset : Double) -> Array[QualitySample]fn quality_deduplicate(samples : ArrayView[QualitySample], tolerance_m : Double) -> Array[QualitySample]fn quality_merge(left : ArrayView[QualitySample], right : ArrayView[QualitySample]) -> Array[QualitySample]fn quality_reflag_outliers(samples : ArrayView[QualitySample], threshold : Double) -> Array[QualitySample]fn quality_reflag_range(samples : ArrayView[QualitySample], range : NumericRange) -> Array[QualitySample]fn quality_sample(sample : FieldSample, flag : QualityFlag, uncertainty : Double, source : String) -> QualitySamplefn quality_sort_by_coordinate(samples : ArrayView[QualitySample], origin : GeoPoint) -> Array[QualitySample]fn quality_with_uncertainty(samples : ArrayView[QualitySample], uncertainty : Double) -> Array[QualitySample]fn regression_residuals(model : Regression, x : ArrayView[Double], y : ArrayView[Double]) -> Array[Double]fn robust_linear_fit(x : ArrayView[Double], y : ArrayView[Double], iterations : Int) -> LeastSquaresResultfn sample_design_to_samples(design : SampleDesign, values : ArrayView[Double], name : String) -> Array[FieldSample]fn sample_design_translate(design : SampleDesign, north_m : Double, east_m : Double) -> SampleDesignfn sample_value_quantiles(samples : ArrayView[FieldSample], fractions : ArrayView[Double]) -> Array[Double]fn samples_deduplicate(samples : ArrayView[FieldSample], tolerance_m : Double) -> Array[FieldSample]fn samples_map_value(samples : ArrayView[FieldSample], transform : (Double) -> Double) -> Array[FieldSample]fn samples_sort_by_distance(samples : ArrayView[FieldSample], origin : GeoPoint) -> Array[FieldSample]fn samples_to_field_series(samples : ArrayView[FieldSample], origin : GeoPoint, name? : String) -> FieldSeriesfn samples_translate(samples : ArrayView[FieldSample], north_m : Double, east_m : Double) -> Array[FieldSample]fn scalar_grid_search(objective : (Double) -> Double, minimum : Double, maximum : Double, steps : Int) -> (Double, Double)fn scalar_maximize(objective : (Double) -> Double, minimum : Double, maximum : Double, iterations : Int) -> (Double, Double)fn spatial_join_nearest(left : ArrayView[FieldSample], right : ArrayView[FieldSample], max_distance_m : Double) -> Array[(FieldSample, FieldSample)]fn spatial_outlier_samples(samples : ArrayView[FieldSample], radius_m : Double, threshold : Double) -> Array[FieldSample]fn spatial_summary(samples : ArrayView[FieldSample], point : GeoPoint, radius_m : Double) -> SpatialSummaryfn spherical_bouguer_correction_mgal(height_m : Double, density_kg_m3? : Double) -> Doublefn terrain_correction_from_samples_mgal(station : GeoPoint, terrain : ArrayView[FieldSample], density_kg_m3? : Double) -> Doublefn terrain_prism_correction_mgal(density_kg_m3 : Double, horizontal_distance_m : Double, elevation_difference_m : Double) -> Doublefn weighted_linear_fit(x : ArrayView[Double], y : ArrayView[Double], weights : ArrayView[Double]) -> LeastSquaresResultInstall
Download zipMoonBit geophysical field toolkit for gravity, magnetic field, gridded data, profiles, CSV and GeoJSON.