检查坐标矩形是否包含 CLLocationCoordinate2D
Check if coordinate rectangle contains CLLocationCoordinate2D
我正在为 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
?
范围内
经过大量研究后,我只找到了一个可能的解决方案:
但是这个答案假设我的 overlayBounds
属性 有 4 个坐标 (CLLocationCoordinate2D's
),而我只有 2 个。
你的描述似乎比实际问题要难得多。因此,如果我的理解正确,您的问题只是检查该点是否在 overlayBounds
中描述的矩形内。
您只有 2 个点,因为它足以定义一个矩形。所以 NE
和 SW
是另外两个接收为 (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);
像这样应该可以解决问题。
现在,如果您要检查该点是否在形状本身内部,这实际上取决于您的形状是如何定义的。如果这是某种形式的分析表示,您可能会发现一些已经为您提供 return 值的方法,但如果不是,那么您最好的拍摄很可能是将形状绘制到某些 canvas 并检查颜色canvas 个在您需要检查的位置。无论如何,这里更大的问题是将点和矩形转换为笛卡尔坐标系。如果是这种情况,那么只需添加评论,我会尽力帮助您...
我正在为 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
?
经过大量研究后,我只找到了一个可能的解决方案:
但是这个答案假设我的 overlayBounds
属性 有 4 个坐标 (CLLocationCoordinate2D's
),而我只有 2 个。
你的描述似乎比实际问题要难得多。因此,如果我的理解正确,您的问题只是检查该点是否在 overlayBounds
中描述的矩形内。
您只有 2 个点,因为它足以定义一个矩形。所以 NE
和 SW
是另外两个接收为 (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);
像这样应该可以解决问题。
现在,如果您要检查该点是否在形状本身内部,这实际上取决于您的形状是如何定义的。如果这是某种形式的分析表示,您可能会发现一些已经为您提供 return 值的方法,但如果不是,那么您最好的拍摄很可能是将形状绘制到某些 canvas 并检查颜色canvas 个在您需要检查的位置。无论如何,这里更大的问题是将点和矩形转换为笛卡尔坐标系。如果是这种情况,那么只需添加评论,我会尽力帮助您...