地图选点

检索屏幕中心点周边的特征POI,帮助用户快速、准确的确认自己的位置。
下载源代码
00:00 / 00:12
体验移动端 扫码体验移动端

使用场景

出行类APP的起终点位置的选择以及社交类应用的位置分享。

用到产品

iOS 地图 SDK iOS 定位 SDK

核心类/接口

接口

说明

版本

MAMapView

setCenterCoordinate:animated:

设置地图中心点。

V2.0.0版本起

AMapSearchAPI

AMapReGoecodeSearch:

逆地址编码查询接口。

V3.0.0版本起


AMapPOIAroundSearch:

POI周边查询接口。

V3.0.0版本起

AMapReGeocodeSearchRequest

location

中心点坐标。

V3.0.0版本起


requireExtension

是否返回扩展信息,默认NO。

V3.0.0版本起

AMapPOIAroundSearchRequest

location

中心点坐标。

V3.0.0版本起


radius

查询半径,范围:0-50000,单位:米 [default = 3000] 。

V3.0.0版本起

AMapPOISearchBaseRequest

types

类型,多个类型用“分割 可选值:文本分类、分类代码 。

V3.0.0版本起


requireExtension

是否返回扩展信息,默认NO。

V3.0.0版本起

AMapSearchDelegate

onPOISearchDone:response:

POI查询回调函数。

V3.0.0版本起

核心难点

1、指定所需类型进行相关 POI 的搜索,这个示例中的类型编码,如下:

 

  • 住宅区:120300
  • 学校:141200
  • 楼宇:120200
  • 商场:060111

若您的业务需要搜索其他类型的POI,请参考POI分类表

2、第一次进到页面中,基于定位位置,在定位回调中进行POI搜索和逆地理编码。

- (void)mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation updatingLocation:(BOOL)updatingLocation
{
    if(!updatingLocation)
        return ;

    if (userLocation.location.horizontalAccuracy < 0)
    {
        return ;
    }

    // only the first locate used.
    if (!self.isLocated)
    {
        self.isLocated = YES;

        [self.mapView setCenterCoordinate:CLLocationCoordinate2DMake(userLocation.location.coordinate.latitude, userLocation.location.coordinate.longitude)];

        [self actionSearchAround];

        self.mapView.userTrackingMode = MAUserTrackingModeFollow;
    }
}
func mapView(_ mapView: MAMapView!, didUpdate userLocation: MAUserLocation!, updatingLocation: Bool) {
    if !updatingLocation {
        return
    }
    if userLocation.location.horizontalAccuracy < 0 {
        return
    }
    // only the first locate used.
    if !self.isLocated {
        self.isLocated = true
        self.mapView.userTrackingMode = .follow
        self.mapView.centerCoordinate = userLocation.location.coordinate
        self.actionSearchAround(at: userLocation.location.coordinate)
    }
}

3、拖动地图时,在地图区域改变的回调中进行POI周边搜索。

- (void)mapView:(MAMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
    if (!self.isMapViewRegionChangedFromTableView && self.mapView.userTrackingMode == MAUserTrackingModeNone)
    {
        [self actionSearchAround];
    }
    self.isMapViewRegionChangedFromTableView = NO;
}
func mapView(_ mapView: MAMapView!, regionDidChangeAnimated animated: Bool) {
    if !self.isMapViewRegionChangedFromTableView && self.mapView.userTrackingMode == .none {
        self.actionSearchAround(at: self.mapView.centerCoordinate)
    }
    self.isMapViewRegionChangedFromTableView = false
}

4、通过POI搜索回调和逆地理编码的回调获取数据填充到TableView中。

- (void)onPOISearchDone:(AMapPOISearchBaseRequest *)request response:(AMapPOISearchResponse *)response
{
    if (self.isFromMoreButton == YES)
    {
        self.isFromMoreButton = NO;
    }
    else
    {
        [self.searchPoiArray removeAllObjects];
        [self.moreButton setTitle:@"更多.." forState:UIControlStateNormal];
        self.moreButton.enabled = YES;
        self.moreButton.backgroundColor = [UIColor whiteColor];
    }

    if (response.pois.count == 0)
    {
        NSLog(@"没有数据了");
        [self.moreButton setTitle:@"没有数据了.." forState:UIControlStateNormal];
        self.moreButton.enabled = NO;
        self.moreButton.backgroundColor = [[UIColor grayColor] colorWithAlphaComponent:0.4];

        self.selectedIndexPath = nil;
        [self.tableView reloadData];
        return;
    }

    [response.pois enumerateObjectsUsingBlock:^(AMapPOI *obj, NSUInteger idx, BOOL *stop) {
        [self.searchPoiArray addObject:obj];
    }];

    self.selectedIndexPath = nil;
    [self.tableView reloadData];
}

- (void)onReGeocodeSearchDone:(AMapReGeocodeSearchRequest *)request response:(AMapReGeocodeSearchResponse *)response
{
    if (response.regeocode != nil)
    {
        self.currentRedWaterPosition = response.regeocode.formattedAddress;

        NSIndexPath *reloadIndexPath = [NSIndexPath indexPathForRow:0 inSection:0];
        [self.tableView reloadRowsAtIndexPaths:@[reloadIndexPath] withRowAnimation:UITableViewRowAnimationNone];
    }
}
func onPOISearchDone(_ request: AMapPOISearchBaseRequest!, response: AMapPOISearchResponse!) {

    if isFromMoreButton {
        isFromMoreButton = false
    }
    else {
        self.searchPoiArray.removeAll()
        self.moreButton.setTitle(kMoreButtonTitle, for: UIControlState.normal)
        self.moreButton.isEnabled = true
        self.moreButton.backgroundColor = UIColor.white
    }

    if response.count == 0 {
        self.moreButton.setTitle("没有数据了...", for: UIControlState.normal)
        self.moreButton.isEnabled = false
        self.moreButton.backgroundColor = UIColor.gray
        self.selectedIndexPath = nil

        self.tableView.reloadData()

        return
    }

    self.searchPoiArray.append(contentsOf: response.pois)
    self.selectedIndexPath = nil
    self.tableView.reloadData()
}

func onReGeocodeSearchDone(_ request: AMapReGeocodeSearchRequest!, response: AMapReGeocodeSearchResponse!) {

    if response.regeocode != nil {
        self.currentAddress = response.regeocode.formattedAddress;
        self.tableView.reloadRows(at: [IndexPath(row: 0, section: 0)], with: UITableViewRowAnimation.none)
    }
}
下载源代码
00:00 / 00:12
体验移动端 扫码体验移动端

使用场景

出行类APP的起终点位置的选择以及社交类应用的位置分享。

用到产品

Android 地图 SDK Android 定位 SDK

核心类/接口

接口

说明

版本

Marker

setPosition(LatLng latlng)

设置 marker 的经纬度位置。

V2.0.0版本起

Projection

toScreenLocation(LatLng paramLatLng)

返回一个从地图位置转换来的屏幕位置。

V2.0.0版本起


fromScreenLocation(Point paramPoint)

根据转入的屏幕位置返回一个地图位置(经纬度)。

V2.0.0版本起

AMap.OnCameraChangeListener

onCameraChangeFinish(CameraPosition postion)

在可视范围一系列动作改变完成之后(例如:拖动、缩放)回调此方法。

V2.0.0版本起

RegeocodeQuery

RegeocodeQuery(LatLonPoint point, float radius, java.lang.String latLonType)

构造函数,构造逆地理编码参数对象。

V2.1.0版本起

GeocodeSearch

setOnGeocodeSearchListener(GeocodeSearch.OnGeocodeSearchListener onGeocodeSearchListener)

设置地理编码(正向和逆向)查询监听。

V2.1.0版本起


getFromLocation(RegeocodeQuery regeocodeQuery)

逆地理编码查询。

V2.1.0版本起

GeocodeSearch.OnGeocodeSearchListener

onRegeocodeSearched(RegeocodeResult result, int rCode)

根据给定的经纬度和最大结果数返回逆地理编码的结果列表。

V2.1.0版本起

PoiSearch.Query

Query(java.lang.String query, java.lang.String ctgr, java.lang.String city)

构造函数,构造POI搜索查询参数对象。

V2.1.0版本起


setCityLimit(boolean isLimit)

返回是否严格按照设定城市搜索。

V2.8.0版本起

PoiSearch.SearchBound

SearchBound(LatLonPoint center, int radiusInMeters, boolean isDistanceSort)

构造函数,构造搜索范围。

V2.1.3版本起

PoiSearch

PoiSearch(Context context, PoiSearch.Query query)

根据给定的参数构造一个PoiSearch 的新对象。

V2.1.0版本起


setOnPoiSearchListener(PoiSearch.OnPoiSearchListener listener)

设置查询监听。

V2.1.0版本起


setBound(PoiSearch.SearchBound bnd)

设置查询范围。

V2.1.0版本起


searchPOIAsyn()

POI搜索异步接口。

V2.1.0版本起

PoiSearch.OnPoiSearchListener

onPoiSearched(PoiResult pageResult, int errorCode)

返回POI搜索异步处理的结果。

V2.1.0版本起

核心难点

1、指定所需类型进行相关 POI 的搜索,这个示例中的类型编码,如下:

 

  • 住宅区:120300
  • 学校:141200
  • 楼宇:120200
  • 商场:060111

若您的业务需要搜索其他类型的POI,请参考POI分类表

2、无论如何缩放、移动地图,都将大头针图标钉在地图中心位置。

在移动或者缩放地图的动作结束时,都会进 onCameraChangeFinish 回调中,获取此时的相机坐标作为 Marker 的坐标。

aMap.setOnCameraChangeListener(new AMap.OnCameraChangeListener() {
        @Override
        public void onCameraChange(CameraPosition cameraPosition) {

        }

        @Override
        public void onCameraChangeFinish(CameraPosition cameraPosition) {
            if (!isItemClickAction) {
                locationMarker.setPosition(cameraPosition.target);
            }
        }
    });



返回顶部 示例中心 常见问题 智能客服 公众号
二维码