From 579e6a8a8bf636f956f3ba124715f7da7d1c0f86 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Thu, 25 Apr 2013 11:04:22 -0400 Subject: [PATCH] geolocation sets zoom based on accuracy fixes #1375 --- js/id/geo.js | 4 ---- js/id/geo/extent.js | 8 ++++++++ js/id/ui/geolocate.js | 5 ++++- js/id/ui/preset/address.js | 5 +---- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/js/id/geo.js b/js/id/geo.js index e227c21c4..682980758 100644 --- a/js/id/geo.js +++ b/js/id/geo.js @@ -85,7 +85,3 @@ iD.geo.pathLength = function(path) { } return length; }; - -iD.geo.metersToCoordinates = function(loc, vector) { - return [vector[1] / 111200, vector[0] / 111200 / Math.abs(Math.cos(loc[1]))]; -}; diff --git a/js/id/geo/extent.js b/js/id/geo/extent.js index 243ebad4f..1b19abcbc 100644 --- a/js/id/geo/extent.js +++ b/js/id/geo/extent.js @@ -33,5 +33,13 @@ _.extend(iD.geo.Extent.prototype, { obj[0][1] <= this[1][1] && obj[1][0] >= this[0][0] && obj[1][1] >= this[0][1]; + }, + + padByMeters: function(meters) { + var dLat = meters / 111200, + dLon = meters / 111200 / Math.abs(Math.cos(this.center()[1])); + return iD.geo.Extent( + [this[0][0] - dLon, this[0][1] - dLat], + [this[1][0] + dLon, this[1][1] + dLat]); } }); diff --git a/js/id/ui/geolocate.js b/js/id/ui/geolocate.js index d1d3f3772..0229727c0 100644 --- a/js/id/ui/geolocate.js +++ b/js/id/ui/geolocate.js @@ -5,7 +5,10 @@ iD.ui.Geolocate = function(map) { } function success(position) { - map.center([position.coords.longitude, position.coords.latitude]); + var extent = iD.geo.Extent([position.coords.longitude, position.coords.latitude]) + .padByMeters(position.coords.accuracy); + + map.centerZoom(extent.center(), Math.min(20, map.extentZoom(extent))); } function error() { } diff --git a/js/id/ui/preset/address.js b/js/id/ui/preset/address.js index 03ce3b56f..79193367f 100644 --- a/js/id/ui/preset/address.js +++ b/js/id/ui/preset/address.js @@ -12,10 +12,7 @@ iD.ui.preset.address = function(field, context) { var extent = entity.extent(context.graph()), l = extent.center(), - dist = iD.geo.metersToCoordinates(l, [200, 200]), - box = iD.geo.Extent( - [extent[0][0] - dist[0], extent[0][1] - dist[1]], - [extent[1][0] + dist[0], extent[1][1] + dist[1]]); + box = iD.geo.Extent(l).padByMeters(200); return context.intersects(box) .filter(isAddressable)