我想检查是否有人进入已分配的边界,然后我必须提醒该用户,例如“您已进入”,当用户离开时,“您离开”。我使用.KML文件绘制边界,其中有超过纬度和经度。在这里,我附上相同的屏幕截图。所以,我担心的是我怎么能检测到任何人进入这个边界并离开那个边界。提前谢谢 边界看起来像这样。红色线是边界。
答案 0 :(得分:0)
使用地图rects。这是使用地图当前可见矩形的示例。关于你的问题,你可以使用convertRegion:toRectToView:首先将你的区域转换为MKMapRect。
MKMapPoint userPoint = MKMapPointForCoordinate(mapView.userLocation.location.coordinate);
MKMapRect mapRect = mapView.visibleMapRect; // find visible map rect
//MKMapRect mapRect = [self getMapRectUsingAnnotations:arrCordinate];//find custom map rect
BOOL inside = MKMapRectContainsPoint(mapRect, userPoint);
MKMapRect mapRect = mapView.visibleMapRect; 使用来自多个纬度和经度的边界区域
创建自定义mapRect- (MKMapRect) getMapRectUsingAnnotations:(NSArray*)arrCordinate {
MKMapPoint points[[arrCordinate count]];
for (int i = 0; i < [arrCordinate count]; i++) {
points[i] = MKMapPointForCoordinate([arrCordinate[i] MKCoordinateValue]);
}
MKPolygon *poly = [MKPolygon polygonWithPoints:points count:[arrCordinate count]];
return [poly boundingMapRect];
}
答案 1 :(得分:0)
试试这段代码。这基于绕组数算法。这适用于复杂的形状,例如红线。
typedef struct {
double lon;
double lat;
} LATLON;
// returns true if w/in region
bool chkInRegion(LATLON poi, int npoi, LATLON *latlon)
{
int wn = 0;
for (int i = 0 ; i < npoi-1 ; i++) {
if (latlon[i].lat <= poi.lat && latlon[i+1].lat > poi.lat) {
double vt = (poi.lat - latlon[i].lat)/(latlon[i+1].lat - latlon[i].lat);
if (poi.lon < (latlon[i].lon + (vt * (latlon[i+1].lon - latlon[i].lon)))) {
wn++;
}
} else if (latlon[i].lat > poi.lat && latlon[i+1].lat <= poi.lat) {
double vt = (poi.lat - latlon[i].lat)/(latlon[i+1].lat - latlon[i].lat);
if (poi.lon < (latlon[i].lon + (vt * (latlon[i+1].lon - latlon[i].lon)))) {
wn--;
}
}
}
return wn < 0;
}
// test data
LATLON llval[] = {
{100,100},
{200,500},
{600,500},
{700,100},
{400,300},
{100,100}
};
#define NLATLON (sizeof(llval)/sizeof(LATLON))
int main(int argc, char **argv) {
while (1) {
char buf[1024];
fprintf(stderr, "lon = ");
fgets(buf, sizeof(buf), stdin);
double lon = atof(buf);
fprintf(stderr, "lat = ");
fgets(buf, sizeof(buf), stdin);
double lat = atof(buf);
LATLON ltest;
ltest.lat = lat;
ltest.lon = lon;
if (chkInRegion(ltest, NLATLON, llval)) {
fprintf(stderr, "\n*** in region ***\n\n");
} else {
fprintf(stderr, "\n=== outside ===\n\n");
}
}
return 0;
}
答案 2 :(得分:0)
地理围栏不适用于复杂的多边形区域。也许你可以通过其他一些方法解决问题。例如,将区域划分为较小的CLCircularRegion,然后为必须显示所有locationManager:didEnterRegion:和locationManager:didExitRegion:callbacks的通知的情况开发聚合逻辑。但请记住,每个应用程序最多只能同时监控20个区域。
请参阅https://forums.developer.apple.com/thread/21323 phillippk1建议,了解其他可能的方法。