add support to convert from HilbertQuadkey to s2Cell.
This commit is contained in:
parent
a4e97ba0a9
commit
d28f0a6d3f
|
@ -200,6 +200,30 @@ S2.IJToST = function(ij,order,offsets) {
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var rotateAndFlipQuadrant = function(n, point, rx, ry)
|
||||||
|
{
|
||||||
|
var newX, newY;
|
||||||
|
if(ry == 0)
|
||||||
|
{
|
||||||
|
if(rx == 1){
|
||||||
|
point.x = n - 1 - point.x;
|
||||||
|
point.y = n - 1 - point.y
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
var x = point.x;
|
||||||
|
point.x = point.y
|
||||||
|
point.y = x;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// hilbert space-filling curve
|
// hilbert space-filling curve
|
||||||
// based on http://blog.notdot.net/2009/11/Damn-Cool-Algorithms-Spatial-indexing-with-Quadtrees-and-Hilbert-Curves
|
// based on http://blog.notdot.net/2009/11/Damn-Cool-Algorithms-Spatial-indexing-with-Quadtrees-and-Hilbert-Curves
|
||||||
// note: rather then calculating the final integer hilbert position, we just return the list of quads
|
// note: rather then calculating the final integer hilbert position, we just return the list of quads
|
||||||
|
@ -240,6 +264,55 @@ var pointToHilbertQuadList = function(x,y,order,face) {
|
||||||
|
|
||||||
S2.S2Cell = function(){};
|
S2.S2Cell = function(){};
|
||||||
|
|
||||||
|
S2.S2Cell.FromHilbertQuadKey = function(hilbertQuadkey) {
|
||||||
|
var parts = hilbertQuadkey.split('/');
|
||||||
|
var face = parseInt(parts[0]);
|
||||||
|
var position = parts[1];
|
||||||
|
var maxLevel = position.length;
|
||||||
|
var point = {
|
||||||
|
x : 0,
|
||||||
|
y: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
for(var i = maxLevel - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
|
||||||
|
var level = maxLevel - i;
|
||||||
|
var bit = position[i];
|
||||||
|
var rx = 0, ry = 0;
|
||||||
|
if(bit == '1')
|
||||||
|
{
|
||||||
|
ry = 1;
|
||||||
|
}
|
||||||
|
else if(bit == '2')
|
||||||
|
{
|
||||||
|
rx = 1;
|
||||||
|
ry = 1;
|
||||||
|
}
|
||||||
|
else if(bit == '3')
|
||||||
|
{
|
||||||
|
rx = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
var val = Math.pow(2, level - 1)
|
||||||
|
rotateAndFlipQuadrant(val, point, rx, ry);
|
||||||
|
|
||||||
|
point.x += val * rx;
|
||||||
|
point.y += val * ry;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if(face % 2 == 1)
|
||||||
|
{
|
||||||
|
var t = point.x;
|
||||||
|
point.x = point.y;
|
||||||
|
point.y = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return S2.S2Cell.FromFaceIJ(parseInt(face),[point.x, point.y],level)
|
||||||
|
|
||||||
|
}
|
||||||
//static method to construct
|
//static method to construct
|
||||||
S2.S2Cell.FromLatLng = function(latLng, level) {
|
S2.S2Cell.FromLatLng = function(latLng, level) {
|
||||||
if (latLng.lat == null || latLng.lng == null) {
|
if (latLng.lat == null || latLng.lng == null) {
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
var S2 = require('../src/s2geometry.js').S2;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for(var level = 1; level <= 20; level++)
|
||||||
|
{
|
||||||
|
var success = 0;
|
||||||
|
var total = 0;
|
||||||
|
for (var x = -180.0; x < 180; x += 0.5) {
|
||||||
|
for (var y = -180.0; y < 180; y += 0.5) {
|
||||||
|
|
||||||
|
var latlng = { lat: x, lng: y };
|
||||||
|
var cell = S2.S2Cell.FromLatLng(latlng, level);
|
||||||
|
var quadKey = cell.toHilbertQuadkey();
|
||||||
|
var cell2 = S2.S2Cell.FromHilbertQuadKey(quadKey);
|
||||||
|
|
||||||
|
if(cell.face != cell2.face ||
|
||||||
|
cell.ij[0] != cell2.ij[0] ||
|
||||||
|
cell.ij[1] != cell2.ij[1] ||
|
||||||
|
cell.level != cell2.level)
|
||||||
|
{
|
||||||
|
/*console.log({
|
||||||
|
cell: cell,
|
||||||
|
cell2: cell2})*/
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
success++;
|
||||||
|
}
|
||||||
|
total++;
|
||||||
|
// check equal
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("level:" + level + "\t total:" + total + "\t success:" + success)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue