繁体   English   中英

从 URL Google Maps 获取经纬度

[英]Get latitude-longitude from URL Google Maps

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

简而言之,我有一个谷歌地图 URL(我可能在 WhatsApp 或类似平台上收到过),并且使用它,不知何故,我需要在我的应用程序中获取该地点的纬度和经度,即使它是一个间接方式。 我对地方 API 不感兴趣,因为它有限制。

几个小时以来一直试图找到解决方案,但没有找到任何相关的内容。

编辑:

我尝试使用的链接示例:

(不能使用 URL Shortners,因为 SO 不允许,将 [dot] 替换为 .)

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

1) 对于像https://goo[dot]gl/maps/fSQSTjDR32m - Google URL Shortener API这样的URL ,请求如下:

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

注意! 您需要在开发者控制台上启用 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 有关更多详细信息,请查看Ogre 的这个问题和答案。

因此,对于缩短的 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。 根据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这样的 URL,您可以使用Google Maps API和 URL 请求,例如

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

其中<YOUR_CID> = 14927999966769665575<YOUR_APP_KEY>为启用了 Google Maps API 的 Android 应用程序的有效密钥(在开发者控制台上与 URL Shortener API 相同)。 从更多细节来看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/fSQSTjDR32m也不是https://maps.google.com/?cid=14927999966769665575&hl=en&gl=gb )你应该找到其他解码和提取纬度的方案 -经度。

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

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

注意:这在没有短链接的情况下工作正常,如下所示:

https://www.google.com/maps/place/Egypt/@26.8444558,26.3722095,6z/data=!3m1!4b1!4m13!1m7!3m6!1s0x0:0x0!2zMTfCsDMwJzA0LjQiMDJ7F20100000000000000!3m1!4b1!4m13!1m7!3m6!1s0x0:0x0!2zMTfCsDMwJzA0LjQiMDJ7F20100000000000!3m1!4b1!4m13!1m7!3m6!1s0x0! 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);

        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM