【问题标题】:Android convert CID location to CoordinatesAndroid将CID位置转换为坐标
【发布时间】:2014-07-21 01:26:27
【问题描述】:

我构建了一个 android 应用程序,它可以处理来自 Google 地图的共享意图并显示它的坐标。

问题是他们发送了一个简短的 url,我使用 Google 的 url shortner api 对其进行解码,在某些情况下,结果长链接属于这种类型:http://maps.google.com/?cid=3635533832900933072&hl=en&gl=us

任何人都可以帮助我了解如何获取对应坐标 "cid=3635533832900933072"

【问题讨论】:

    标签: android google-api


    【解决方案1】:

    据我所知,没有公共 API 可以从 cid 获取位置。

    但是,一种可能的解决方法是解析 Google 地图的输出以获取纬度和经度(尽管如果它们更改结果格式,它可能会很脆弱)。

    (虽然 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;
        }
    }
    

    【讨论】:

    • @Richard 是的,为什么?坏了吗?
    • @matiash 好吧,当我尝试搜索有关公共交通站点的详细信息时,JSON 返回为空。 :[
    • maps.google.com/maps?cid=%s&q=a&output=json 似乎不再工作了。关于如何从 cid 获取坐标的任何其他想法?
    【解决方案2】:

    昨天看了这篇文章后,我发现了一种新的方法。我希望谷歌不要关闭这个新的 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

    【讨论】:

      【解决方案3】:

      在最新的 Google 地图更新中,分享意图包含正文中的地址名称,可以使用 Geocoder 将其解码为坐标。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-06
        • 1970-01-01
        相关资源
        最近更新 更多