如何获得随机街景位置?

问题描述 投票:0回答:3

我正在尝试编写一个 JavaScript Web 应用程序,它允许我获取包含 Google 街景信息的随机位置。

我采取的第一步是创建一个随机的纬度和经度位置,但是由于地球主要是海洋,所以我经常到那里。然后,我尝试使用距离这些随机选择的点最近的位置,但这使我最终在岸上,或者大多数时候在随机的水下位置。

我还尝试使用 API 来获取随机陆地位置列表,但其中也包括稍微离岸的位置,并且通常不会落在街景区域(或接近街景区域)。它很接近,但没有给我最好的结果。

我们的目标是尽可能高效地做到这一点,同时保持相对较低的 API 调用量。

据我所知,谷歌并未发布包含街景信息的所有位置的列表,这限制了我从列表中随机选择位置的可能性。

我正在尝试实现GeoGuessr的效果。

javascript google-street-view
3个回答
0
投票

您可以使用一些 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

获取最终的全景数据

0
投票

像魅力一样工作

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

-1
投票

街景服务

在他们的文档中,谷歌描述了如何获取街景位置。

另请参阅有关堆栈溢出的answer,描述了示例实现。

反向地理编码

如果这对你不起作用;我认为你的反向地理编码随机 LatLon 方法不会那么糟糕。

在他们的文档中 谷歌描述了其反向地理编码器的请求参数。

也许您可以使用

street
route
作为
result_type
至少可以将范围缩小很多。

© www.soinside.com 2019 - 2024. All rights reserved.