User:CitySketcher

From OpenStreetMap Wiki
Jump to navigation Jump to search
Userboxen
OSM Logo This user submits data to OpenStreetMap under the name
cityofgod.
💕🐈 CitySketcher
really loves cats.
Rainbow Neon logo CitySketcher is a
queer KDE Neon user.
Anarchy CitySketcher prefers to actually do stuff.
Dislikes Baldwin Street CitySketcher strongly dislikes
hills and tourism.
Overpass-turbo.svg CitySketcher uses Overpass turbo, an OSM database search tool, and is willing to advise on it

About me

  • OpenStreetMap profile: cityofgod
  • Location: Dunedin
  • Pronouns: she/her
  • Favourite key: bicycle_parking=*
  • Favourite value: *=gate
  • Favourite editor: The iD/JOSM binary, like all binaries, is artificially constructed and deeply detrimental to society.

Hello! I am mapping things in Dunedin, most notably parks and shops. I enjoy micromapping, and adding surface tags.

Precision is important to me, and I check tag meanings on the wiki, though I am not afraid to make up my own tags (and document them here) if the existing ones are insufficient.

I am not currently affiliated with any commercial mapping organisations. Though if you’re hiring, get in touch! I'd love to work on the map full time.

My OpenStreetMap username is a reference to how many churches there are in this city! My friends constantly comment on how many different churches there are, because there are many different factions of christianity all with their own churches, and church structures! They are very visible while walking. I don't mean it to include/exclude people based on religion :)

Projects

In-progress

Dunedin malls! I am trying to add as much detail to the mall complex as possible. This is an incredibly challenging task because I needed to learn about indoor mapping, and trying to manage objects on different elevations is tricky. I'm making good progress, and you can see the status on OpenLevelUp! My preferred editor for indoor things is still JOSM with no particular plugins, though for new indoor mappers I would suggest trying the old iD-indoor, it looks pretty convenient.

Completed

Bus route 10. I walked to each stop and noted the details of it, then constructed a new route following the public transport v2 tutorial. It is now routable in OsmAnd.

Bus route 8 (both directions). I have local knowledge of this route but have never ridden it end-to-end. In a recent bus stop locations import from kylenz, and flyers explaining the route layout, I was able to join up the whole route using aerial imagery. There was already a route in the database, but it seemed to be about 10 years old, incorrect, and using PTv1 tags, so I decided to just delete it and construct my new route from scratch. My new route is now routable in OsmAnd.

Botanic gardens footpaths. I walked every path in the gardens leaving private GPS traces, then drew over those traces to map every path. Most of them were already there, some were missing, and a section was totally incorrect. If there’s a path in the gardens that I missed, I would be so interested to hear about it and then visit it for myself!

Unofficial tags I use

If in the future a consensus is reached on how to map these objects with the same meanings as my tags, feel free to use automated edits to convert my objects to another format. Just let me know about it before you do it, mkay?

Benches

I am using these additional tags on benches to document whether there is anti-homeless architecture, and the nature of it. Mapping hostile architecture has only been discussed a couple of times informally off-wiki, and sleeping_hindrance is my own invention.

Toilet gender markers

We need a way to map gender neutral toilets. The current unisex=yes tag is not helpful because iD presents the gender options as radio buttons, making the unisex value appear to mean "both male and female facilities are available here". However, for people who are neither male nor female, or who do not wish to declare a gender in order to pee, it is unclear whether they will be able to comfortably use these facilities!

I use gender_segregated=yes/no to determine whether non-binary people are able to use the bathrooms. I'm using this tag because it already has some use, however, it wouldn't be my tag of choice. There are a couple of problems with it:

  • The meaning is inverted. gender_segregated=yes means that non-binary people can't use the facility.
  • It doesn't fully describe the feature. The facility may be divided into male, female, and genderless accessible (this is a very common design in my area). The tag that would be used is gender_segregated=no because non-binary people can use the bathroom. However, genders are segregated here!

The tag I would like to use is: gender_neutral=yes/shared_with_accessible/no. It would be treated in a similar way to the existing male and female keys, by saying whether a specific gender is serviced. This would then allow for the following possibilities:

  • Male and female only: male=yes + female=yes + gender_neutral=no [+ the legacy tag unisex=no]
  • Male, female, and genderless accessible: male=yes + female=yes + gender_neutral=shared_with_accessible [+ the legacy tag unisex=yes]
  • Male, female, and genderless: male=yes + female=yes + gender_neutral=yes [+ the legacy tag unisex=yes]
  • Genderless only, in case of a single large room called a "family" bathroom: gender_neutral=yes [+ the legacy tag unisex=yes]
  • Female only, due to micromapping a single section of a facility: female=yes
  • Genderless only, due to micromapping a single section of a facility: gender_neutral=yes [+ the legacy tag unisex=yes]

However, it's not going to be helpful to many people if I'm the only person adding this tag, especially when there's no renderer support. Hopefully in the future a tag will be accepted and used by many, and added to StreetComplete for easy and accessible surveying.

Helpful links

Learning

(Disclaimer: I am not affiliated with the authors of these articles.)

Software

  • StreetComplete: quick on-the-ground map improvement by solving quests.
  • OsmAnd: fully offline map browsing with incredibly advanced features, including wonderful GPX track recording and display.
  • Organic Maps: fully offline map browsing, with fewer features than OsmAnd, but everything in the app loads way faster, so I prefer it over OsmAnd for everyday browsing and routing.
  • overpass turbo: quickly run and iterate on overpass queries, and render the results on a map.

(Disclaimer: I have commented on StreetComplete development issues, and I have received a few dollars from OsmAnd's contributor funding initiative, but I am otherwise not affiliated with these applications.)

Overpass queries

Comparing how benches are rendered based on object type

Don't forget to set Settings > Map > ✅ Don't display small features as POIs.

The query makes the most sense if you open it at this preset region: https://overpass-turbo.eu/s/1eLs

You can see that the benches that are nodes are rendered on osm-carto, whereas the benches that are ways are not rendered.

// select new zealand
({{nominatimArea:"New Zealand"}});

// within new zealand, select benches that are mapped as ways (this is an unusual way of mapping them)
way[amenity=bench](area);
out geom;

// within 100m of those benches, select benches that are mapped as nodes (this is the usual way of mapping them)
node[amenity=bench](around:100);
out;

Names and refs of 110 km/h highways

The majority of New Zealand open roads have a speed limit of 100 km/h. There are two motorways with a higher limit of 110 km/h. Here are their names and reference numbers.

You can adapt the query to plot them on the map instead, by removing the out:csv line.

The resulting data matches this NZTA resource: https://www.nzta.govt.nz/projects/110kmh-speed-limit-implementation/

[out:csv(name, ref)];
way[highway=motorway][maxspeed=110]({{bbox}});
out;

All doctors in Queensland, Australia

Queensland has a funny shape, so rather than a simple bounding box, we would rather find all doctors within the state's border.

To select Queensland I'll use the regular openstreetmap.org interface to look up the Queensland relation, which is ID 2316595. The ID is the number in brackets at the top.

To search inside that relation, I have to use Overpass's concept of an area, which isn't a real OSM object. An area just represents the boundaries of a multipolygon relation. To use a relation as an area in Overpass, I can add 3600000000 to its ID, which makes 3602316595. The rest of the query comes naturally.

area(3602316595);
(nwr[amenity=clinic](area);
 nwr[amenity=doctors](area););
out center;

Travelling on foot while staying close to benches

Some people may only be able to walk a short distance before needing to sit down. This query helps you to figure out where you can reach from a certain starting point while staying within a few hundred metres of a bench at all times.

// pick a location to start at...
node[name="University of Otago Library"];
// then, repeatedly expand search to find the following objects:
complete {
  // benches that are within 400 metres of any benches already found.
  nw[amenity=bench](around:400);
}
out center;

Finding roads that are part of many routes

This query returns data, so switch to data view. You can look up the id of a way on the openstreetmap.org interface to see its location and which specific relations it is part of.

As far as I know, it is not possible to sort the output. If I could sort it then I would make the ways with many routes appear at the top.

I have done a number of optimisations here.

  • If I had used the recurse up operator, the Overpass API would look up relations from disk for every iteration of the foreach loop. By holding .routes in memory and recursing through it using bw., the query runs much faster. Further reading
  • For each unique set of relations, a single way is sent to the output. The additional processing to deduplicate them takes slightly longer, but it's totally worth it because the final result is much smaller and faster to download. (When run on a city, download size goes from tens of megabytes to negligible.)
  • To speed this up further, select less stuff. You can restrict the highway selection to major highways like [highway="trunk|motorway|primary"] or restrict the route selection to major routes.

Try it out on Cleveland, Ohio! https://overpass-turbo.eu/s/1jqY

[bbox:{{bbox}}];
// select all route relations here
relation[route=road]->.routes;
// select all roads within those relations
way[highway](r.routes);

foreach->.road { // for each road...
  // get the relations that it is part of
  relation.routes(bw.road);
  // make output with the road's id, the relations that it is part of, and how many relations there are
  convert way ::id=road.u(id()), relations_list=set(id()), relations_count=count(relations) ->.this;
  // combine into output set
  (.this; .output;)->.output;
}

// for each set of relations, output one way
for.output (t["relations_list"]) {
  ._; out 1;
}

Number of distinct streets with a certain name

I was curious what the most common street in a country was. There seem to be many separate Queen Streets in Aotearoa, so I wanted to write a query to count which street names were actually the most popular.

Turns out the query I came up with is too slow to run on the whole country. You can run it on a city! But the results aren't really meaningful since the same street name is generally not reused within a city. Imagine how awful it would be for the postal workers if names were reused in that way. Do you want to visit King Street, Auckland; King Street, Auckland; or King Street; Auckland?

Update: I have been informated that this actually happens a lot in the United States. United States mappers will therefore love this query, just not for the reasons I originally thought.

[timeout:3600][bbox:{{bbox}}][out:csv(name, count)]; // this is slow to run, so a longer timeout is necessary. hehe!

// gather all ways that are roads with a name
way["highway"~"motorway|trunk|primary|secondary|tertiary|residential|unclassified|living_street"][name]->.all_roads;

// we will calculate totals for each name
for.all_roads->.all_roads_with_name (t["name"]) {
  // reset persistent variables
  ()->.seen; ()->.counter;
  
  .all_roads_with_name;
  // for each way...
  foreach->.start {
    // check if we have seen this way
    // (if we have already seen it, then there is nothing else to do)
    way.start.seen;
    if (count(ways) == 0) {
      // if we have not, then gather this way and all linked ways with the same name as if they were a chain
      .start;
      complete->.roads {
        way.all_roads_with_name(around:200);
      };
      // add the entire chain to the list of "seen" things
      (.roads; .seen;)->.seen;
      // add a single way to the list of ways with this name - this will keep a record of the number of distinct chains seen.
      (.start; .counter;)->.counter;
    };
  };
  
  // exclude ways with a single segment, output all the rest
  if (counter.count(ways) >= 2) {
    make segment_count
      name=u(all_roads_with_name.val),
      count=counter.count(ways);
    out;
  };
}

Contacting me

I prefer not to give out my personal contact details in public places. Fortunately for both of us, you can use OpenStreetMap's in-band tools! Leave a public note on my wiki talk page, write a comment on a changeset, or send a private message through the OpenStreetMap web interface.