我想使用谷歌地理编码通过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 = ????
由于
答案 0 :(得分:3)
这就是我如何进行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.