osmdata icon indicating copy to clipboard operation
osmdata copied to clipboard

[FEATURE] Data trimming on OP server side

Open Mashin6 opened this issue 2 years ago • 0 comments

As suggested in #178 trimming by area polygon using Overpass is fast and useful way of data filtering.

Note: OP now treats all closed ways as areas thus allowing filtering by features like parks or buildings. Overpass-turbo uses {{geocodeArea:"name"}} shorthand to query Nominatim and takes the first retrieved object for area filtering. We could use this behavior here as well.

Ok. I took a look on the existing code and though of a solution. But before I write any code I want to check if the solution is in line with overall spirit of the package structure and any long term visions:

  1. getbb(... , format_out = "data.frame") will be used to query Nominatim for geocoded area.
  2. Resulting data.frame can be then passed into new function overpass_trim(dat, osm_area) in a similar way as it is used for trim_osmdata() and format_out = "polygon". osm_area = data.frame from getbb()
  3. overpass_trim() will then take only the very first result of Nominatim output for filtering. (maybe show warning if multiple results?)
  4. overpass_trim() can also take two other parameters osm_id and type that can be used to trim by a specific osm object instead of relying on Nominatim search. osm_id = single id or vector of ids type = single type or vector of types (w|r)
  5. overpass_trim will parse and set opq$bbox=NULL and new $trim_area= list( c(id_1, id_2), c("r", "w"))
  6. opq_string_intern() will detect presence of $trim_area in opq object and modify query buildup. So from this:
opq() |>
    trim_osmdata(osm_id = c(id_1, id_2), type = c("r", "w")) |>
    add_osm_feature(key = "natural", value = "tree") |>
    osmdata_sf()

we get

(
rel(id:id_1);
way(id:id_2);
);

map_to_area->.a;

(
nwr[natural=tree](area.a);
);

It would work the same with getbb nominatim search but the osm_id and type will be taken from the passed data.frame.

Mashin6 avatar Dec 04 '21 06:12 Mashin6