#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):
Дает результат, который можно проанализировать, чтобы получить широту и долготу для вашего маркера.
Комментарии:
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
}