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);
}
Причина, по которой отображаются не все изображения, заключается в том, что вызов Rest для API Bing Maps возвращает следующее:
mapArea: значение этого параметра выходит за пределы диапазона.
Вот одно из изображений, которое не удалось (я удалил свой ключ):
Кто-нибудь знает, что я делаю не так?
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
), Я не смог воспроизвести этот случай. Можете ли вы поделиться запросом, который был связан с этой проблемой?