日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

tablueau地图标记圆形_高德地图实现自定义小蓝点 自定义点标记 绘制多边形/圆形区域 根据地图的移动显示或者隐藏自定义点标记的相关实现...

發(fā)布時間:2025/3/15 编程问答 15 豆豆

最近項目中有需要應(yīng)用到高德地圖的模塊,在參考別的app地圖相關(guān)模塊實現(xiàn)過程中,自己產(chǎn)生了一些想法。首先說明要實現(xiàn)的功能需求。類似支付寶app內(nèi)的跑腿功能,在全市的所有商鋪,電梯廣告等任意地點發(fā)布任務(wù),參與者要根據(jù)地圖上的標(biāo)記接取任務(wù)后到達(dá)指定地點,完成任務(wù),獲取報酬。

首先我想到的是共享單車app的找附近的車功能。

4011528126383_.pic_hd.jpg

分析其實現(xiàn)原理應(yīng)該是獲取用戶當(dāng)前坐標(biāo),然后將坐標(biāo)發(fā)送至服務(wù)器,服務(wù)器計算這個用戶周圍1公里范圍內(nèi)空閑的單車,然后將坐標(biāo)繪制在地圖上,最后導(dǎo)航引導(dǎo)用戶找到該車。但是共享單車數(shù)量龐大,一個城市或許會有幾百萬輛或者幾千萬輛,但是我們所做的體量比較小,或許有另外的方式實現(xiàn)此功能。

使用高德地圖SDK,具體集成方法和相關(guān)配置請參考官方文檔,這里不做介紹。首先我們需要1000個模擬數(shù)據(jù) 沈陽市的經(jīng)緯度范圍是 東經(jīng)122° 25′ --- 123° 48′, 北緯41°12′ --- 42° 17′

我們根據(jù)這個范圍隨機(jī)生成1萬個坐標(biāo),然后先在地圖上自定義視圖標(biāo)記出來,但是不要顯示,這里先全部顯示看一下 ps:此圖手抖多打個0,是1萬個坐標(biāo)點...

3991528126362_.pic_hd.jpg

然后在當(dāng)前地圖的中心點繪制一個半徑為3km的圓形, 在地圖移動的時候,這個圓心也隨之變化,這個時候遍歷這些數(shù)據(jù),如果這個數(shù)據(jù)的坐標(biāo)在圓的范圍內(nèi)那么就顯示,反之就隱藏。

4031528126386_.pic_hd.jpg

這樣做的好處是只需要從服務(wù)器拿取一次數(shù)據(jù),數(shù)據(jù)量小的時候也很流暢,減輕了服務(wù)器的運算,但是弊端就是數(shù)據(jù)量龐大的時候會非常占用手機(jī)的內(nèi)存,這也是我最開始沒有考慮到的一點,

屏幕快照 2018-06-05 上午12.01.55.png

為了穩(wěn)定不建議這樣處理,除非數(shù)據(jù)量小的時候,我用iphone6測試 數(shù)據(jù)量達(dá)到500就開始卡頓,用iphoneX 數(shù)據(jù)量1000還可以接受,為了向下兼容不建議這種做法,還是老實向服務(wù)器請求數(shù)據(jù)比較好些。寫這個文章主要還是想多了解下高德的API,加深下理解,以后再使用高德SDK的時候更加熟練。如果哪位大神看到這篇文章有好的優(yōu)化方案請賜教,十分感謝,如果感覺垃圾,求輕噴。下面就開始代碼部分

創(chuàng)建地圖視圖

//初始化地圖

_mapView = [[MAMapView alloc] initWithFrame:self.view.bounds];

_mapView.userTrackingMode = MAUserTrackingModeFollow;

//如果您需要進(jìn)入地圖就顯示定位小藍(lán)點,則需要下面兩行代碼

_mapView.showsUserLocation = YES;

_mapView.showsScale = NO;

_mapView.zoomLevel = 13;

_mapView.showTraffic = YES;

_mapView.showsCompass = NO;

_mapView.delegate = self;

//_mapView.desiredAccuracy = 100;

///把地圖添加至view

[self.view addSubview:_mapView];

//自定義定位小藍(lán)點

//初始化 MAUserLocationRepresentation 對象

MAUserLocationRepresentation *r = [[MAUserLocationRepresentation alloc] init];

r.showsAccuracyRing = NO;///精度圈是否顯示,默認(rèn)YES

r.showsHeadingIndicator = YES;///是否顯示方向指示 (MAUserTrackingModeFollowWithHeading模式開啟)。默認(rèn)為YES

//r.fillColor = [UIColor redColor];///精度圈 填充顏色, 默認(rèn) kAccuracyCircleDefaultColor

r.image = [UIImage imageNamed:@"endPoint"];

//定位圖標(biāo), 與藍(lán)色原點互斥

// [_mapView updateUserLocationRepresentation:r];`

CLLocationCoordinate2D coor = _mapView.centerCoordinate;

//以初始地圖中心點為圓心 繪制半徑為3km米的圓

_circleView = [MACircle circleWithCenterCoordinate:coor radius:3000];

[self.mapView addOverlay:_circleView];

獲取模擬數(shù)據(jù)

//沈陽位于東經(jīng)122゜25'---123゜48’,北緯41゜12’,---42゜17’,之間

self.annotations = [NSMutableArray array];

for (int i = 0; i < 1000; i ++) {

CGFloat ls = [self randomBetween:41 AndBigNum:42 AndPrecision:1000000];

CGFloat lw = [self randomBetween:123 AndBigNum:124 AndPrecision:1000000];

MAPointAnnotation *a1 = [[MAPointAnnotation alloc] init];

a1.coordinate = (CLLocationCoordinate2D){ls,lw};

a1.title = [NSString stringWithFormat:@"anno: %d", i];

a1.subtitle = [NSString stringWithFormat:@"自定義點標(biāo)記內(nèi)容: %d",I];

[self.annotations addObject:a1];

}

獲取指定范圍內(nèi)坐標(biāo)點的函數(shù)

- (float)randomBetween:(float)smallNum AndBigNum:(float)bigNum AndPrecision:(NSInteger)precision{

//求兩數(shù)之間的差值

float subtraction = bigNum - smallNum;

//取絕對值

subtraction = ABS(subtraction);

//乘以精度的位數(shù)

subtraction *= precision;

//在差值間隨機(jī)

float randomNumber = arc4random() % ((int) subtraction + 1);

//隨機(jī)的結(jié)果除以精度的位數(shù)

randomNumber /= precision;

//將隨機(jī)的值加到較小的值上

float result = MIN(smallNum, bigNum) + randomNumber;

//返回結(jié)果

return result;

}

#pragma mark - MAMapViewDelegate

//繪制區(qū)域圖形的相關(guān)屬性配置 可以是矩形 多邊形 圓形

- (MAOverlayRenderer *)mapView:(MAMapView *)mapView rendererForOverlay:(id )overlay

{

if ([overlay isKindOfClass:[MACircle class]]) {

MACircleRenderer * polygonRenderer = [[MACircleRenderer alloc]initWithCircle:overlay];

polygonRenderer.lineWidth = 1.f;

// polygonRenderer.strokeColor = [UIColor yellowColor];

polygonRenderer.fillColor = [UIColor colorWithRed:0.73 green:0.73 blue:0.73 alpha:0.2];

return polygonRenderer;

}

return nil;

}

/*!

@brief 根據(jù)anntation生成對應(yīng)的View

@param mapView 地圖View

@param annotation 指定的標(biāo)注

@return 生成的標(biāo)注View

*/

- (MAAnnotationView*)mapView:(MAMapView *)mapView viewForAnnotation:(id )annotation {

//定位藍(lán)點 如果不在此判斷 自身的定位點樣式會被其他自定義的樣式修改

if ([annotation isKindOfClass:[MAUserLocation class]]) {

return nil;

}

if ([annotation isKindOfClass:[MAPointAnnotation class]]){

static NSString *reuseIndetifier = @"annotationReuseIndetifier";

MAAnnotationView *annotationView = (MAAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:reuseIndetifier];

if (annotationView == nil){

annotationView = [[MAAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseIndetifier];

}

annotationView.image = [UIImage imageNamed:@"qwuh"];

annotationView.canShowCallout = YES;

annotationView.draggable = YES;

annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

//設(shè)置中心點偏移,使得標(biāo)注底部中間點成為經(jīng)緯度對應(yīng)點

annotationView.centerOffset = CGPointMake(0, -18);

return annotationView;

}

return nil;

}

//點擊屏幕獲取經(jīng)緯度 (手動獲取模擬數(shù)據(jù)使用)

- (void)mapView:(MAMapView *)mapView didSingleTappedAtCoordinate:(CLLocationCoordinate2D)coordinate{

NSLog(@"%f ---- %f",coordinate.latitude,coordinate.longitude);

//41.737987 ---- 123.422523

//41.765668 ---- 123.434932

//41.794761 ---- 123.409902

}

/**

* @brief 地圖區(qū)域改變過程中會調(diào)用此接口 since 4.6.0

* @param mapView 地圖View

*/

- (void)mapViewRegionChanged:(MAMapView *)mapView{

//移動地圖 根據(jù)新的中心點坐標(biāo) 改變所繪制圖形的位置

[self.circleView setCircleWithCenterCoordinate:mapView.centerCoordinate radius:3000];

//遍歷所有的自定義坐標(biāo)點

for (int i = 0; i < self.annotations.count; i ++) {

MAPointAnnotation *a1 = self.annotations[I];

CLLocationCoordinate2D loc1 = a1.coordinate;

// [self.mapView addAnnotation:a1];

if(MACircleContainsCoordinate(loc1, self.circleView.coordinate, 3000)) {

NSLog(@"在區(qū)域內(nèi) 新增自定義坐標(biāo)點");

[self.mapView addAnnotation:a1];

} else {

NSLog(@"不在區(qū)域內(nèi) 移除自定義坐標(biāo)點");

[self.mapView removeAnnotation:a1];

}

}

}

或許會用到的相關(guān)代理方法

/**

* @brief 地圖移動結(jié)束后調(diào)用此接口

* @param mapView 地圖view

* @param wasUserAction 標(biāo)識是否是用戶動作

*/

- (void)mapView:(MAMapView *)mapView mapDidMoveByUser:(BOOL)wasUserAction{

if (wasUserAction) {

//當(dāng)前地圖的中心點,改變該值時,地圖的比例尺級別不會發(fā)生變化

}

}

/**

* @brief 定位失敗后,會調(diào)用此函數(shù)

* @param mapView 地圖View

* @param error 錯誤號,參考CLError.h中定義的錯誤號

*/

- (void)mapView:(MAMapView *)mapView didFailToLocateUserWithError:(NSError *)error{

NSLog(@"定位失敗");

}

/**

* @brief 地圖初始化完成(在此之后,可以進(jìn)行坐標(biāo)計算)

* @param mapView 地圖View

*/

- (void)mapInitComplete:(MAMapView *)mapView{

// NSLog(@"當(dāng)前經(jīng)緯度%lf--%lf",mapView.userLocation.coordinate.latitude,mapView.userLocation.coordinate.longitude);

}

/*!

@brief 當(dāng)mapView新添加annotation views時調(diào)用此接口

@param mapView 地圖View

@param views 新添加的annotation views

*/

- (void)mapView:(MAMapView *)mapView didAddAnnotationViews:(NSArray *)views {

}

/*!

@brief 當(dāng)選中一個annotation views時調(diào)用此接口

@param mapView 地圖View

@param views 選中的annotation views

*/

- (void)mapView:(MAMapView *)mapView didSelectAnnotationView:(MAAnnotationView *)view {

}

/*!

@brief 當(dāng)取消選中一個annotation views時調(diào)用此接口

@param mapView 地圖View

@param views 取消選中的annotation views

*/

- (void)mapView:(MAMapView *)mapView didDeselectAnnotationView:(MAAnnotationView *)view {

}

/*!

@brief 標(biāo)注view的accessory view(必須繼承自UIControl)被點擊時調(diào)用此接口

@param mapView 地圖View

@param annotationView callout所屬的標(biāo)注view

@param control 對應(yīng)的control

*/

- (void)mapView:(MAMapView *)mapView annotationView:(MAAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {

}

https://github.com/ReReReReReRe/GDMapDemo/tree/master/PaiPaiPai

總結(jié)

以上是生活随笔為你收集整理的tablueau地图标记圆形_高德地图实现自定义小蓝点 自定义点标记 绘制多边形/圆形区域 根据地图的移动显示或者隐藏自定义点标记的相关实现...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。