mirror of
https://github.com/a-b-street/abstreet.git
synced 2024-12-26 16:02:23 +03:00
finish producing the osm change
This commit is contained in:
parent
76f5dc21be
commit
1fc9792378
@ -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.
|
||||
|
@ -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\"?>");
|
||||
modified_ways.push(stripped.to_string());
|
||||
}
|
||||
|
||||
println!("wrote: {}", stripped);
|
||||
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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user