Яндекс карты: отображение очень большого количества обьектов на карте
Задача: отобразить на карте ОЧЕНЬ большого количества обьектов на карте:
Решение: для отображения используем ObjectManager с включенной кластеризаций, кроме того, обекты загружаем через JSON с типом «Feature» — т.е. метки загружаются ни как обьекты, а как «теневой массив», который не умеет отображать контент,хинты и имеет еще ряд ограничений. Этот момент мы обходим следующим образом: при наведении курсора мышки на метку, мы переносим её в «обьекты».
javascript:
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
var myMap; latitude=55.76; longitude=37.64; navigator.geolocation.getCurrentPosition( function(location) { latitude=location.coords.latitude; longitude=location.coords.longitude; accuracy=location.coords.accuracy; ymaps.ready(init); }, function(error){ ymaps.ready(init); } ); function init () { console.log("-инициируем карту в "+latitude+" и "+longitude); myMap = new ymaps.Map('map', { center: [latitude, longitude], controls: ['trafficControl','zoomControl','routeButtonControl','routeEditor'], zoom: 15 }, { searchControlProvider: 'yandex#search' }); if (isMobile.any()) { console.log("-открыто на мобильнике - отключаем мультитач"); //myMap.behaviors.disable('drag'); myMap.behaviors.disable('multiTouch'); } LoadEVCByCar(<?=$Users->defaultcar?>); } function LoadEVCByCar(carcode){ //очищаем холст myMap.geoObjects.removeAll(); NormalCollection = new ymaps.GeoObjectCollection(); //теневые не полноценные обьекты загружаем скопом objectManager = new ymaps.ObjectManager({clusterize: true}); myMap.geoObjects.add(objectManager); $.post("csdcsdcs", { carcode:carcode, latitude:latitude, longitude:longitude }).done(function(data) { jsond=JSON.parse(data); objectManager.add(jsond); }); // по событию "попадание мышкой" теневой обьект удаляем и создаем "настоящий" полноценный, с которым далее и работаем.. objectManager.objects.events.add(['mouseenter', 'mouseleave'], Shadow2Normal); }; function Shadow2Normal (e) { aa=e; console.log(e); if (e.get('type') == 'mouseenter') { objectIdcur = e.get('objectId'); newob=objectManager.objects.getById(objectIdcur); myMap.geoObjects.remove([objectIdcur]); objectManager.remove([objectIdcur]); newob.options["draggable"]=false; newob.options["id"]=newob.id; NormalObject = new ymaps.GeoObject( { id: newob.id, geometry : newob.geometry, properties: newob.properties }, newob.options ); NormalCollection.add(NormalObject); //добавляем в коллекцию myMap.geoObjects.add(NormalCollection); // добавляем на холст }; } |
PHP:
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 |
<?php $JsonEVCS=array(); $JsonEVCS["type"]="FeatureCollection"; $longitude= _POST("longitude"); $latitude= _POST("latitude"); $carcode= _POST("carcode"); for ($i = 1; $i <= 10000; $i++) { $evcs_info=array(); $evcs_info["type"]="Feature"; $evcs_info["id"]=$i; $evcs_info["geometry"]["type"]="Point"; $m1=rand(0,1);if ($m1==0){$m1=-1;}; $m2=rand(0,1);if ($m2==0){$m2=-1;}; $evcs_info["geometry"]["coordinates"]=array($latitude+$m1*rand(1,200)/100,$longitude+$m2*rand(1,200)/100); $evcs_info["properties"]["balloonContent"]="html код"; $evcs_info["properties"]["hintContent"]="Подсказка"; $evcs_info["properties"]["data"]["ip"]="32у23"; $evcs_info["options"]["preset"]="islands#redDotIcon"; $evcs_info["properties"]["iconContent"]="Имя"; $evcs_info["options"]["draggable"]=false; $evcs_info["options"]["hideIconOnBalloonOpen"]=false; $JsonEVCS["features"][]=$evcs_info; }; echo json_encode($JsonEVCS); |