s2-geometry.js/README.md

134 lines
3.4 KiB
Markdown
Raw Normal View History

2016-07-26 00:42:53 -04:00
s2-geometry (JavaScript/ES5.1)
2014-01-23 09:05:56 -08:00
======================
2016-07-28 05:23:39 -04:00
A pure JavaScript/ES5.1 port of Google/Niantic's S2 Geometry library (as used by **Ingress**, **Pokemon GO**)
2014-01-23 17:10:43 +00:00
Currently contains basic support for S2Cell
2016-08-03 16:48:49 -06:00
<table>
<tr>
<td></td>
<td>
2016-08-03 16:56:09 -06:00
Face 2 - The North Pole (and Canada and Europe)
2016-08-03 16:48:49 -06:00
2016-08-03 16:54:02 -06:00
<a href="http://i.imgur.com/SODO4bT.jpg" target="_face2"><img src="http://i.imgur.com/SODO4bTt.jpg" title="Face 2" alt="Face 2"></a>
2016-08-03 16:48:49 -06:00
</td>
<td></td>
</tr>
<tr>
<td>
2016-08-03 16:56:09 -06:00
Face 0 - Africa
2016-08-03 16:48:49 -06:00
2016-08-03 16:54:02 -06:00
<a href="http://i.imgur.com/dLI5Zd1.jpg" target="_face0"><img src="http://i.imgur.com/dLI5Zd1t.jpg" title="Face 0" alt="Face 0"></a>
2016-08-03 16:48:49 -06:00
</td>
<td>
2016-08-03 16:56:09 -06:00
Face 1 - Asia
2016-08-03 16:48:49 -06:00
2016-08-03 16:54:02 -06:00
<a href="http://i.imgur.com/duTLDTV.jpg" target="_face1"><img src="http://i.imgur.com/duTLDTVt.jpg" title="Face 1" alt="Face 1"></a>
2016-08-03 16:48:49 -06:00
</td>
<td>
2016-08-03 16:56:09 -06:00
Face 3 - Nothing... and Australia
2016-08-03 16:48:49 -06:00
2016-08-03 16:54:02 -06:00
<a href="http://i.imgur.com/6Ho35Tc.jpg" target="_face3"><img src="http://i.imgur.com/6Ho35Tct.jpg" title="Face 3" alt="Face 3"></a>
2016-08-03 16:48:49 -06:00
</td>
<td>
2016-08-03 16:56:09 -06:00
Face 4 - The Americas (and Provo, UT)
2016-08-03 16:48:49 -06:00
2016-08-03 16:54:02 -06:00
<a href="http://i.imgur.com/3IBAfqj.jpg" target="_face4"><img src="http://i.imgur.com/3IBAfqjt.jpg" title="Face 4" alt="Face 4"></a>
2016-08-03 16:48:49 -06:00
</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td>
2016-08-03 16:56:09 -06:00
Face 5 - Antarctica
2016-08-03 16:48:49 -06:00
2016-08-03 16:54:02 -06:00
<a href="http://i.imgur.com/HZCBvgy.jpg" target="_face5"><img src="http://i.imgur.com/HZCBvgyt.jpg" title="Face 5" alt="Face 5"></a>
2016-08-03 16:48:49 -06:00
</td>
</tr>
</table>
2016-07-28 05:23:39 -04:00
Where is this being used?
---------------------
* [pokemap-webapp](https://github.com/Daplie/pokemap-webapp)
* [node-pokemap](https://github.com/Daplie/node-pokemap)
* [Pokemon-GO-node-api](https://github.com/Daplie/Pokemon-GO-node-api)
2016-07-26 00:42:53 -04:00
Simple Examples
---------------
```javascript
2016-07-26 00:42:53 -04:00
var level = 15;
var latlng = { lat: 40.2574448, lng: -111.7089464 };
var cell = S2.S2Cell.FromLatLng(latlng, level);
2016-07-26 00:42:53 -04:00
cell.getNeighbors(); // [ cellLeft, cellDown, cellRight, cellUp ]
2016-07-26 00:42:53 -04:00
cell.getLatLng(); // { lat: 40.2574448, lng: -111.7089464 }
2016-07-28 02:25:17 -04:00
var key = cell.toHilbertQuadkey();
```
Previous and Next
-----------------
You can get the previous and next S2CellId from any given Key:
1. Convert from Lat/Lng to Key (Face and Hilbert Curve Quadtree)
2. Get the Previous or Next Key
3. Convert the Key to an Id (uint64 string)
2016-07-28 05:17:53 -04:00
```javascript
2016-07-28 05:21:24 -04:00
var key = S2.latLngToKey(40.2574448, -111.7089464); // '4/032212303102210'
var id = S2.toId(key); // '9749618446378729472'
2016-07-28 02:25:17 -04:00
var nextKey = S2.nextKey(key);
var nextId = S2.toId(nextKey);
var prevKey = S2.prevKey(key);
var prevId = S2.toId(prevKey);
// See it
2016-07-28 05:21:24 -04:00
console.log(prevKey); // '4/032212303102203'
console.log(key); // '4/032212303102210'
console.log(nextKey); // '4/032212303102211'
2016-07-28 02:25:17 -04:00
console.log(nextId);
```
2016-07-27 20:41:04 -04:00
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'
2016-07-28 05:17:53 -04:00
```javascript
2016-07-27 20:41:04 -04:00
'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'
2016-07-28 05:21:24 -04:00
```javascript
2016-07-27 20:41:04 -04:00
'use strict';
var cellId = '9749618446378729472';
var hilbertQuadkey = S2.toHilbertQuadkey(cellId);
console.log(hilbertQuadkey);
```