我在我的一个项目中使用谷歌地图api版本3并且它正常工作。 我使用此功能设置标记以指向客户地址。
function codeAddress() {
var address = 'ulitsa "Dimcho Debelyanov" 3, Sofia, Bulgaria';
geocoder.geocode({ 'address': address}, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
map.setCenter(results[0].geometry.location);
var marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location
});
map.setZoom(16);
} else {
alert('Geocode was not successful for the following reason: ' + status);
}
});
}
但有时候对地理编码器的请求并不成功,并且没有构建标记。 我试图将结果数组硬编码为变量(result.toSource()的结果) 并直接进入
var marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location
});
但这不能正常工作,因为.toSource只保留变量。我收到以下错误:
InvalidValueError: setCenter: not a LatLng or LatLngLiteral: in property lat: not a number
我认为google.maps.Marker期望对象作为参数。
当我将对象显示到调试器中时,我看到它从原型链中收到了几个方法:
__proto__: Q
b: function (a){return a?Md(this.lat(),a.lat())&&Md(this.lng(),a.lng()):!1}
constructor: function Q(a,b,c){a-=0;b-=0;c||(a=Kd(a,-90,90),180!=b&&(b=Ld(b,-180,180)));this.nb=a;this.ob=b}
equals: function (a){return a?Md(this.lat(),a.lat())&&Md(this.lng(),a.lng()):!1}
lat: function (){return this[a]}
lng: function (){return this[a]}
toString: function (){return"("+this.lat()+", "+this.lng()+")"}
toUrlValue: function (a){a=Sd(a)?a:6;return We(this.lat(),a)+","+We(this.lng(),a)}
__proto__: Object
所以如果我将lat: function (){return this[a]}
放入对象中,这还不够。
这个问题很感兴趣。我正在寻找如何解决问题的想法。
我很感激任何想法和帮助。
经过霍利斯特的好回答后,我将代码重写为此 功能完全避免地理编码器(我从地理编码器得到latitide和longtitude 响应)。
function createGoogleMap() {
var map, latlng = new google.maps.LatLng(42.67218039999999, 23.354384200000027);
var mapOptions = {
zoom: 16,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP,
}
map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
var marker = new google.maps.Marker({
map: map,
position: latlng,
title: 'улица „Димчо Дебелянов“ 3, 1113 София, България'
});
}
google.maps.event.addDomListener(window, 'load', createGoogleMap);
可能会帮助有类似问题的人。
答案 0 :(得分:1)
我不确定你要做什么。如果您已经拥有位置lat& lng,那么你不需要地理编码器。如果地理编码器 可用,则没有问题。
如果在地理编码器不可用时设置标记,可能这是一个解决方案。
Marker
属性的所有position
需求都是LatLng
对象(results[0].geometry.location
对象是什么)。您可以在成功的地理编码调用中按地址缓存此值,然后从那里查找:
var cachedAddresses = {};
function cacheAddress(address, location) {
cachedAddresses[address] = new google.maps.LatLng(location.lat(), location.lng());
};
function createMarker(location, address) {
map.setCenter(location);
var marker = new google.maps.Marker({
map: map,
position: location,
title: address || location.toString()
});
map.setZoom(16);
};
if (cachedAddresses[address]) {
console.log('getting address from cache');
createMarker(cachedAddresses[address], address);
} else {
console.log('geocoding address...');
geocoder.geocode({'address': address}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
// cache the address for future lookup
cacheAddress(address, results[0].geometry.location);
createMarker(results[0].geometry.location, address);
} else {
console.log('Geocode failed: ' + status);
}
});
}
这也可以通过存储lat& amp; lng按地址计算值并重新构建LatLng对象以进行标记调用。像这样的JSON结构可能有效:
{address: 'the address':
{
lat: 42.6721804,
lng: 23.3543842
}
}
但这非常具体。地址的轻微差异会错过缓存。
以下是展示此内容的fiddle。