避免使用Google地图中的geocoder.geocode并使用变量传递给google.maps.Marker

时间:2013-12-28 11:35:14

标签: google-maps-api-3 google-maps-markers

我在我的一个项目中使用谷歌地图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);

可能会帮助有类似问题的人。

1 个答案:

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