Страницы

Поиск по вопросам

Показаны сообщения с ярлыком google-maps-api. Показать все сообщения
Показаны сообщения с ярлыком google-maps-api. Показать все сообщения

понедельник, 30 марта 2020 г.

Как получить координаты draggable метки в Google Maps Android API v2?

#android #google_maps_api


На карте находятся несколько draggable меток. Как можно получить новые  координаты
метки, после того, как она была передвинута пользователем?
    


Ответы

Ответ 1



Все просто: OnMarkerDragListener в помощь. [Ваш маркер].draggable(true); googleMap.setOnMarkerDragListener(new OnMarkerDragListener() { @Override public void onMarkerDragStart(Marker marker) { //взять координаты до перемещения } @Override public void onMarkerDragEnd(Marker marker) { //взять координаты после перемещения LatLng pos = marker.getPosition(); marker.setSnippet(pos.latitude + "," + pos.longitude); marker.showInfoWindow(); } @Override public void onMarkerDrag(Marker marker) { //брать координаты во время перемещения } });

воскресенье, 15 марта 2020 г.

Android Google Map v2 нарисовать маршрут

#java #android #google_maps_api #android_fragment #google_maps


У меня есть Google Map fragment:




Мое местоположение получаю вот так:

private void getMyLocation() {
    LatLng latLng = new LatLng(mMap.getMyLocation().getLatitude(), mMap.getMyLocation().getLongitude());
    CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLng, 16);
    mMap.animateCamera(cameraUpdate);
}


Нужно показать маршрут к заданным координатам, как на фото:

    


Ответы

Ответ 1



Помогла данная библиотека. Мой код: Route supportRoute = new Route(); LatLng source = new LatLng(mMap.getMyLocation().getLatitude(), mMap.getMyLocation().getLongitude()); LatLng dest= new LatLng(destLat, destLog); supportRoute.drawRoute(mMap, MapsActivity.this, source, dest, true, "en");

Ответ 2



Как вариант использовать библиотеку Google-Directions-Android

пятница, 13 марта 2020 г.

Как получить координаты центра отображаемой Google-карты?

#google_maps_api #карты


При загрузке страницы на карте после определения геолокации (html5) появляется маркер.

Задача: после того, как он появился, при перетягивании карты он должен постоянно
быть в центре (т.е. карта перетаскивается, а этот маркер всё время остаётся в центре).
    


Ответы

Ответ 1



Вы можете вызвать: map.getCenter()это вернет вам объект содержаний Lon,Lat. А вот так можно получить координаты по нажатию правой кнопки мыши: google.maps.event.addListener(map, "rightclick", function(event) { var lat = event.latLng.lat(); var lng = event.latLng.lng(); ... });

Ответ 2



google.maps.event.addListener(map, "dragend", function(event) { var g = map.getCenter(); $('#lat').html(g.lat()); $('#long').html(g.lng()); coords = new google.maps.LatLng(g.lat(), g.lng()); marker.setPosition(g); }); Вот так все работает!))) Спасибо!

понедельник, 24 февраля 2020 г.

Почему не отображается карта гугл сайте

#javascript #jquery #google_maps_api


Почему не отображается карта гугл на сайте хотя на denwer все работает отлично 
    


Ответы

Ответ 1



Вы не указали API ключ при подключении API Про ключ можете узнать здесь: https://developers.google.com/maps/documentation/javascript/get-api-key

воскресенье, 16 февраля 2020 г.

Почему не отображается карта гугл сайте

#javascript #jquery #google_maps_api


Почему не отображается карта гугл на сайте хотя на denwer все работает отлично 
    


Ответы

Ответ 1



Вы не указали API ключ при подключении API Про ключ можете узнать здесь: https://developers.google.com/maps/documentation/javascript/get-api-key

четверг, 13 февраля 2020 г.

Координаты областей РФ

#геолокация #google_maps_api #google #geocoding


Заметил у Гугла очень нужную штуку - он знает координаты границ практически всех
областей/городов РФ.
Но, увы, выдрать оттуда их нельзя - границы рисуюися прям на картинках, а времени
(да и желания) парсить картинки нет.
Скажите, есть ли какое-то общедоступный справочник полигонов областей-городов РФ?    


Ответы

Ответ 1



Вот тут гляньте: Свободные данные по границам субъектов РФ и тут: Данные OpenStreetMap в форматах XML и PBF - если вы умеете работать с *.osm файлами, то для вас не составит труда вытащить нужные отношения. Подробная информация... UPD: Вот ещё есть глобальная база данных по границам. Там данные различного уровня детализации по административным и государственным границам в разных форматах (включая Google Earth kml).

Ответ 2



Если кому-то требуются координаты в формате JSON, есть готовый на GitHubGist (сервис обмена фрагментами кода). Разумеется, там огромное кол-во строк и привести здесь не представляется разумным.

пятница, 24 января 2020 г.

Приложение вылетает с NullPointerException при переходе на MapFragment на эмуляторе

#android #android_studio #google_maps_api


Возникла необходимость интегрировать в проект карты google, накидал по руководству
google MapFragment, до этого с картами google дел не имел, проверил вчера на телефоне(Samsung
Galaxy S4) - фрагмент открывается и корректно отображает карту. GoogleMaps API на сайте
google активирован, ключ Api в манифесте прописан. Activity, в котором запускаются
фрагменты, наследуется от AppCompatActivity. При попытке перехода на фрагмент с картой
на встроенном в студию эмуляторе(Nexus 4 21 API(with GoogleAPIs) и Nexus 4 23 API(with
GoogleAPIs), приложение вылетает. 

Вопрос: Что можно предпринять, чтобы фрагмент с картами корректно запускался и отображал
карты на эмуляторе?

Прилагаю стактрейс ошибки, полный код фрагмента, и частично лэйаут, манифест и Build.gradle.

Cтактрейс ошибки:

12-07 11:15:09.290 2318-2318/xx.xxx.xxx W/GooglePlayServicesUtil: Google Play services
out of date.  Requires 8298000 but found 8185480
12-07 11:15:09.290 2318-2318/xx.xxx.xxx W/GooglePlayServicesUtil: Google Play services
out of date.  Requires 8298000 but found 8185480
12-07 11:15:09.290 2318-2318/xx.xxx.xxx W/GooglePlayServicesUtil: Google Play services
out of date.  Requires 8298000 but found 8185480
12-07 11:15:09.290 2318-2318/xx.xxx.xxx W/GooglePlayServicesUtil: Google Play services
out of date.  Requires 8298000 but found 8185480
12-07 11:15:09.290 2318-2318/xx.xxx.xxx W/GooglePlayServicesUtil: Google Play services
out of date.  Requires 8298000 but found 8185480
12-07 11:15:09.290 2318-2318/xx.xxx.xxx W/GooglePlayServicesUtil: Google Play services
out of date.  Requires 8298000 but found 8185480
12-07 11:15:09.300 2318-2318/xx.xxx.xxx W/GooglePlayServicesUtil: Google Play services
out of date.  Requires 8298000 but found 8185480
12-07 11:15:09.300 2318-2318/xx.xxx.xxx W/GooglePlayServicesUtil: Google Play services
out of date.  Requires 8298000 but found 8185480
12-07 11:15:09.300 2318-2318/xx.xxx.xxx W/GooglePlayServicesUtil: Google Play services
out of date.  Requires 8298000 but found 8185480
12-07 11:15:09.320 2318-2318/xx.xxx.xxx D/AndroidRuntime: Shutting down VM
12-07 11:15:09.320 2318-2318/xx.xxx.xxx E/ACRA: ACRA caught a NullPointerException
for xx.xxx.xxx
                                                        java.lang.NullPointerException:
Attempt to invoke virtual method 'void com.google.android.gms.maps.MapFragment.getMapAsync(com.google.android.gms.maps.OnMapReadyCallback)'
on a null object reference
                                                            at xx.xxx.xxx.courier.OrdersFragmentMap.onCreateView(OrdersFragmentMap.java:45)
                                                            at android.app.Fragment.performCreateView(Fragment.java:2220)
                                                            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:973)
                                                            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148)
                                                            at android.app.BackStackRecord.run(BackStackRecord.java:793)
                                                            at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535)
                                                            at android.app.FragmentManagerImpl$1.run(FragmentManager.java:482)
                                                            at android.os.Handler.handleCallback(Handler.java:739)
                                                            at android.os.Handler.dispatchMessage(Handler.java:95)
                                                            at android.os.Looper.loop(Looper.java:148)
                                                            at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                            at java.lang.reflect.Method.invoke(Native
Method)
                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)




Код фрагмента с картами:

package xx.xxx.xxx.courier;
import android.os.Bundle;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import xx.xxx.xxx.R;

public class OrdersFragmentMap extends Fragment implements OnMapReadyCallback {

    public static OrdersFragmentMap newInstance() { return  new OrdersFragmentMap(); }

    public OrdersFragmentMap() {  }

    @Override
    public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
savedInstanceState) {
        View view = inflater.inflate(R.layout.courier_fragment_map, container, false);
        MapFragment mapFragment = (MapFragment) getFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
        return view;
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        LatLng sydney = new LatLng(-33.867, 151.506);

        googleMap.setMyLocationEnabled(true);
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 13));

        googleMap.addMarker(new MarkerOptions().title("Sydney").snippet(
                "The most populous city in Australia.").position(sydney));

    }

    @Override
    public void onResume() {
        super.onResume();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
    }
}


Лэйаут, содержащий MapFragment(фрагмент):



    
   



Манифест(фрагмент):




    
    
    
    
    
    
    
    
    

 
    

    
        
        
        

         

    



Build.gradle(фпагмент): 

dependencies {
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
    compile 'com.android.support:support-v4:23.1.1'
    compile 'com.nbsp:library:1.01'
    compile 'info.hoang8f:android-segmented:1.0.6'
    compile 'ch.acra:acra:4.7.0-RC.3'
    compile 'com.google.android.gms:play-services-maps:8.3.0'
    compile 'com.google.android.gms:play-services-ads:8.3.0'
    compile 'com.google.android.gms:play-services-auth:8.3.0'
    compile 'com.google.android.gms:play-services-gcm:8.3.0'
    compile 'com.google.android.gms:play-services:8.3.0'
}

    


Ответы

Ответ 1



Решил проблему следующим образом. Во-первых изменил код класса фрагмента, чтобы приложение не вылетало на версиях API 21 и выше: public class OrdersFragmentMap extends Fragment implements OnMapReadyCallback, LoaderManager.LoaderCallbacks { ArrayList freeOrders = new ArrayList<>(); ArrayList myOrders = new ArrayList<>(); private FragmentActivity myContext; public static OrdersFragmentMap newInstance() { return new OrdersFragmentMap(); } public OrdersFragmentMap() { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.courier_fragment_map, container, false); FragmentManager fm = myContext.getSupportFragmentManager(); SupportMapFragment mapFragment = SupportMapFragment.newInstance(); fm.beginTransaction().replace(R.id.map, mapFragment).commit(); mapFragment.getMapAsync(this); return view; } @Override public void onMapReady(GoogleMap googleMap) { LatLng sydney = new LatLng(-33.867, 151.506); googleMap.setMyLocationEnabled(true); googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 13)); googleMap.addMarker(new MarkerOptions().title("Sydney").snippet( "The most populous city in Australia.").position(sydney)); } @Override public void onResume() { super.onResume(); } @Override public void onDestroy() { super.onDestroy(); } @Override public void onLowMemory() { super.onLowMemory(); } @Override public void onAttach(Activity activity) { myContext=(FragmentActivity) activity; super.onAttach(activity); Метод onAttach() является устаревшим и я использую его временно только для того, чтобы запустить android.support.v4.app.FragmentManager в AppCompatActivity. Во-вторых создал шаблон MapActivity, для этого в корне проекта щелкнуть правой клавишей мыши, выбрать new>Google>GoogleMapsActivity. Из трех созданных файлов оставил только res/values/google_maps_api.xml(debug), скопировал из него ссылку для генерации ключа, которая находится в комментарии, перешел по ней в браузере, создал ключ и все заработало. Самое странное, что до этого вводил тот же фингерпринт и имя пакета. Такие вот дела. А на Galaxy S4 API работал, видимо, в обход защиты Google, так как запросов в консоли разработчика во время работы приложения не было.

Как получить ближайшие города использую google maps api?

#javascript #google_maps_api #google_maps #геолокация


Задача - получить все города в радиусе 50км от заданной точки используя google maps
js api

1) поиск мест поблизости, nearbySearch - при указании types: ['locality', 'administrative_area_level_3']
- возвращает только 2 города для каждого запроса, а надо получить ВСЕ города в радиусе.
В доке не нашел про это ничего вообще.
если тип не указывать и парсить ответ самому - приходит максимум 60 мест, которые
могут не включать в себя все города.

2) массовый поиск, radarSearch - нельзя указать городской тип, приходит 200 мест,
в которых опять же могут не попасть города, и для каждого места надо посылать запрос
с его place_id для определения город это или нет - это слишком накладно

3) сделал много меток, разместил их по границам вьюпорта карты и на некотором отдалении,
проверяю каждую геокодированием находится в городе или нет - опять проблема - гугл
не дает геокодировать больше 5 точек, только с перерывами в 2сек, это не подходит

подскажите что ещё можно попробовать
    


Ответы

Ответ 1



Примените в строке запроса radius=5000, примерно так: https://maps.googleapis.com/maps/api/place/radarsearch/json?location=48.859294,2.347589&radius=50&types=locality|administrative_area_level_3&key=zzzzzz

Как в Google Maps строить маршрут между точкой и областью?

#android #google_maps_api


Здравствуйте.
Задача: построить маршрут от точки до полигона на Картах Google.
Нашел информацию только о том, как построить маршрут между двумя точками, но с областью
есть нюанс: маршруты до неё могут быть разными в зависимости от того, какую её точку
считать конечной. Есть ли стандартный способ построения подобных маршрутов?
    


Ответы

Ответ 1



Без математики тут не обойтись. Необходимо определить центр масс вашего полигона. Для расчета можно воспользоваться формулами с сайта. Определив точку можно построить PolyLine, предоставляемый GoogleMaps API.

среда, 22 января 2020 г.

Как центрировать карту на маркер после смены размера карты?

#google_maps_api #javascript


  



No Title 



  
  
Хочу чтобы при нажатие на маркер появлялась информация о магазине (справа) Дело в том, что после того, как изменяется размер Table, маркер остается на том же месте, где раньше был центр. Стоит мне изменить размер окна и, вуаля, маркер встает по центру. Как сделать чтобы он сразу встал туда? Извиняюсь, код был не очень корректен (исправил) myLatlng = new google.maps.LatLng(marker.getPosition()); Эта строчка вроде должна менять центр карты на маркер google.maps.event.addListener(map, 'zoom_changed', function(){ map.setCenter( marker.getPosition() ); }); Работает точно так же, т.е. карта центрируется на маркер но это не совсем центр (это тот старый центр), карта уменьшилась в размерах (с права на 20%) то и центр должен сдвинуться (на 10% от центра в левую сторону) Нет, парни все дело не в этом. т.е. это то же самое плавно, не плавно, без разницы, центр (маркер) остаются на старом месте после изменения размера таблицы, если я уменьшу таблицу до 40%, то он вообще исчезнет из поля видимости.


Ответы

Ответ 1



У карты есть событие zoom_changed. На него можно повесить обработчик, которым будет устанавливаться центральная точка. google.maps.event.addListener(map, 'zoom_changed', function(){ map.setCenter( marker.getPosition() ); });

Ответ 2



Есть более прекрасное решение: методом yourMap.panTo(new google.maps.LatLng(userLat, userLong)); Тут прокрутка произойдет плавно, а не так что сразу в центр ляснет ;)

воскресенье, 12 января 2020 г.

Почему все при увеличении масштаба карты, маркер сдвигается от заданных координат?

#javascript #google_maps_api #google_maps


У меня есть несколько разных карт. При нажатии на ссылку я показываю карту с заданными
координатами и ставлю маркер на это место! Но когда начинаю увеличивать зум, то маркер
смещается!


//инициализация карты
var mapModule = (function(){
    'use strict';

    var mapSection = $('#map')[0];

    return {
        // Добавим маркер
        addMarker: function(latitude, longitude, map){
            new google.maps.Marker({
                position: {
                    lat: latitude,
                    lng: longitude
                },
                icon: new google.maps.MarkerImage('/images/mapMarker.png',
                    new google.maps.Size(84,95),
                    new google.maps.Point(0,0),
                    new google.maps.Point(0,95)
                ),
                map: map
            });
        },

        // Инициализация карты
        initMap: function(latitude, longitude) {
            var mapPosition = new google.maps.LatLng(latitude, longitude),
                mapOptions = {
                    zoom: 14,
                    center: mapPosition,
                    scaleControl: false,
                    zoomControl: false,
                    streetViewControl: false,
                    mapTypeControl: false
                },

                map = new google.maps.Map(mapSection, mapOptions);

            mapModule.addMarker(latitude, longitude, map);
        }
    }
}());

// Открытие карты с заданными координатами
$('.showMap').on('click', function(event){
    event.preventDefault();

    $('.showMap').removeClass('act');
    $(this).addClass('act');

    var latitude = $(this).data('latitude'),
        longitude = $(this).data('longitude');

    mapModule.initMap(latitude, longitude);
});


В чем проблема?

Обновление

Сайта нет, делаю локально!

Пример на jsFiddle



//инициализация карты
var mapModule = (function() {
  'use strict';

  var mapSection = $('#map')[0];

  return {
    // Добавим маркер
    addMarker: function(latitude, longitude, map) {
      var marker = new google.maps.Marker({
        position: {
          lat: latitude,
          lng: longitude
        },
        icon: new google.maps.MarkerImage('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFQAAABfCAMAAABBchAwAAACPVBMVEUAtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0AtK0Dta4Gtq8Jt7AMuLEPuLISubMVurQYu7UbvLYevbchvrgkv7knv7oqwLstwbswwrwzw702xL45xb88xsA/x8FCx8JFyMNIycRLysVOy8ZRzMdUzchXzslazspdz8tg0Mxj0c1m0s5p089s1NBv1dFy1tJ11tN419R72NV+2daB2taE29eH3NiK3dmN3dqQ3tuT39yW4N2Z4d6c4t+f4+Ci5OGl5eKo5eOr5uSu5+Wx6Oa06ee36ui66+m97OrA7OvD7ezG7u3J7+7M8O/P8fDS8vHV8/HY9PLb9PPe9fTh9vXk9/bn+Pfq+fjt+vnw+/rz+/v2/Pz5/f38/v7///+1e+LrAAAAaXRSTlMAAQIEBQYHCAoLDA0OEBIdHyAiIyQlJiorLC4vMTQ2ODo8PT5AQUJDREZHSEpMTU5PUFJTVFZYWVpbXl9gYWJkZWZqa21vcXN2eHqMj5GTlZqcnqCjpaqsrre5vL7Fx9DU19ng7/Hy9P0k/Wr7AAAFqUlEQVR4AaTMQYqDMAAF0J/WUjrSYpkpboSABCGgonHjIiJ/5/1PNAewiUl8B3g4lL+rejRmJVdjxrp65zjn8atm7szq74FE2aelU/vJEO+pFnot6ok4r4YBmhfC3RUDqTsClZbBbIkQPwOjDDkOFZaRbAE/IZlACnhcNZPoK5yynon6GxxuE5NNjvXS8YTugi+E5ilaYE/Sb9voJ7FT/DNaxigMAkEU7VJ4AHMAC2vrBRG0ExHEKBYiKg475C65TEibsyUkMVHnr9nX7v8qf5Y/mtVp040TP5nGrknNOnFfHYWFcd4Sr6A2j7FWOZtAAyhLKmIAVQmUB+tYj1BUEBuYCmhYtctBocn0vEOP5qaWTYgqOSPehTJU24ueB8el5j/oEth+u8CXhzVbUEuf/91xkfxOtuIkjNG8DT2Zp2YrtMzV+xReKOZObAmJOxC+/wdc8baBZy63+5LrmTcMwuy+Hioa70F4/TwncYZxAN+7vTjj0aMe66lOZ+yhTg8648HqzZn24MHO9LsbQohokgWbhCRqu4YIFULKloIUjAGhWQg/9sf3byu7Ydnypi9+htNzeObd4Xm+7+5DhFK0zFCLXTMPER5eyMBg62+Lu/kTQjmmEdK82v/ulrixt/0EuLJgmo6YOOK5v9DrwJf83FxdmTS9JuZSdFC899TTgenr2WjaAPYcPhOOKmbWtUlT8V3xASInAwyb8P3B+OQHDPqGinkPxDdNRbkknv4xIlZbY9vwvWd6n2nArq4VMO+x2OGSclmo3PkZEae+zFBmh6+Bca3Ip8IG3BFaXFauCpX7iCyzjG3j3C7WaOq6fVJhRtf1BCL3hRZXletC5QdE1vlOf5V6PpspRtiKzvuj0OK6ckO6TcArBqyDJfgOzUjVbUi36oZyU6g8QUjNu14jaxilEXs6RJ0eQk+EFjeVW/OF76KeVXZT8C1lXTuFeWusYEaY1FuK8LlwF6EDVjXEX5aKKWDTPotjToUbmLkrfGIowtHvYWp53NGwO+REM4Y3PMR/JdyPiNwTmijfSpq+5TbSXm9n5bnJlqp27SWEtrKlGjOLmn4jefzWSMXpOJibEl9in1tYN3z7Hfry6oLH/1qIE0yNjpGcPnOcFbzgPjoMOO9Syb02ywv+qK8kI+XWofMAAedvbLBunFm6nh7b6yu/m5tagxn5SH0pGf5+C3GvDt8GD7HNiTKwx4PEgGR2xWnIh1+2pg0nhgZ3ACy13DUUmTNeBLG9WqCx2hvi2JavqRgo3+Pca2aRHHo1o2DxLWIDCwGT8T+ZwAcHdVcaKNLo06xREsk6ybNdoMzfEHjDrQwHx6yp/Y40+uQh/YvXXwdW9VVAK7KhIpDwWpoxtGvxHHOykP5iwXXyqzsuBLG52WV7GVN5Np8GYXMak10nCy++9D/0PlVOXHpHGkJqifz0cUzr2YKL7+IV/Qgzm/UunXYhjOmw2B9/yMYw9ejf2uxuJYEoigLwOoqiOeIPZlYUI6iEIiKCYFPSvvBiQLqRELwQSVB6/xcIFQnanp9x9nxPILLhrLXm0hN9w4L+/ieCHYv/xzox4LHHHY89Axw0DAHNige0exxkWZQM3aNkyKJkNoHQ29LH86/Y8VyySLwkUnnM5ezTcq57SzlDLiAuNF7Wd0hckLcX3oX2tHYLc+E1VfPZ8nI1X85cqjmK77oRYf3vv92vdSPCGxvobklrvtpsj794t92s5qa5g/HJLAzJzAenuhRLVyUwdqUTnOWYjNyAKDB1dtMwUD5dwVcwq0SfjyuwKgwpkmEBDlQjyiTfUHCTa5Ojdi7pzxx2xdaUjKatIqLL1Puk1a9ncKV8rTMhZtKp5RGPV32lP8FT1YOEO/YKCVAjOhspSCnRWQlyenTSgyDvFOE+PEhq0kETsbF5PchC1gMRPUJYakzjFKSVqQx5z3D2C8LKUP46Ah1SAAAAAElFTkSuQmCC',
          new google.maps.Size(84, 95),
          new google.maps.Point(0, 0),
          new google.maps.Point(84, 95)
        ),
        map: map
      });
    },

    // Инициализация карты
    initMap: function(latitude, longitude) {
      var mapPosition = new google.maps.LatLng(latitude, longitude),
        mapOptions = {
          zoom: 14,
          center: mapPosition,
          scaleControl: false,
          zoomControl: false,
          streetViewControl: false,
          mapTypeControl: false
        },

        map = new google.maps.Map(mapSection, mapOptions);

      mapModule.addMarker(latitude, longitude, map);
    }
  }
}());

mapModule.initMap(54.6199796, 39.790707);
#map {
  height: 400px;
}



Ответы

Ответ 1



У вас, на сколько я понял, параметр new google.maps.Point(84, 95) у маркера - неправильный. Надо: new google.maps.Point(42,95) Т.е. опорная точка в середине-внизу изображения картинки в base64 бесят))

Две гугл карты на одной странице

#javascript #google_maps_api #google_maps


Добрый день! Сделал черно-белую гугл-карту со свом маркером,нужно было сделать вторую,но
две карты не показываются, у второй карты виден только маркер и значок гугл внизу.

Что я делаю не так и как исправить? вот код



  
  

 


Ответы

Ответ 1



Можно вот так:
Насчёт чёрно-белой, я не знаю.

понедельник, 6 января 2020 г.

Как узнать валюту страны, в которой находится пользователь?

#android #google_maps_api #геолокация


Как можно узнать валюту той страны, в которой на данный момент находится пользователь
Android-приложения? Предполагается, что пользователь часто путешествует и меняет страну.
Подскажите какой-нибудь сервис с открытым API.
    


Ответы

Ответ 1



Решение с конца: https://developer.android.com/reference/java/util/Currency.html Класс который отдает код валюты, символ и т.п. Делается из локали: Currency currency = Currency.getInstance(locale); Локаль можно сделать из координат: Geocoder geocoder = new Geocoder(ctx, Locale.getDefault()); List
addresses = geocoder.getFromLocation(latitude, longitude, 1); if (addresses.size() > 0) { Address address = addresses.get(0); regionCode = address.getCountryCode(); } Статья от первоисточника: https://developer.android.com/training/location/display-address.html regionCode должен содержать 2х символьный код, например 'RU','US','DE'. Из этого кода и делаем локаль: Locale whereMI = new Locale(regionCode); Мои извинения за бессвязность кода, надрал из разных проектов по частям. П.С. Еще вместо GPS для получения кода страны можно использовать ip-api.com/json . С известными оговорками конечно.

воскресенье, 5 января 2020 г.

Добавление кнопок на Google Map Android

#android #google_maps_api #java


Нужно сделать перемещение по карте кнопками, может кто то подсказать как такое сделать,
ни одного туториала по этому вопросу не нашел, и как юзать вообще такое я не представляю.
Карту на телефоне вывел, теперь нужно добавить по нажатию на кнопку ехать или вверх
или вниз или вправо или влево. Есть у кого нибудь примеры? Или хотя бы скажите какое
событие и как перемещать карту?    


Ответы

Ответ 1



Используй RelativeLayout, чтобы разместить свои кнопки поверх MapView, и mapView.getController().scrollBy(x, y), чтобы двигать карту: ... onClick(View v) { if (v == mMyCustomPanLeftButton) { mMapController.scrollBy(-15 /*x*/, 0) } }

Ответ 2



btn4.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (v == btn4) { GeoPoint p = mapView.getMapCenter(); GeoPoint z = new GeoPoint(p.getLatitudeE6(), p.getLongitudeE6() - 1000000); mc.animateTo(z); } } });

Ответ 3



Может, что-то из класса com.google.android.maps.MapController подойдет?

суббота, 4 января 2020 г.

Leaflet координаты

#javascript #google_maps_api #leafletjs #mapbox


Подскажите, как я могу получить координаты углов каждого тайла?

                var layers = {
                    Streets: L.mapbox.tileLayer('mapbox.streets'),
                };
                layers.Streets.on('tileload', function (e) {
                    ... как-то получить координаты углов загрузившегося тайла ...
                });


Версия leaflet 0.7.7. Благодарю!
    


Ответы

Ответ 1



В обработчик события tileload передается объект {tile: ... , url: ... }. Элемент tile является HTML элементом с некоторыми допольнительными параметрами. Один из них _leaflet_pos - отступ в пикселах от левого верхнего угла видимой части карты (поскольку параметр начинается с подчеркивания, подразумевается что он приватный, его не будет в документации и он запросто может называться в другой версии иначе или вообще отсутствовать). Также эти значения можно увидеть в параметре inline-стиля transform. Чтобы перевести пикселы в координаты, можно воспользоваться методом layerPointToLatLng. Например так: layers.Streets.on('tileload', function (e) { console.log(mymap.layerPointToLatLng(e.tile._leaflet_pos)); }); См также: Исходник L.TileLayer

Ответ 2



Вроде все получилось var layers = { Streets: L.mapbox.tileLayer('mapbox.streets'), }; layers.Streets.on('tileload', function (e) { var topLeft = map.layerPointToLatLng([e.tile._leaflet_pos.y, e.tile._leaflet_pos.x]); var topRight = map.layerPointToLatLng([e.tile._leaflet_pos.y, e.tile._leaflet_pos.x + layers.Streets.options.tileSize]); var downLeft = map.layerPointToLatLng([e.tile._leaflet_pos.y + layers.Streets.options.tileSize, e.tile._leaflet_pos.x]); var downRight = map.layerPointToLatLng([e.tile._leaflet_pos.y + layers.Streets.options.tileSize, e.tile._leaflet_pos.x + layers.Streets.options.tileSize]); L.marker([topLeft.lat, topLeft.lng]).addTo(map); L.marker([topRight.lat, topRight.lng]).addTo(map); L.marker([downLeft.lat, downLeft.lng]).addTo(map); L.marker([downRight.lat, downRight.lng]).addTo(map); }); Может это можно было сделать как-то более изящно... И странное поведение появилось - отрисовывается только половину маркеров почему-то...

Как ограничить область видимости карты, Map API Android?

#android #google_maps_api


Возможно ли как то ограничить область видимости, например квадрат на карте, за который
нельзя выйти перемещением карты?
    


Ответы

Ответ 1



попробуйте так private GoogleMap mMap; // Create a LatLngBounds that includes the city of Adelaide in Australia. private LatLngBounds ADELAIDE = new LatLngBounds( new LatLng(-35.0, 138.58), new LatLng(-34.9, 138.61)); // Constrain the camera target to the Adelaide bounds. mMap.setLatLngBoundsForCameraTarget(ADELAIDE); более подробно на сайте https://developers.google.com/maps/documentation/android-api/views#_14

пятница, 27 декабря 2019 г.

Нахождение ближайшей точки Google Maps API

#javascript #c_sharp #google_maps_api


Подскажите:
у меня есть 8 точек на карте я хочу найти ближайшую точку от нажатия мыши. 
Вот код.

for (var i = 0; i < Markers.length; i++)
    {

        var request = {
            origin: point1,
            destination: Markers[i],
            travelMode: 'DRIVING'
        };

        directionsService.route(request, function (result, status) {
            if (status == 'OK') {
                distance = parseInt(result.routes[0].legs[0].distance.value);
                console.log('in' + distance);
                if (distance < maxD) {
                    maxD = distance;
                    pointSave = Markers[i];             
                }
            }
        });
    }
    calcRoute(point1, pointSave);


в переменную Point1 автоматически добавляется координаты клика мыши. 
В Markers массив точек до которых надо построить маршрут.
функция CalcRoute строит маршрут.

Ошибки:

1) Почему в блоке кода 

` directionsService.route(request, function (result, status) {
            if (status == 'OK') {
                distance = parseInt(result.routes[0].legs[0].distance.value);
                console.log('in' + distance);
                if (distance < maxD) {
                    maxD = distance;
                    pointSave = Markers[i];             
                }
            }
        });`


Точка Marker[i] не видна? вообще не хочет сохранятся . 
И переменная i там почему-то всегда равна максимальному размеру массива.

2) Так же переменная distance является глобальной. Почему она не сохраняет свое значение
после блока  directionsService.route
    


Ответы

Ответ 1



Корень данных проблем кроется в асинхронности вызова замыкания, которое является параметром directionsService.route. Это замыкание будет вызвано после выхода из цикла. Соответственно i будет иметь значение Markers.length, а Markers[Markers.length] не существует. distance хоть и является глобальной, но получает значения позже чем вызывается calcRoute(), поэтому вы не видите нужного результата. См. также ответы на вопросы: Использование promise с циклом for Как вернуть значение из события или из функции обратного вызова? Или хотя бы дождаться их окончания

Как сделать генератор словаря?

#python #python_3x #django #google_maps_api


Задача состоит в том, чтобы сгенерить словарь из городов, такого типа:

{city: {'distance': '443 mi', 'duration': '9 hours 0 mins'}}


Вот модель:

@python_2_unicode_compatible
class Route(Base):

    cities = models.ManyToManyField(City)

    @cached_property
    def cities_arrival_time(self, *args, **kwargs):
        r = lambda: x, y: requests.get(
            'https://maps.googleapis.com/maps/api/distancematrix/json?units=metric&mode=driving&origins={}&destinations={}&key={}'.format(
                x.name,
                y.name,     
                settings.GEOPOSITION_GOOGLE_MAPS_API_KEY
                )
            )


После чего, нужно преобразовать duration таким образом, чтобы получить datetime

Проблема в том, что отправлять я не понимаю, как написать генератор, который будет
итерировать QuerySet исключая последний элемент.
    


Ответы

Ответ 1



Сделал совершенно иначе. import json import urllib import os import copy import ast import operator import requests DISTANCE_MATRIX_URL = "http://maps.googleapis.com/maps/api/distancematrix/" class DM(object): def __init__(self, api_key=None, url=DISTANCE_MATRIX_URL): self.api_key = api_key self.url = url self.response = '' self.dict_response = {'distance': {'value': {}, 'text': {}, }, 'duration': {'value': {}, 'text': {}, }, } self.origins = '' self.destinations = '' def make_request(self, origins, destinations, mode='driving'): data = {} self.origins = [origins] if type(origins) == str else origins self.destinations = [destinations] if type(destinations) == str else destinations data['origins'] = origins if type(origins) == str else '|'.join(origins) data['destinations'] = destinations if type(destinations) == str else '|'.join(destinations) data['mode'] = mode url_values = urllib.parse.urlencode(data) output_format = 'json' url = os.path.join(self.url, output_format) self.response = ast.literal_eval((urllib.request.urlopen(url + '?' + url_values).read()).decode("utf-8"))['rows'] self.dict_response = {'distance': {'value': {}, 'text': {}, }, # Reset temporary dict 'duration': {'value': {}, 'text': {}, }, } def __get_response_element_data(self, key1, key2): if not self.dict_response[key1][key2]: l = self.response for i, orig in enumerate(self.origins): self.dict_response[key1][key2][orig] = {} for j, dest in enumerate(self.destinations): if l[i]['elements'][j]['status'] == 'OK': self.dict_response[key1][key2][orig][dest] = l[i]['elements'][j][key1][key2] else: self.dict_response[key1][key2][orig][dest] = l[i]['elements'][j]['status'] return self.dict_response[key1][key2] def get_distance_values(self): return self.__get_response_element_data('distance', 'value') def get_distance_texts(self): return self.__get_response_element_data('distance', 'text') def get_time_values(self): return self.__get_response_element_data('duration', 'value') def get_time_texts(self): return self.__get_response_element_data('duration', 'text') def get_closest_points(self, max_distance=None, num=10, origin_index=0, origin_raw=None): if not self.dict_response['distance']['value']: self.get_distance_values() if origin_raw: origin = copy.deepcopy(self.dict_response['distance']['value'][origin_raw]) else: origin = copy.deepcopy(self.dict_response['distance']['value'][self.origins[origin_index]]) tmp_origin = copy.deepcopy(origin) if max_distance: for k, v in tmp_origin.iteritems(): if v > max_distance: del(origin[k]) if origin: return sorted(origin.iteritems(), key=operator.itemgetter(1))[:num] Работает это так: a = DM() a.make_request(['Minsk'], ['Moscow']) # Отдаём один origin (точка, от которой считаем) и один destination (пункт назначения). Если хотим получить результат в текстовом формате (он менее точный), то делаем так: a.get_distance_texts() и получаем результат: {'Minsk': {'Moscow': '717 km'}} Если же, нужно посчитать расстояние между одним origin и несколькими destination, то делаем так: a.make_request(['Minsk'], ['Moscow', 'Sankt-Peterburg']) a.get_distance_texts() {'Minsk': {'Moscow': '717 km', 'Sankt-Peterburg': '795 km'}} В действительности, расстояние иное. Но разница между Москвой и СПб более-менее точная. Вот так получаем данные в метрах: a.get_distance_values() {'Minsk': {'Moscow': 717038, 'Sankt-Peterburg': 795481}} А вот так, получаем duration a.get_time_values() {'Minsk': {'Moscow': 28751, 'Sankt-Peterburg': 36415}} Точно так же, с текстовым отображением: a.get_time_texts() {'Minsk': {'Moscow': '7 hours 59 mins', 'Sankt-Peterburg': '10 hours 7 mins'}} Если же надо узнать про расстояние между несколькоими origins и destinations, то так: a.make_request(['Minsk', 'Moscow'], ['Moscow', 'Varshava']) a.get_distance_texts() {'Minsk': {'Moscow': '717 km', 'Varshava': '554 km'}, 'Moscow': {'Moscow': '1 m', 'Varshava': '1,264 km'}} А вот так: a.get_closest_points() Получаем список из кортежей, где первый элемент - пункт назначения, а второй - расстояние от первого origin [('Varshava', 553521), ('Moscow', 717038)]

среда, 25 декабря 2019 г.

Сделать, чтоб определенные объекты не исчезали при уменьшении масштаба - google map js api v3

#javascript #google_maps_api


Возможно ли на гугл картах сделать, чтобы определенные объекты были видны при любом
масштабе? Например, по умолчанию местные дороги исчезают после зума меньше 8, остаются
только только автобаны, потом после зума 6 исчезают и автобаны. Так вот можно ли как-то
сделать, чтоб все, например, дороги были видны при любом зуме?
    


Ответы

Ответ 1



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

Ответ 2



В данном случае правила отрисовки для объектов задаёт сам Google, где у него прописано, что и при каком масштабе рисовать, на это повлиять не получится. НО возможность же отрисовки каких-либо объектов при любом масштабе, в принципе, в данных картах имеется, для этого просто необходимо самим их отрисовать.

воскресенье, 22 декабря 2019 г.

Как определить текущее местоположение пользователя и что лучше использовать?

#javascript #google_maps_api #yandex_maps_api #геолокация


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

Есть ли пример получения этих данных при этом сделав как можно меньше запросов?

P.S. При этом мне не нужно что-либо отрисовывать на карте и рисовать саму карту
    


Ответы

Ответ 1



Силами HTML5 — navigator.geolocation.getCurrentPosition(). Браузер спрашивает у пользователя разрешение и в случае согласия отдает ОЧЕНЬ (в большинстве случаев) точные данные в виде широты и долготы. Потом это можно скормить https://developers.google.com/maps/documentation/geocoding/intro без карты. upd 2018: данный способ работает для https-сайтов Определять по IP. Есть бесплатная (но не самая полная) база — https://dev.maxmind.com/ru/geolite2/ Вот есть библиотека под нее — https://github.com/maxmind/GeoIP2-php В этом случае данные доступны сразу, но они не точные (Страна, город).

Ответ 2



Если на js, могу дать совет воспользоваться запросом, на сторонний сервис, после чего получить json данные с него, через jsonp.
На codepen: https://codepen.io/AndreyMyP/pen/gzXVXV

Ответ 3



Яндекс, кстати, предоставляет "API Geocoder" для HTTP запросов: https://tech.yandex.ru/maps/doc/geocoder/desc/concepts/input_params-docpage/ Ответ геокодера может быть сформирован в следующих форматах: XML, согласно спецификации YMapsML; JSON или JSONP. Чтобы начать работать с HTTP API Геокодера, нужно получить ключ для пакета «JavaScript API и HTTP Геокодер». Но есть ограничение на кол-во бесплатных запросов 25тыс в сутки. И определенные условия, например проект должен находиться в открытом доступе, т.е. если есть регистрация, то она должна быть открыта для всех.