navigator.geolocation.getCurrentPosition需要太多才能执行

时间:2016-07-13 19:58:36

标签: javascript php

我正在开发一个网站,其中包括计算用户(移动设备或计算机)与某些餐馆之间的距离。每个餐馆的纬度和经度值存储在数据库表中。以下是我用于计算设备纬度和经度的函数:

        function getLocation() {
            if (navigator.geolocation) {
                document.getElementById("geoloc_en_sts").value = true;
                navigator.geolocation.getCurrentPosition(showPosition,showError,
                    {
                        enableHighAccuracy : false,
                        timeout : 10000, // 10s
                    }
                );
            } else { 
                document.getElementById("geoloc_en_sts").value = false;
            }
        }
        function showPosition(position) {
            document.getElementById("user_lat").value=position.coords.latitude;
            document.getElementById("user_long").value=position.coords.longitude;
        }
        function showError(error) {
            switch(error.code) {
                case error.PERMISSION_DENIED:
                    //Do something
                    break;
                case error.POSITION_UNAVAILABLE:
                    //Do something
                    break;
                case error.TIMEOUT:
                    //Do something
                    break;
                case error.UNKNOWN_ERROR:
                    //Do something else
                    break;
            }
        }

(我从另一个stackoverflow答案中抓取并个性化了这些函数)

showPosition函数将设备的纬度和经度值存储在一些id为user_lat和user_long的隐藏标签中。我们的想法是让它们在那里供以后使用。另外,我必须说我在网络开发方面很新,而且我不知道在javascript和PHP之间传递参数的更好方法。

我用来计算两点之间距离的函数是:

        function getDistance($id, $rest_lat, $rest_long) {
            var geoloc_en_sts = document.getElementById("geoloc_en_sts");
            if (geoloc_en_sts.value == "true") {
                var user_lat = document.getElementById("user_lat").value;
                var user_long = document.getElementById("user_long").value;
                var d2r = 0.017453292519; //   pi/180
                var long = (user_long - $rest_long) * d2r;
                var lat = (user_lat - $rest_lat) * d2r;
                var a = Math.pow(Math.sin(lat/2.0), 2) + Math.cos($rest_lat*d2r) * Math.cos(user_lat*d2r) * Math.pow(Math.sin(long/2.0), 2);
                var c = 2.0 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
                var e = (6378.1370 * c).toFixed(2);
                alert("Distance for restaurant ID " + $id + " is " + e " km";
            }
        }

(另外,我从另一个答案中抓住了这个)

在查询我的数据库时,我获取了JSON文件中的餐馆数据,然后对于其中的每条记录,我需要计算距离。这是我的代码:

        $context = stream_context_create(array('http' => array('header'=>'Connection: close\r\n')));
        $restaurants_json_url = "http://www.whateversite.com/restaurants/data.json";
        $restaurants_json = file_get_contents($restaurants_json_url,false,$context);
        ?>
        <script> getLocation(); </script>
        <?php
        $restaurants_array = json_decode($restaurants_json, true);
        $restaurants = $restaurants_array['restaurants'];
        $restaurants_result_count = count($restaurants);
        if ($restaurants_result_count > 0) {
            foreach ($restaurants as $restaurant) {
                $rest_id = $restaurant['id'];
                $rest_latitude = $restaurant['latitude'];
                $rest_longitude = $restaurant['longitude'];
                ?>
                <script> getDistance(<?php echo $rest_id.",".$rest_latitude.",".$rest_longitude ?>); </script>
                <?php
            }
        }

此函数抓取先前存储在隐藏标签中的值并进行计算。我期望的事件序列如下:

  1. 调用并执行getLocation函数
  2. 调用并执行showPosition函数。设备纬度和纵向值存储在隐藏标签
  3. getDistance函数的调用次数与数据库表中的记录次数相同。每次计算距离。
  4. 我的问题是,即使我按此顺序调用这些函数,实际的完成顺序也不是1,2,3,而是1,3,3。 showPosition函数需要大约5秒才能执行,并且到时间结束时,getDistance函数已经计算了错误的距离。我想我要么延迟执行getDistance,直到showPosition完成执行或提前执行showPosition,所以它是在调用getDistance时完成的。问题是我使用$ _POST查询数据库,并且,就我所看到的,每次执行$ _POST时,隐藏的标记值都会重置。

    正如我之前提到的,我在网络开发方面非常陌生,可能有100种不同的(更好的)方法来做我正在尝试做的事情。任何帮助都感激不尽。感谢。

1 个答案:

答案 0 :(得分:0)

更简单的方法是通过JavaScript并使用Google Maps API进行翻译。大多数工作都是为你完成的,为什么不使用呢?

另外,只是为了一个好的做法:

始终使用私人,公共或受保护的东西。也使用类