以编程方式上传街景全景图

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

我的 Android 手机相机有很多 360 度全景图,是在世界偏远地区拍摄的。我使用 Google 地图上现有的全景照片来计划我的旅行,并上传我的照片以帮助其他人做同样的事情。直到现在,我一直使用 Android 街景应用上传全景图,但该应用已于 2023 年 3 月停用

谷歌建议将街景工作室作为替代品,但只允许上传视频。您也可以通过 Google 地图应用程序上传照片,但这些照片必须与现有“地点”相关联,因此它们无法用于记录偏远的道路、山脉等

Google 让您可以制作“自定义街景”,但这看起来非常复杂。我已经在所需的分辨率和纵横比中准备好独立的 360 度照片文件,我不想在不同的缩放级别上乱七八糟地服务于我没有的单个图块。

有没有办法通过 Google API 继续上传光球 JPEG?

google-street-view 360-panorama photography google-streetview-publish
2个回答
1
投票

这是使用 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"
}

0
投票

是的,根据另一个答案,您仍然可以使用街景发布 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);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.