【问题标题】:Google Maps Custom Markers in an Area [duplicate]区域中的谷歌地图自定义标记[重复]
【发布时间】:2012-12-19 09:20:22
【问题描述】:

可能重复:
Calculate “as the crow flies” distance php

我正在尝试开发一个 GoogleMaps 页面,我可以在其中获取用户位置并显示来自用户周围计算区域内的 XML 文件的自定义标记点.

为了让事情更清楚:

  1. 我有一个来自 WebConfig 文件的半径参数,比如 5000(以米为单位)
  2. 我在地图上找到了用户位置,
  3. 使用我拥有的 xml 列表(xml 的 Lat-Long 值为 每个商店)我想在地图上放置 自定义标记用户位置为中心的 5 km^2 区域范围

有没有办法实现这个目标?

如何仅通过传递用户的位置坐标和距离参数(在我的例子中为 5000)来计算一个点的纬度和经度值?

编辑:

我的 XML 文档有点庞大,包括周围的白色家电商店 国家。我的主要问题是过滤这些数据行(long,latt) 使用用户的当前位置。

I need something like:
func distanceCale(int long, int latt, int radius)
to return me some values that can help me filter my XML data.

I guess my question was not clear enough at the firs place. :)

【问题讨论】:

    标签: google-maps google-maps-api-3 google-maps-markers latitude-longitude


    【解决方案1】:

    您可以使用Haversine formula 实现此目的。此公式已用于 XML 文件中的 Demo,显示给定半径内的标记。

    对于您的应用程序,javascript 代码用于从 XML 文件生成标记。

    function deg2rad(degrees){
    radians = degrees * (Math.PI/180);
    //document.write(radians);
    return radians;
    
    }
    function Haversine(lat1,lon1,lat2,lon2) {
      deltaLat = lat2 - lat1 ;
      deltaLon = lon2 - lon1 ;
      earthRadius = 3959; // in miles 6371 in meters.
      alpha    = deltaLat/2;
      beta     = deltaLon/2;
      a        = Math.sin(deg2rad(alpha)) * Math.sin(deg2rad(alpha)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.sin(deg2rad(beta)) * Math.sin(deg2rad(beta)) ;
      c        = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
      distance =  earthRadius * c;
      return distance.toFixed(2);
    }
    

    解析XML时使用Haversine函数

    var radius = document.getElementById('radiusSelect').value;
           for (var i = 0; i < markerNodes.length; i++) {
             var lat = parseFloat(markerNodes[i].getAttribute("lat"));
             var lng = parseFloat(markerNodes[i].getAttribute("lng"));
             var latlng = new google.maps.LatLng(
                  lat,
                  lng);
            var  distance = Haversine(center.lat(),center.lng(),lat,lng);
            if(distance<=radius) {    
             createOption(name, distance, i);
             createMarker(latlng, name, distance);
             bounds.extend(latlng);
             }
    

    【讨论】:

    • 我的 XML 文档有点庞大,包括全国各地的白色家电商店。我的主要问题是使用用户的当前位置过滤这些数据行(long,latt)。我需要类似: func distanceCale(int long, int latt, int radius) 来返回一些可以帮助我过滤 XML 数据的值。我想我的问题不够清楚。
    • haversine 公式允许您这样做 lat1, lon1 是您的用户的位置。遍历您的 xml,将每个点用作 lat2、lon2。这给了你距离,如果它小于半径,则显示在地图上,如果大于半径,则不显示。您最好使用启用空间的数据库或 FusionTables 来存储您的数据。
    • @ouzmpasa 查看编辑后的答案,其中包含新链接以使用 XML 文件中的标记进行映射
    • @davidstrachan 感谢您编辑您的答案并使其更加清晰。在意识到您的第一个答案也很有用后,我有点尴尬:) 对于那些正在寻找接近解决方案的人,我找到了一些工作示例:pjtecnologia.com.br/maps/exemplos/…
    猜你喜欢
    • 1970-01-01
    • 2014-02-23
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    相关资源
    最近更新 更多