2017-02-07 3 views
1

Мое приложение Codename One имеет MapContainer. Мне нужно показать интересующие объекты (POI), на которых координаты находятся на сервере. В будущем могут быть сотни (возможно, тысячи в будущем) таких POI на сервере. Вот почему я хотел бы только загрузить с сервера POI, которые могут быть показаны на карте. Следовательно, мне нужно получить границы карты, чтобы передать их на сервер.Как получить ограничительную рамку MapContainer в Codename One

Я прочитал this for Android и этот другой SO question for iOS, и ключ, похоже, получит карту проекции и ограничительную рамку. Однако метод getProjection() или getBoundingBox() не отображаются.

Решением может быть смешение координат от getCameraLocation(), который является центром карты, и getZoom(), чтобы вывести эти границы. Но это может варьироваться в зависимости от устройства (см. Показанную область может быть больше).

Как получить границы карты в Codename?

Любая помощь приветствуется,

Cheers,

ответ

1

Проблема заключается в javadocs для getCoordAtPosition(). Это будет исправлено. getCoordAtPosition() ожидает абсолютных координат, а не относительных.

например

Coord NE = currentMap.getCoordAtPosition(currentMap.getWidth(), 0); 
Coord SW = currentMap.getCoordAtPosition(0, currentMap.getHeight()); 

Должно быть

Coord NE = currentMap.getCoordAtPosition(currentMap.getAbsoluteX() + currentMap.getWidth(), currentMap.getAbsoluteY()); 
Coord SW = currentMap.getCoordAtPosition(currentMap.getAbsoluteX(), currentMap.getAbsoluteY() + currentMap.getHeight()); 

Я попытался это на координаты, которые вы указали, и она возвращает правильные результаты.

EDIT 21 марта 2017 года: Оказывается, что некоторые платформы ожидали относительных координат, а другие ожидали абсолютных координат. Я должен был стандартизировать его, и я решил использовать относительные координаты на всех платформах, чтобы они соответствовали Javadocs. Итак, ваша первая попытка:

Coord NE = currentMap.getCoordAtPosition(currentMap.getWidth(), 0); 
Coord SW = currentMap.getCoordAtPosition(0, currentMap.getHeight()); 

Теперь будет работать в последней версии библиотеки.

Я также добавил еще один способ: getBoundingBox(), который получит ограничительную рамку для вас, не беспокоясь об относительных/абсолютных координатах.

+0

Это замечательно! Спасибо, Стив! – HelloWorld

1

Это, вероятно, то, что может подвергаться легко разветвление проекта и предоставления запроса тянуть. В настоящее время мы работаем над обновлением компонента карты, поэтому сейчас самое подходящее время для внесения изменений и добавления функций.

+0

Вы имеете в виду 'MapComponent' из' package com.codename1.maps' или 'MapContainer'. Первый не объявляет объект «Projection» или «BoundingBox», и я не могу найти источники «MapContainer». Не могли бы вы направить меня дальше? – HelloWorld

+0

'MapContainer' является частью родных карт cn1lib, который [здесь] (https://github.com/codenameone/codenameone-google-maps). Поскольку он реализован как cn1lib, вы также можете легко редактировать собственный код, который иногда менее интуитивно понятен в Codename One. Это также не так рискованно. –

+0

Спасибо @Shai. Между тем для той же цели я попробовал что-то с 'getCoordAtPosition', примененным к MapContainer, но я не понимаю результатов. Центр карты находится на (** Lat: 48.8574; Lon: 2.0654 **), и я попробовал '// Получить границы карты ' Координат NE = currentMap.getCoordAtPosition (currentMap.getWidth(), 0); Координата SW = currentMap.getCoordAtPosition (0, currentMap.getHeight()); ' В симуляторе я получаю ** Lat SW = 48.8584 lat NE = 48.8612 ** _ (NOK, потому что и lat> центр карты lat) _ ** Lon SW = 2.0625 lon NE = 2.0679 ** _ (OK) _. Почему SW широта неправильно? – HelloWorld

Смежные вопросы