2014-01-22 4 views
19

Ich möchte spezifische Informationen zeigen, je nachdem, wo ich bin.Geolocation nächstgelegenen Standort (lat, lang) von meiner Position

Ich habe fünf Städte mit verschiedenen Informationen, und ich möchte diese Stadt (Informationen) zeigen, die ich am nächsten bin.

Wie mache ich das am einfachsten mit Javascript.

Ex.

Wenn ich die Städte lat speichert, lange in einem Array

var cities = [ 
    ['new york', '111111', '222222', 'blablabla'] 
    ['boston', '111111', '222222', 'blablabla'] 
    ['seattle', '111111', '222222', 'blablabla'] 
    ['london', '111111', '222222', 'blablabla'] 
] 

Und mit meiner aktuellen Position (lat, long) Ich mag die Stadt, die ich bin Schrank.

+0

Was muss versucht werden? –

+1

Habe noch nichts versucht, nur überprüft, ob es möglich ist. –

Antwort

36

Hier ist ein grundlegendes Codebeispiel mit HTML5 Geolocation, um die Position des Benutzers zu erhalten. Es ruft dann NearestCity() auf und berechnet die Entfernung (km) vom Standort zu jeder Stadt. Ich gab die Haversine-Formeln weiter und benutzte stattdessen die einfacheren Pythagoras-Formeln und eine equirectangulare Projektion, um die Krümmung in den Längenlinien anzupassen.

// Get User's Coordinate from their Browser 
window.onload = function() { 
    // HTML5/W3C Geolocation 
    if (navigator.geolocation) { 
    navigator.geolocation.getCurrentPosition(UserLocation); 
    } 
    // Default to Washington, DC 
    else 
    NearestCity(38.8951, -77.0367); 
} 

// Callback function for asynchronous call to HTML5 geolocation 
function UserLocation(position) { 
    NearestCity(position.coords.latitude, position.coords.longitude); 
} 


// Convert Degress to Radians 
function Deg2Rad(deg) { 
    return deg * Math.PI/180; 
} 

function PythagorasEquirectangular(lat1, lon1, lat2, lon2) { 
    lat1 = Deg2Rad(lat1); 
    lat2 = Deg2Rad(lat2); 
    lon1 = Deg2Rad(lon1); 
    lon2 = Deg2Rad(lon2); 
    var R = 6371; // km 
    var x = (lon2 - lon1) * Math.cos((lat1 + lat2)/2); 
    var y = (lat2 - lat1); 
    var d = Math.sqrt(x * x + y * y) * R; 
    return d; 
} 

var lat = 20; // user's latitude 
var lon = 40; // user's longitude 

var cities = [ 
    ["city1", 10, 50, "blah"], 
    ["city2", 40, 60, "blah"], 
    ["city3", 25, 10, "blah"], 
    ["city4", 5, 80, "blah"] 
]; 

function NearestCity(latitude, longitude) { 
    var mindif = 99999; 
    var closest; 

    for (index = 0; index < cities.length; ++index) { 
    var dif = PythagorasEquirectangular(latitude, longitude, cities[index][1], cities[index][2]); 
    if (dif < mindif) { 
     closest = index; 
     mindif = dif; 
    } 
    } 

    // echo the nearest city 
    alert(cities[closest]); 
} 
+0

Vorsicht, es gibt einen Tippfehler in der folgenden Zeile: var diff = PythagorasEquirectangular (lat, lon, Städte [index] [1], Städte [index] [2]); Sollte var diff sein = PythagorasEquirectangular (Breitengrad, Längengrad, Städte [Index] [1], Städte [Index] [2]); – Kennet

+0

@Kennet - danke, dass du mich über den Tippfehler informiert hast. Ich habe es in der Antwort behoben. –

+0

Dies. ist. Genial. Danke @ Andrew-OpenGeoCode – AndrewLeonardi

15

Mit HTML5 lesen können, können Sie den Standort des Benutzers ziehen und vergleicht dann dieses Beispiel unter Verwendung eine Haversine Funktion (function below taken from here):

function getDistanceFromLatLonInKm(lat1,lon1,lat2,lon2) { 
    var R = 6371; // Radius of the earth in km 
    var dLat = deg2rad(lat2-lat1); // deg2rad below 
    var dLon = deg2rad(lon2-lon1); 
    var a = 
    Math.sin(dLat/2) * Math.sin(dLat/2) + 
    Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * 
    Math.sin(dLon/2) * Math.sin(dLon/2) 
    ; 
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    var d = R * c; // Distance in km 
    return d; 
} 

function deg2rad(deg) { 
    return deg * (Math.PI/180) 
} 
Verwandte Themen