1

我正在使用适用于 iOS 的特殊 Map SDK,并且正在向地图添加自定义形状。形状总是不同的大小,它可以是圆形、方形、星形等。关键是每当应用程序运行时它总是动态的。

将此形状添加到地图后,我可以访问它的属性overlayBounds,该属性被描述为:This property contains the smallest rectangle that completely encompasses the overlay.

overlay是我添加到地图的形状。

每当生成位置更新时CLLocationManager,我想检查并查看最近的坐标是否在overlayBounds形状的该属性内。

访问时overlayBounds,它有一个ne属性和一个sw属性。这两个都只是CLLocationCoordinate2D's

所以,如果overlayBounds由两个组成,CLLocationCoordinate2D's并且CLLocationManager总是更新用户的位置并给我最近的坐标(CLLocationCoordinate2D),我如何检查最近的坐标是否在overlayBounds

经过大量研究后,我只找到了一种可能的解决方案:https ://stackoverflow.com/a/30434618/3344977

但是这个答案假设我的overlayBounds属性有 4 个坐标(CLLocationCoordinate2D's),而我只有 2 个。

4

1 回答 1

2

您的描述似乎比实际问题更难。因此,如果我正确理解了这一点,您的问题只是检查该点是否在overlayBounds.

您只有 2 个点,因为它足以定义一个矩形。所以NESW是另外两个被接收为(NE.x, SE.y)和的两个点(SE.x, NE.y)。有了这个,您可以使用您链接的答案,或者您可以简单地构建一个MKMapRectwhere origin is NEand size is SE-NE。因此,在这种情况下,您可以简单地使用MKMapRectMake然后使用MKMapRectContainsPoint. 但是在计算大小时要小心,因为SE-NE可能会产生负面结果,在这种情况下,您需要增加大小的度数。那是180到x(纬度)和360到y(经度)......

MKMapRect rect = MKMapRectMake(NE.latitude, NE.longitude, SE.latitude-NE.latitude, SE.longitude-NE.longitude);
if(rect.width < .0) rect.width += 180.0;
if(rect.height < .0) rect.height += 360.0;
BOOL pointInside = MKMapRectContainsPoint(rect, pointOnMap);

像这样的东西应该可以解决问题。

现在,如果您尝试检查该点是否在形状本身内部,这实际上取决于您的形状是如何定义的。如果这是某种形式的分析表示,您可能会找到一些已经为您返回值的方法,但如果不是,那么您最好的方法很可能是将形状绘制到某个画布并检查您需要的位置的画布颜色查看。无论如何,这里更大的问题是将点和矩形转换为笛卡尔坐标系。如果是这种情况,那么只需添加评论,我会尽力帮助您...

于 2015-09-12T06:50:49.933 回答