gpt4 book ai didi

ios - 考虑到缩放因子,将 CAShapeLayer raidus 转换为 MKcircle 半径

转载 作者:行者123 更新时间:2023-11-28 21:51:41 25 4
gpt4 key购买 nike

将 cAshapelayer 半径转换为 ​​mkcircle 半径转换。

由于 shapelayer 是基于实际 View 的顶点,而 mkcircle 半径是基于 map 缩放因子,那么转换的最佳方法是什么?

最佳答案

下面列出了一种将 MKCircle 的半径转换为 View 半径和返回半径的方法:-

1> 将MKCircle 的中心点(lat,long) 转换为ViewController View 的中心点。这将是要绘制的 CAShapeLayer 的中心。

[mapView convertCoordinate:yourCoordinate toPointToView:self.view]; 

2>MKCircle 将半径作为 map 上的距离,iOS 以米为单位。此距离必须转换为 UIViewController View 上的距离。可以按照以下步骤进行计算。

a) 使用以下方法从 MKCircle 获取半径 r 米处的 (Lat,Long):-

-(CLLocationCoordinate2D)calculateCoordinateForDistanceInKm:(double)distanceKM bearing:(double)bearing initialCoordinate:(CLLocationCoordinate2D)coordinate
{
if(!CLLocationCoordinate2DIsValid(coordinate) || !isValidDouble(distanceKM) || !isValidDouble(bearing))
assert("The Inputs are not Valid");

double angularDistance = tan(distanceKM / 6371.0f);
double bearingRad = degreeToRad(bearing);
double currentLat = degreeToRad(coordinate.latitude);
double currentLong = degreeToRad(coordinate.longitude);

double newLatitude = asin((sin(currentLat) * cos(angularDistance))
+ (cos(currentLat) * sin(angularDistance) * cos(bearingRad)));
double newLongitude = currentLong + atan2(sin(bearingRad)
* sin(angularDistance) * cos(currentLat), cos(angularDistance) - (sin(currentLat) * sin(newLatitude)));
// newLongitude should be in the range -180 to +180
newLongitude = fmod((newLongitude + 3*M_PI), (2*M_PI)) - M_PI;

return CLLocationCoordinate2DMake(RadToDegree(newLatitude), RadToDegree(newLongitude));
}

bool isValidDouble(double number)
{
if(isnan(number) || isinf(number))
return NO;
return YES;
}

double degreeToRad(double degree)
{
double radians = (degree * M_PI)/ 180.0f;
return radians;
}

double RadToDegree(double rad)
{
double degree = (rad * 180.0f)/ M_PI;
return degree;
}

b) 将新坐标转换为第 1 步中提到的 UIViewController View 的坐标。

c) 求出这两点之间的距离。

CGPoint pointOne = [mapView convertCoordinate:yourCoordinate toPointToView:self.view];
CLLocationCoordinate2D newCoordinate = [self calculateCoordinateForDistanceInKm:1.0f bearing:youtCurrentLocationObject.course initialCoordinate:youtCurrentLocationObject.coordinate];
CGPoint pointTwo = [mapView convertCoordinate:newCoordinate toPointToView:self.view];
NSNumber *radius = [NSNumber numberWithDouble:hypotf(pointOne.x - pointTwo.x, pointOne.y - pointTwo.y)];

3) 根据半径和第一个点(圆心)绘制CAShapeLayer。

4) 将 CAShapeLayer 点 bak 转换为 CLLocationCoordinate2D 以绘制 MKCircle(根据您的一些期望要求)。 CAShapeLayer 的中心点和半径是已知的,因此中心将是一些(x,y) 并且与中心等距的轨迹上的点将是(x + radius, y )

使用以下将 View 的点转换回 MKMapView 的坐标。

[mapView convertPoint:someCGPoint toCoordinateFromView:mapView]

注意:- 计算距离另一个坐标 D 处的坐标的公式。

Formula:    φ2 = asin( sin φ1 ⋅ cos δ + cos φ1 ⋅ sin δ ⋅ cos θ )
λ2 = λ1 + atan2( sin θ ⋅ sin δ ⋅ cos φ1, cos δ − sin φ1 ⋅ sin φ2 )
where φ is latitude, λ is longitude, θ is the bearing (clockwise from north), δ is the angular distance d/R; d being the distance travelled, R the earth’s radius.

希望它能回答您的问题。

关于ios - 考虑到缩放因子,将 CAShapeLayer raidus 转换为 MKcircle 半径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28081860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com