谷歌地理编码通过HTTP回调功能?

时间:2009-05-09 23:42:40

标签: javascript ajax callback geocoding

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

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

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

是真的,没有回调函数吗?

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

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

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

E.g。 http://maps.google.com/maps/geo?output=json&sensor=false&key= {API_KEY}&安培; Q = {市,州}&安培; CALLBACK = ????

由于

8 个答案:

答案 0 :(得分:3)

嗯......我想你必须把你的AJAX电话回到你自己的服务器上,然后从你的服务器上调用谷歌的地理编码。

这就是我如何进行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代码做的不仅仅是传递数据。这样我就可以在将数据发送到客户端之前,在服务器上执行错误处理,过滤,验证,业务逻辑。

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

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

答案 1 :(得分: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]
            );
          }
        }
      }
    );
  }
}

答案 2 :(得分:2)

正如其他人所说,您没有阅读整页。您想要该页面调用JavaScript Client Geocode

这是我之前写的一个简化版本的脚本。它还使用Google Map控件,但可以随意忽略它。延迟函数hack是因为当我点击他们的服务器太快时,Google似乎偶尔会返回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>

答案 3 :(得分: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"

然后你会在你的html中添加一个脚本标签(可以使用document.createElement('script')),并使用src http://query.yahooapis.com/v1/public/yql?q= {你的yql here}&amp; format = json&amp; callback = {your函数here}其中{your yql here}替换为URI yql statment的编码版本。

答案 4 :(得分:1)

  

如果你看过了   文档,但没有找到它   安德鲁和迈克都没说   “是”,告诉你该怎么做,我   怀疑你有答案。

洛尔

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

  

10.13隐藏或屏蔽Google使用的服务标识   服务,包括未通过   遵循身份识别惯例   在Maps API文档中列出;   要么   10.14违反Maps API文档中的任何政策或违反Google的规定   软件原则(......)

     

另外

     

此服务旨在对静态(已知)地址进行地理编码   使用REST接口进行放置   地图上的应用程序内容。对于   用户定义的动态地理编码   地址(例如,在用户内)   界面元素),请咨询   JavaScript的文档   客户端地理编码器或Maps API for   Flash客户端地理编码器。地理编码是一种   时间和资源密集型任务。   只要有可能,前地理编码已知   地址(使用地理编码服务   这里描述的或另一种地理编码   服务),并将您的结果存储在一个   你自己设计的临时缓存。

但是你可以尝试Google Maps API V3 Geocoder

答案 5 :(得分:0)

查看Google Maps API。它有一些回调功能,使用它的地理编码服务。

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

答案 6 :(得分:0)

我的建议是创建一个服务器端页面来访问地理编码器。我正在做类似的事情并且效果很好。有一篇关于在PHP here中使用地理编码器的好文章。

另请注意,技术上you're not permitted使用Google的地理编码器,除非您在Google地图上显示数据 - 但我不知道他们是否真的会检查您。

答案 7 :(得分:0)

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

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

I wrote an extremely long-winded blog post describing this process.