[OSM-dev] Osmosis Bug Report: Node TileIDs Incorrect
Brett Henderson
brett at bretth.com
Sun Apr 27 11:38:21 BST 2008
If somebody knows how the current quad tile implementation is supposed
to work, please let me know.
I've had a quick look at the error but I don't know how the quad tile
algorithm should work. When I implemented this I just copied the C
implementation, however I found it a little confusing which code I
should be looking at because the source files didn't all appear to be in
a single location. As a result, I may have implemented it wrongly.
This is my java implementation:
/**
* Calculates a tile index based upon the supplied coordinates.
*
* @param latitude
* The coordinate latitude.
* @param longitude
* The coordinate longitude.
* @return The tile index value.
*/
public long calculateTile(double latitude, double longitude) {
int x;
int y;
long tile;
//x = (int) Math.round((longitude + 180) * 65536 / 360);
//y = (int) Math.round((latitude + 90) * 65536 / 180);
x = (int) Math.floor((longitude + 180) * 65536 / 360);
y = (int) Math.floor((latitude + 90) * 65536 / 180);
tile = 0;
for (int i = 15; i >= 0; i--) {
tile = (tile << 1) | ((x >> i) & 1);
tile = (tile << 1) | ((y >> i) & 1);
}
return tile;
}
Note the commented out lines, they are the original code giving the
wrong answer.
I have replaced them with different rounding code which now gives the
correct answer for the example given by cschmidt below.
For lat="51.4781325" and lon="-0.1474929" I now get the correct answer
of 2062265654 but I'm not sure if this is a fluke or whether this is now
the correct implementation.
Christopher Schmidt wrote:
> On Wed, Apr 23, 2008 at 09:07:50AM +1000, Brett Henderson wrote:
>
>> Oh crap, apparently I didn't test that bit. I never did get the mysql
>> extensions installed to compare against.
>>
>> I doubt if I'll get to this for a few days, bit run off my feet at the
>> moment. I don't know what the problem is but perhaps Java is doing some
>> unexpected rounding along the way.
>>
>
> That's essentially what I figured. For now, anyone using osmosis to
> populate a mysql database should use the update statement at the end of
> this post if they want to get accurate results back from API map/bbox
> queries.
>
>
>> Christopher Schmidt wrote:
>>
>>> Osmosis creates incorrect tile IDs for some nodes when reading from XML
>>> and inserting into MySQL.
>>>
>>> For the node:
>>>
>>> <node id="21619242" lat="51.4781325" lon="-0.1474929" user="Osmosis
>>> System User" visible="true" timestamp="2007-11-11T09:11:14-05:00">
>>>
>>> Osmosis generates:
>>>
>>> 2062265655
>>>
>>> tile_for_point generates:
>>>
>>> 16:35:51 < crschmidt> select tile_for_point(514781325,-01474929);
>>> 16:35:56 < crschmidt> | tile_for_point(514781325,-01474929) |
>>> 16:35:56 < crschmidt> +-------------------------------------+
>>> 16:35:56 < crschmidt> | 2062265654 |
>>>
>>> Updating a table with 115000 nodes in it says:
>>>
>>> mysql> update current_nodes set tile=tile_for_point(latitude,
>>> longitude);
>>> Query OK, 103333 rows affected (11.41 sec)
>>> Rows matched: 115692 Changed: 103333 Warnings: 0
>>>
>>> Which means, I guess, that 12000 (~10%) ended up okay, and everything
>>> else was (presumably) off by one.
>>>
>>> Regards,
>>>
>>>
>> _______________________________________________
>> dev mailing list
>> dev at openstreetmap.org
>> http://lists.openstreetmap.org/cgi-bin/mailman/listinfo/dev
>>
>
>
More information about the dev
mailing list