【问题标题】:Converting/Geocoding address into Lat Long coordinates - spiderfier for google maps将/地理编码地址转换为经纬度坐标 - 谷歌地图的蜘蛛侠
【发布时间】:2012-08-10 04:43:40
【问题描述】:

我正在尝试在我的代码中实现 spiderfier,但我在将字符串地址转换为(经纬度)坐标时遇到了一些困难。

演示:http://jawj.github.com/OverlappingMarkerSpiderfier/demo.html

文档:https://github.com/jawj/OverlappingMarkerSpiderfier

这就是我从数据库中获取地址的方式,现在我需要将其转换为(经纬度)格式

<?php 
  $locations = new locations;
  $userid = '1';
  $cityArray = $locations->pastLocations($userid);
  $title = $locations->pastTitles($userid);
  $length = count($cityArray);
?>

//now that I have the cityArray acquired from php, I encode them for javascript
<script>
var cityArray= <?php echo json_encode($cityArray); ?>;
var title = <?php echo json_encode($title); ?>;

好的,现在我的地址在一个数组中。 spiderfier 的示例使用以下方法生成随机位置(足够接近以重叠)

var baseJitter = 2.5;
var clusterJitterMax = 0.1;
var rnd = Math.random;
var data = [];
var clusterSizes = [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,2, 3, 3, 4, 5, 6, 7, 8, 9, 12, 18, 24];
for (var i = 0; i < clusterSizes.length; i++) {
GClientGeocoder.getLatLng()
var baseLon = -1 - baseJitter / 2 + rnd() * baseJitter;
var baseLat = 52 - baseJitter / 2 + rnd() * baseJitter;
var clusterJitter = clusterJitterMax * rnd();
for (var j = 0; j < clusterSizes[i]; j ++) data.push({
  lon: baseLon - clusterJitter + rnd() * clusterJitter,
  lat: baseLat - clusterJitter + rnd() * clusterJitter,
  h:   new Date(1E12 + rnd() * 1E11).toString(), //this is the title
  d:   Math.round(rnd() * 100) + '% happy'
});
} 
window.mapData = data; 

这里是 spiderfier 用来绘制数据数组的代码。这是我在生成它使用的数据数组时遇到问题的部分

var bounds = new gm.LatLngBounds();

  for (var i = 0; i < window.mapData.length; i ++) {
    var datum = window.mapData[i];
    var loc = new gm.LatLng(datum.lat, datum.lon);
    bounds.extend(loc);
    var marker = new gm.Marker({
      position: loc,
      title: datum.h,
      map: map,
      icon: iconWithColor(usualColor),
      shadow: shadow
    });
    marker.desc = datum.d;
    oms.addMarker(marker);
  }
  map.fitBounds(bounds);

假设我有一个可以输入地理编码的数组,我如何将地址(例如德克萨斯州达拉斯)转换为可以与 spiderfier 一起使用的(经纬度)格式?请记住,这个数组中有多个地址,所以我必须循环遍历并将每个地址以某种方式推送到数据数组中。这主要是我感到困惑的地方。

谢谢!

编辑 - 我尝试编写一些代码循环遍历我的 cityArray 并对每个代码进行地理编码,然后将其插入一个名为 data 的数组中,但不幸的是它不起作用

这是代码。当我使用 document.write(data) 时,什么都没有显示。我也没有收到任何错误,所以我不确定自己做错了什么。

var data = [];
for (var i = 0; i < cityArray.length; i++) {
    //document.write(cityArray[i]);
    geocoder.geocode( { 'address': cityArray[i] }, function(results, status) { //use latlang to enter city instead of coordinates 
        if (status == google.maps.GeocoderStatus.OK) {
            data.push({
                position:results[0].geometry.location,
                h: 'test',
                d: 'test'
            });
          }
          else {
            alert("Geocode was not successful for the following reason: " + status);
            }   
        });  
}  

【问题讨论】:

    标签: php javascript mysql google-maps google-maps-api-3


    【解决方案1】:

    您的问题是如何将地址转换为地理坐标(纬度和经度)以用于谷歌地图。

    将地址转换为坐标的过程称为地理编码。

    Google Maps API v3 包含一个client side geocoder,供用户输入地址时使用。

    还有一个geocoding web service供服务器使用。

    两者都受配额和速率限制。

    请参阅此article from the documentation,了解它们的使用说明以及何时适用的讨论。

    如果您有数据库,最理想的选择是在将地址输入数据库时​​对其进行地理编码,然后使用数据库中的坐标放置标记,而不是“即时”对其进行地理编码。

    【讨论】:

    • 我编辑了我的帖子以显示我在地理编码方面所做的更改。介意看看吗?
    • document.write 在渲染页面上使用时会覆盖现有页面,这不是调试的好方法。请参阅 Andrew Leach 对this question 的回答,如果您必须“即时”进行地理编码(如果您有超过〜10个标记),至于为什么您的地理编码调用不起作用,您能否提供一个链接或显示问题的jsfiddle?
    • 我还看到您对地理编码函数进行编码的方式存在问题,地理编码器异步返回其结果,因此输入顺序和输出顺序可能不同,看起来您假设它们是相同的。
    • 我正试图让它在 jsfiddle 中工作,但什么都不会显示。
    猜你喜欢
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多