cordova-plugin-googlemaps
Version:
Google Maps native SDK for Android and iOS, and Google Maps JavaScript API v3 for browser.
140 lines (121 loc) • 3.79 kB
JavaScript
/**
#
# Copyright 2010 Alexandre Gellibert
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
*/
var LatLng = require('./LatLng'),
LatLngBounds = require('./LatLngBounds'),
GEOCELL_GRID_SIZE = 4,
GEOCELL_ALPHABET = '0123456789abcdef';
function computeBox(geocell) {
var subcell_lng_span, subcell_lat_span;
var xy, x, y;
var bbox = _createBoundingBox(90.0, 180.0, -90.0, -180.0);
while(geocell.length > 0) {
//geoChar = geocell.charAt(i);
//pos = GEOCELL_ALPHABET.indexOf(geoChar);
subcell_lng_span = (bbox.getEast() - bbox.getWest()) / GEOCELL_GRID_SIZE;
subcell_lat_span = (bbox.getNorth() - bbox.getSouth()) / GEOCELL_GRID_SIZE;
xy = _subdiv_xy(geocell.charAt(0));
x = xy[0];
y = xy[1];
bbox = _createBoundingBox(bbox.getSouth() + subcell_lat_span * (y + 1),
bbox.getWest() + subcell_lng_span * (x + 1),
bbox.getSouth() + subcell_lat_span * y,
bbox.getWest() + subcell_lng_span * x);
geocell = geocell.substring(1);
}
var sw = new LatLng(bbox.getSouth(), bbox.getWest());
var ne = new LatLng(bbox.getNorth(), bbox.getEast());
var bounds = new LatLngBounds(sw, ne);
return bounds;
}
function _createBoundingBox(north, east, south, west) {
var north_,south_;
if(south > north) {
south_ = north;
north_ = south;
} else {
south_ = south;
north_ = north;
}
return {
northEast: {lat: north_, lng: east},
southWest: {lat: south_, lng: west},
getNorth: function() {
return this.northEast.lat;
},
getSouth: function() {
return this.southWest.lat;
},
getWest: function() {
return this.southWest.lng;
},
getEast: function() {
return this.northEast.lng;
}
};
}
/**
* https://code.google.com/p/geomodel/source/browse/trunk/geo/geocell.py#370
* @param latLng
* @param resolution
* @return
*/
function getGeocell(lat, lng, resolution) {
var cell = '';
var north = 90.0;
var south = -90.0;
var east = 180.0;
var west = -180.0;
var subcell_lng_span, subcell_lat_span;
var x, y;
while(cell.length < resolution + 1) {
subcell_lng_span = (east - west) / GEOCELL_GRID_SIZE;
subcell_lat_span = (north - south) / GEOCELL_GRID_SIZE;
x = Math.min(Math.floor(GEOCELL_GRID_SIZE * (lng - west) / (east - west)), GEOCELL_GRID_SIZE - 1);
y = Math.min(Math.floor(GEOCELL_GRID_SIZE * (lat - south) / (north - south)),GEOCELL_GRID_SIZE - 1);
cell += _subdiv_char(x, y);
south += subcell_lat_span * y;
north = south + subcell_lat_span;
west += subcell_lng_span * x;
east = west + subcell_lng_span;
}
return cell;
}
/*
* Returns the (x, y) of the geocell character in the 4x4 alphabet grid.
*/
function _subdiv_xy(char) {
// NOTE: This only works for grid size 4.
var charI = GEOCELL_ALPHABET.indexOf(char);
return [(charI & 4) >> 1 | (charI & 1) >> 0,
(charI & 8) >> 2 | (charI & 2) >> 1];
}
/**
* Returns the geocell character in the 4x4 alphabet grid at pos. (x, y).
* @return
*/
function _subdiv_char(posX, posY) {
// NOTE: This only works for grid size 4.
return GEOCELL_ALPHABET.charAt(
(posY & 2) << 2 |
(posX & 2) << 1 |
(posY & 1) << 1 |
(posX & 1) << 0);
}
module.exports = {
computeBox: computeBox,
getGeocell: getGeocell
};