从URL Google Maps获取经度

时间:2018-08-18 09:45:56

标签: java android google-maps google-maps-android-api-2 google-url-shortener

我需要一种方法来计算出谷歌地图中某个地方的经度和纬度,并提供其链接。另外,如果可以的话,我可以在地图上绘制应用程序内的点,或者使用某种意图从Google地图共享纬度经度,这样我就可以在应用程序内接收该点。以上任何一种可能直接或间接吗?

简而言之,我随身带有一个谷歌地图URL(我可能已经在WhatsApp或类似平台上收到了),并且以某种方式使用它,即使我在应用程序中也需要获取该位置的纬度和经度,即使这是一种间接的方式。我对places API没兴趣,因为它有限制。

已经尝试了几个小时的解决方案,没有发现任何相关的东西。

编辑:

我要使用的链接示例:

(由于SO不允许,因此无法使用URL缩写,请将[dot]替换为。)

2 个答案:

答案 0 :(得分:3)

似乎,没有一种通用的解决方案可用于所有类型的编码URL,但是对于上述两种,您可以使用:

1)用于诸如https://goo[dot]gl/maps/fSQSTjDR32m的URL-Google URL Shortener API,其请求如下:

https://www.googleapis.com/urlshortener/v1/url?shortUrl=<YOUR_SHORT_URL_e_g_https://goo[dot]gl/maps/fSQSTjDR32m>&key=<YOUR_APP_KEY>

NB!您需要在Developer Console

上启用了URL Shortener API的Android应用程序的有效密钥

您可以使用HttpURLConnection获得回复

...
URL url = new URL("https://www.googleapis.com/urlshortener/v1/url?shortUrl=...");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
...

或使用URL Shortener API Client Library for Java。有关更多详细信息,请查看thisOgre问题和答案。

因此,对于缩短的URL,您应该获得JSON响应,如:

{
 "kind": "urlshortener#url",
 "id": "https://goo<.>gl/maps/fSQSTjDR32m",
 "longUrl": "https://www.google.co.in/maps/place/10%C2%B007'16.8%22N+76%C2%B020'54.2%22E/@10.1213253,76.3478427,247m/data=!3m2!1e3!4b1!4m6!3m5!1s0x0:0x0!7e2!8m2!3d10.1213237!4d76.348392?shorturl=1",
 "status": "OK"
}

其中longUrl标签包含具有所需纬度-经度的URL。根据{{​​3}}关于treebles的回答:

  

这不是第一组坐标@ 10.1213253,76.3478427-即   地图视口的中心。点的坐标   兴趣来自他们的fid,并表示为   !3d10.1213237!4d76.348392其中,!3d参数表示纬度,而!4d参数表示兴趣点的经度。

您可以通过longUrl!3d前缀或使用正则表达式在!4d中查找纬度。

2)对于this之类的URL,您可以使用https://maps.google.com/?cid=14927999966769665575&hl=en&gl=gb和URL请求之类

Google Maps API&key =

其中<YOUR_CID> = 14927999966769665575<YOUR_APP_KEY>对启用了Google Maps API的Android应用有效(在开发者控制台上与URL Shortener API相同)。有关更多详细信息,请查看https://maps.googleapis.com/maps/api/place/details/json?cid=this答案。 您可以使用HttpURLConnection来获得与第1点类似的响应:

...
URL url = new URL("https://maps.googleapis.com/maps/api/place/details/json?cid=...");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
...

因此,您应该获得带有标签geometry和“子标签” location

的大型JSON。
...
"geometry" : {
     "location" : {
        "lat" : 10.1652839,
        "lng" : 76.218744
     },
     "viewport" : {
        "northeast" : {
           "lat" : 10.1666328802915,
           "lng" : 76.22009298029151
        },
        "southwest" : {
           "lat" : 10.1639349197085,
           "lng" : 76.21739501970849
        }
     }
  },
...

,您可以从中获得经度。

对于其他类型的URL(不是Leonhttps://goo[dot]gl/maps/fSQSTjDR32m),您应该找到其他用于解码和提取经度的方案。

答案 1 :(得分:1)

您可以从URL Google Maps获取经度,

使用正则表达式匹配器和模式

注意: 如果没有短链接,就可以正常工作,例如:

https://www.google.com/maps/place/Egypt/@26.8444558,26.3722095,6z/data=!3m1!4b1!4m13!1m7!3m6!1s0x0:0x0!2zMTfCsDMwJzA0LjQiTiA3NMKwMDcnMjQuNyJF!3b1!8m2!3d17.5012212!4d74.1235132!3m4!1s0x14368976c35c36e9:0x2c45a00925c4c444!8m2!3d27.0982539!4d29.8828125

String url = "www.google.com/maps/place/@bla,bla"; // full link
Pattern pattern = Pattern.compile("\\d+\\.\\d+,\\d+\\.\\d+");
Matcher matcher = pattern.matcher(url);
if (matcher.find()) {
        System.out.println(matcher.group(0));
    }

现在您将获得纬度-经度,如果您想使用这两个变量进行拆分

if (matcher.find()) {
            String s = matcher.group(0);

            String lon = s.split(",")[0];
            String lat = s.split(",")[1];

            System.out.println(lon);
            System.out.println(lat);

        }