Customize indoor map and Path Planning and indoor Planning
Recently, we have implemented a project to design the indoor map path planning. In fact, the general project is rarely designed to design the indoor path planning, and the interior is so big.
But let's do it as we said above, or it's a user-friendly project. If you write it, share it with you.
Let's talk about the general idea process first. The language is not very good. If you don't understand it, add my qq24272779 to ask!
Example:
The basic idea is to select all the building areas with coordinates, that is, the areas that cannot be reached, the blue area and the gray area.
Coordinates are measured in pixels.
After the selection, the entire image map is divided into a lot of small squares!
Select two points and use the * algorithm to find the shortest path that needs to go through non-blue and gray areas.
(A * Baidu is not familiar with algorithms ).
Code:
// Add a map image
SKIndoorMapView *indoorMap = [[SKIndoorMapView alloc]initWithIndoorMapImageName:@"WHTerminalBD.png" Frame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)]; [self.view addSubview:indoorMap];
// Changan selects the start and end points
# Pragma mark-Zoom methods-(void) longRequired :( UIGestureRecognizer *) gesture {if (gesture. state = UIGestureRecognizerStateBegan) {if (Points. count = 0 | Points. count> = 2) {[Points removeAllObjects]; for (UIView * view in [self. mapView subviews]) {[view removeFromSuperview];} // coordinate CGPoint touchPoint = [gesture locationInView: self. mapView]; UIImage * Img = [UIImage imageNamed: @ "startPoint"]; UIImageView * imgView = [[UIImageView alloc] initWithImage: Img]; [imgView setFrame: CGRectMake (touchPoint. x-(Img. size. width/(self. zoomScale * 2), touchPoint. y-(Img. size. width/(self. zoomScale), Img. size. width/self. zoomScale, Img. size. height/self. zoomScale)]; [self. mapView addSubview: imgView]; [Points addObject: NSStringFromCGPoint (touchPoint)];} else if (Points. count = 1) {// coordinate CGPoint touchPoint = [gesture locationInView: self. mapView]; UIImage * Img = [UIImage imageNamed: @ "endPoint"]; UIImageView * imgView = [[UIImageView alloc] initWithImage: Img]; [imgView setFrame: CGRectMake (touchPoint. x-(Img. size. width/(self. zoomScale * 2), touchPoint. y-(Img. size. width/(self. zoomScale), Img. size. width/self. zoomScale, Img. size. height/self. zoomScale)]; [self. mapView addSubview: imgView]; [Points addObject: NSStringFromCGPoint (touchPoint)]; [self RoadRecevied: Points] ;}}
# Pragma path-(void) RoadRecevied :( NSMutableArray *) Arr {/* Path Planning */AStar * astar = [[AStar alloc] init]; data = [astar findPath: CGPointFromString (Arr [0]). x curY: CGPointFromString (Arr [0]). y aimX: CGPointFromString (Arr [1]). x aimY: CGPointFromString (Arr [1]). y];/* size -- same as UIGraphicsBeginImageContext opaque-transparent switch. If the image is completely transparent, set YES to optimize the storage of Bitmap. Scale -- Scaling Factor */uigraphicsbeginimagecontextwittions (CGSizeMake (320,480), NO, [UIScreen mainScreen]. scale); UIBezierPath * path = [UIBezierPath bezierPath]; [[UIColor redColor] setStroke]; [path setLineWidth: 0.5]; [path setLineJoinStyle: callback]; [path setLineCapStyle: kCGLineCapRound]; BOOL isfirst = YES; if (data & [data count]> 0) {for (id obj in data) {if (isfirst) {isfirst = NO; [path moveToPoint: CGPointMake ([obj id_col], [obj id_row])]; // set the start path point} [path addLineToPoint: CGPointMake ([obj id_col], [obj id_row])] ;}} [path stroke]; UIImage * img = histogram (); UIGraphicsEndImageContext (); UIImageView * imgV = [[UIImageView alloc] initWithImage: img]; [_ mapView addSubview: imgV]; [self setNeedsDisplay];}
// Here let's see how to select the blue area and the gray non-Path Planning area.
<Pre name = "code" class = "objc">-(bool) checkMap :( int) col row :( int) row {CGPoint point = CGPointMake (col, row ); /* 180,150,150,150,150,135,120,135,120,145,195,150, 45, 95,125,120,110,140,110,160, 100,165,125, 65,125,270,140,270,140,280, 95, 85,280, 85,260, 95,260, 150,170,170,170,170,260,150,260, 10,310 security check area, 60,280,150,290,150,275,180,275,180,305,150,305,150,360,170,360,170,390,200,405,200,475,150,475,150,380, 180,350,220,250,220,370,180,380 rest area * // * 10,145, 60,170, 310,150,380,150,420,190,425,150,480, 0,480 left gray 230,0, 320,0, 320,480,230,480 right gray */NSString * obstacle00 = @ ", 45, 18, 18,,"; NSString * obstacle01 = @ ", 10, 50, 180,150,150,150,150,135,120,135,120,145,195,150, 95,125,120,110,140,110,160, 100,165,125, 65,125,270,140,270,140,280 "; NSString * obstacle02 = @" 85,280, 85,260, 95 "; NSString * obstacle03 =, 95,260 "; NSString * obstacle04 = @" 150,170,170,170,170,260,150,260 "; NSString * obstacle05 = @" 10,310, 60,280,150,290,150,275,180,275,180,305,150,305,150,360,170,360,170,390,200,405,200,475,150,475,150,380 "; NSString * obstacle06 = @" 180,350,220,250,220,370,180,380 "; UIBezierPath * path00 = [Utils failed: obstacle00]; UIBezierPath * path01 = [Utils failed: obstacle01]; required * path02 = [Utils failed: obstacle02]; UIBezierPath * path03 = [Utils failed: obstacle03]; UIBezierPath * path04 = [Utils failed: obstacle04]; UIBezierPath * path05 = [Utils failed: obstacle05]; UIBezierPath * path06 = [Utils failed: obstacle06]; // NSString * str110 = @ "10,145, 65,170, 65,280, 10,310,150,385,150,423,190,425,190,475,230,475,230, 5,200, 5,200, 45,150, 45,150, 75"; if (CGPathContainsPoint (path00.CGPath, NULL, point, false )) {return NO;} else if (CGPathContainsPoint (path01.CGPath, NULL, point, false) {return NO;} else if (CGPathContainsPoint (path02.CGPath, NULL, point, false )) {return NO;} else if (CGPathContainsPoint (path03.CGPath, NULL, point, false) {return NO;} else if (CGPathContainsPoint (path04.CGPath, NULL, point, false )) {return NO;} else if (CGPathContainsPoint (path05.CGPath, NULL, point, false) {return NO;} else if (CGPathContainsPoint (path06.CGPath, NULL, point, false )) {return NO;} return YES ;}
Let's take a look at the final effect!