6

我想通过 HTTP功能使用谷歌地理编码将城市名称转换为我的 AJAX Web 应用程序的经度和纬度。

但是,HTTP 地理编码器功能似乎不存在回调函数

http://code.google.com/apis/maps/documentation/geocoding/index.html

是这样吗,不存在回调函数?

因为如果这是真的,它本质上意味着通过 HTTP api 的 Google 地理编码在与 AJAX 一起使用时是无用的,因为 JavaScript 会引发跨域异常错误。

关于如何在 JavaScript 中的 AJAX Web 应用程序中通过 HTTP api 使用地理编码的任何想法?

注意:我不想使用大约 200kb 下载的完整 Google Maps API(即 GClientGeocoder)。我想使用 HTTP api b/c,因为它具有超快的响应能力,并且不需要我的网络用户下载巨大的完整的交互式谷歌地图 api。

例如 http://maps.google.com/maps/geo?output=json&sensor=false&key= {API_KEY}&q={CITY,STATE}&CALLBACK=????

谢谢

4

8 回答 8

3

嗯....我认为您必须将 AJAX 回调到您自己的服务器,然后从您的服务器调用 Google 的地理编码。

这就是我进行 AJAX 地理编码的方式,这一切都通过我的 ASP.NET 代码进行。

编辑:

在 ASP.NET webforms 环境中,我可能将其实现为轻量级 ASHX 文件,但为了简单起见,这里有一个 ASPX 示例:

public partial class GoogleHandler : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e) {
        Response.Write(GetGoogleXML("http://pseudo_googlegeocode?parameter=" + parametersFromQuerystring);
    }
}

在上面的示例中,.NET 页面仅传递请求。

但在真实环境中,我宁愿我的 .NET 代码做的不仅仅是传递数据。通过这种方式,我可以在将数据发送到客户端之前,在服务器上进行所有的错误处理、过滤、验证、业务逻辑。

此外,这允许更大的抽象。即,我可能会从谷歌更改为雅虎地理编码。通过这种方式,我只需要更改我的服务逻辑,让客户端只接收一组通用的坐标/位置数据。

此外,使用这种抽象,我实际上可以聚合来自各种地理编码数据源的多个数据。同样,服务器负责聚合,客户端只接收并显示过滤后的数据。

于 2009-05-09T23:47:44.937 回答
3

这是一个使用 Google Maps Geocoder 的示例。地理编码器函数 getLocation 将回调函数作为第二个参数。

function findAddress(street, city, state, zip) {
  var address = [
    street,
    city.toLowerCase(),
    state.toLowerCase(),
    zip
  ].join(', ');

  if (!geocoder) {
    geocoder = new GClientGeocoder();
  }

  if (geocoder) {
    geocoder.getLocations(
      address,
      function(result) {
        var dialog, len, point;
        if (result.Status.code != G_GEO_SUCCESS) {
          alert("Error: "+result.Status.code)
        } else {
          len = result.Placemark.length;
          if (len > 1) {
            alert("Multiple matches were found.  I'll leave it as an exercise to handle this condition");
          } else {
            point = new GLatLng(
              result.Placemark[0].Point.coordinates[1],
              result.Placemark[0].Point.coordinates[0]
            );
          }
        }
      }
    );
  }
}
于 2009-05-10T00:44:33.163 回答
2

正如其他人指出的那样,您没有阅读整页。您想要该页面称为JavaScript Client Geocode的内容。

这是我不久前编写的脚本的简化版本。它还使用 Google Map 控件,但请随意忽略它。延迟函数 hack 是因为当我访问他们的服务器太快时,谷歌似乎偶尔会返回 null。我不知道这是否仍然是一个问题,所以除非必须,否则不要放入。

<script type="text/javascript">

    //<![CDATA[

    var freezeLocations;
    var coder;
    var map;

    function load() {
      if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById("map"));
        map.setCenter(new GLatLng(38.479395, -98.349609), 4);
        map.addControl(new GLargeMapControl());
      }

      coder = new GClientGeocoder();

      missionLocations = new Array();
      missionLocationsDelayed = new Array();
      addMissionLocation("Atlanta, Georgia", "http://improveverywhere.ning.com/group/atlanta");
      //etc.
    }

    function addMissionLocation(newLocation, url)
    {
        var successful = false;
        var counter = 0;

        while(!successful && counter < 3)
        {
            coder.getLatLng(
                newLocation,
                function(point) {
                    if (!point) {
                        //alert(newLocation + " not found");
                        successful = false;
                    } else {
                        missionLocations.push(new GMarker(point, { title:newLocation}));
                        //alert(missionLocations.length);
                        map.addOverlay(missionLocations[missionLocations.length - 1]);
                        missionLocations[missionLocations.length - 1].bindInfoWindowHtml("<a href='" + url + "'>" + newLocation + "</a>");
                        successful = true;
                    }
                }
            );

            if(!successful)
            {
                delayGeocode();
            }

            counter++;
        }
    }

    function delayGeocode()
    {
        for(var i = 0; i < 2000000; i++)
        {
        }
    }


    //]]>
    </script>
于 2009-05-10T00:53:09.273 回答
1

您可以使用我的博客文章http://jawtek.blogspot.com/2009/03/unwritten-guide-to-yahoo-query-langauge.html中概述的 Yahoo Query 语言

您将能够使用如下 yql 语句:

select * from json where
  url="http://maps.google.com/maps/geo?output=json&sensor=false&q=Indianapolis,In"

然后,您将使用 src http://query.yahooapis.com/v1/public/yql?q= {your yql here}为您的 html 添加一个脚本标签(可以使用 document.createElement('script') 完成)&format=json&callback={your function here} 其中 {your yql here} 被替换为 yql 语句的 URI 编码版本。

于 2009-05-10T04:52:06.033 回答
1

如果您查看了文档但没有找到它,而 Andrew 和 Mike 都没有说“是”,并告诉您如何去做,我怀疑您有答案。

哈哈

并让所有人阅读服务的文档:

10.13 在使用服务时向 Google 隐藏或掩盖您的服务的身份,包括不遵守 Maps API 文档中列出的标识约定;或 10.14 违反 Maps API 文档中的任何政策或违反 Google 的软件原则 (...)

该服务设计用于使用 REST 接口对静态(已知)地址进行地理编码,用于在地图上放置应用程序内容。对于用户定义地址的动态地理编码(例如,在用户界面元素中),请参阅 JavaScript 客户端地理编码器或 Flash 客户端地理编码器的 Maps API 的文档。地理编码是一项时间和资源密集型任务。尽可能对已知地址进行预地理编码(使用此处描述的地理编码服务或其他地理编码服务),并将结果存储在您自己设计的临时缓存中。

但话又说回来,您可以尝试Google Maps API V3 Geocoder

于 2009-06-08T00:52:53.940 回答
0

查看谷歌地图 API。它有一些回调函数,使用它的地理编码服务。

http://code.google.com/apis/maps/documentation/reference.html#GClientGeocoder.getLatLng

于 2009-05-09T23:55:41.907 回答
0

我也遇到了你上面描述的挑战。正如您所指出的,Google 阻止了对 Geocode API URL 的跨域 HTTP 访问:

在使用客户端脚本时,这确实严重降低了它的实用性。我发现这个挑战的唯一解决方案是创建一个服务器端代理服务,它将来自 Google Maps Geocode API 的响应中继到我的客户端脚本。

我写了一篇非常冗长的博客文章来描述这个过程。

于 2010-09-23T17:33:34.983 回答
0

我支持创建服务器端页面以访问地理编码器的建议。我正在做类似的事情,效果很好。这里有一篇关于在 PHP 中使用地理编码器的好文章。

另请注意,从技术上讲,您不得使用 Google 的地理编码器,除非您将在 Google 地图上显示数据——但我不知道他们是否真的会检查您。

于 2009-05-11T20:32:32.053 回答