API Карт Bing - mapArea: значение этого параметра выходит за пределы диапазона

Я использую API Карт Bing для генерации изображений из определенных мест с помощью пакета NuFet BotFramework-Location. (Какой код можно найти здесь)

Иногда это работает, но иногда изображения не загружаются из-за ошибки в вызове Rest (который вызывается BotFramework, а не мной)

Это мой код:

IGeoSpatialService geoService = new AzureMapsSpatialService(this.azureApiKey);
List < Location > concreteLocations = new List < Location > ();

foreach(String location in locations) {
 LocationSet locationSet = await geoService.GetLocationsByQueryAsync(location);
 concreteLocations.AddRange(locationSet ? .Locations);
}

// Filter out duplicates
var seenKeys = new HashSet < String > ();
var uniqueLocations = new List < Location > ();

foreach(Location location in concreteLocations) {
 if (seenKeys.Add(location.Address.AddressLine)) {
  uniqueLocations.Add(location);
 }
}

concreteLocations = new List < Location > (uniqueLocations.Take(5));

if (concreteLocations.Count == 0) {
 await context.PostAsync("No dealers found.");
 context.Done(true);
} else {
 var locationsCardReply = context.MakeMessage();
 locationsCardReply.Attachments = new LocationCardBuilder(this.bingApiKey, new LocationResourceManager()).CreateHeroCards(concreteLocations).Select(card => card.ToAttachment()).ToList();
 locationsCardReply.AttachmentLayout = AttachmentLayoutTypes.Carousel;
 await context.PostAsync(locationsCardReply);
}

Что отвечает на это: Карта местоположения HeroCard возвращается пакетом BotFramework-Location NuGet

Причина, по которой отображаются не все изображения, заключается в том, что вызов Rest для API Bing Maps возвращает следующее:

mapArea: значение этого параметра выходит за пределы диапазона.

Вот одно из изображений, которое не удалось (я удалил свой ключ):

https://dev.virtualearth.net/REST/V1/Imagery/Map/Road?form=BTCTRL&mapArea=49.5737,5.53792,49.57348,5.53744&mapSize=500,280&pp=49.5737,5.53744;1;1&dpi=1&logo=always&key=NOT_REAL_12758FDLKJLDKJO8769KLJDLKJF

Кто-нибудь знает, что я делаю не так?

1 ответ

Я думаю, я понял, почему вы получили эту ошибку. Я попытался получить эту карту и получил тот же результат, что и вы, как вы сказали:

mapArea: значение этого параметра выходит за пределы диапазона.

Если вы посмотрите на образец URL, который вы предоставили, то mapArea равно 49.5737,5.53792,49.57348,5.53744

Так что я просто инвертировал координаты 2 точек, определяющих эту область, поместив сначала точку с меньшей широтой, я получил ответ:

Изображение с карты

РЕДАКТИРОВАТЬ:

Как вы прокомментировали, этот звонок делается внутри BotBuilder-Location код, не на вашем. Я посмотрел на это, это метод для генерации карты, вызываемой внутри LocationCardBuilder класс, который вы создаете:

public string GetLocationMapImageUrl(Location location, int? index = null)
{
    if (location == null)
    {
        throw new ArgumentNullException(nameof(location));
    }

    var point = location.Point;
    if (point == null)
    {
        throw new ArgumentNullException(nameof(point));
    }

    if (location.BoundaryBox != null && location.BoundaryBox.Count >= 4)
    {
        return string.Format(
            CultureInfo.InvariantCulture,
            ImageUrlByBBox,
            location.BoundaryBox[0],
            location.BoundaryBox[1],
            location.BoundaryBox[2],
            location.BoundaryBox[3],
            point.Coordinates[0],
            point.Coordinates[1], 
            index, 
            this.apiKey);
    }
    else
    {
        return string.Format(
            CultureInfo.InvariantCulture, 
            ImageUrlByPoint, 
            point.Coordinates[0], 
            point.Coordinates[1], 
            index, 
            apiKey);
    }
}

Как видите, нет ограничений на формат элемента BoundaryBox. Но если вы посмотрите документацию о данных о местоположении здесь:

BoundingBox: географическая область, которая содержит местоположение. Ограничительная рамка содержит значения SouthLatitude, WestLongitude, NorthLatitude и EastLongitude в единицах градусов.

Как вы, возможно, знаете, в коде SouthLatitude меньше, чем NorthLatitude (поскольку он выражается положительными и отрицательными значениями в коде в зависимости от местоположения по сравнению с Эквадором: 43N - 43, 43S - -43). Таким образом, проблема, кажется, здесь.

Я сделал быструю проверку, чтобы выяснить, не получил ли я сообщение об ошибке на вызове, который вы делаете до GetLocationsByQueryAsync), Я не смог воспроизвести этот случай. Можете ли вы поделиться запросом, который был связан с этой проблемой?

Другие вопросы по тегам