Вопрос по API Яндекс Карт

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО InstantCMS 2.X
#1 13 апреля 2017 в 17:52
Друзья, прошу помочь решить вопрос по Яндекс картам.

Есть скрипт с поиском объектов по карте "Адрес и объект", все работает, но ищет города и улицы вперемешку. Как ограничить поиск только населенными пунктами, без улиц?



  1. <script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
  2. <script type="text/javascript">
  3. ymaps.ready(init);
  4. var myMap,
  5. myPlacemark;
  6.  
  7. <?php
  8. $cn = empty($value) ? $field->getOption('center') : $value;
  9. $zoom = $field->getOption('zoom');
  10. ?>
  11.  
  12. function init(){
  13. myMap = new ymaps.Map("mapayandexaunicid", {
  14. center: [<?php echo $cn; ?>],
  15. zoom: <?php echo $zoom; ?>,
  16. controls: ['zoomControl', 'typeSelector',"fullscreenControl" ]
  17. });
  18.  
  19. var searchControl = new ymaps.control.SearchControl({
  20. options: {
  21. float: 'left',
  22. floatIndex: 100,
  23. noPlacemark: true
  24. }
  25. });
  26.  
  27. myMap.controls.add(searchControl);
  28.  
  29. <?php if($value){ ?>
  30.  
  31. myPlacemark = new ymaps.Placemark([<?php echo $cn; ?>], {});
  32. myMap.geoObjects.add(myPlacemark);
  33.  
  34. <?php } ?>
  35.  
  36. myMap.events.add('click', function (e) {
  37. myMap.geoObjects.remove(myPlacemark);
  38. var coords = e.get('coords');
  39. myPlacemark = new ymaps.Placemark([coords[0], coords[1]], {});
  40. myMap.geoObjects.add(myPlacemark);
  41. $('#<?php echo $field->name; ?>').val(coords[0]+ ',' + coords[1]);
  42. });
  43. }
  44.  
  45. $(document).ready(function(){
  46. $('.clearmap').click(function(event){
  47. event.preventDefault();
  48. $('#<?php echo $field->name; ?>').val('');
  49. myMap.geoObjects.remove(myPlacemark);
  50. });
  51. });
  52.  
  53. </script>
  54.  
  55. <div id="mapayandexaunicid" style="width: 100%; height: 350px"></div>
#2 13 апреля 2017 в 18:35
Если это весь код, то скорее всего попробуйте заменить это
  1. myPlacemark = new ymaps.Placemark([coords[0], coords[1]], {});
  2. myMap.geoObjects.add(myPlacemark);
  3. $('#<?php echo $field->name; ?>').val(coords[0]+ ',' + coords[1]);
на так
  1. myPlacemark = new ymaps.Placemark(coords[0], {});
  2. myMap.geoObjects.add(myPlacemark);
  3. $('#<?php echo $field->name; ?>').val(coords[0]);
Если не будет работать сразу посмотрите ошибки в консоле.
#3 13 апреля 2017 в 18:55
Мартин, ничего не изменилось. Код не весь, немного перепиливаю поле от Zau4man: instantcms.ru/addons/yandexmaps.html
При поиске объекта через форму на карте, нарушалась логика действий юзеров.

Весь код:
/templates/default/assets/fields/yandexmaps.tpl.php
  1. <?php if ($field->title) { ?><label for="<?php echo $field->id; ?>"><?php echo $field->title; ?></label><?php } ?>
  2.  
  3. <script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
  4. <script type="text/javascript">
  5. ymaps.ready(init);
  6. var myMap,
  7. myPlacemark;
  8.  
  9. <?php
  10. $cn = empty($value) ? $field->getOption('center') : $value;
  11. $zoom = $field->getOption('zoom');
  12. ?>
  13.  
  14. function init(){
  15. myMap = new ymaps.Map("mapayandexaunicid", {
  16. center: [<?php echo $cn; ?>],
  17. zoom: <?php echo $zoom; ?>,
  18. controls: ['zoomControl', 'typeSelector',"fullscreenControl" ]
  19. });
  20.  
  21. var searchControl = new ymaps.control.SearchControl({
  22. options: {
  23. float: 'left',
  24. floatIndex: 100,
  25. noPlacemark: true
  26. }
  27. });
  28.  
  29. myMap.controls.add(searchControl);
  30.  
  31. <?php if($value){ ?>
  32.  
  33. myPlacemark = new ymaps.Placemark([<?php echo $cn; ?>], {});
  34. myMap.geoObjects.add(myPlacemark);
  35.  
  36. <?php } ?>
  37.  
  38. myMap.events.add('click', function (e) {
  39. myMap.geoObjects.remove(myPlacemark);
  40. var coords = e.get('coords');
  41. myPlacemark = new ymaps.Placemark(coords[0], {});
  42. myMap.geoObjects.add(myPlacemark);
  43. $('#<?php echo $field->name; ?>').val(coords[0]);
  44. });
  45. }
  46.  
  47. $(document).ready(function(){
  48. $('.clearmap').click(function(event){
  49. event.preventDefault();
  50. $('#<?php echo $field->name; ?>').val('');
  51. myMap.geoObjects.remove(myPlacemark);
  52. });
  53. });
  54.  
  55. </script>
  56.  
  57. <div id="mapayandexaunicid" style="width: 100%; height: 350px"></div>
  58.  
  59. <?php echo html_input('hidden', $field->element_name, $value, array('id'=>$field->id)); ?>
  60. <a class="clearmap" href="#"><?php echo LANG_FIELD_YANDEXMAPS_CLEAR; ?></a>
/system/fields/yandexmaps.php
  1. <?php
  2.  
  3. class fieldYandexmaps extends cmsFormField {
  4.  
  5. public $title = LANG_FIELD_YANDEXMAPS;
  6. public $sql = 'varchar(255) NULL DEFAULT NULL';
  7. public $filter_type = 'str';
  8.  
  9. public function getFilterInput($value) {
  10. return false;
  11. }
  12.  
  13. public function getOptions(){
  14. return array(
  15. new fieldString('center', array(
  16. 'title' => LANG_FIELD_YANDEXMAPS_CENTER,
  17. 'default' => '57.7801162,55.7354444'
  18. )),
  19. new fieldString('zoom', array(
  20. 'title' => LANG_FIELD_YANDEXMAPS_ZOOM,
  21. 'default' => '13',
  22. 'hint' => LANG_FIELD_YANDEXMAPS_ZOOM_HINT
  23. ))
  24. );
  25. }
  26.  
  27. public function parse($value){
  28.  
  29. if(!$value) return false;
  30.  
  31. $cn = $value;
  32. $zoom = $this->getOption('zoom');
  33. $id = $this->item['id'];
  34.  
  35. cmsTemplate::getInstance()->addJS('https://api-maps.yandex.ru/2.1/?lang=ru_RU');
  36.  
  37. $map = <<< MAP
  38.  
  39.   <script type="text/javascript">
  40.   ymaps.ready(init);
  41.   var myMap,
  42.   myPlacemark;
  43.  
  44.   function init(){
  45.   myMap = new ymaps.Map("map$id", {
  46.   center: [$cn],
  47.   zoom: $zoom,
  48. controls: ['zoomControl', 'typeSelector',"fullscreenControl" ]
  49.   });
  50.  
  51. var searchControl = new ymaps.control.SearchControl({
  52.   options: {
  53.   float: 'left',
  54.   floatIndex: 100,
  55.   noPlacemark: true
  56.   }
  57.   });
  58.  
  59.   myMap.controls.add(searchControl);
  60.  
  61.   myPlacemark = new ymaps.Placemark([$cn], {});
  62.   myMap.geoObjects.add(myPlacemark);
  63.  
  64.   }
  65.  
  66. </script>
  67.  
  68. <div id="map$id" style="width: 100%; height: 350px"></div>
  69.  
  70. MAP;
  71.  
  72.  
  73. return $map;
  74.  
  75. }
  76.  
  77. }
Это уже с моими правками, видимо перемудрил что-то. sad
#4 13 апреля 2017 в 19:37
Не знаю, что сказать. По идеи код ясен и должно было сработать. Но вот есть пара моментов не понятных. Например, что такое
var coords = e.get('coords'); В смысле откуда приходит и что содержит. Я думал в ней ваши адреса, но откуда идёт? Нужно проверять на месте, так не скажу больше ничего.
#5 13 апреля 2017 в 19:46
Дело похоже не в бобине. Нашел схожий по функционалу скрипт с такой же проблемой: webmap-blog.ru/examples/coord-map.html

Перекопал документацию api maps Яндекса, что-то по 2.1, по этой теме ничего не нашел.

Как ограничить поиск только населенными пунктами, без улиц? Вопрос остается открытым.
#6 13 апреля 2017 в 20:03
Pasechnik, в эту сторону надо копать.
#7 13 апреля 2017 в 21:24

Pasechnik, в эту сторону надо копать.

Loadырь
Смотрел сегодня, но просмотрел)) Попробовал добавить kind: 'locality', вроде более корректно стало искать.

Спасибо всем кто откликнулся!
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.