2

我有一个旅游地点列表,我愿意编写一个服务,可以告诉我哪个旅游地点离我最近,然后是第二近的,同样不使用地图。我该怎么做。这个想法是我有一个城市中所有旅游地点及其纬度/经度的数据库,我可能在城市的任何地方,想找到离我最近的旅游景点和第二近的旅游景点,这样我可能会根据我有多少时间计划去拜访他们。我尝试了这个并找到了谷歌地图 api,但我不想显示相同的地图。或者给用户地图来搜索东西。

4

2 回答 2

0

你不需要谷歌地图。

  1. 通过geolocation API获取用户的位置。
  2. 在点列表上进行映射,使用大圆距离算法计算出的用户与点之间的距离来扩充您的对象。
  3. 通过距离对列表进行排序。
于 2012-08-06T07:54:06.837 回答
0

如果您不打算显示地图,那么您就不能使用 Google Maps API(这违反了他们的 TOS)。

如果您想从没有 Google Maps 或类似地址的地址获取纬度/经度(因为类似的服务具有类似的 TOS),那么您将需要寻找LiveAddress API 之类的东西(显然我应该透露我的工作在SmartyStreets

此示例适用于美国地址。国际地址需要不同的 API。

像 US Street Address API 这样的 API 不需要您显示地图、返回地理坐标,并且会在返回有效负载时验证地址的有效性。

这是一个Javascript 示例

    <script type="text/javascript" src="liveaddress.min.js"></script>
    <script type="text/javascript">
    LiveAddress.init(123456789); // API key

    // Make sure you declare or obtain the starting or ending lat/lon somewhere.
    // This example only does one of the points.

    LiveAddress.geocode(addr, function(geo) {
        var lat2 = geo.lat, lon2 = geo.lon;

        // Distance calculation from: http://stackoverflow.com/questions/27928/how-do-i-calculate-distance-between-two-latitude-longitude-points
        var R = 6371; // Radius of the earth in km
        var dLat = (lat2-lat1).toRad();  // Javascript functions in radians
        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; // Distance in km
    });
    </script>
于 2012-08-06T13:33:44.947 回答