Bing Maps API - mapArea: значение этого параметра вне допустимого диапазона

Я использую Bing Maps API для создания изображений из определенных мест с помощью пакета NuGet 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);
}

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

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

mapArea: значение этого параметра вне допустимого диапазона.

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

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&lo=всегда&ключ=NOT_REAL_12758FDLKJLDKJO8769KLJDLKJF

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


person Titulum    schedule 27.07.2018    source источник
comment
Можете ли вы также предоставить информацию, которую вы передали, чтобы получить этот рабочий пример, который вы показали? Я хотел бы изучить репо, чтобы узнать, есть ли что-то с этой стороны. Я думаю, что для вашего 1-го элемента он использует другой метод для создания изображения, поэтому проблема   -  person Nicolas R    schedule 27.07.2018


Ответы (1)


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

mapArea: значение этого параметра вне допустимого диапазона.

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

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

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

ИЗМЕНИТЬ:

Как вы прокомментировали, этот вызов выполняется внутри 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), мне не удалось воспроизвести этот случай. Не могли бы вы поделиться своим запросом, связанным с этой проблемой?

person Nicolas R    schedule 27.07.2018
comment
это шаг в правильном направлении. К сожалению, я не сгенерировал URL-адрес изображения. Он был предоставлен Bing Maps API, что означало бы, что это вне моего контроля. Кроме того, изображение должно быть сгенерировано таким образом, чтобы синий маркер был по центру, что означает, что API Карт Bing выполнил какие-то неправильные вычисления или что-то в этом роде. Спасибо, в любом случае! - person Titulum; 27.07.2018
comment
поскольку код имеет открытый исходный код, не стесняйтесь поднимать вопрос на github и даже предлагать решение, если можете - person Nicolas R; 27.07.2018
comment
Я отредактировал свой ответ, чтобы уточнить детали. Посмотрел код репо, вроде нормально. Можете ли вы поделиться locations контентом, который запрашиваете? - person Nicolas R; 27.07.2018
comment
Запросы - это адреса внизу карточек. - person Titulum; 27.07.2018