add id conversion

This commit is contained in:
AJ ONeal 2016-07-27 20:41:04 -04:00
parent 5179a6b31d
commit b5c41f04e4
4 changed files with 102 additions and 3 deletions

View File

@ -1,7 +1,7 @@
s2-geometry (JavaScript/ES5.1)
======================
A pure JavaScript/ES5.1 port of Google/Niantic's S2 Geometry library (used by Ingress, Pokemon GO)
A pure JavaScript/ES5.1 port of Google/Niantic's S2 Geometry library (used by **Ingress**, **Pokemon GO**)
Currently contains basic support for S2Cell
@ -17,3 +17,38 @@ cell.getNeighbors(); // [ cellLeft, cellDown, cellRight, cellUp ]
cell.getLatLng(); // { lat: 40.2574448, lng: -111.7089464 }
```
convert Cell Id to Quadkey
------------------
Convert from base 10 (decimal) `S2 Cell Id` to base 4 `quadkey` (aka hilbert curve quadtree id)
Example '4/032212303102210' becomes '9749618446378729472'
```
'use strict';
var quadkey = '4/032212303102210'
var parts = quadkey.split('/');
var face = parts[0]; // 4
var position = parts[1]; // '032212303102210';
var level = '032212303102210'.length; // 15
var cellId = S2.fromFacePosLevel(face, position, level);
console.log(cellId);
```
Convert from hilbert quadtree id to s2 cell id:
Example '9749618446378729472' becomes '4/032212303102210'
```
'use strict';
var cellId = '9749618446378729472';
var hilbertQuadkey = S2.toHilbertQuadkey(cellId);
console.log(hilbertQuadkey);
```

View File

@ -1,6 +1,6 @@
{
"name": "s2-geometry",
"version": "1.0.0",
"version": "1.1.0",
"description": "A pure JavaScript/ES5.1 port of Google/Niantic's S2 Geometry library (used by Ingress, Pokemon GO)",
"main": "src/s2geometry.js",
"scripts": {
@ -32,5 +32,8 @@
"bugs": {
"url": "https://github.com/coolaj86/s2-geometry-javascript/issues"
},
"homepage": "https://github.com/coolaj86/s2-geometry-javascript#readme"
"homepage": "https://github.com/coolaj86/s2-geometry-javascript#readme",
"dependencies": {
"long": "^3.2.0"
}
}

View File

@ -298,6 +298,58 @@ S2.S2Cell.prototype.getNeighbors = function() {
};
//
// Functional Style
//
S2.FACE_BITS = 3;
S2.MAX_LEVEL = 30;
S2.POS_BITS = (2 * S2.MAX_LEVEL) + 1;
S2.fromFacePosLevel = function (faceN, posS, levelN) {
var Long = require('long');
if (!levelN) {
levelN = posS.length;
}
if (posS.length > levelN) {
posS = posS.substr(0, levelN);
}
var posB = Long.fromString(posS, true, 4).toString(2);
while (posB.length < (2 * levelN)) {
posB = '0' + posB;
}
var bin = Long.fromString(faceN.toString(10), true, 10).toString(2);
bin += posB;
bin += '1';
while (bin.length < (S2.FACE_BITS + S2.POS_BITS)) {
bin += '0';
}
return Long.fromString(bin, true, 2).toString();
};
S2.toHilbertQuadkey = function (idS) {
var Long = require('long');
var bin = Long.fromString(idS, true, 10).toString(2);
var lsbIndex = bin.lastIndexOf('1');
// substr(start, len)
// substring(start, end)
var faceB = bin.substr(0, 3);
// posB will always be a multiple of 2 (or it's invalid)
var posB = bin.substring(4, lsbIndex);
var levelN = posB.length / 2;
var faceS = Long.fromString(faceB, true, 2).toString(10);
var posS = Long.fromString(posB, true, 2).toString(4);
while (posS.length < levelN) {
posS = '0' + posS;
}
return faceS + '/' + posS;
};
})('undefined' !== typeof window ? window : module.exports);

9
tests/ids.js Normal file
View File

@ -0,0 +1,9 @@
'use strict';
var S2 = require('../src/s2geometry').S2;
var cellId = S2.fromFacePosLevel(4, '032212303102210');
var hilbertQuadkey = S2.toHilbertQuadkey('9749618446378729472');
console.log(cellId, '9749618446378729472' === cellId);
console.log(hilbertQuadkey, '4/032212303102210' === hilbertQuadkey);