Advertisement
anatolt

mtrd map

Aug 7th, 2019
354
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.52 KB | None | 0 0
  1.  
  2. <style>
  3. #legend {
  4. margin-top: 295px;
  5. height: 650px;
  6. overflow: auto;
  7. }
  8. #map {
  9. width: 100%;
  10. height: 600px;
  11. }
  12. .legend-item {
  13. cursor: pointer;
  14. }
  15. .legend-item.active {
  16. font-weight: bold;
  17. }
  18. .place-header {
  19. padding-left: 15px;
  20. }
  21. .place-header.collapsed {
  22. background: url("/bitrix/templates/main/components/bitrix/catalog.section.list/tree/images/plus.gif") no-repeat scroll 0 7px;
  23. }
  24. .place-header.expanded {
  25. background: url("/bitrix/templates/main/components/bitrix/catalog.section.list/tree/images/minus.gif") no-repeat scroll 0 7px;
  26. }
  27. </style>
  28.  
  29. <script src="//api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
  30.  
  31. <div>
  32. <p>Уважаемые посетители сайта министерства!</p>
  33.  
  34. <p>Для повышения удобства в получении информации об учреждениях, находящихся в ведении министерства, а также филиалов, отделов и отделений данных учреждений (всего более 300 объектов), направленности их деятельности, местоположении, схемы проезда, контактных данных вам предлагается ресурс: Карта учреждений социальной защиты Республики Башкортостан.</p>
  35.  
  36. <p>Все учреждения выстроены в разрезе административного деления республики и нанесены на карту.</p>
  37.  
  38. <p>Выбрав интересующий вас район из списка справа, кликните на него мышью. В открывшемся списке объектов, находящихся на данной территории, выберите нужный &mdash; на карте отобразится его местоположение, адрес и телефон. Также существует возможность перехода на сайт учреждения (или страницу филиала, отдела, отделения).</p>
  39.  
  40. <p>Карта реализована на основе поисково-информационного сервиса Яндекс.Карты.</p>
  41. </div>
  42.  
  43. <div id="map"></div>
  44.  
  45. <script type="text/javascript">
  46. ymaps.ready(function () {
  47. var myMap = new ymaps.Map('map', {
  48. center: [54.734721, 55.957829],
  49. zoom: 7
  50. });
  51.  
  52. var clusterer = new ymaps.Clusterer({
  53. hasHint: false,
  54. maxZoom: 12
  55. });
  56.  
  57. var addPoints = function(data) {
  58. var geoObjects = [];
  59. var places = {};
  60. var aaa = {};
  61. var placeNames = [];
  62.  
  63. var getPointData = function(item) {
  64. var html = '<a id="bxid_683599" href="' + item.site + '" target="_blank" >' + item.short_name + '</a><br />' + item.address + '<br />' + item.phone;
  65. if (item.parent) {
  66. html = '<strong>' + item.parent.short_name + '</strong><br />' + html;
  67. }
  68. return {
  69. balloonContentBody: html,
  70. clusterCaption: item.short_name,
  71. data: item
  72. }
  73. }
  74.  
  75. var addCoords = function(item) {
  76. if (item.coords) {
  77. var coords = [item.coords.lat, item.coords.lng];
  78. geoObjects.push(new ymaps.Placemark(coords, getPointData(item), {preset: 'islands#blueCircleDotIcon', hideIconOnBalloonOpen: false}));
  79. item['geoIndex'] = geoObjects.length - 1;
  80.  
  81. if (item.place_name) {
  82. if(item.place_name != 'г. Уфа') {
  83. if (!!places[item.place_name]) { places[item.place_name].push(item); }
  84. } else {
  85. places['г. Уфа и Уфимский район'].push(item);
  86. }
  87. }
  88. }
  89. }
  90.  
  91. for (var i = 0, len = data.length; i < len; i++) {
  92. var item = data[i];
  93. if (item.place_name) {
  94. var placeName = item.place_name;
  95. if (!places[placeName]) {
  96. places[placeName] = [];
  97. placeNames.push(placeName);
  98. }
  99. }
  100. }
  101.  
  102. for (var i = 0, len = data.length; i < len; i++) {
  103. var item = data[i];
  104. addCoords(item);
  105. if (item.offices) {
  106. for (var j = 0, oLen = item.offices.length; j < oLen; j++) {
  107. var office = item.offices[j];
  108. office['parent'] = item;
  109. addCoords(office);
  110. }
  111. }
  112. }
  113.  
  114. var html = '<div id="legend">';
  115. for (var i = 0, len = placeNames.length; i < len; i++) {
  116. var placeName = placeNames[i];
  117. html += '<h4 class="place-header collapsed">' + placeName + '</h4><ol class="place-content" style="display: none;">';
  118. var items = places[placeName];
  119. for (var j = 0, len2 = items.length; j < len2; j++) {
  120. var item = items[j];
  121. var name = item.parent ? item.name : item.short_name;
  122. var title = item.parent ? item.parent.name + '. ' + item.short_name : item.name;
  123. html += '<li class="legend-item" title="' + title + '" data-geo-index="' + item.geoIndex + '" id="legendItem' + item.geoIndex + '">' + name + '</li>';
  124. }
  125. html += '</ol>';
  126. }
  127. html += '</div>';
  128. $('#side-column').html(html);
  129.  
  130. var collapsePlaceHeader = function($header) {
  131. $header.removeClass('expanded').addClass('collapsed').next().hide();
  132. }
  133.  
  134. var expandPlaceHeader = function($header) {
  135. $header.removeClass('collapsed').addClass('expanded').next().show();
  136. }
  137.  
  138. var makeLegendItemActive = function($item) {
  139. $('.legend-item.active').removeClass('active');
  140. expandPlaceHeader($item.addClass('active').parent().prev());
  141. }
  142.  
  143. $('.place-header').click(function(){
  144. var $this = $(this);
  145. if ($this.hasClass('collapsed')) {
  146. expandPlaceHeader($this)
  147. }
  148. else {
  149. collapsePlaceHeader($this);
  150. }
  151. });
  152.  
  153. $('.legend-item').click(function() {
  154. var $this = $(this);
  155. makeLegendItemActive($this);
  156. var geoIndex = parseInt($(this).attr('data-geo-index'));
  157. var placemark = geoObjects[geoIndex];
  158. var zoom = myMap.getZoom();
  159. if (zoom < 13) {
  160. zoom = 13;
  161. }
  162. myMap.setCenter(placemark.geometry.getCoordinates(), zoom);
  163. placemark.balloon.open();
  164. return false;
  165. });
  166.  
  167. clusterer.add(geoObjects);
  168.  
  169. myMap.geoObjects.add(clusterer);
  170.  
  171. myMap.geoObjects.events.add('click', function (e) {
  172. var object = e.get('target');
  173. var item = object.properties.get('data');
  174. if (item && item.geoIndex != null) {
  175. var $legendItem = $('#legendItem' + item.geoIndex);
  176. makeLegendItemActive($legendItem);
  177. var $legend = $('#legend');
  178. var top = $legend.scrollTop() - $legend.offset().top + $legendItem.offset().top - 100;
  179. $('#legend').animate({
  180. scrollTop: top
  181. }, 400);
  182. }
  183. });
  184. }
  185.  
  186. $.ajax({
  187. type: 'GET',
  188. url: 'http://api.mintrudrb.ru/institutions_with_offices?callback=?',
  189. jsonpCallback: 'jsonCallback',
  190. dataType: 'jsonp',
  191. success: function(data) {
  192. addPoints(data);
  193. }
  194. });
  195. });
  196. </script>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement