使用lat和lon上的边界框过滤wordpress帖子

时间:2015-07-25 12:43:03

标签: php wordpress math geocoding

关于enigma在这里给出的答案https://stackoverflow.com/a/29753454/4804502

这对于我需要实现的内容几乎是完美的,因为使用WP_Query,我可以添加更多元数据来过滤返回的帖子,但是在返回绑定框的坐标时遇到了问题。

因此需要过滤搜索半径2公里范围内的其他帖子。 使用enigma提供的函数,我生成一个边界框来输入两个不同的元查询。

但是,虽然经度正确地返回,略高于原始经度,但是纬度不会再靠近而且不能为我的生活找出原因。

这是原始纬度和经度..

13.736979
-100.55612300000007

这是从边界框返回的。:

Array
(
    [0] => 1.17060885652
    [1] => 1.17060791476
    [2] => 100.556121791
    [3] => 100.556124209
)

我猜它有以下功能,

function get_destination_lat($lat1, $lng1, $d, $brng){
    return asin( sin($lat1)*cos($d/$R) +
                    cos($lat1)*sin($d/$R)*cos($brng) );
}

并且还猜测返回和asin之间应该有一个$ lat +,这至少会使它更接近纬度,但不会小于或大于。

可以通过能够查看以下内容并为解决方案提供建议的人提供一些帮助。

PS ..这是有问题的三个功能..

function get_destination_lat($lat1, $lng1, $d, $brng){
    return asin( sin($lat1)*cos($d/$R) +
                    cos($lat1)*sin($d/$R)*cos($brng) );
}

function get_destination_lng($lat1, $lng1, $d, $brng){
    $lat2 = get_destination_lat($lat1, $lng1, $d, $brng);
    return $lng1 + atan2(sin($brng)*sin($d/$R)*cos($lat1),
                         cos($d/$R)-sin($lat1)*sin($lat2));
}

function get_bounding_box($lat, $lng, $range){
    // latlng in radians, range in m
    $latmin = get_destination_lat($lat, $lng, $range, 0);
    $latmax = get_destination_lat($lat, $lng, $range, deg2rad(180));
    $lngmax = get_destination_lng($lat, $lng, $range, deg2rad(90));
    $lngmin = get_destination_lng($lat, $lng, $range, deg2rad(270));
    // return approx bounding latlng in radians
    return array($latmin, $latmax, $lngmin, $lngmax);
}

此外,这是$ args数组的输出:

[query] => Array
    (
        [posts_per_page] => 24
        [category] => 
        [orderby] => post_date
        [order] => DESC
        [post_type] => dt_agents
        [post_status] => publish
        [meta_query] => Array
            (
                [relation] => AND
                [0] => Array
                    (
                        [key] => _building_latitude
                        [value] => Array
                            (
                                [0] => 1.17060885652
                                [1] => 1.17060791476
                            )

                        [type] => numeric
                        [compare] => BETWEEN
                    )

                [1] => Array
                    (
                        [key] => _building_longitude
                        [value] => Array
                            (
                                [0] => 100.556121791
                                [1] => 100.556124209
                            )

                        [type] => numeric
                        [compare] => BETWEEN
                    )

            )

    )

非常感谢...

0 个答案:

没有答案