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

发布于 2018-05-02 12:41:37
您可以使用距离计算来获得积分。
我首先从所需的中心点计算轴承,然后预先循环它们并将它们传递给函数。
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);
}在理论上,取决于你需要它的精确程度,你只需要用函数计算一半的值,然后你就可以用基本的计算来计算另一半。
但是,如果距离很大(不知道什么是大的),它可能会产生影响。
发布于 2018-05-02 15:07:39
迅速相当于@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)
}https://stackoverflow.com/questions/50133937
复制相似问题