On 11/19/2015 07:13 AM, Paul Johnson wrote:
Obviously there needs to be a sunrise for consumers to catch up, but
eventually the dinosaur needs to be killed. There's some places where
the way has a ref unique to the route, as noted on the ground, that
currently isn't easy to map thanks to the associated tag already being
used to identify the ref of an entirely different entity (the route
relation). I'm also suggesting that the quicker we do this, the more
painless it'll be.
We should probably bear in mind how we got here. There's a natural
tension here between the different uses of refs, that should be made
explicit.
Those who gather data in the field map what they see. I get on the
freeway near home, and I see signs "Interstate 890 East/NY 7 West."
(Newcomers get confused all the time about the fact that "east" on the
one route is "west" on the concurrent one.) At that strictly local view,
"ref" is a cluster of values - it's the multiple things that are on the
signs. That's what a nearsighted mapper sees. In this view, the topology
of the highway grid is an emergent phenomenon.
Similarly, to the renderer, the question to be asked is, "what shield or
cluster of shields shall I put on this way?" That's again a purely
local, nearsighted view, and comes down to "what's on the sign?"
If collecting mapping data from mappers or rendering maps were all that
we cared about, we'd stop here. Collect what's on the signs, render
what's on the signs, we're done.
And that's how OSM got started, and for a while everyone was happy. Some
people still are, I suppose. But with refs existing just on the ways, we
lose important capabilities.
We want to be able to route, and generally speaking, I imagine that
routers will favour staying on the same numbered route. (I could be
mistaken, they may simply disfavour roads of lower quality or getting on
and off freeways unnecessarily.) In any case, the traffic engineers
generally number routes with the idea that they link destinations. A
driver heading from Schenectady, New York to Bennington, Vermont can get
fairly simple directions of "follow NY 7 east all the way to the state
line, where it becomes Vermont 9. Take Vermont 9 the rest of the way
into Bennington. The fact that NY 7 makes several twists and turns over
local streets, and is briefly concurrent with NY 2, or I-87, or NY 22
(and so on) might be noted as "watch out, the highway turns here," but a
driver could follow the directions just as I gave them. That's why we
have numbered routes.
And it's entirely sensible to ask questions like, "what cities does NY 7
visit?" or "what route does the Northville-Placid Trail take for the
section where it's following the paved roads in Piseco, NY?"or "what are
the mileages between exits on I-87?" If all we have is the clustered
text on the signs, then these are the sort of questions that most
database managers are very poor at answering, because there's really no
alternative than parsing the text of each sign, separating it out, and
discarding those ways that don't match. Furthermore, such a question now
comes back with a disconnected bucket of ways, without topology, so the
program answering the question has to reassemble the ways into a route -
and it may not even be possible to do so.
With route relations, it becomes simpler. "Troy Road between Crosstown
Blvd and the Northway interchange is bannered NY 7,"
"The Adirondack Northway is bannered I-87 for its entire length" "The
Adirondack Northway between exits 6 and 7 is bannered NY 7" become
discrete facts, that are easily queried either by route or by way.
The disadvantage is that life becomes a trifle more complicated for the
renderer. Instead of dealing simply with ways that have all the refs in
one place, there's a subquery to get the cluster of refs that belong to
a given way. This isn't all that hard, but Mapnik doesn't do it yet.
Rather than try to get functionality like that into Mapnik, what Phil!
Gold did with his clustered-shield proof of concept was to update the
bannered ways with clusters of refs when importing the data, and then
have the renderer deal with those clusters (with pre-rendered graphics
for the shields). This approach had the advantage that the changes to
the Mapnik symbolizers were minimal, but came at the expense of some
truly weird database logic (made weirder by the fact that it also has to
incorporate refs on ways). I use his code, because it was too much work
to reimplement it, but it's far from ideal.
In any case, any database designer wants to have a given piece of
information in only one place. If refs are on both routes and ways,
that's a potential for their becoming inconsistent between the two.
Starting from the "mapper and renderer" perspective, refs on ways made
sense, but moving forward, it makes things insane for routers, route
queries and the like. Assembling reference for routes, by contrast, is
fairly straightforward to do in the database. A database that can
actually support GIS (such as PostGIS, SpatiaLite, or Oracle Spatial)
can surely support subqueries to retrieve the refs. Failing that,
auxiliary tables that organize refs by way could be invented, but I
prefer not to go there.
I don't think any formal decision has been made to deprecate refs on
ways, but all of us looking at the problem agree that they're not a
sensible approach. Someone who's familiar with database design would
identify them as not being in even "first normal form," which is the
among the weakest sets of constraints without which a relational
database cannot function.
Now we need to get organized on the task list to make it happen. We have
the right brains here to do it "bottom up." I have some thoughts on it,
but don't have time to set them down right now. Maybe I'll follow up
tonight. They break down into, "help the mapper," "handle the data
import," "help the renderer process concurrent routes," "provide for
legacy renderers," and "get the existing mess retagged."
--
73 de ke9tv/2, Kevin
_______________________________________________
Talk-us mailing list
Talk-us@openstreetmap.org
https://lists.openstreetmap.org/listinfo/talk-us