Google映射iOS sdk获取tapped叠加坐标

时间:2014-05-25 16:55:51

标签: ios objective-c google-maps google-maps-sdk-ios gmsmapview

我正在使用谷歌地图iOS sdk。 我想在用户点击叠加层时获取触摸点的坐标。

有这种委托方法:

- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate

但是点击叠加层或标记时不会调用它。

我能以编程方式调用它(但是缺少坐标参数 - 这就是我想要的......)? 或从中得到位置:

- (void) mapView: (GMSMapView *) mapView  didTapOverlay: (GMSOverlay *) overlay

任何建议都很珍贵!

谢谢!

6 个答案:

答案 0 :(得分:6)

更新2015年6月2日

只需将UITapGestureRecognizer装订到地图上,然后从触摸点提取坐标。你的didTapAtCoordinate和didTapAtOverlay将继续像以前一样开火。

  UITapGestureRecognizer *touchTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTouchTap:)];
  [self.view addGestureRecognizer:touchTap];

-(void)tapTouchTap:(UITapGestureRecognizer*)touchGesture
{
  CGPoint point = [touchGesture locationInView:self.view];
  CLLocationCoordinate2D coord = [self.mapView.projection coordinateForPoint:point];
  NSLog(@"%f %f", coord.latitude, coord.longitude);
}

原始邮寄

您可能错过了两段代码。 在头文件中采用GMSMapViewDelegate:

@interface Map : UIViewController <GMSMapViewDelegate>

您还需要在viewDidLoad中设置委托:

self.mapView.delegate = self;

现在这应该为你解雇:

- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate
{
    NSLog(@"You tapped at %f,%f", coordinate.latitude, coordinate.longitude);
}

答案 1 :(得分:2)

如果您只想获得标记的位置,则有一个位置属性

CLLocationCoordinate2D coord = marker.position;

调用此委托方法时

- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate

它用于屏幕点击,没有标记或覆盖我的expierience。

GMSOverlay有点不同,因为它是GMSMarker的超类。您只需将GMSOverlay子类化为自定义叠加层并添加位置属性。当您创建叠加层时,例如在didTapAtCoordinate中,您可以在那里指定位置(GPS坐标)。

答案 2 :(得分:1)

您可以设置圈子不可点击(默认行为),并使用.col-xs-6:nth-child(odd) { clear: both; } 代表捕获地图上的所有点击。

然后,当触发此事件时,您可以遍历所有圈子,以检查用户是否在其中一个圈子内部或外部进行了点击。

答案 3 :(得分:1)

  

self.mapview.settings.consumesGesturesInView = NO;

在viewdidload中或分配后添加此行。

然后实现此委托方法。

- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate
{
    NSLog(@"%g",coordinate);
}


- (void)mapView:(GMSMapView *)mapView didTapOverlay:(GMSOverlay *)overlay
{

    GMSCircle *circle=(GMSCircle *)overlay;
    CLLocationCoordinate2D touchCoOrdinate= circle.position;
    NSLog(@"%g",touchCoOrdinate);
}

答案 4 :(得分:0)

因此,您无法触发didTapAtCoordinateMethod以进行重叠点按。但是我确实找到了一个稍微脏的解决方法。

使用叠加来绘制折线,我们需要一种方法来识别折线的位置。因此,在绘制折线时,我们可以像这样构建它们。

    //draw line
    GMSPolyline *polyline = [GMSPolyline polylineWithPath:path];
    polyline.strokeColor = [UIColor purpleColor];
    polyline.tappable = TRUE;
    polyline.map = self.googleMapView;
    polyline.title = routestring;

其中routestring是来自

的构建字符串
routestring = [NSString stringWithFormat:@"%@/%@/%@",lat,lng,[annnotationobject objectForKey:@"linkId"]];

lat和lng是我们坐标的字符串值。最后一部分是折线的ID。

routestring存储坐标和由&#39; /&#39;分隔的ID。这样我们就可以使用string的组件路径来查找它们了。这将分配给折线标题。

现在点击叠加层时:

-(void)mapView:(GMSMapView *)mapView didTapOverlay:(GMSOverlay *)overlay{

NSString *path = overlay.title;

//Finding componentpaths of string
NSArray *pathparts = [path pathComponents];
NSString *lat = [pathparts objectAtIndex:0];
NSString *lng = [pathparts objectAtIndex:1];
NSString *linkID = [pathparts objectAtIndex:2];

//Here we are building a marker to place near the users tap location on the polyline.
GMSMarker *marker = [GMSMarker markerWithPosition:CLLocationCoordinate2DMake([lat doubleValue],[lng doubleValue])];
marker.title = overlay.title;
marker.snippet = @"ROUTE DATA";
marker.map = self.googleMapView;

//This will popup a marker window
[self.googleMapView setSelectedMarker:marker];

}

我们可以使用我们构建的字符串的组件路径(由&#34; /&#34;分隔)来获取折线的纬度和经度坐标。然后为覆盖项目上的弹出信息指定标记。

答案 5 :(得分:0)

您可以继承UITapGestureRecognizer并覆盖其touchesEnded以检索触摸点,而不是使用GMSMapView的coordinateForPoint检索坐标。

将UITapGestureRecognizer子类化并添加到mapView:

self.touchTap = [[TouchGestureRecognizer alloc] initWithTarget:self action:@selector(tapTouchTap)];
self.touchTap.mapView = self.mapView;
[self.view addGestureRecognizer:self.touchTap];

TouchDownGestureRecognizer.h:

#import <UIKit/UIKit.h>    

@interface TouchGestureRecognizer : UITapGestureRecognizer
@property  GMSMapView       *mapView;
@end

TouchDownGestureRecognizer.m:

#import "TouchGestureRecognizer.h"
#import <UIKit/UIGestureRecognizerSubclass.h>

@implementation TouchGestureRecognizer

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
  [super touchesEnded:touches withEvent:event];

  UITouch *touch = touches.allObjects[0];
  CGPoint point = [touch locationInView:self.mapView];
  CLLocationCoordinate2D coord = [self.mapView.projection coordinateForPoint:point];
  NSLog(@"%f %f", coord.latitude, coord.longitude);
}

@end