Android-карты Google. Добавить маркер по адресу

#android #google-maps

#Android #google-карты

Вопрос:

Я добавил карту в приложение для Android и хочу добавить маркер на карту по адресу. Это возможно? Я уже пытался использовать long и lat Geocoder , но там я получаю ошибку Service not Available .

мой код:

 Geocoder geocoder = new Geocoder(getBaseContext());
        List<Address> addresses = null;

        try {
            addresses = geocoder.getFromLocationName(event.getPlace(), 20);
            System.out.println(addresses);
//          for (int i = 0; i < addresses.size(); i  ) { // MULTIPLE MATCHES
//
//              Address addr = addresses.get(i);
//
//              double latitude = addr.getLatitude();
//              double longitude = addr.getLongitude(); // DO SOMETHING WITH
//                                                      // VALUES
//
//              System.out.println(latitude);
//              System.out.println(longitude);
//
//          }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 

Комментарии:

1. можете ли вы опубликовать то, что вы уже пробовали??

Ответ №1:

Создайте метод для преобразования адреса в LatLng:

 public LatLng getLocationFromAddress(Context context, String strAddress)
{
    Geocoder coder= new Geocoder(context);
    List<Address> address;
    LatLng p1 = null;

    try
    {
        address = coder.getFromLocationName(strAddress, 5);
        if(address==null)
        {
            return null;
        }
        Address location = address.get(0);
        location.getLatitude();
        location.getLongitude();

        p1 = new LatLng(location.getLatitude(), location.getLongitude());
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
    return p1;

}
 

затем ,

  @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);      

}


@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
  LatLng address = getLocationFromAddress(this, yourAddressString(eg. "Street Number, Street, Suburb, State, Postcode");
    mMap.addMarker(new MarkerOptions().position(address).title("Marker in Sydney"));
    mMap.moveCamera(CameraUpdateFactory.newLatLng(address));
}
 

Ответ №2:

Это возможно. Похоже, ваша проблема связана с геокодированием.

Проблема с вашим использованием Geocoder заключается в том, что для него требуется серверная служба, которая не включена в основную платформу Android, как указано в Android API для Geocoder. Вы должны использовать geocoder.isPresent() , чтобы проверить, доступна ли эта функция. Если это не так, вы не можете использовать этот метод.

Геокодирование можно также выполнить с помощью Google Maps, используя URL-адрес, как описано в API геокодирования Google. Например (вам нужен ключ API):

https://maps.googleapis.com/maps/api/geocode/json?address=1600 Amphitheatre Parkway, Mountain View, CAamp;key=API_KEY

Дает результат, который можно проанализировать, чтобы получить широту и долготу для вашего маркера.

Комментарии:

1. Итак, если геокодер отсутствует, что мы можем сделать? Как можно отобразить указатель назначения на карте ?!

2. @Mr.Hyde вы могли бы использовать URL, который я предложил в качестве альтернативы. Для этого нет требований к API Android.

3. Почему геокодера нет в библиотеке поддержки !? Вы знаете?

4. Потому что производитель телефона не создал его собственную реализацию. Он не является частью основной платформы Android.

Ответ №3:

Версия Kotlin:

 import com.google.android.gms.maps.model.LatLng

fun getLocationByAddress(context: Context, strAddress: String?): LatLng? {
    val coder = Geocoder(context)
    try {
        val address = coder.getFromLocationName(strAddress, 5) ?: return null
        val location = address.first()
        return LatLng(location.latitude, location.longitude)
    } catch (e: Exception) {
        Timber.e(e, "getLocationByAddress")
    }
    return null
}