如何使用Javascript查找地址的LatLong(快速-15-20ms)?

如何使用Javascript查找地址的LatLong(快速-15-20ms)?,javascript,geolocation,google-geocoder,Javascript,Geolocation,Google Geocoder,我有一个socket.io,它每隔15-20毫秒ping一个新地址。对于这个地址,我必须获得Lat长度,并将标记放在谷歌地图中。因此,在这15-20毫秒内(如果不是,可能在50-60毫秒内),我必须获得地理位置。目前我正在使用geocoder=new google.maps.geocoder()

我有一个socket.io,它每隔15-20毫秒ping一个新地址。对于这个地址,我必须获得Lat长度,并将标记放在谷歌地图中。因此,在这15-20毫秒内(如果不是,可能在50-60毫秒内),我必须获得地理位置。目前我正在使用
geocoder=new google.maps.geocoder()geocoder.geocode({address:data},myFunction(){})

但是这个地图API非常慢。它以400-500毫秒的速度返回地理位置,这使得我的中间地址请求为空。我需要一个非常快的API

以下是socket.io的代码片段供参考:

geocoder = new google.maps.Geocoder();
    var socket = io.connect('http://localhost');
    socket.on('new_address', function (data) {
        //Gets called everytime a new request for GeoLocation comes
        geocoder.geocode({address: data}, placeMarker);
    });

var placeMarker = function(){
    //Add Marker to GoogleMaps
};

正如在评论中提到的,你不能期望在20毫秒内在互联网上得到回复,这样做是行不通的。然而,你cán所做的是用地址创建一个池,让地理编码器(或者可能是4个中的3个)按照自己的速度处理它

这可能看起来有点像这样(这里只是给出了一个方向,不要期望它马上就能工作):


甚至您的网络延迟也将超过15-20毫秒。除非你能使用一些本地数据库执行反向地理编码,否则我看不到任何方法可以做到这一点。试着让谷歌购买更多网络和更快的服务器^^为什么不从你的服务器(中央)调用谷歌API,并将地址与lat/lon数据一起发送?@Cthulhu..可能会发生网络延迟超过时间的情况。但它肯定不会高达400-500毫秒。是的,另一种方法是维护本地数据库,但我希望如果有其他API可以满足需要。@Bergi..我想我可以这样做,但谷歌API将再次花时间返回LatLong。这将在服务器端socket.io上导致相同的延迟问题。@tanmaykhandelwal:不会,因为您的服务器(希望?)可能比客户端具有更好的网络连接。另外,据我所知,您的问题是套接字处理程序和placeMarker之间的时间(出于某些UX原因?),如果您“延迟”套接字消息并同时发送这两个信息,那么这将是零。嗯?这个独立的间隔将如何缩短从套接字处理程序到调用
placeMarker
的时间?此外,如果地理编码器计算结果的时间超过400毫秒,该脚本将无法工作。它不是那样工作的。。。其思想是javascript从node/socket.io获取地址,并在循环中调用一个单独的函数addressCheck对其进行处理。地理编码器的回调再次调用该函数以重新启动它。400毫秒的延迟是为了在列表上没有更多地址时给浏览器一些空闲时间。哦,对了,我误解了循环。不过,使用单独的函数不会使地理编码器更快。根据你的时间间隔,在最坏的情况下,从
地址。按
位置标记
的时间可能会加倍。答案很简单:你不能在这么短的时间内查找,你都说过了。我正在展示一种解决问题的方法:他从socket.io获取地址,并希望地图上的标记能够显示出来。时间是不相关的,当请求工作时。修复哪个问题?OPs示例代码有效。他问起时间的改进。
var addresses = [];
var socket = io.connect('http://localhost');
socket.on('new_address', function (data) {
    //Gets called everytime a new request for GeoLocation comes
    //Adds an address to the list when it comes in from the backend
    adresses.push(data);
});

var geocoder = new google.maps.Geocoder();
//This function is called in a loop.
var addressCheck = function() {
    //When the list of addresses is empty, because we haven't received anything from the backend, just wait for a bit and call this function again.
    if(addresses.length == 0) {
        setTimeout(addressCheck, 400);
        return;
    }
    //Get the first one on the list.
    var data = addresses[0];
    //Process it.
    geocoder.geocode({address: data}, function() {
        placeMarker();
            //remove the first element from the adresses list.
        addresses.shift();
            //Call the entire function again, so it starts with a new address.
        addressCheck();
    });
}
var placeMarker = function(){
    //Add Marker to GoogleMaps
};

addressCheck();