Путь с указателями направления на карте с использованием Yandex Map Kit для Android
Загружаем архив с библиотекой отсюда и получаем API-ключ.
Создаем проект в Eclipse, копируем с заменой папки \yandexmapkit-library\res и \yandexmapkit-library\libs из загруженного архива в папку нашего проекта.
В настройках проекта добавляем ссылку на yandexmapkit-android.jar из папки libs нашего проекта (Build Path->Configure Buil Path->Libraries->Add External JARs)
Добавляем разрешения в манифест нашего проекта
Изменяем разметку activity
2. Создание расширения для класса Overlay с целью вывода на карту пути с указателями направления и обработки событий «onClick» по карте
Чтобы нарисовать путь, нам потребуется расширить класс OverlayIRender, который реализует интерфейс IRender
public class MyOverlayIRender extends OverlayIRender < Overlay mOverlay; public MyOverlayIRender(Overlay overlay) < super(); mOverlay = overlay; >@Override public void draw(Canvas canvas, OverlayItem arg1) < super.draw(canvas, arg1); Listoi = mOverlay.getOverlayItems(); if (oi.size() < 2) return; Paint mPaint = new Paint(); mPaint.setDither(true); mPaint.setColor(Color.RED); mPaint.setStyle(Paint.Style.FILL_AND_STROKE); mPaint.setStrokeJoin(Paint.Join.ROUND); mPaint.setStrokeCap(Paint.Cap.ROUND); mPaint.setStrokeWidth(2); mPaint.setAntiAlias(true); for (int i = 0; i < oi.size() - 1; i++) < Path path = new Path(); ScreenPoint p1 = mOverlay.getMapController().getScreenPoint( oi.get(i).getGeoPoint()); ScreenPoint p2 = mOverlay.getMapController().getScreenPoint( oi.get(i + 1).getGeoPoint()); float angle = (float) (Math.atan2(p2.getY() - p1.getY(), p2.getX()- p1.getX()) * 180 / 3.14); path.moveTo(p2.getX(), p2.getY()); path.lineTo(p1.getX(), p1.getY()); canvas.drawPath(path, mPaint); canvas.save(); canvas.rotate(angle + 90, p2.getX(), p2.getY()); Path path2 = new Path(); path2.moveTo(p2.getX(), p2.getY()); path2.lineTo(p2.getX() + 5, p2.getY() + 8.66f); path2.lineTo(p2.getX() - 5, p2.getY() + 8.66f); path2.close(); canvas.drawPath(path2, mPaint); canvas.restore(); >> >
Если количество точек добавленных в наш путь больше 1, то в цикле отрисовываются отрезки пути и стрелки направления.
Теперь нужно создать наследника Overlay MyPathOverLay, назначить ему MyOverlayIRender для отрисовки.
public class MyPathOverLay extends Overlay < MapView mMmapView; public MyPathOverLay(MapController arg0, MapView mapView) < super(arg0); mMmapView = mapView; this.setIRender(new MyOverlayIRender(this)); >@Override public int compareTo(Object arg0) < return 0; >@Override public boolean onLongPress(float x, float y) < OverlayItem m = new OverlayItem( this.c.getGeoPoint(new ScreenPoint(x, y)), BitmapFactory.decodeResource( this.c.getContext().getResources(), R.drawable.flag2leftred)); m.setOffsetY(-23); this.addOverlayItem(m); this.c.setPositionNoAnimationTo(this.c .getGeoPoint(new ScreenPoint(x, y))); return true; >>
В переопределенном методе onLongPress будем добавлять промежуточные точки для нашего пути долгим нажатием на карту.
R.drawable.flag2leftred — картинка для точки,
m.setOffsetY(-23); — смещение, которое нужно подобрать, если нужно сместить картинку относительно точки нажатия на карту, по-умолчанию центр картинки совмещается с точкой нажатия.
Осталось добавить наш Overlay на карту и протестировать
public class BlogYandexActivity extends Activity < @Override public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.main); MapView mMap = (MapView) findViewById(R.id.map); MapController mMapController = mMap.getMapController(); OverlayManager mOverlayManager = mMapController.getOverlayManager(); mOverlayManager.addOverlay(new MyPathOverLay(mMapController, mMap)); mMap.showBuiltInScreenButtons(true); mOverlayManager.getMyLocation().setEnabled(false); >>
- Android разработка
- Yandex Map Kit
- direction arrow
- onclick
- onlongpress
- overlay
- pathoverlay
- нажатие на карту
- путь на карте
- стрелки направления
Yandex Map Kit android
А надо-то всего, чтобы запустить пример, согласно официальному сайту:
«Данные проекты уже настроены для работы в среде Eclipse
Импортируйте данные проекты в среду Eclipse
Проверьте в настройках проекта yandexmapkit-library в пункте Android что установлена «is Library»
Проверьте в настройках проекта yandexmapkit-sample в пункте Android что есть зависимость от проекта yandexmapkit-library
Подставьте свой API ключ во все layout где используется объект MapView»
Делаю все по пунктам. Правда, не могу найти пункт Android, чтобы поставить «is Library». Может, еще что-то надо. Вообщем, в проекте вылезает огромное количество ошибок. Eclipse не видит библиотеку и пробный проект как приложение android — только как обычное приложение.
Может, кто сталкивался с такой проблемой. Подскажите, пожалуйста.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Yandex map kit
Здравствуйте. Использую в своем приложении yandex map kit. Если работает GPS, то на карте.
Приложение с Yandex Map Kit
Ребят посмотрите, закукунился уже) Не работает и все) 3 дня уже мучаюсь) Проект во вложении)
Добавление «балуна» в Yandex Map Kit
Здравствуйте. Пытаюсь используя сэмплы Yandex Map Kit сделать добавление балуна по нажатию кнопки.
Yandex MapKit на Android Studio
Здравствуйте, импортировал библиотеку карт в проект, на эмуляторе все отлично работает, но на.
106 / 106 / 1
Регистрация: 09.04.2012
Сообщений: 655
Сообщение от ivanp1
Никто так и не поможет запустить простое приложение с картой?
А вы там что-то новое внесли? если буду какие-то существенные изменения, то можете в личку кидать apk, я у себя на реальном устройстве проверю
Регистрация: 11.05.2013
Сообщений: 19
Вот приложение, которое я делаю, и в котором я хочу использовать карты. Отчаявшись подключить карту Яндекс, я стал пробовать пользоваться картой Google
Здесь брал пример, Google Map API загрузил, ключ есть, все прописал, как в документации:
https://developers.google.com/. lo-mapview
Карту в моем приложении находим так: «Продолжить»->»Найти место».
Пример из документации выводит карту и отметку на карте. Видно, что все работает (видны кнопки зума, надпись Google, сама отметка на карте видна), но вместо карты загружаются клеточки.
подключение к Интернету есть, где-то вычитал, что Google Map API со второй версии требует установленных Карты Google и Google Play Services — все это есть.
В чем может быть проблема?
Вот как выглядит страница с картой на фото, папка с проектом. Приложение требует существования на SDcard вашего телефона папки Folder с файлом file.txt (но это для тех кто хочет посмотреть работу приложения, а к карте это не имеет никакого отношения)
Вложения
Favmap.7z (1.07 Мб, 9 просмотров) |
file.txt (1.4 Кб, 8 просмотров) |
Регистрация: 11.05.2013
Сообщений: 19
Да, и у меня класс marker не опознает. Marker нет в последней версии? Вместо него используется ItemOverlay?
Я хочу сделать такую вещь: когда добавляю новое место , то по нажатию на определенное место на карте, marker будет отмечать это место, запоминать координаты и записывать их файл. собственно как по нажатию на карту определить ее координаты? Подкиньте статьи, где прочитать.
Добавлено через 1 час 22 минуты
Тоже самое с MapFragment — нет в 3-ей версии.
С геокодированием нашел много, но все на javascript.
Добавлено через 1 час 4 минуты
С геокодированием разобрался, больше это не вопрос, сейчас подумаю только как сразу отмечать на карте место и тут же получать его координаты.
Вопрос тот же: как убрать клеточки и какую магию сделать, чтобы вместо них наконец-то появилась карта.
Добавлено через 5 часов 28 минут
Понял и причину клеточек вместо карты — приложение не подписано, но никак не могу его подписать. Пароли надо вводить, а я не знаю, какие.
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
если все также как и в гугл мапс, то нужно на их сайте зарегаться, получить ключ и вставить в свое приложение.
Регистрация: 11.05.2013
Сообщений: 19
Все ссылаются, что подписать приложение надо здесь
Как-то не понимаю, как
Добавлено через 2 минуты
Я про Гугл мапс и говорю. Ключ есть, точнее MD5, который как апикей прописывается в xml файле. Вопрос как зарегистрировать его. Все ссылаются на ссылку выше , но там ничего нет, по этой ссылке не зарегистрироваться.
Как тогда?
Добавлено через 12 минут
Ключ получил, как здесь
http://ondroid.info/poluchenie. s-api-key/
Но регистрации там нет. И не могу найти, где она. Киньте ссылку, пожалуйста.
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
в начале разговор ведь шел про Yandex Map.
если получили ключ, то регистрация уже не нужна, а куда его вставлять написано ведь по второй ссылке.
Добавлено через 3 минуты
внизу скриншот есть.
106 / 106 / 1
Регистрация: 09.04.2012
Сообщений: 655
Сообщение от ivanp1
Здесь брал пример, Google Map API загрузил, ключ есть, все прописал, как в документации:
По той ссылке, что вы привели там карты Гугл версии 1, они уже «устарели».
Если вместо карты просто клеточки, то это не верный ключ.
Здесь http://forum.startandroid.ru/v. =31&t=1535 на русском написано как получить ключ к картам версии 2.
Регистрация: 26.05.2013
Сообщений: 160
весь тред не читал.
чтобы заработало view карт надо подключить jarник classes к вашему проекту.
а у меня другой вопрос, мне надо получить гео точку по адресу — так как апи яндекс карт этого не умеют (а гугловские имеют и они намного удобнее, но использовать к сожалению надо именно их), необходимо сделать это другим путем. нашел следующее: http://api.yandex.ru/maps/doc/. /About.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
public class MapUtils { public static String getXmlFromUrl(String url) { // Making HTTP request InputStream is; try { DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); } catch (IOException e) { e.printStackTrace(); return null; } try { BufferedReader reader = new BufferedReader(new InputStreamReader( is, "iso-8859-1"), 10); StringBuilder sb = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { sb.append(line).append("\n"); } String xml = sb.toString(); is.close(); return xml; } catch (Exception e) { Log.e("Buffer Error", "Error converting result " + e.toString()); return null; } } }
Но при любом урле, даже из примеров, я получаю ошибку «missing geocoder parameter».
Кто разбирался с данной темой?
Из браузера стабильно работает, получаю и json и xml.
Добавлено через 8 минут
Решил вопрос 🙂
Правильный код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
public class MapUtils { public static String getXmlFromUrl(String url) { // Making HTTP request HttpClient client = new DefaultHttpClient(); // Perform a GET request for a JSON list HttpUriRequest request = new HttpGet(url); // Get the response that sends back InputStream is; try { HttpResponse response = client.execute(request); HttpEntity entity = response.getEntity(); is = entity.getContent(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); return null; } try { BufferedReader reader = new BufferedReader(new InputStreamReader( is, "iso-8859-1"), 10); StringBuilder sb = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { sb.append(line).append("\n"); } String xml = sb.toString(); is.close(); return xml; } catch (Exception e) { Log.e("Buffer Error", "Error converting result " + e.toString()); return null; } } }
Ещё о прошивке магнитолы и оффлайн-картах в Я.Навигаторе
Езжу с прошивкой уже с 13 мая, в целом прошивкой доволен, прошивка — компромисс, как я и писал из прошлого поста. Но, функционал приличный, что ещё кстати можно сделать благодаря прошивке:
1. Полностью отключить систему Start/Stop при запуске двигателя.
2. Сделать кнопку паузы на качельке громкости на руле.
3. Автоматическое открытие шторки панорамной крыши при запуске двигателя.
Мелочи а приятно, для многих я думаю это будет удобно! Собственно это я и сделал. Ещё попробовал приложение 7Fon для смены фонов рабочего стола. Тоже круто!
Но сейчас снова коснёмся негативных моментов, и для кого-то важных, скорее всего. Но! Весь этот негатив можно решить очень просто, приложив несколько усилий. Этим мы и займемся.
А речь у нас пойдет про оффлайн-карты в Яндекс Навигаторе, дело в том, что версия которая у нас стабильно работает и без вылетов, это версия 3.6.8, она старая — 2019 года, но в целом жить с ней можно, но есть негативный момент в том, что она НЕ скачивает оффлайн-карты, просто вылетает! Да, кто-то скажет: да кому они нужны? кругом интернет и т.д. и т.п. Но он будет не прав в том, что иногда ты можешь ехать по непонятной трассе или жить где-то в посёлке, где с сетью могут быть достаточно серьёзные проблемы, и ландшафт на экране в один неподходящий момент просто закончится, и это доставит сильные неудобства и приведёт нас в полную «небоеготовность», но в этом не наш смысл и не наша стратегия!
Поэтому, посидев подумав как можно решить проблему с оффлайн-картами, пришёл к выводу что решать ее нужно с помощью эмулятора Андроид на ПК и флешки. Почему использую эмулятор? Потому что Android 13 на телефоне уже не поддерживает эту версию яндекс навигатора… Приходится делать через него.
Что нам нужно для скачивания оффлайн-карт во внутреннюю память магнитолы, да ещё так, чтобы Яндекс Навигатор их видел?
1) Компьютер под Windows или macOS.
2) Эмулятор Android — BlueStacks
3) .APK-файл установщик Яндекс Навигатора версии 3.6.8 *тыц*
4) Съемный накопитель (флешка) на 4+ ГБ.
— Для чего делать такой путь? Можно же просто перетащить карты с мобилки на Андроиде и вуаля!
— Да вот тут то не задача, в старых версиях Яндекс Навигатора путь к картам и их название совершенно другое, и отличается от новых версий, если их приложить в папки то ничего не произойдет! Приложение их просто не увидит.
Поэтому, для исследования пути, нам и нужен такой гемор, и чтобы правильно выгрузить карты и загрузить их на накопитель, а потом уже через Root Explorer забросить в папку где хранит данные навигатор.
И так, скачиваем и устанавливаем BlueStacks.
После его установки, запускаем его, либо запускаем скачанный .apk файл и ждём пока он установится. Затем уже открываем Яндекс Навигатор.
Дальше, идём в меню с тремя черточками, находим там пункт — Загрузка карт.
Вбиваем нужные вам города и скачиваем их.
После скачивания карт, можно закрыть яндекс навигатор.
Дальше, открываем проводник, который в папке на рабочем столе Bluestacks
Общий путь который нам нужен в блюстаксе: /sdcard/Android/data/ru.yandex.yandexnavi/files/mapkit
В этих папках как раз и хранятся наши скачанные только что карты, их нам нужно переместить изначально на рабочий стол компа.
Так как, проводник этот в Блюстаксе какой-то кривой и кастрированный, папки копировать он не умеет, то получается нужно копировать из каждой папки всё пофайлово. Так что, создаем папки так же как в Bluestacks, и копируем все в точности.
Сравниваем потом все папки и каждый файл, чтобы все было 1:1.
Затем можно все закрывать, и доставать флешку, и копировать папку mapkit на неё.
Далее, идём в машину.
Подключаем флешку со скопированной папкой, и открываем Root Explorer.
Там, идём по тому же самому пути, только в меню выберите — Закладки — Память. И у Вас откроется окно с папками плюс-минус похожее как в блюстаксе.
В первом диалоговом окне идём вот по этому пути: /Android/data/ru.yandex.yandexnavi/files/
И так же, во втором диалоговом окне находим на флешке папку mapkit, выделяем и нажимаем Копировать.
И соответственно копируем её в /Android/data/ru.yandex.yandexnavi/files/.
И в целом всё, останется лишь открыть Яндекс Навигатор, выбрать Меню — Настройки — Сохраненные данные и указать что папка хранения карт — Карта памяти.
И в целом всё, потом у нас появятся загруженные карты, которые работают без наличия интернета!
Если кто-то найдёт способ проще, только поприветствую! Я думаю многим будет эта информация очень и очень полезна!
Где хранятся карты в Яндекс навигаторе и как перенести их на SD карту памяти
2. Переходим в настройки.
3. Прокручиваем страницу до расширенных настроек, далее переходим в пункт «Сохранённые данные».
4. Здесь выбираем пункт «Папка для карт».
5. В открывшемся окне «Где сохранять карты», выбираем «На карте памяти».
6. Ждём окончания перемещения карт, на SD карту.
- ВКонтакте
- Telegram
- Одноклассники