2014-05-31 2 views
7

Я создал приложение для Android, которое может обрабатывать намерение использовать Google Карты и показывать его координаты.Android конвертирует местоположение CID в координаты

Проблема заключается в том, что они отправляют короткий URL-адрес, который я декодирую с помощью url shorter api, и в некоторых случаях результат длинной ссылки имеет следующий тип: http://maps.google.com/?cid=3635533832900933072&hl=en&gl=us.

Может кто-нибудь поможет мне о том, как получить coresponding координаты «CID = 3635533832900933072»

ответ

6

Насколько я знаю, нет никакого общественного API, чтобы получить расположение от ИДС.

Однако возможное обходное решение будет заключаться в том, чтобы проанализировать выходные данные Google Maps для получения широты и долготы (хотя они могут быть хрупкими, если они изменяют формат результата).

(Хотя URL содержит output=json, это на самом деле не JSON - вот почему я разобрать его с substring() и такой вместо использования JSONObject).

Попробуйте этот код:

public static LatLng getCidCoordinates(String cid) 
{ 
    final String URL_FORMAT = "http://maps.google.com/maps?cid=%s&q=a&output=json"; 
    final String LATLNG_BEFORE = "viewport:{center:{"; 
    final String LATLNG_AFTER = "}"; 
    final String LATLNG_SEPARATOR = ","; 
    final String LAT_PREFIX = "lat:"; 
    final String LNG_PREFIX = "lng:"; 

    try 
    { 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet get = new HttpGet(String.format(URL_FORMAT, cid)); 
     HttpResponse response = client.execute(get); 

     String text = EntityUtils.toString(response.getEntity(), "UTF-8"); 

     int startIndex = text.indexOf(LATLNG_BEFORE); 
     if (startIndex == -1) 
      return null; 

     startIndex += LATLNG_BEFORE.length(); 
     int endIndex = text.indexOf(LATLNG_AFTER, startIndex); 

     // Should be "lat:<number>,lng:<number>" 
     String[] parts = text.substring(startIndex, endIndex).split(LATLNG_SEPARATOR); 
     if (parts.length != 2) 
      return null; 

     if (parts[0].startsWith(LAT_PREFIX)) 
      parts[0] = parts[0].substring(LAT_PREFIX.length()); 
     else 
      return null; 

     if (parts[1].startsWith(LNG_PREFIX)) 
      parts[1] = parts[1].substring(LNG_PREFIX.length()); 
     else 
      return null; 

     return new LatLng(Double.parseDouble(parts[0]), Double.parseDouble(parts[1])); 
    } 
    catch (NumberFormatException e) 
    { 
     e.printStackTrace(); 
     return null; 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
     return null; 
    } 
} 
+0

Большого обходного пути ... Спасибо! – Adrian

+0

Вы написали этот код – Richard

+0

@Richard Да, почему? Разрушено? – matiash

0

Решение, которое я сейчас использую (на основе @matiash ответа) заключается в следующем:

String responseWithCoordinates = getResponseStr(String.format("http://maps.google.com/maps?cid=%s", cid)); 

// it seems that "http://maps.google.com/maps?cid=%s" is no longer available but we 
// do receive a redirect link which we can safely use for now 
if (text.contains("The document has moved")) { 
    String movedToUrl = text.substring(text.indexOf("A HREF=\"") + 8, text.indexOf("\">here")); 
    responseWithCoordinates = getResponseStr(movedToUrl); 
} 

Где getResponseStr(String url) открывает HttpURLConnection и читает InputStream ,

1

Вчера, прочитав это сообщение, я нашел новый метод для этого. Надеюсь, Google не закрывает этот новый API и скрытый параметр. :)

Вы можете использовать этот скрытый параметр API для получения координатора. Использование: https://maps.googleapis.com/maps/api/place/details/json?cid=YOUR_CID&key=YOUR_KEY

Он возвращает результат, содержащий отформатированный адрес, place_id, имя адреса и координатор GPS.

Пожалуйста, смотрите мой блог, чтобы увидеть больше деталей: https://leonbbs.blogspot.com/2018/03/google-map-cid-to-placeid-or-get.html

Смежные вопросы