osmdata
osmdata copied to clipboard
[FEATURE] Data trimming on OP server side
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:
-
getbb(... , format_out = "data.frame")
will be used to query Nominatim for geocoded area. - Resulting data.frame can be then passed into new function
overpass_trim(dat, osm_area)
in a similar way as it is used fortrim_osmdata()
andformat_out = "polygon"
.osm_area =
data.frame from getbb() -
overpass_trim()
will then take only the very first result of Nominatim output for filtering. (maybe show warning if multiple results?) -
overpass_trim()
can also take two other parametersosm_id
andtype
that can be used to trim by a specific osm object instead of relying on Nominatim search.osm_id =
single id or vector of idstype =
single type or vector of types (w|r) -
overpass_trim
will parse and setopq$bbox=NULL
and new$trim_area= list( c(id_1, id_2), c("r", "w"))
-
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.