Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何得到N个围绕中心坐标和半径的坐标_Php_Swift_Google Maps_Mapkit_Coordinate Transformation - Fatal编程技术网

Php 如何得到N个围绕中心坐标和半径的坐标

Php 如何得到N个围绕中心坐标和半径的坐标,php,swift,google-maps,mapkit,coordinate-transformation,Php,Swift,Google Maps,Mapkit,Coordinate Transformation,我得到了一个中心坐标和一个距离/半径,我需要使用半径从中心得到N个坐标,例如如何在下图中得到12个红点坐标 您可以使用计算来获取点 我首先从所需的中心点计算轴承,然后foreach循环轴承并将其传递给函数 function destinationPoint($lat, $lng, $brng, $dist) { $rad = 6371; // earths mean radius $dist = $dist/$rad; // convert dist to angular di

我得到了一个中心坐标和一个距离/半径,我需要使用半径从中心得到N个坐标,例如如何在下图中得到12个红点坐标

您可以使用计算来获取点

我首先从所需的中心点计算轴承,然后foreach循环轴承并将其传递给函数

function destinationPoint($lat, $lng, $brng, $dist) {
    $rad = 6371; // earths mean radius
    $dist = $dist/$rad;  // convert dist to angular distance in radians
    $brng = deg2rad($brng);  // conver to radians 
    $lat1 = deg2rad($lat); 
    $lon1 = deg2rad($lng);

    $lat2 = asin(sin($lat1)*cos($dist) + cos($lat1)*sin($dist)*cos($brng) );
    $lon2 = $lon1 + atan2(sin($brng)*sin($dist)*cos($lat1),cos($dist)-sin($lat1)*sin($lat2));
    $lon2 = fmod($lon2 + 3*M_PI, 2*M_PI) - M_PI;  // normalise to -180..+180º
    $lat2 = rad2deg($lat2);
    $lon2 = rad2deg($lon2);


    echo "lat = ".$lat2."\n";
    echo "lon = ".$lon2."\n\n";
}

$lat = 0;
$lng = 0;
$dist = 1; // km
$n = 12;

$bearings = range(0, 360-(360/$n)  , 360/$n); // create array of all bearings needed from $lat/$lng

foreach($bearings as $brng){
    echo $brng ."\n";
    destinationPoint($lat, $lng, $brng, $dist);
}
在理论上,根据您需要的精确度,您只需要使用函数计算一半的值,然后您就可以使用基本计算来计算另一半值。
但是如果距离很大(不知道大到底意味着什么),可能会有不同

您可以使用计算来获取点

我首先从所需的中心点计算轴承,然后foreach循环轴承并将其传递给函数

function destinationPoint($lat, $lng, $brng, $dist) {
    $rad = 6371; // earths mean radius
    $dist = $dist/$rad;  // convert dist to angular distance in radians
    $brng = deg2rad($brng);  // conver to radians 
    $lat1 = deg2rad($lat); 
    $lon1 = deg2rad($lng);

    $lat2 = asin(sin($lat1)*cos($dist) + cos($lat1)*sin($dist)*cos($brng) );
    $lon2 = $lon1 + atan2(sin($brng)*sin($dist)*cos($lat1),cos($dist)-sin($lat1)*sin($lat2));
    $lon2 = fmod($lon2 + 3*M_PI, 2*M_PI) - M_PI;  // normalise to -180..+180º
    $lat2 = rad2deg($lat2);
    $lon2 = rad2deg($lon2);


    echo "lat = ".$lat2."\n";
    echo "lon = ".$lon2."\n\n";
}

$lat = 0;
$lng = 0;
$dist = 1; // km
$n = 12;

$bearings = range(0, 360-(360/$n)  , 360/$n); // create array of all bearings needed from $lat/$lng

foreach($bearings as $brng){
    echo $brng ."\n";
    destinationPoint($lat, $lng, $brng, $dist);
}
在理论上,根据您需要的精确度,您只需要使用函数计算一半的值,然后您就可以使用基本计算来计算另一半值。
但是如果距离很大(不知道大到底意味着什么),可能会有不同


斯威夫特相当于@Andreas的回答:

func destinationPoint(latitude: Double, longitude: Double, bearing: Double, dist: Double) -> CLLocationCoordinate2D {
    let lat2 = asin(sin(latitude) * cos(dist) + cos(latitude) * sin(dist) * cos(bearing))
    var lon2 = longitude + atan2(sin(bearing) * sin(dist) * cos(latitude),cos(dist) - sin(latitude) * sin(lat2))
        lon2 = fmod(lon2 + 3 * .pi, 2 * .pi) - .pi  // normalise to -180..+180º
    return CLLocationCoordinate2D(latitude: lat2 * (180.0 / .pi), longitude: lon2 * (180.0 / .pi))
}

let latRadian = coordinate.latitude * .pi / 180
let lngRadian = coordinate.longitude * .pi / 180
let distance = (radius / 1000) / 6371 // km
let n = 24

let coordinates = stride(from: 0.0, to: 360.0, by: Double(360 / n)).map {
    destinationPoint(latitude: latRadian, longitude: lngRadian, bearing: $0 * .pi / 180, dist: distance)
}

斯威夫特相当于@Andreas的回答:

func destinationPoint(latitude: Double, longitude: Double, bearing: Double, dist: Double) -> CLLocationCoordinate2D {
    let lat2 = asin(sin(latitude) * cos(dist) + cos(latitude) * sin(dist) * cos(bearing))
    var lon2 = longitude + atan2(sin(bearing) * sin(dist) * cos(latitude),cos(dist) - sin(latitude) * sin(lat2))
        lon2 = fmod(lon2 + 3 * .pi, 2 * .pi) - .pi  // normalise to -180..+180º
    return CLLocationCoordinate2D(latitude: lat2 * (180.0 / .pi), longitude: lon2 * (180.0 / .pi))
}

let latRadian = coordinate.latitude * .pi / 180
let lngRadian = coordinate.longitude * .pi / 180
let distance = (radius / 1000) / 6371 // km
let n = 24

let coordinates = stride(from: 0.0, to: 360.0, by: Double(360 / n)).map {
    destinationPoint(latitude: latRadian, longitude: lngRadian, bearing: $0 * .pi / 180, dist: distance)
}

问题出在哪里?你一定是带着这个来了什么地方?我的答案有什么遗漏吗?现在检查…,谢谢问题出在哪里?你一定是带着这个来了什么地方?我的答案有什么遗漏吗?现在检查…,谢谢