计算地理位置距离返回NaN

时间:2013-12-17 17:12:22

标签: javascript jquery google-maps-api-3 geolocation

我正在尝试计算用户与下面坐标之间的距离,我不确定我做错了什么,但我得到了响应'NaN'(不是数字)

HTML:

<h3>Come visit</h3>
<p>You're only <span class="distance"> </span>km away</p>

JS文件:

// Location
if($('#content').hasClass('contact_page')) {
    var localSearch = new GlocalSearch();
    var sharp_hq = {
        lat: 53.639993,
        lng: -1.782354
    };
   // calculate the distance between me and thee
    var calculate_distance = function(location) {
        return Math.round(3959 * 1.609344 
       * Math.acos(Math.cos(0.0174532925 * location.y) 
       * Math.cos(0.0174532925 * sharp_hq.lat)
       * Math.cos((0.0174532925 * sharp_hq.lng) - (location.x * 0.0174532925))
       + Math.sin(0.0174532925 * location.y)
       * Math.sin(0.0174532925 * sharp_hq.lat)));
    };

    // geo location
    if(navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(function(position) {
            initialLocation = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
            //display in .distance <span>
            $('.distance', '.location').html(calculate_distance(initialLocation));
            $('p', '.location').css({ display: 'block' });
        });
    }
}

4 个答案:

答案 0 :(得分:1)

google.maps.LatLng对象没有.x或.y属性

看起来您可能仍然希望Google Maps Javascript API v2能够正常工作(它已被v3的包装器取代)。

而不是location.x / location.y使用location.lat()作为纬度,使用location.lng()作为经度。或者使用.x和.y属性创建自己的匿名对象(但不要指望它可以与google.maps.LatLng对象互换)。

注意: Google Maps Javascript API v3有一个library to calculate distance

答案 1 :(得分:1)

这对我有用;

$(document).ready(function(){
    var sharp_hq = {
        lat: 53.639993,
        lng: -1.782354
    };
    // geo location
    if(navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(function(position) {
            $('.distance').html( gc(position.coords.latitude,position.coords.longitude,sharp_hq.lat,sharp_hq.lng).toFixed(2) );
            $('p', '.location').css({ display: 'block' });
        });
    }
} ) ;

/** Converts numeric degrees to radians */
if (typeof (Number.prototype.toRad) === "undefined") {
    Number.prototype.toRad = function () {
        return this * (Math.PI / 180);
    }
};

function gc(lat1, lon1, lat2, lon2) {
    // returns the distance in km between the pair of latitude and longitudes provided in decimal degrees
    var R = 6371; // km
    var dLat = (lat2 - lat1).toRad();
    var dLon = (lon2 - lon1).toRad();
    var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
                    Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) *
                    Math.sin(dLon / 2) * Math.sin(dLon / 2);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    var d = R * c;
    return d;
}

答案 2 :(得分:0)

您可以使用名为google.maps.geometry.computeDistanceBetween()的函数找到两个latlng对象之间的距离。

https://developers.google.com/maps/documentation/javascript/geometry

用{/ p>替换对calculate_distance功能的调用

var distance = google.maps.geometry.spherical.computeDistanceBetween(
  new google.maps.LatLng(sharp_hq.lat, sharphq.lng),
  initialLocation
) / 1000;
$('.distance').text(distance);

以米为单位返回距离,然后除以1000。

答案 3 :(得分:0)

在您的公式中,(0.0174532925 * sharp_hq.lng) - (location.x * 0.0174532925)的值可以是&lt; 0导致NaN。

如果<0,则需要将其预处理为0以避免异常。

我希望这可以在不改变整个公式的情况下解决您的问题。