当使用 Android 谷歌地图应用程序分享位置按钮时,它只是返回一个 url 作为其他应用程序的意图,如下所示:
https://goo. gl / 地图/tkNXzF2krmR2
这是一个谷歌短网址,可翻译为长网址(使用 goole 短网址 api),如下所示:
http://maps.google.com/?q=德黑兰+省,+德黑兰,+Banafsheh+3&ftid=0x3f8dfd04d309f925:0x2867166b05b0bfe6&hl=en&gl=us&shorturl=1
很明显,这个网址没有纯粹的纬度和经度值。但似乎 value 位于 url 中 ftid 参数的后面。用“:”字符分隔。
请帮我从这种十六进制格式中提取纬度和经度值
我正在使用 PHP 语言,但其他语言也可以提供帮助。 我需要一个像这样的函数:(这不起作用):
函数 hextolatlon($hex){ // 假设十六进制是类似 0x1446041F 或 0x447D1100 的值 // 转换为有符号整数 $h=$hex&0xFF; $h=($h>8)&0xFF); $h=($h>16)&0xFF); $h=($h>24)&0xFF); $负=($h>>31)!=0; // 获取标志 如果($负数){ $h=~$h; $h=$h&0x7FFFFFFF; $h++; } // 转换为度和分 $度=下限($h/10000000); $分钟=$h%10000000; // 转换为完整度数 $度+=($分钟/100000.0) / 60.0; if($负)$度=-$度; 返回$度数; }
将 0x3f8dfd04d309f925 转换为 35.74388 之类的值。 非常感谢
我认为晚回复总比没有好。
您尝试解密的 FTID 参数(不一定)存储纬度和经度。如果它指的是地图地点(例如咖啡馆、时装店),则冒号后参数的第二部分指的是客户 ID。
举一个现实世界的例子,参数:
!1s0x6ad63fbf56e24c27:0xe665b3308d32f379
可以这么理解
0xe665b3308d32f379 ---hex-to-dec---> 16601872622479930233
和 https://google.com/maps?cid=16601872622479930233 将通往标记的地点。
如何从中提取坐标?如果你只有几个样品,你可以手工完成。点击上面的链接,1-2秒后,谷歌地图将刷新浏览器中的URL。它现在包含
!3d
和 !4d
参数中该地点的准确坐标。
如果您有很多示例和/或想要自动化该过程,则必须使用 Google Maps API(例如,查看此链接)。
我还没弄清楚的是 1)第一个参数保存什么信息以及 2) 如何理解 FTID 参数(如果它指向地址或地理位置)。
另请查看我在此处发布的问题以了解更多详细信息。
function ftid_to_latlong($ftid)
{
$fetch = curl_request("https://www.google.com/maps?ftid=$ftid");
preg_match("/\"$ftid\",.*?(\d+\.\d+),(\d+\.\d+)/", $fetch, $geo);
return [$geo[1], $geo[2]];
}
让我用一种自动化方法来扩展 Manu CJ 的精彩答案。不幸的是,我只能分享一个基于Python的解决方案,但我相信它可能仍然有帮助。
完成从十六进制中提取十进制值后,您可以继续执行以下操作:
def get_coordinates_from_place_id(place_id, api_key):
"""
Convert a Google Places ID to coordinates using the Places Details API.
Args:
place_id (str): The Google Places ID.
api_key (str): Your Google API key.
Returns:
dict: A dictionary containing latitude and longitude, or None if failed.
"""
try:
# API endpoint for Places Details
url = "https://maps.googleapis.com/maps/api/place/details/json"
params = {"cid": place_id, "key": api_key}
# Make the API request
response = requests.get(url, params=params)
response_data = response.json()
# Check the response status
if response_data["status"] == "OK":
# Extract geometry location
location = response_data["result"]["geometry"]["location"]
return {"latitude": location["lat"], "longitude": location["lng"]}
else:
raise ValueError(f"Places API Error: {response_data['status']}")
except Exception as e:
logger.error(f"Error resolving coordinates from Place ID: {e}")
return None