从 Google Maps 的 URL 中获取纬度和经度

3
我需要一种方法来确定谷歌地图中某个地方的纬度和经度,提供其链接。或者,如果可能的话,在我的应用程序上绘制该点,或者使用某些意图从谷歌地图共享纬度经度,以便我可以从我的应用程序中接收它。以上任何一种方式都可以是直接或间接的吗?
简而言之,我手头有一个谷歌地图URL(我可能在WhatsApp或类似平台上收到),并且使用它,无论是通过间接方式还是直接方式,我都需要在我的应用程序中获取该地方的纬度和经度。我不感兴趣的是places API,因为它有限制。
已经尝试寻找解决方案几个小时了,没有找到相关的东西。
编辑:
我正在尝试使用的链接示例:

由于SO不允许使用URL缩短服务,因此无法使用。请将[dot]替换为.。


请给出这样一个链接的例子。在您的帖子中以此为开头。 - greenapps
请更新您的问题并添加一个适当的URL示例。 - ScaisEdge
请检查编辑。 - Harikrishnan
2个回答

4

看起来,并没有一种通用的解决方案适用于所有类型的编码URL,但对于描述的两种情况,您可以使用以下方法:

1)对于像https://goo[dot]gl/maps/fSQSTjDR32m这样的URL - 使用Google URL缩短API并发送请求:

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

注意!您需要在开发者控制台上启用URL缩短API,为您的Android应用程序获取有效的密钥。

您可以使用HttpURLConnection来获取响应。

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

或使用 Java URL缩短API客户端库。有关更多详细信息,请查看Ogre问题和答案。因此,您应该获得类似以下JSON响应的缩短URL:
{
 "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。根据this treebles的回答:

这不是第一组坐标@10.1213253,76.3478427——那是地图视口的中心。感兴趣点的坐标出现在其fid之后,由!3d10.1213237!4d76.348392指示。其中!3d参数表示感兴趣点的纬度,!4d参数表示其经度。

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

2) 对于类似 https://maps.google.com/?cid=14927999966769665575&hl=en&gl=gb 的网址,您可以使用 Google Maps API 和 URL 请求,例如:

https://maps.googleapis.com/maps/api/place/details/json?cid=&key=

<YOUR_CID> = 14927999966769665575 并且 <YOUR_APP_KEY> 是您的Android应用程序的有效密钥,并启用了Google Maps API(在开发人员控制台上与URL缩短器API相同)。有关更多详细信息,请查看this Leon的答案。 您可以使用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(不是https://goo[dot]gl/maps/fSQSTjDR32mhttps://maps.google.com/?cid=14927999966769665575&hl=en&gl=gb),你应该找到其他方案来解码和提取纬度和经度。


Google已关闭其URL缩短服务。现有链接将继续重定向到其预定目的地。我们还有哪些其他选择?由于现在无法创建此类API密钥,所以我们有什么其他选项? - undefined

1
你可以通过使用正则表达式匹配器和模式,从Google地图的URL中获取纬度和经度。
注意:这种方法仅适用于非短链接的情况。

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);

        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接