【发布时间】:2009-08-28 21:24:53
【问题描述】:
今天我正在尝试使用谷歌地图的 api 制作商店定位器。 商店定位器的设置如下: 两个区域,一个带有包含给定区域内所有商店的地图(以中心点的可选半径测量),另一个区域包含地图上所有商店的列表,它们的信息,当然还有指向他们的网站。当人们点击商店列表中的商店名称时,它会以地图中的商店为中心,并在商店标记上方打开一个信息窗口。
我有一个 javascript 变量,我煞费苦心地从 php 脚本中分配了一些 json 数据(从数据库中动态选择这些数据)
locations = [{"siteurl":"http:\/\/localhost.localdomain\/5","address":"260 Test St","city":"Brooklyn","state":"New York","zip_code":"11206"},{"siteurl":"http:\/\/localhost.localdomain\/4","address":"3709 Testing St.","city":"Austin","state":"Texas","zip_code":"78705"}];
现在,我知道我需要运行 5 个不同的函数,下面列出了它们的明显用途:
-
geocoder.getLocations:曾经 转换地址数据(来自 json 对象)转化为经纬度 数据对象 -
addElementToList: 用于添加地址信息到 商店列表,并绑定centerOnStoreonclick 函数 -
centerOnStore在列表区域点击店铺列表项时,该功能中心位于地图区域被点击的店铺。此功能还会在以商店为中心的上方打开一个信息窗口。 -
placeMarker在地图上放置标记的函数,在地理编码器返回 latitudeLongitude 对象时调用 -
eventListener这以某种方式与单击列表项有关,它进一步将地图集中在相关商店上
好吧,我不喜欢它会出现。我刚刚学习 javascript 闭包,我认为这些可能是必要的,但我不太了解它们。我需要想办法让所有这些功能进入正常工作状态,来回传递信息,并创建一个商店定位器
.
这是我到目前为止所得到的,但其中有一些非常错误的地方。
var map = null;
var geocoder = null;
var locations = null;
var center_on = null;
var zoom_level = null;
var markerList = [];
function initialize()
{
if(GBrowserIsCompatible())
{
// Assign vars
map = new GMap2(document.getElementById("map_canvas"));
geocoder = new GClientGeocoder();
locations = <?php echo(json_encode($my_vars['locations'])); ?>;
center_on = "<?php echo($my_vars['center_on']); ?>";
zoom_level = <?php echo($my_vars['zoom_level']); ?>;
var currentLocation = 0;
geocoder.getLatLng(center_on, function(myPoint)
{
map.setCenter(myPoint, zoom_level);
});
map.setUIToDefault();
var list = document.getElementById('center_list');
for(var i = 0; i < locations.length; i++)
{
var address = locations[i]['address'] + ', ' + locations[i]['city'] + ' ' + locations[i]['state'] + ', ' + locations[i]['zip_code'];
geocoder.getLocations(address, addAddressToMap);
}
}
function addAddressToMap(response) {
if (!response || response.Status.code != 200) {
currentLocation++;
} else {
var place = response.Placemark[0];
var point = new GLatLng(place.Point.coordinates[1],
place.Point.coordinates[0]);
marker = new GMarker(point);
GEvent.addListener(marker, 'click', function(){
this.openInfoWindowHtml("<strong>" + place.address + "</strong><br /><a href='" + locations[currentLocation]['siteurl'] + "'>" + locations[currentLocation]['siteurl'] + "</a>");
});
map.setCenter(point, 13);
markerList.push(marker);
map.addOverlay(marker);
li = document.createElement('li');
li.innerHTML = "<strong>" + place.address + "</strong>";
li.setAttribute('onclick', 'center_on_center(' + place.Point.coordinates[1] + ',' + place.Point.coordinates[0] + ')');
li.setAttribute('id', 'center_');
li.style.fontSize = '1.4em';
document.getElementById('center_list').appendChild(li);
// alert(currentLocation) here says 0,0,0,0
currentLocation++;
// alert(currentLocation) here says 1,2,3,4
}
}
}
我为代码墙感到抱歉。我不能再想了。我不知道这会如此困难。完全不知道。
如果我在增加它之前在行中警告 currentLocation,它总是 0。但是如果我在增加它之后在行中警告它,它是 '1,2,3,4' 等等。这与我所知道的一切背道而驰关于计算机。
【问题讨论】:
-
有点不相关,但是一旦获得地理编码,您就应该真正将它们存储在数据库中,因为这应该会加快您的应用程序的速度。
-
为此,我必须在 wordpress MU 管理员中添加一个钩子以运行 javascript 异步 xml 请求,并确保在用户提交表单之前完成该请求。
-
您最好使用 HTTP 地理编码器将位置存储在数据库中。 code.google.com/apis/maps/documentation/geocoding/index.html
标签: javascript api google-maps closures