Raj*_*epe 7 google-maps ios google-polyline google-maps-sdk-ios
我已经调用了下面的方法来绘制标记之间的虚线折线.在执行时,它表明只绘制实线.你能告诉我如何在Google Map上绘制虚线吗?

- (void) createDashedLine:(CLLocationCoordinate2D )thisPoint:(CLLocationCoordinate2D )nextPoint:
(UIColor *)colour
{
NSLog(@"next pt latitude %ff" , nextPoint.latitude);
NSLog(@"next pt longitude %ff" , nextPoint.longitude);
NSLog(@"this pt laatitude %ff" , thisPoint.latitude);
NSLog(@"this pt longitude %ff" , thisPoint.longitude);
double difLat = nextPoint.latitude - thisPoint.latitude;
double difLng = nextPoint.longitude - thisPoint.longitude;
double scale = camera.zoom * 2;
double divLat = difLat / scale;
double divLng = difLng / scale;
CLLocationCoordinate2D tmpOrig= thisPoint;
GMSMutablePath *singleLinePath = [GMSMutablePath path];
for(int i = 0 ; i < scale ; i ++){
CLLocationCoordinate2D tmpOri = tmpOrig;
if(i > 0){
tmpOri = CLLocationCoordinate2DMake(tmpOrig.latitude + (divLat * 0.25f), tmpOrig.longitude + (divLng * 0.25f));
}
[singleLinePath addCoordinate:tmpOri];
[singleLinePath addCoordinate:
CLLocationCoordinate2DMake(tmpOrig.latitude + (divLat * 1.0f),
tmpOrig.longitude + (divLng * 1.0f))];
tmpOri = CLLocationCoordinate2DMake(tmpOrig.latitude + (divLat * 1.0f), tmpOrig.longitude + (divLng * 1.0f));
}
GMSPolyline *polyline ;
polyline = [GMSPolyline polylineWithPath:singleLinePath];
polyline.geodesic = NO;
polyline.strokeWidth = 5.f;
polyline.strokeColor = colour;
polyline.map = mapView_;
//Setup line style and draw
_lengths = @[@([singleLinePath lengthOfKind:kGMSLengthGeodesic] / 50)];
_polys = @[polyline];
[self setupStyleWithColour:colour];
[self tick];
}
- (void)tick {
//Create steps for polyline(dotted polylines)
for (GMSPolyline *poly in _polys) {
poly.spans =
GMSStyleSpans(poly.path, _styles, _lengths, kGMSLengthGeodesic, _pos);
}
_pos -= _step;
}
-(void)setupStyleWithColour:(UIColor *)color{
GMSStrokeStyle *gradColor = [GMSStrokeStyle gradientFromColor:color toColor:color];
_styles = @[gradColor,[GMSStrokeStyle solidColor:[UIColor colorWithWhite:0 alpha:0]],];
_step = 50000;
}
- (void)addMarkers
{
// NSMutableArray *polys = [NSMutableArray array];
if([CarArray count] > 0){
GMSMutablePath *path = [GMSMutablePath path];
GMSMutablePath *currentPath = [GMSMutablePath path];
GMSPolyline *polyline ;
GMSPolyline *polylineC ;
GMSMarker *marker;
for (int i = 0; i < [CarArray count]; i++) {
CheckPoints *cp = [CarArray objectAtIndex:i];
CLLocationCoordinate2D position = CLLocationCoordinate2DMake(cp.getLatitude , cp.getLongitude);
marker = [GMSMarker markerWithPosition:position];
// GMSMarker *marker = [[GMSMarker alloc] init];
marker.position = position;
NSLog( @"%d", cp.getState );
NSLog( @"%f", cp.getLatitude);
NSLog( @"%f", cp.getLongitude );
NSLog( @"%@", cp.getDesp );
marker.title = cp.getDesp;
marker.zIndex = 1;
NSString *tmpLat = [[NSString alloc] initWithFormat:@"%f", position.latitude];
NSString *tmpLong = [[NSString alloc] initWithFormat:@"%f", position.longitude];
marker.snippet = [NSString stringWithFormat:@"%@ %@", tmpLat,tmpLong];
UIColor *color;
if (cp.getState ==0) {
color = [UIColor greenColor];
} else {
color = [UIColor redColor];
}
if([CarArray count] > 2){
[path addLatitude:cp.getLatitude longitude:cp.getLongitude];
if(i > [CarArray indexOfObject:CarArray.lastObject] -2){
[currentPath addLatitude:cp.getLatitude longitude:cp.getLongitude];
}
}else{
[currentPath addLatitude:cp.getLatitude longitude:cp.getLongitude];
}
marker.icon = [GMSMarker markerImageWithColor:color];
marker.map = mapView_;
// mapView_.selectedMarker = marker;
}
if([CarArray count] > 2) {
polyline = [GMSPolyline polylineWithPath:currentPath];
polyline.geodesic = YES;
polyline.strokeWidth = 5.f;
polyline.strokeColor = [UIColor greenColor];
polyline.map = mapView_;
_lengths = @[@([currentPath lengthOfKind:kGMSLengthGeodesic] / 50)];
_polys = @[polyline];
[self setupStyleWithColour:[UIColor greenColor]];
[self tick];
for(int i = 0 ; i < [currentPath count] -1 ; i++){
CLLocationCoordinate2D thisPoint = [currentPath coordinateAtIndex:i];
CLLocationCoordinate2D nextPoint = [currentPath coordinateAtIndex:i+1];
NSLog(@"next pt s latitude %ff" , nextPoint.latitude);
NSLog(@"next pt s longitude %ff" , nextPoint.longitude);
NSLog(@"this pt s latitude %ff" , thisPoint.latitude);
NSLog(@"this pt s longitude %ff" , thisPoint.longitude);
[self drawArrowLines:mapView_ :thisPoint :nextPoint :[UIColor greenColor]:i+1: false];
[self createDashedLine: thisPoint :nextPoint :[UIColor greenColor]];
}
GMSMutablePath *path2 = [GMSMutablePath path];
GMSMutablePath *path3 = [GMSMutablePath path];
path2 = path.mutableCopy;
[path2 removeLastCoordinate];
path3 = path2;
polylineC = [GMSPolyline polylineWithPath:path3];
polylineC.geodesic = YES;
polylineC.strokeWidth = 5.f;
polylineC.map = mapView_;
_lengths = @[@([currentPath lengthOfKind:kGMSLengthGeodesic] / 50)];
_polys = @[polylineC];
[self setupStyleWithColour:[UIColor greenColor]];
[self tick];
// polylineC.strokeColor = [UIColor redColor];
for(int i = 0 ; i < [path count] -1 ; i++){
CLLocationCoordinate2D thisPoint = [path coordinateAtIndex:i];
CLLocationCoordinate2D nextPoint = [path coordinateAtIndex:i+1];
NSLog(@"next pt s latitude %ff" , nextPoint.latitude);
NSLog(@"next pt s longitude %ff" , nextPoint.longitude);
NSLog(@"this pt s latitude %ff" , thisPoint.latitude);
NSLog(@"this pt s longitude %ff" , thisPoint.longitude);
[self drawArrowLines:mapView_ :thisPoint :nextPoint :[UIColor redColor]: i+1 : true];
[self createDashedLine: thisPoint :nextPoint :[UIColor redColor]];
}
}else{
polyline = [GMSPolyline polylineWithPath:currentPath];
polyline.geodesic = NO;
polyline.strokeWidth = 5.f;
polyline.strokeColor = [UIColor greenColor];
polyline.map = mapView_;
_lengths = @[@([currentPath lengthOfKind:kGMSLengthGeodesic] / 50)];
_polys = @[polyline];
[self setupStyleWithColour:[UIColor greenColor]];
[self tick];
for(int i = 0 ; i < [currentPath count] -1 ; i++){
CLLocationCoordinate2D thisPoint = [currentPath coordinateAtIndex:i];
CLLocationCoordinate2D nextPoint = [currentPath coordinateAtIndex:i+1];
NSLog(@"next pt s latitude %ff" , nextPoint.latitude);
NSLog(@"next pt s longitude %ff" , nextPoint.longitude);
NSLog(@"this pt s latitude %ff" , thisPoint.latitude);
NSLog(@"this pt s longitude %ff" , thisPoint.longitude);
[self drawArrowLines:mapView_ :thisPoint :nextPoint :[UIColor greenColor] : i+1 : false];
[self createDashedLine: thisPoint :nextPoint :[UIColor greenColor]];
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 33
在谷歌地图中创建虚线就像这样简单.这定义了具有绿色和透明交替图案的折线.
GMSMutablePath *path = [GMSMutablePath path];
for (...) {
// add coordinate to your path
[path addCoordinate:CLLocationCoordinate2DMake(latitude, longitude)];
}
GMSPolyline *polyline = [GMSPolyline polylineWithPath:path];
polyline.map = self.mapView;
polyline.strokeWidth = 3.0;
NSArray *styles = @[[GMSStrokeStyle solidColor:[UIColor greenColor]],
[GMSStrokeStyle solidColor:[UIColor clearColor]]];
NSArray *lengths = @[@25, @20];
polyline.spans = GMSStyleSpans(polyline.path, styles, lengths, kGMSLengthRhumb);
Run Code Online (Sandbox Code Playgroud)
如果你想要一条虚线,那么你可以调整长度
NSArray *lengths = @[@10, @10];
Run Code Online (Sandbox Code Playgroud)
小智 17
每个需要线段长度独立于地图缩放级别的人,这是我在swift中的解决方案.我创建折线的方式与此答案相同,然后就在func mapView(mapView: GMSMapView, didChangeCameraPosition position: GMSCameraPosition)我之后调用此方法:
func updateLine() {
let styles = [
GMSStrokeStyle.solidColor(UIColor.blackColor()),
GMSStrokeStyle.solidColor(UIColor.clearColor())
]
let scale = 1.0 / mapView.projection.pointsForMeters(1, atCoordinate: mapView.camera.target)
line.spans = GMSStyleSpans(line.path!, styles, [15.0 * scale, 10.0 * scale], kGMSLengthRhumb)
}
Run Code Online (Sandbox Code Playgroud)
15.0并且10.0是段的长度.
雨燕4.0及以上版本的米哈伊尔·瓦西里耶夫的答案。
func updateLine() {
let styles: [GMSStrokeStyle] = [.solidColor(.red), .solidColor(.clear)]
let scale = 1.0 / mapView.projection.points(forMeters: 1, at: mapView.camera.target)
let solidLine = NSNumber(value: 15.0 * Float(scale))
let gap = NSNumber(value: 10.0 * Float(scale))
line.spans = GMSStyleSpans(line.path!, styles, [solidLine, gap], GMSLengthKind.rhumb)
}
Run Code Online (Sandbox Code Playgroud)
是的,对于虚线,您需要配置一些东西。
首先定义几个变量
NSArray *_styles;
NSArray *_lengths;
NSArray *_polys;
double _pos, _step;
Run Code Online (Sandbox Code Playgroud)
函数中的定义,在函数之外,而for..loop不是像您所做的那样在函数内部定义
- (void) createDashedLine:(CLLocationCoordinate2D )thisPoint:(CLLocationCoordinate2D )nextPoint:
(UIColor *)colour
{
double difLat = nextPoint.latitude - thisPoint.latitude;
double difLng = nextPoint.longitude - thisPoint.longitude;
double scale = camera.zoom * 2;
double divLat = difLat / scale;
double divLng = difLng / scale;
CLLocationCoordinate2D tmpOrig= thisPoint;
GMSMutablePath *singleLinePath = [GMSMutablePath path];
for(int i = 0 ; i < scale ; i ++){
CLLocationCoordinate2D tmpOri = tmpOrig;
if(i > 0){
tmpOri = CLLocationCoordinate2DMake(tmpOrig.latitude + (divLat * 0.25f),
tmpOrig.longitude + (divLng * 0.25f));
}
[singleLinePath addCoordinate:tmpOri];
[singleLinePath addCoordinate:
CLLocationCoordinate2DMake(tmpOrig.latitude + (divLat * 1.0f),
tmpOrig.longitude + (divLng * 1.0f))];
tmpOri = CLLocationCoordinate2DMake(tmpOrig.latitude + (divLat * 1.0f),
tmpOrig.longitude + (divLng * 1.0f));
}
GMSPolyline *polyline ;
polyline = [GMSPolyline polylineWithPath:singleLinePath];
polyline.geodesic = NO;
polyline.strokeWidth = 5.f;
polyline.strokeColor = colour;
polyline.map = mapView_;
//Setup line style and draw
_lengths = @[@([singleLinePath lengthOfKind:kGMSLengthGeodesic] / 100)];
_polys = @[polyline];
[self setupStyleWithColour:colour];
[self tick];
}
- (void)tick {
//Create steps for polyline(dotted polylines)
for (GMSPolyline *poly in _polys) {
poly.spans =
GMSStyleSpans(poly.path, _styles, _lengths, kGMSLengthGeodesic, _pos);
}
_pos -= _step;
}
-(void)setupStyleWithColour:(UIColor *)color{
GMSStrokeStyle *gradColor = [GMSStrokeStyle gradientFromColor:color toColor:color];
_styles = @[
gradColor,
[GMSStrokeStyle solidColor:[UIColor colorWithWhite:0 alpha:0]],
];
_step = 50000;
}
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你。干杯。
| 归档时间: |
|
| 查看次数: |
5740 次 |
| 最近记录: |