Android Google Maps API V2缩放到当前位置


74

我试图弄乱Maps API V2以使其更加熟悉,并且试图以用户的当前位置为中心启动地图。使用该map.setMyLocationEnabled(true);语句,我可以在地图上显示我的当前位置。这还将按钮添加到将地图居中于当前位置的UI中。

我想模拟代码中的按钮按下。我熟悉LocationManagerLocationListener类,并意识到使用它们是一个可行的选择,但是集中和放大用户位置的功能似乎已经通过按钮内置了。

如果API具有显示用户当前位置的方法,那么肯定有比使用LocationManager/LocationListener类更简单的以位置为中心的方法,对吗?


这里的重点是获取当前位置的地理坐标。您可以使用GPS库来获取。一旦有了地理坐标,它就变得微不足道了。有关更多详细信息,请参见以下内容:stackoverflow.com/questions/17519198/…–
user846316

Answers:


111

试试下面的编码:

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();

Location location = locationManager.getLastKnownLocation(locationManager.getBestProvider(criteria, false));
if (location != null)
{
    map.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(location.getLatitude(), location.getLongitude()), 13));

    CameraPosition cameraPosition = new CameraPosition.Builder()
        .target(new LatLng(location.getLatitude(), location.getLongitude()))      // Sets the center of the map to location user
        .zoom(17)                   // Sets the zoom
        .bearing(90)                // Sets the orientation of the camera to east
        .tilt(40)                   // Sets the tilt of the camera to 30 degrees
        .build();                   // Creates a CameraPosition from the builder
    map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));       
}

1
如果位置== null,该怎么办。.请帮忙
jyomin 2014年

@jyomin在这里查看有关如何获取用户位置的答案。它使用上述方法并带有一些故障保护功能,以检查用户的下一个最佳位置。stackoverflow.com/a/14511032/845038可以通过检查下一个最佳位置来补救获取null的问题。
DMCApps

1
这个解决方案很简单,并且可以正常工作。谢谢。
Enkk 2015年

这在android 4.2.1上不适合我,但在android 5上的nexus 7平板电脑上却可以使用。
farid bekran

The Google Play services location APIs are preferred over the Android framework location APIs (android.location) as a way of adding location awareness to your app.这种方法是旧的。请检查developer.android.com/training/location/index.html
Gokhan Arik

45

实例化地图对象(从片段中)后,添加以下内容-

private void centerMapOnMyLocation() {

    map.setMyLocationEnabled(true);

    location = map.getMyLocation();

    if (location != null) {
        myLocation = new LatLng(location.getLatitude(),
                location.getLongitude());
    }
    map.animateCamera(CameraUpdateFactory.newLatLngZoom(myLocation,
            Constants.MAP_ZOOM));
}

如果您需要任何指导,请问一下,但它应该是自欺欺人的-只需为默认位置实例化myLocation对象即可。


1
我有同样的问题,但是当我尝试使用map.getMyLocation()时,它警告我不赞成使用此方法。现在正确的方法是什么?
帕姆(Pam),

15
“ getMyLocation()已过时。请改用LocationClient。LocationClient提供了改进的位置查找和电量使用方式,并由“我的位置”蓝色圆点使用。有关示例示例代码,请参见示例应用程序文件夹中的MyLocationDemoActivity或Location Developer。指南。” (摘自android开发者网站)下次如果不赞成使用某些东西,只需阅读API,即可对其进行替换
crazyPixel 2013年

5
LocationClient已被标记为过时。您必须改用LocationServices
Lars Nielsen

我猜Constants.MAP_ZOOM应该是我们定义的缩放级别?
AgentKnopf

@Zainodis你猜对了。作为经验法则,每当我编写依赖于某些先前数据或应获取的数据的内容时,我都会将其初始化为某个默认值。
crazyPixel 2014年

18
youmap.animateCamera(CameraUpdateFactory.newLatLngZoom(currentlocation, 16));

16是缩放级别


1
但是,如何在不使用LocationManager和LocationListener的情况下获取currentLocation?还是不可能?
user139260 2013年

据我所知,这是不可能的。我建议您不要使用位置管理器。用户定位客户端,准确性高,电池功耗低,易于实现。由Google新推出的developer.android.com/google/play-services/location.html
SHASHIDHAR MANCHUKONDA 2013年

1
位置位置= map.getMyLocation(); 地图是GoogleMap对象
-Venkat

1
这个解决方案简单而迷人
Satheesh

而不是16,你可以用14.0f
丹麦夏尔马

16
    mMap.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() {
        @Override
        public void onMyLocationChange(Location location) {

                CameraUpdate center=CameraUpdateFactory.newLatLng(new LatLng(location.getLatitude(), location.getLongitude()));
                CameraUpdate zoom=CameraUpdateFactory.zoomTo(11);
                mMap.moveCamera(center);
                mMap.animateCamera(zoom);

        }
    });

2
不幸的是,现在不赞成使用此方法:(
Antonio

1
而且,如果您滚动离开您的位置,则几秒钟后,您将跳回到当前位置,因为您的位置刚刚更新。
Jeffrey Liu

10

试试这个代码:

private GoogleMap mMap;


LocationManager locationManager;


private static final String TAG = "";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);
    // Obtain the SupportMapFragment and get notified when the map is ready to be used.
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(map);
    mapFragment.getMapAsync(this);

    arrayPoints = new ArrayList<LatLng>();
}

@Override
public void onMapReady(GoogleMap googleMap) {


    mMap = googleMap;


    mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);


    LatLng myPosition;


    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling
        //    ActivityCompat#requestPermissions
        // here to request the missing permissions, and then overriding
        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
        //                                          int[] grantResults)
        // to handle the case where the user grants the permission. See the documentation
        // for ActivityCompat#requestPermissions for more details.
        return;
    }
    googleMap.setMyLocationEnabled(true);
    LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    String provider = locationManager.getBestProvider(criteria, true);
    Location location = locationManager.getLastKnownLocation(provider);


    if (location != null) {
        double latitude = location.getLatitude();
        double longitude = location.getLongitude();
        LatLng latLng = new LatLng(latitude, longitude);
        myPosition = new LatLng(latitude, longitude);


        LatLng coordinate = new LatLng(latitude, longitude);
        CameraUpdate yourLocation = CameraUpdateFactory.newLatLngZoom(coordinate, 19);
        mMap.animateCamera(yourLocation);
    }
}

}

不要忘记在AndroidManifest.xml上添加权限。

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

1
欢迎使用Stack Overflow!尽管这段代码可以回答这个问题,但最好包含对问题所在以及代码如何解决给定问题的描述。对于未来,这里是一些信息,如何破解上堆栈溢出真棒答案:stackoverflow.com/help/how-to-answer
dirtydanee

4
private void setUpMapIfNeeded(){
    if (mMap == null){
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();//invoke of map fragment by id from main xml file

     if (mMap != null) {
         mMap.setMyLocationEnabled(true);//Makes the users current location visible by displaying a blue dot.

         LocationManager lm=(LocationManager)getSystemService(LOCATION_SERVICE);//use of location services by firstly defining location manager.
         String provider=lm.getBestProvider(new Criteria(), true);

         if(provider==null){
             onProviderDisabled(provider);
              }
         Location loc=lm.getLastKnownLocation(provider);


         if (loc!=null){
             onLocationChanged(loc);
      }
         }
     }
}

    // Initialize map options. For example:
    // mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);

@Override
public void onLocationChanged(Location location) {

   LatLng latlng=new LatLng(location.getLatitude(),location.getLongitude());// This methods gets the users current longitude and latitude.

    mMap.moveCamera(CameraUpdateFactory.newLatLng(latlng));//Moves the camera to users current longitude and latitude
    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latlng,(float) 14.6));//Animates camera and zooms to preferred state on the user's current location.
}

    // TODO Auto-generated method stub


请添加一些有关您的代码功能以及其如何回答问题的解释,并正确设置其格式。在将代码复制到SO之前,请将制表符转换为空格,因为制表符通常无法按预期方式呈现。
Adi Inbar 2014年

上面的解决方案加载了地图片段,并使用所需的缩放级别显示了用户当前位置的中心位置,在这种情况下,我的位置是(14.6)@AdiInbar
imm3000

请在答案中包含解释,而不要在评论中做出回应,并格式化代码。(仅供参考,我不是出于个人利益提出要求。我在“低质量帖子”审核队列中遇到了您的答案,并建议您进行改进,以避免进一步投票和删除投票。)
Adi Inbar 2014年

3

这是在里面做的方法 ViewModel和中进行操作的方法FusedLocationProviderClient,在Kotlin中进行编码

locationClient.lastLocation.addOnSuccessListener { location: Location? ->
            location?.let {
                val position = CameraPosition.Builder()
                        .target(LatLng(it.latitude, it.longitude))
                        .zoom(15.0f)
                        .build()
                map.animateCamera(CameraUpdateFactory.newCameraPosition(position))
            }
        }

这是明智的吗?链接多个项目,例如locationClient.lastLocation.addOnSuccessListener{}
Ssenyonjo

2

这正在使用Google Map V2的当前位置进行缩放

 double lat= location.getLatitude();
 double lng = location.getLongitude();
 LatLng ll = new LatLng(lat, lng);
 googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(ll, 20));

3
locationCan not resolute symbol 'location'
引发

问问如何获取当前位置坐标,答案在这里:stackoverflow.com/a/17519248/846316
user846316

2

看一下这个:

    fun requestMyGpsLocation(context: Context, callback: (location: Location) -> Unit) {
        val request = LocationRequest()
        //        request.interval = 10000
        //        request.fastestInterval = 5000
        request.numUpdates = 1
        request.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
        val client = LocationServices.getFusedLocationProviderClient(context)

        val permission = ContextCompat.checkSelfPermission(context,
            Manifest.permission.ACCESS_FINE_LOCATION )
        if (permission == PackageManager.PERMISSION_GRANTED) {
            client.requestLocationUpdates(request, object : LocationCallback() {
                override fun onLocationResult(locationResult: LocationResult?) {
                val location = locationResult?.lastLocation
                if (location != null)
                    callback.invoke(location)
            }
         }, null)
       }
     }

    fun zoomOnMe() {
        requestMyGpsLocation(this) { location ->
            mMap?.animateCamera(CameraUpdateFactory.newLatLngZoom(
                LatLng(location.latitude,location.longitude ), 13F ))
        }
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.