draw shp file

This commit is contained in:
sleptworld 2023-05-06 08:33:00 +08:00
parent 13dda7c316
commit c6d28848ab
3 changed files with 179 additions and 7 deletions

139
Cargo.lock generated
View File

@ -23,6 +23,15 @@ version = "1.0.70"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" 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]] [[package]]
name = "autocfg" name = "autocfg"
version = "1.1.0" version = "1.1.0"
@ -111,7 +120,7 @@ dependencies = [
"js-sys", "js-sys",
"num-integer", "num-integer",
"num-traits", "num-traits",
"time", "time 0.1.45",
"wasm-bindgen", "wasm-bindgen",
"winapi", "winapi",
] ]
@ -126,6 +135,10 @@ dependencies = [
"gtk4", "gtk4",
"plotters", "plotters",
"plotters-backend", "plotters-backend",
"rand",
"rand_distr",
"rand_xorshift",
"shapefile",
] ]
[[package]] [[package]]
@ -265,6 +278,16 @@ dependencies = [
"syn 2.0.15", "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]] [[package]]
name = "dirs-next" name = "dirs-next"
version = "2.0.0" version = "2.0.0"
@ -526,6 +549,17 @@ dependencies = [
"system-deps", "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]] [[package]]
name = "getrandom" name = "getrandom"
version = "0.2.9" version = "0.2.9"
@ -854,6 +888,12 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "libm"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb"
[[package]] [[package]]
name = "link-cplusplus" name = "link-cplusplus"
version = "1.0.8" version = "1.0.8"
@ -934,6 +974,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
dependencies = [ dependencies = [
"autocfg", "autocfg",
"libm",
] ]
[[package]] [[package]]
@ -1074,6 +1115,12 @@ dependencies = [
"miniz_oxide 0.7.1", "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]] [[package]]
name = "proc-macro-crate" name = "proc-macro-crate"
version = "1.3.1" version = "1.3.1"
@ -1126,6 +1173,55 @@ dependencies = [
"proc-macro2", "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]] [[package]]
name = "redox_syscall" name = "redox_syscall"
version = "0.2.16" version = "0.2.16"
@ -1208,6 +1304,20 @@ name = "serde"
version = "1.0.160" version = "1.0.160"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" 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]] [[package]]
name = "serde_spanned" name = "serde_spanned"
@ -1218,6 +1328,17 @@ dependencies = [
"serde", "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]] [[package]]
name = "simd-adler32" name = "simd-adler32"
version = "0.3.5" version = "0.3.5"
@ -1320,6 +1441,22 @@ dependencies = [
"winapi", "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]] [[package]]
name = "toml" name = "toml"
version = "0.7.3" version = "0.7.3"

View File

@ -9,10 +9,15 @@ edition = "2021"
cairo-rs = { version = "0.17.0", features = ["xlib"] } cairo-rs = { version = "0.17.0", features = ["xlib"] }
glib = "0.17.9" glib = "0.17.9"
gtk = { version = "0.6.6", package = "gtk4", features = ["v4_8"] } gtk = { version = "0.6.6", package = "gtk4", features = ["v4_8"] }
shapefile = { version = "0.4", features = ["geo-types"] }
# gtk = "0.15.5" # gtk = "0.15.5"
plotters = "0.3.4" plotters = "0.3.4"
plotters-backend = "0.3.4" plotters-backend = "0.3.4"
rand = "0.8.5"
rand_distr = "0.4.3"
rand_xorshift = "0.3.0"
[build-dependencies] [build-dependencies]
glib-build-tools = "0.17.0" glib-build-tools = "0.17.0"

View File

@ -1,12 +1,17 @@
use backend::CairoBackend; use backend::CairoBackend;
use plotters::prelude::*;
use rand_distr::{Distribution, Normal};
use rand_xorshift;
use shapefile;
use gtk::gdk::Display; use gtk::gdk::Display;
use gtk::{ use gtk::{
gio, glib, style_context_add_provider_for_display, Application, ApplicationWindow, CssProvider, gio, glib, style_context_add_provider_for_display, Application, ApplicationWindow, CssProvider,
StyleContext, StyleContext,
}; };
use gtk::{prelude::*, DrawingArea}; use gtk::{prelude::*, DrawingArea};
use plotters::prelude::{ChartBuilder, IntoDrawingArea}; // use plotters::prelude::{ChartBuilder, IntoDrawingArea, Rectangle};
use plotters::style::{BLACK, WHITE}; use plotters::style::{HSLColor, BLACK, WHITE};
// use plotters::prelude::DrawingArea; // use plotters::prelude::DrawingArea;
use window::Window; use window::Window;
mod backend; mod backend;
@ -43,13 +48,38 @@ fn build_ui(app: &Application) {
root.fill(&WHITE); 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) let mut chart = ChartBuilder::on(&root)
.margin(20) .set_label_area_size(LabelAreaPosition::Left, 60)
.build_cartesian_2d(-2.1f64..0.6f64, -1.2f64..1.2f64).unwrap(); .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)); window.set_child(Some(&drawing_area));