diff --git a/Cargo.lock b/Cargo.lock index 3ca5d49..8f9469f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,6 +23,15 @@ version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + [[package]] name = "autocfg" version = "1.1.0" @@ -111,7 +120,7 @@ dependencies = [ "js-sys", "num-integer", "num-traits", - "time", + "time 0.1.45", "wasm-bindgen", "winapi", ] @@ -126,6 +135,10 @@ dependencies = [ "gtk4", "plotters", "plotters-backend", + "rand", + "rand_distr", + "rand_xorshift", + "shapefile", ] [[package]] @@ -265,6 +278,16 @@ dependencies = [ "syn 2.0.15", ] +[[package]] +name = "dbase" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c1a2a9e9238982f599f25b54ec2c7cf1518cc97084cf0c8da475f8a3727fe7" +dependencies = [ + "byteorder", + "time 0.3.20", +] + [[package]] name = "dirs-next" version = "2.0.0" @@ -526,6 +549,17 @@ dependencies = [ "system-deps", ] +[[package]] +name = "geo-types" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5f0b3068e1537a4b861ec3734f4aa9c317d537cf0845bf6fb6221973499d26c" +dependencies = [ + "approx", + "num-traits", + "serde", +] + [[package]] name = "getrandom" version = "0.2.9" @@ -854,6 +888,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "libm" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb" + [[package]] name = "link-cplusplus" version = "1.0.8" @@ -934,6 +974,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -1074,6 +1115,12 @@ dependencies = [ "miniz_oxide 0.7.1", ] +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "proc-macro-crate" version = "1.3.1" @@ -1126,6 +1173,55 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_distr" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" +dependencies = [ + "num-traits", + "rand", +] + +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core", +] + [[package]] name = "redox_syscall" version = "0.2.16" @@ -1208,6 +1304,20 @@ name = "serde" version = "1.0.160" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.160" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] [[package]] name = "serde_spanned" @@ -1218,6 +1328,17 @@ dependencies = [ "serde", ] +[[package]] +name = "shapefile" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f77dc980d3b70a602ad40a20e9a5137800d5271ce25ec9e2a2826ca24a4be18" +dependencies = [ + "byteorder", + "dbase", + "geo-types", +] + [[package]] name = "simd-adler32" version = "0.3.5" @@ -1320,6 +1441,22 @@ dependencies = [ "winapi", ] +[[package]] +name = "time" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" +dependencies = [ + "serde", + "time-core", +] + +[[package]] +name = "time-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" + [[package]] name = "toml" version = "0.7.3" diff --git a/Cargo.toml b/Cargo.toml index a266edc..e9d2b00 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,10 +9,15 @@ edition = "2021" cairo-rs = { version = "0.17.0", features = ["xlib"] } glib = "0.17.9" gtk = { version = "0.6.6", package = "gtk4", features = ["v4_8"] } +shapefile = { version = "0.4", features = ["geo-types"] } + # gtk = "0.15.5" plotters = "0.3.4" plotters-backend = "0.3.4" +rand = "0.8.5" +rand_distr = "0.4.3" +rand_xorshift = "0.3.0" [build-dependencies] glib-build-tools = "0.17.0" diff --git a/src/main.rs b/src/main.rs index 8478e15..20af607 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,17 @@ use backend::CairoBackend; +use plotters::prelude::*; +use rand_distr::{Distribution, Normal}; +use rand_xorshift; +use shapefile; + use gtk::gdk::Display; use gtk::{ gio, glib, style_context_add_provider_for_display, Application, ApplicationWindow, CssProvider, StyleContext, }; use gtk::{prelude::*, DrawingArea}; -use plotters::prelude::{ChartBuilder, IntoDrawingArea}; -use plotters::style::{BLACK, WHITE}; +// use plotters::prelude::{ChartBuilder, IntoDrawingArea, Rectangle}; +use plotters::style::{HSLColor, BLACK, WHITE}; // use plotters::prelude::DrawingArea; use window::Window; mod backend; @@ -43,13 +48,38 @@ fn build_ui(app: &Application) { root.fill(&WHITE); + let mut polygons = shapefile::read_as::<_, shapefile::Polygon, shapefile::dbase::Record>( + "/Users/ruomu/china/省界_region.shp", + ) + .unwrap(); + + let (polygon, polygon_record) = polygons.first().unwrap(); + + let x_range = polygon.bbox().x_range(); + let y_range = polygon.bbox().y_range(); + let mut chart = ChartBuilder::on(&root) - .margin(20) - .build_cartesian_2d(-2.1f64..0.6f64, -1.2f64..1.2f64).unwrap(); + .set_label_area_size(LabelAreaPosition::Left, 60) + .set_label_area_size(LabelAreaPosition::Bottom, 60) + .caption("Area Chart Demo", ("sans-serif", 40)) + .build_cartesian_2d(x_range[0]..x_range[1], y_range[0]..y_range[1]) + .unwrap(); - chart.configure_mesh().draw().unwrap(); + chart + .configure_mesh() + .disable_x_mesh() + .disable_y_mesh() + .draw() + .unwrap(); - + let ring = polygon.ring(0).unwrap(); + + chart + .draw_series( + AreaSeries::new(ring.points().iter().map(|x| (x.x, x.y)), 0.0, &RED.mix(0.2)) + .border_style(&RED), + ) + .unwrap(); }); window.set_child(Some(&drawing_area));