我的 Android 手机相机有很多 360 度全景图,是在世界偏远地区拍摄的。我使用 Google 地图上现有的全景照片来计划我的旅行,并上传我的照片以帮助其他人做同样的事情。直到现在,我一直使用 Android 街景应用上传全景图,但该应用已于 2023 年 3 月停用。
谷歌建议将街景工作室作为替代品,但只允许上传视频。您也可以通过 Google 地图应用程序上传照片,但这些照片必须与现有“地点”相关联,因此它们无法用于记录偏远的道路、山脉等
Google 让您可以制作“自定义街景”,但这看起来非常复杂。我已经在所需的分辨率和纵横比中准备好独立的 360 度照片文件,我不想在不同的缩放级别上乱七八糟地服务于我没有的单个图块。
有没有办法通过 Google API 继续上传光球 JPEG?
这是使用 curl 的答案。您仍然可以使用 Street View Publish API 上传未链接到 Google 地图“地点”的单张全景照片。根据 here 的说明。要使用 Google API,您首先需要一个 API 密钥和访问令牌,如该页顶部所述。将它们存储在
$API_KEY
和 $ACCESS_TOKEN
中。然后需要三个API调用。
首先你告诉谷歌你想上传一张新图片。它返回一个 URL,您应该在其中发布图像字节。
$ curl --request POST --url "https://streetviewpublish.googleapis.com/v1/photo:startUpload?key=$API_KEY" --header "Authorization: Bearer $ACCESS_TOKEN" --header 'Content-Length: 0'
{
"uploadUrl": "https://streetviewpublish.googleapis.com/media/user/112233445566778899/photo/1234567890"
}
将
UPLOAD_URL
设置为上面返回的URL,然后POST实际的图像文件。成功时有一个空响应。
$ curl --request POST --url "$UPLOAD_URL" --upload-file 'C:\path\to\photosphere.jpg' --header 'Authorization: Bearer $ACCESS_TOKEN'
最后,您需要根据 API 文档“上传元数据”,如纬度/经度和捕获时间,但我发现如果您发送的元数据仅包含最低限度的 uploadUrl,那么 Google 将从 EXIF 标签中获取正确的姿势值。但是,您仍然需要执行第三次 API 调用才能使光球层公开可见。响应包含有关您上传的照片的大量信息。
$ curl --request POST --url 'https://streetviewpublish.googleapis.com/v1/photo?key=$API_KEY' --header 'Authorization: Bearer $ACCESS_TOKEN' --header 'Content-Type: application/json' --data '{ "uploadReference": { "uploadUrl": "$UPLOAD_URL" } }'
{
"photoId": {
"id": "nsqmdBsi7gBzTxgiKMc8q7NxuQciAbWCBMKf9kaE"
},
"pose": {
"latLngPair": {
"latitude": 40.1234567,
"longitude": -120.1122334
}
},
"captureTime": "2022-12-05T06:02:34Z",
"thumbnailUrl": "https://lh3.googleusercontent.com/p/ogtBgwKGjqqpDuUnuicCcFZZor7apQ7jKCQtnQvG",
"shareLink": "https://www.google.com/maps/@0,0,0a,90y,90t/data=!3m4!1e1!3m2!cCqKpcfdGC2S5G44BY6R2bfvKV9gmijdJL3gw4kz!2e10",
"mapsPublishStatus": "PUBLISHED",
"uploadTime": "2023-05-12T10:58:48Z"
}
是的,根据另一个答案,您仍然可以使用街景发布 API 在任意 GPS 位置上传个人光球图像。
这是 C# 中的一个粗略示例,它使用
Google.Apis.StreetViewPublish.v1
和 Google.Protobuf
nuget 包。它进行与其他答案相同的三个 API 调用,但首先根据 client_secret.json 文件设置凭据。
using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
using Google.Apis.StreetViewPublish.v1;
using Google.Apis.StreetViewPublish.v1.Data;
namespace PhotosphereUploader
{
public static class Example
{
public static void Main()
{
var secretsPath = @"C:\path\to\client_secret.json";
var filePath = @"C:\path\to\photosphere.jpg";
// Authenticate to API
var secrets = GoogleClientSecrets.FromFile(secretsPath);
var scopes = new[] { StreetViewPublishService.Scope.Streetviewpublish };
var credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
secrets.Secrets,
scopes,
"username",
CancellationToken.None
).Result;
var service = new StreetViewPublishService(new BaseClientService.Initializer
{
HttpClientInitializer = credential,
ApplicationName = "Street View upload example"
});
// Make the first API call to get UploadUrl
var uploadUrl = service.Photo.StartUpload(null).Execute().UploadUrl;
// Send the image bytes to UploadUrl
var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + credential.Token.AccessToken);
var content = new StreamContent(File.Open(filePath, FileMode.Open));
client.PostAsync(uploadUrl, content).Wait();
// Now set (empty) image metadata, Google will read metadata from EXIF tags
var uploadRequest = new Photo
{
UploadReference = new UploadRef { UploadUrl = uploadUrl }
};
var result = service.Photo.Create(uploadRequest).Execute();
// JSON response contains URL to find your photosphere in Google Maps
Console.WriteLine(result);
}
}
}