[OSM-dev] auto-generating landuse=residential polygon around highway=residential -streets
Roland Olbricht
roland.olbricht at gmx.de
Fri Feb 27 16:47:53 GMT 2009
> However I doing all such operations on the fly.
> e.g. the user already has a local map in LOD0-3 and chooses
> download->countryX.
[...]
> Think of having half a continent on disk and
> on the road downloading a small strip between start and target(s)
> via a mobile phone before starting the route-calculation to update
> the part of the map you will most likely be driving on 5 minutes later.
In this scenario, it might be worth a thought to do the preprocessing on the
server. The polygon coordinates for the areas will be much less data than the
roads itself. And on the server, preprocessing of the residental areas for
the 4 LODs is rather cheap.
> * This will never shrink a polygon, however I think the impact by this
> limitation is neglectable.
I think this can and should be stated as an assertion: shrinking polygons will
get quite complicated. And in the real world, a residental area is unlikely
to suddenly disappear. Only in the rare case that a road has been accidently
tagged as residental, a shrinking would be required. And this can be done by
a manually triggered reset of the data.
> I therefor require the algorithm to work with incremental updates.
> I do have fast, indexed access to:
> * the residential road currently being added
> * all nodes of the road
> * all relations the road is a part of
> * all relations and ways and relations of the nodes
[...]
> 3 => merge the polygons onto one and join the 2 relations
This might get expensive: as one relation would disappear, you have to update
the entries in the node->relation index for all the nodes of the disappearing
relation. If you are primarly interested in drawing the areas on a map, it
might be cheaper to keep two distinct polygons even if they are overlapping.
Given the assumption that we never shrink polygons, there is no harm in
forgetting that a certain node belongs to more than one residental area.
[...]
> 4 => create a new polygon and a relation with all residential roads
> contained and the surrounding polygon
That also might get expensive. But I don't see any way to circumvent this
operation.
> and if it is
> related to a surrounding landuse=residential.
I would expect that this is the essential part of the algorithm: depending on
the datastructure for the areas, it might be expensive to find the area
something is contained in. Do you already have a good datastructure for that
operation? Depending on the amount of data, the aforementioned index might
work or just be too slow. I'm using stripes with a width of 1 degree of
latitude at the moment - this is reasonably working, but looks like a
bailout.
Assumed we are anyway in the case of few LODs, a much simpler approach might
be appropriate: Consider the map as a bitmap of pixels, for example with the
doubled resolution of the LOD exactness. Then one can just mark every pixel
that is touched by a residental road as residental. A datastructure for
pixels will be much simpler than a datastructure for polygons or even
relations - for pixels, you can simply use the quadtile index of a node to
check whether there is a pixel that contains the respective node.
Roland
More information about the dev
mailing list