From 24df98878c3c6b0bce815e3b970c79a6e03b1450 Mon Sep 17 00:00:00 2001 From: Austen Adler Date: Thu, 27 Apr 2023 21:21:22 -0400 Subject: [PATCH] Start work on google maps satellite link --- spatial-coordinate-systems/src/urls.rs | 32 +++++++++++++++++++++----- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/spatial-coordinate-systems/src/urls.rs b/spatial-coordinate-systems/src/urls.rs index 6050e37..244fb68 100644 --- a/spatial-coordinate-systems/src/urls.rs +++ b/spatial-coordinate-systems/src/urls.rs @@ -2,10 +2,10 @@ use crate::{common::parse_f64, Error, LatLon}; use nom::{ branch::alt, bytes::complete::tag, - character::complete::digit1, + character::complete::{self, digit1}, combinator::{eof, fail, map, map_res, rest}, error::context, - sequence::tuple, + sequence::{pair, tuple}, IResult, }; #[cfg(feature = "serde")] @@ -24,6 +24,7 @@ const OPENSTREETMAP_ZOOM_LEVEL: u8 = 19; pub struct CoordinateUrls { // TODO: These should be getters only pub google_maps: String, + pub google_maps_satellite: String, pub openstreetmap: String, pub waze: String, pub apple_maps: String, @@ -51,14 +52,18 @@ impl CoordinateUrls { } fn parse_google_maps(i: &str) -> IResult<&str, LatLon> { - // TODO: Include this format - // https://www.google.com/maps/place/69%C2%B047'21.8%22N+108%C2%B022'45.4%22W/@69.7869906,-108.3727563,15.31z/data=!4m4!3m3!8m2!3d69.7893868!4d-108.3792642 - let (_, url) = Self::parse_url_full(i)?; + // https://www.google.com/maps/place/69%C2%B047'21.8%22N+108%C2%B022'45.4%22W/@69.7869906,-108.3727563,15.31z/data=!4m4!3m3!8m2!3d69.7893868!4d-108.3792642 + for segment in url.path_segments().into_iter().flatten() { + if let Ok((_str, (_, ret))) = pair(complete::char('@'), LatLon::parse)(segment) { + return Ok(("", ret)); + } + } + for (key, value) in url.query_pairs() { if key == "query" { - if let Ok((_str, ret)) = LatLon::parse_full(value.as_ref()) { + if let Ok((_str, ret)) = LatLon::parse(value.as_ref()) { return Ok(("", ret)); } } @@ -129,6 +134,7 @@ impl From for CoordinateUrls { let (lat_str, lon_str) = (format!("{lat}"), format!("{lon}")); let ll = format!("{lat},{lon}"); + // https://developers.google.com/maps/documentation/urls/get-started let google_maps = String::from( Url::parse_with_params( "https://www.google.com/maps/search/", @@ -137,6 +143,19 @@ impl From for CoordinateUrls { .unwrap(), ); + // TODO: Make this actually open in satellite view + let google_maps_satellite = String::from( + Url::parse_with_params( + "https://www.google.com/maps/search/", + &[ + ("api", "1"), + ("query", ll.as_str()), + ("basemap", "satellite"), + ], + ) + .unwrap(), + ); + let openstreetmap = { let mut ret = Url::parse_with_params( "https://www.openstreetmap.org/query", @@ -201,6 +220,7 @@ impl From for CoordinateUrls { Self { google_maps, + google_maps_satellite, openstreetmap, latlon, waze,