代码之家  ›  专栏  ›  技术社区  ›  Mystic Developer

如何使用坐标在地图android上查找位置

  •  1
  • Mystic Developer  · 技术社区  · 7 年前

    我正在使用Google Api服务构建Java地图。目前,我的地图接收一个地址,然后在地图上查找并标记该位置。我希望它能够在坐标和找到这些坐标的位置,并标记,但还没有找到任何文件显示我如何这样做的运气。有人能给我指出正确的方向吗?谢谢:)

    这是一张我的地图图片,可以让你看到一些东西 哦! https://imgur.com/a/Aq85U

    我需要它从我的搜索栏中获取纬度/经度,并在地图上定位/标记该区域。这是我的地图应用程序的代码

    package net.androidbootcamp.mymapdemo;
    
    import android.Manifest;
    import android.content.pm.PackageManager;
    import android.location.Address;
    import android.location.Geocoder;
    import android.location.Location;
    import android.location.LocationProvider;
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.support.v4.app.ActivityCompat;
    import android.support.v4.content.ContextCompat;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    import android.view.KeyEvent;
    import android.view.View;
    import android.view.WindowManager;
    import android.view.inputmethod.EditorInfo;
    import android.widget.EditText;
    import android.widget.ImageView;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import com.google.android.gms.location.FusedLocationProviderClient;
    import com.google.android.gms.location.LocationServices;
    import com.google.android.gms.maps.CameraUpdateFactory;
    import com.google.android.gms.maps.GoogleMap;
    import com.google.android.gms.maps.OnMapReadyCallback;
    import com.google.android.gms.maps.SupportMapFragment;
    import com.google.android.gms.maps.model.LatLng;
    import com.google.android.gms.maps.model.Marker;
    import com.google.android.gms.maps.model.MarkerOptions;
    import com.google.android.gms.tasks.OnCompleteListener;
    import com.google.android.gms.tasks.Task;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Locale;
    
    /**
     * Created by Micha on 3/1/2018.
     */
    
    public class MapActivity extends AppCompatActivity implements OnMapReadyCallback {
    
        @Override
        public void onMapReady(GoogleMap googleMap) {
            Toast.makeText(this, "Map is Ready", Toast.LENGTH_SHORT).show();
            Log.d(TAG, "onMapReady: Map is Ready");
            mMap = googleMap;
    
            if (mLocationPermissionsGranted) {
                getDeviceLocation();
    
                if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                        != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this,
                        Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    return;
                }
                mMap.setMyLocationEnabled(true);
                mMap.getUiSettings().setMyLocationButtonEnabled(false);
    
                init();
            }
        }
    
        private static final String TAG = "MapActivity";
        private static final String FINE_LOCATION = Manifest.permission.ACCESS_FINE_LOCATION;
        private static final String COURSE_LOCATION = Manifest.permission.ACCESS_COARSE_LOCATION;
        private static final int LOCATION_PERMISSION_REQUEST_CODE = 1234;
        private static final float DEFAULT_ZOOM = 15f;
    
    
        //Widget
        private EditText mSearchText;
        private ImageView mGps;
    
        //Variables
        private Boolean mLocationPermissionsGranted = false;
        private GoogleMap mMap;
        private FusedLocationProviderClient mFusedLocationProviderClient;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_map);
            getLocationPermission();
            mSearchText =(EditText) findViewById(R.id.input_search);
            mGps = (ImageView) findViewById(R.id.ic_gps);
    
        }
    
        private void init(){
            Log.d(TAG, "init: initializing");
    
            mSearchText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
                @Override
                public boolean onEditorAction(TextView textViewv, int actionId, KeyEvent keyEvent) {
                    if (actionId == EditorInfo.IME_ACTION_SEARCH
                            || actionId == EditorInfo.IME_ACTION_DONE
                            || keyEvent.getAction() == KeyEvent.ACTION_DOWN
                            || keyEvent.getAction() == KeyEvent.KEYCODE_ENTER){
    
                        //Execute method for searching
                        geoLocate();
    
                    }
    
                    return false;
                }
            });
    
            mGps.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.d(TAG,"onClick: clicked gps icon");
                    getDeviceLocation();
                }
            });
    
            hideSoftKeyboard();
        }
    
        private void geoLocate(){
            Log.d(TAG,"geoLocate: geolocating");
            String searchString = mSearchText.getText().toString();
    
            Geocoder geocoder = new Geocoder(MapActivity.this);
            List<Address> list = new ArrayList<>();
            try {
                list = geocoder.getFromLocationName(searchString, 1);
            }catch (IOException e){
                Log.e(TAG,"geoLocate: IOException:" + e.getMessage());
            }
    
            if (list.size() > 0){
                Address address = list.get(0);
    
                Log.d(TAG,"geoLocate: found a location: " + address.toString());
                //Toast.makeText(this, address.toString(), Toast.LENGTH_SHORT).show();
    
                moveCamera(new LatLng(address.getLatitude(),address.getLongitude()),DEFAULT_ZOOM, address.getAddressLine(0));
            }
        }
    
        private void getDeviceLocation(){
            Log.d(TAG,"getDeviceLocation: getting the devices current location");
    
            mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
    
            try {
                if (mLocationPermissionsGranted){
                    Task location = mFusedLocationProviderClient.getLastLocation();
                    location.addOnCompleteListener(new OnCompleteListener() {
                        @Override
                        public void onComplete(@NonNull Task task) {
                            if (task.isSuccessful()){
                                Log.d(TAG,"onComplete: found location!");
                                Location currentLocation = (Location) task.getResult();
    
                                moveCamera(new LatLng(currentLocation.getLatitude(), currentLocation.getLongitude()), DEFAULT_ZOOM,"My Location");
                            }else {
                                Log.d(TAG,"onComplete: current location is null");
                                Toast.makeText(MapActivity.this, "unable to get current location", Toast.LENGTH_SHORT).show();
                            }
                        }
                    });
                }
            }catch (SecurityException e){
                Log.e(TAG,"getDeviceLocation: SecurityException: " + e.getMessage());
            }
        }
    
        private void moveCamera(LatLng latLng, float zoom, String title){
            Log.d(TAG, "moveCamera: moving the camera to: lat: " + latLng.latitude + ", lng: " + latLng.longitude);
            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,zoom));
            if (!title.equals("My Location")){
                MarkerOptions options = new MarkerOptions()
                        .position(latLng)
                        .title(title)
                        .draggable(true);
                mMap.addMarker(options);
            }
            hideSoftKeyboard();
        }
    
        private void initMap(){
            Log.d(TAG,"initMap: initializing map");
            SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    
            mapFragment.getMapAsync(MapActivity.this);
        }
    
        //Checks permissions
        private void getLocationPermission(){
            Log.d(TAG,"getLocationPermission: getting location permissions");
            String[] permissions = {Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION};
    
            if (ContextCompat.checkSelfPermission(this.getApplicationContext(),
                    FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){
                if (ContextCompat.checkSelfPermission(this.getApplicationContext(),
                        COURSE_LOCATION) == PackageManager.PERMISSION_GRANTED){
                    mLocationPermissionsGranted = true;
                    initMap();
                } else {
                    ActivityCompat.requestPermissions(this,
                            permissions,
                            LOCATION_PERMISSION_REQUEST_CODE);
                }
            }else {
                ActivityCompat.requestPermissions(this,
                        permissions,
                        LOCATION_PERMISSION_REQUEST_CODE);
            }
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            Log.d(TAG,"onRequestPermissionsResult: called.");
    
            mLocationPermissionsGranted = false;
    
            switch (requestCode){
                case LOCATION_PERMISSION_REQUEST_CODE:{
                    if(grantResults.length > 0){
                        for (int i = 0; i < grantResults.length; i++){
                            if (grantResults[i] != PackageManager.PERMISSION_GRANTED){
                                mLocationPermissionsGranted = false;
                                Log.d(TAG,"onRequestPermissionsResult: permission failed");
                                return;
                            }
                        }
                        Log.d(TAG,"onRequestPermissionsResult: permission granted");
                        mLocationPermissionsGranted = true;
                        //Initialize map
                        initMap();
                    }
                }
            }
        }
    
    
    
        private void hideSoftKeyboard(){
            this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
        }
    
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Zaid Mirza    7 年前

    在根据坐标进行搜索时,您使用了错误的方法。

    将其用于坐标:

    getFromLocation(double latitude, double longitude, int maxResults)
    

    如果您有地址,请告诉我们:

    getFromLocationName(String locationName, int maxResults)
    

    请注意,以上这些方法可以返回多个地址,您使用的是返回列表中的第一个地址。

    Address address = list.get(0);
    

    显然,您无法确定索引0处的地址是否是所需的地址,甚至无法确定设置 maxResults=1 并不能保证你会得到想要的地址。所以,您有两个选择,要么在地图上显示所有回信地址,要么定义您想要显示的地址类型的标准,即餐厅、医院等。。。。