我需要一种方法来计算谷歌地图中一个地方的纬度,经度提供其链接。或者,如果可能的话,我可以在地图上绘制应用程序内部的点,或者使用某种意图从谷歌地图共享纬度经度,以便我可以从我的应用程序中接收它,那就没问题了。以上是否有任何一种可能直接或间接?
简而言之,我有一个谷歌地图URL(我可能在WhatsApp或类似平台上收到过(,并且使用它,不知何故,我需要在我的应用程序中获取该地点的纬度和经度,即使它是间接方式。我对地方 API 不感兴趣,因为它有限制。
几个小时以来一直在尝试解决方案,没有找到任何相关内容。
编辑:
我尝试使用的链接示例:
- https://goo[dot]gl/maps/fSQSTjDR32m
- https://maps.google.com/?cid=14927999966769665575&hl=en&gl=gb
(不能使用 URL 缩短器,因为 SO 不允许,请将 [点] 替换为 .(
似乎,对于所有类型的编码 URL,没有一个通用的解决方案,但对于描述的两个,您可以使用:
1(对于像https://goo[dot]gl/maps/fSQSTjDR32m
这样的网址 - 谷歌网址缩短器API,请求如下:
https://www.googleapis.com/urlshortener/v1/url?shortUrl=<YOUR_SHORT_URL_e_g_https://goo[dot]gl/maps/fSQSTjDR32m>&key=<YOUR_APP_KEY>
铌!您需要在开发者控制台上启用网址缩短器 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。有关更多详细信息,请查看食人魔的这个问题和答案。
因此,对于缩短的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。根据树莓的这个答案:
它不是第一组 coordinates@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,你可以使用谷歌地图API和URL请求,如
https://maps.googleapis.com/maps/api/place/details/json?cid=&key=
其中<YOUR_CID> = 14927999966769665575
并<YOUR_APP_KEY>
启用了谷歌地图API的Android应用的有效密钥(在开发者控制台上与URL缩短器API相同(。更多细节看看莱昂的这个答案。 您可以使用HttpURLConnection
来获取响应,例如第 1 点:
...
URL url = new URL("https://maps.googleapis.com/maps/api/place/details/json?cid=...");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
...
结果,您应该获得带有标签geometry
和"子标签"的大 JSONlocation
...
"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(,您应该找到其他用于解码和提取经纬度的方案。
您可以从网址谷歌地图获取经纬度,
使用正则表达式匹配器和模式
注意:这在没有短链接的情况下工作正常,如下所示:
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);
}