finish producing the osm change

This commit is contained in:
Dustin Carlino 2019-10-15 18:49:06 -07:00
parent 76f5dc21be
commit 1fc9792378
2 changed files with 59 additions and 14 deletions

View File

@ -82,3 +82,12 @@ ffmpeg -f x11grab -r 25 -s 1800x800 -i :0.0+28,92 -vcodec huffyuv raw.avi
ffmpeg -ss 10.0 -t 5.0 -i raw.avi -f gif -filter_complex "[0:v] fps=12,scale=1024:-1,split [a][b];[a] palettegen [p];[b][p] paletteuse" screencast.gif
```
## JOSM
```
java -jar ~/Downloads/josm-tested.jar ~/abstreet/map_editor/parking_diff.osc
```
Press (and release T), then click to pan. Download a relevant layer, select the
.osc, merge, then upload.

View File

@ -1,6 +1,8 @@
use map_model::osm;
use map_model::raw::RawMap;
use std::collections::BTreeMap;
use std::fs::File;
use std::io::Write;
pub fn find_parking_diffs(map: &RawMap) {
let mut way_to_tags: BTreeMap<String, BTreeMap<String, String>> = BTreeMap::new();
@ -18,12 +20,8 @@ pub fn find_parking_diffs(map: &RawMap) {
way_to_tags.insert(tags[osm::OSM_WAY_ID].clone(), tags);
}
for (way, tags) in way_to_tags {
println!("grab way {}", way);
for (k, v) in tags {
println!(" - {} = {}", k, v);
}
let mut modified_ways = Vec::new();
for (way, abst_tags) in way_to_tags {
let url = format!("https://api.openstreetmap.org/api/0.6/way/{}", way);
println!("Fetching {}", url);
let resp = reqwest::get(&url).unwrap().text().unwrap();
@ -31,26 +29,64 @@ pub fn find_parking_diffs(map: &RawMap) {
.unwrap()
.take_child("way")
.unwrap();
for elem in &tree.children {
let mut osm_tags = BTreeMap::new();
let mut other_children = Vec::new();
for elem in tree.children.drain(..) {
if elem.name == "tag" {
println!(
"attribs: {} = {}",
elem.attributes["k"], elem.attributes["v"]
);
osm_tags.insert(elem.attributes["k"].clone(), elem.attributes["v"].clone());
} else {
other_children.push(elem);
}
}
// Does the data already match?
if abst_tags.get(osm::PARKING_LEFT) == osm_tags.get(osm::PARKING_LEFT)
&& abst_tags.get(osm::PARKING_RIGHT) == osm_tags.get(osm::PARKING_RIGHT)
&& abst_tags.get(osm::PARKING_BOTH) == osm_tags.get(osm::PARKING_BOTH)
{
println!("{} is already up-to-date in OSM", way);
continue;
}
// Fill out these tags.
for tag_key in vec![osm::PARKING_LEFT, osm::PARKING_RIGHT, osm::PARKING_BOTH] {
if let Some(value) = abst_tags.get(tag_key) {
osm_tags.insert(tag_key.to_string(), value.to_string());
} else {
osm_tags.remove(tag_key);
}
}
tree.children = other_children;
for (k, v) in osm_tags {
let mut new_elem = xmltree::Element::new("tag");
new_elem.attributes.insert("k".to_string(), k);
new_elem.attributes.insert("v".to_string(), v);
tree.children.push(new_elem);
}
tree.attributes.remove("timestamp");
tree.attributes.remove("changeset");
tree.attributes.remove("user");
tree.attributes.remove("uid");
tree.attributes.remove("visible");
// TODO bump version
let mut bytes: Vec<u8> = Vec::new();
tree.write(&mut bytes).unwrap();
let out = String::from_utf8(bytes).unwrap();
let stripped = out.trim_start_matches("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
println!("wrote: {}", stripped);
modified_ways.push(stripped.to_string());
}
println!("{} modified ways", modified_ways.len());
if modified_ways.is_empty() {
return;
}
let path = "parking_diff.osc";
let mut f = File::create(path).unwrap();
writeln!(f, "<osmChange version=\"0.6\" generator=\"abst\"><modify>").unwrap();
for w in modified_ways {
writeln!(f, " {}", w).unwrap();
}
writeln!(f, "</modify></osmChange>").unwrap();
println!("Wrote {}", path);
}