Javascript 谷歌地理编码通过HTTP回调函数?

Javascript 谷歌地理编码通过HTTP回调函数?,javascript,ajax,callback,geocoding,Javascript,Ajax,Callback,Geocoding,我想通过HTTP使用google geocode功能将城市名称转换为我的AJAX web应用程序中的经度和纬度 但是,似乎不存在HTTP地理编码器功能的回调函数 这是真的吗,不存在回调函数 因为如果这是真的,那么它本质上意味着当与AJAX一起使用时,通过HTTP api的Google地理代码是无用的,因为JavaScript将抛出一个跨域异常错误 关于如何在JavaScript的AJAX web应用程序中通过HTTP api使用地理代码,有什么想法吗 注意:我不想使用完整的Google Map

我想通过HTTP使用google geocode功能将城市名称转换为我的AJAX web应用程序中的经度和纬度

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

这是真的吗,不存在回调函数

因为如果这是真的,那么它本质上意味着当与AJAX一起使用时,通过HTTP api的Google地理代码是无用的,因为JavaScript将抛出一个跨域异常错误

关于如何在JavaScript的AJAX web应用程序中通过HTTP api使用地理代码,有什么想法吗

注意:我不想使用完整的Google Maps API,该API下载量约为200kb(即GClientGeocoder)。我想使用HTTP api b/c,它具有超快速的响应能力,并且不需要我的web用户下载庞大的完整交互式google maps api

例如。 {API_KEY}&q={城市,州}&CALLBACK=


谢谢

嗯……我想你必须让你的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代码做更多的事情,而不仅仅是传递数据。这样,在将数据发送到客户端之前,我可以在服务器上执行错误处理、过滤、验证、业务逻辑等操作

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


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

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


下面是一个使用谷歌地图地理编码器的示例。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]
            );
          }
        }
      }
    );
  }
}

正如其他人指出的,你没有阅读整页。你想要那个页面所说的

这是我不久前写的一个脚本的简化版本。它还使用了谷歌地图控件,但可以忽略这一点。延迟函数黑客是因为当我太快点击他们的服务器时,谷歌似乎偶尔返回空值。我不知道这是否仍然是一个问题,所以除非必须,否则不要把它放进去

<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>

//

您可以使用我博客文章中概述的雅虎查询语言

您可以使用yql语句,如:
select*fromJSON,其中
select * from json where
  url="http://maps.google.com/maps/geo?output=json&sensor=false&q=Indianapolis,In"
url=”http://maps.google.com/maps/geo?output=json&sensor=false&q=Indianapolis,在“


然后,您可以使用src{your yql here}&format=json&callback={your function here}将脚本标记添加到html(可以使用document.createElement('script'))中,其中{your yql here}替换为yql语句的URI编码版本

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

另外请注意,从技术上讲,除非你将数据显示在谷歌地图上,否则使用谷歌地理编码器是不可能的,但我不知道他们是否真的会检查你

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

哈哈

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

10.13从谷歌隐藏或屏蔽您的服务使用时的身份 服务,包括未能 遵循身份确认惯例 在Maps API文档中列出; 或 10.14违反地图API文档中的任何政策或违反谷歌的 软件原理(…)

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


但是你也可以试试

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

当使用客户端脚本时,这确实严重降低了它的有用性。我找到的解决这个问题的唯一办法是创建一个服务器端代理服务,将Google Maps Geocode API的响应转发到我的客户端脚本


谢谢,但我不想使用完整的谷歌地图API。我想使用HTTP地理编码器。谢谢,但我不想使用完整的谷歌地图API。我想使用HTTP地理编码器。谢谢,但我不想使用完整的谷歌地图API。我想使用HTTP地理编码器。没有原始JSONP。您可以使用RESTAPI(如果需要,可以使用代理),也可以使用GClientGeocoder。如果这是真的,那么JSONP不存在于HTTP中,并且只存在于GClientGeocoder中。。。那将是非常悲哀的,这不是一个