我正在尝试编写一个 JavaScript Web 应用程序,它允许我获取包含 Google 街景信息的随机位置。
我采取的第一步是创建一个随机的纬度和经度位置,但是由于地球主要是海洋,所以我经常到那里。然后,我尝试使用距离这些随机选择的点最近的位置,但这使我最终在岸上,或者大多数时候在随机的水下位置。
我还尝试使用 API 来获取随机陆地位置列表,但其中也包括稍微离岸的位置,并且通常不会落在街景区域(或接近街景区域)。它很接近,但没有给我最好的结果。
我们的目标是尽可能高效地做到这一点,同时保持相对较低的 API 调用量。
据我所知,谷歌并未发布包含街景信息的所有位置的列表,这限制了我从列表中随机选择位置的可能性。
我正在尝试实现GeoGuessr的效果。
您可以使用一些 API 来获取随机坐标
例如:
https://api.3geonames.org/?random=yes 3geonames 的随机位置 API 可能会有所帮助
并且,如果您想在陆地或陆地附近随机选择一个位置https://api.3geonames.org/?randomland=yes(因为地球的大部分表面都被海洋覆盖)
您还可以在此 API 中添加国家/地区代码作为参数(例如,德国 - DE):https://api.3geonames.org/?randomland=DE
然后,您可以在 Google Static API 中检查这些坐标的有效性,并从 Street View Service
获取最终的全景数据像魅力一样工作
function generateLatLong() {
const lat = Math.random() * 180 - 90;
const long = Math.random() * 360 - 180;
return { lat, long };
}
// send post to https://maps.googleapis.com/$rpc/google.internal.maps.mapsjs.v1.MapsJsInternalService/SingleImageSearch
// with payload [["apiv3",null,null,null,"US",null,null,null,null,null,[[0]]],[[null,null,X,Y],50000],[[null,null,1],["en","US"],null,null,null,null,null,null,[1],null,[[[2,1,2],[3,1,2],[10,1,2]]]],[[1,2,3,4,8,6]]]
// x and y are the lat and long
// if output is [[5, "generic", "Search returned no images."]] then the lat and long are invalid
async function verifyLatLong(lat, long) {
const resp = await fetch("https://maps.googleapis.com/$rpc/google.internal.maps.mapsjs.v1.MapsJsInternalService/SingleImageSearch", {
"headers": {
"accept": "*/*",
"accept-language": "en-US,en;q=0.9,es-US;q=0.8,es;q=0.7",
"content-type": "application/json+protobuf",
"sec-ch-ua": "\"Google Chrome\";v=\"123\", \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"123\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
"x-client-data": "CJW2yQEIorbJAQipncoBCNr5ygEIlqHLAQiFoM0BGPTJzQEY642lFw==",
"x-goog-api-key": "",
"x-goog-maps-channel-id": "",
"x-user-agent": "grpc-web-javascript/0.1"
},
"referrer": "https://www.google.com/",
"referrerPolicy": "strict-origin-when-cross-origin",
"body": JSON.stringify([["apiv3", null, null, null, "US", null, null, null, null, null, [[0]]], [[null, null, lat, long], 50000], [[null, null, 1], ["en", "US"], null, null, null, null, null, null, [1], null, [[[2, 1, 2], [3, 1, 2], [10, 1, 2]]]], [[1, 2, 3, 4, 8, 6]]]),
"method": "POST",
"mode": "cors",
"credentials": "omit"
});
const data = await resp.json();
// check if the response is invalid
if (data[0][0] === 5) {
return false;
}
return [data[1][5][0][1][0][2], data[1][5][0][1][0][3]];
}
export default async function findLatLongRandom() {
let found = false;
let output = null;
while (!found) {
const { lat, long } = generateLatLong();
console.log(lat, long);
found = await verifyLatLong(lat, long);
if (found) {
output = { lat, long };
}
}
return output;
}