检查坐标矩形是否包含CLLocationCoordinate2D

时间:2015-09-11 22:12:42

标签: ios core-location cllocationmanager cllocationcoordinate2d

我正在使用一个特殊的Map SDK for iOS,我正在为地图添加一个自定义形状。形状总是不同的大小,它可以是圆形,方形,星形等。只要应用程序运行,它总是动态的。

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

overlay是我加入地图的形状。

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

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

因此,如果overlayBounds由两个CLLocationCoordinate2D's组成,CLLocationManager始终更新用户的位置并为我提供最新的坐标({{1} }},如何检查最近的坐标是否在CLLocationCoordinate2D

之内

经过大量的研究后,我发现了一个可能的解决方案:https://stackoverflow.com/a/30434618/3344977

但是,当我只有2时,该答案假定我的overlayBounds属性有4个坐标(overlayBounds)。

1 个答案:

答案 0 :(得分:2)

您的描述似乎比实际问题困难得多。因此,如果我正确地得到这个,那么您的问题只是检查该点是否在overlayBounds中描述的矩形内。

你只有两个点,因为它足以定义一个矩形。因此,NESW是收到(NE.x, SE.y)(SE.x, NE.y)的其他两个点。有了这个,您可以使用您链接的答案,或者您可以构建一个MKMapRect,其中来源为NE,大小为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);

这样的事情应该可以解决问题。

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