node-s2 icon indicating copy to clipboard operation
node-s2 copied to clipboard

CellID(0,0) mismatch with golang/geo/s2 and java s2 lib

Open realfun opened this issue 7 years ago • 1 comments

I am trying to use this for a project, did a simple test like the following:

const s2 = require('s2');
let ll = new s2.S2LatLng(0, 0);
let cell = new s2.S2Cell(ll);
let cid = new s2.S2CellId(ll);

console.log(cid.id());
console.log(cid.parent(10).id());
console.log(cid.parent(11).id());
console.log(cid.parent(12).id());
console.log(cid.parent(13).id());

The results is like the following:

1152921504606847000
1152922604118474800 (if I use this on Java / go lib, it returns level 28)
1152921779484754000 (level 28 on java lib)
1152921573326323700 (level 29 on java lib)
1152921521786716200

On Java lib and Golang version, it is like below:

1152921504606846977
1152922604118474752
1152921779484753920
1152921573326323712
1152921521786716160

Am I using it wrong or some misunderstanding?

realfun avatar Oct 03 '17 02:10 realfun

Hey realfun,

The IDs in mapbox s2 are corrupted because they're returning a JavaScript number type. S2 Cell IDs are 64 bit, whereas the positive limit to the number type in JavaScript is 53 bits (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER).

We're actively working on new bindings for the S2 C++ library over at Radar (https://github.com/radarlabs/s2) and we return a BigInt to address this issue.

Here's an example with that library:

const s2 = require('@radarlabs/s2');

const ll = new s2.LatLng(0, 0);
const cid = new s2.CellId(ll);

console.log(cid.id());
console.log(cid.parent(10).id());
console.log(cid.parent(11).id());
console.log(cid.parent(12).id());
console.log(cid.parent(13).id());

Which results in:

1152921504606846977n
1152922604118474752n
1152921779484753920n
1152921573326323712n
1152921521786716160n

jkao avatar Sep 18 '19 16:09 jkao