Клуб API Карт

Изъятие координат с базы данных MySQL

ny.gunsk
15 октября 2010, 23:03

Здравствуйте!

Суть темы вот в чем: нужно отрисовать многоугольник по координатам из БД. Когда делаю так:

 var polygon2 = new YMaps.Polygon([
    new YMaps.GeoPoint(72.625392,61.07641),
    new YMaps.GeoPoint(72.62419,61.076649),
    new YMaps.GeoPoint(72.624211,61.076769),
    new YMaps.GeoPoint(72.625467,61.076514)

  ],{
    style: "polygon#Example",
    hasHint: 1,
    hasBalloon: 1
  });
polygon2.name = "Дом 2";
polygon2.description = "Жилое Помещение";
map.addOverlay(polygon2);

, то всё работает идеально!


Далее, заношу координаты в БД, и теперь в  базе находится строка:

    new YMaps.GeoPoint(72.625392,61.07641),
    new YMaps.GeoPoint(72.62419,61.076649),
    new YMaps.GeoPoint(72.624211,61.076769),
    new YMaps.GeoPoint(72.625467,61.076514)

Начинаю вынимать из базы эту строку, строка заносится в переменную test_polygon и соответсвенно переменная приняла это значение. Проверил с помощью document.write(test_polygon).

Подставляю эту переменную в код вместо строки с координатами:

var polygon2 = new YMaps.Polygon([
    test_polygon
  ],{
    style: "polygon#Example",
    hasHint: 1,
    hasBalloon: 1
  });
polygon2.name = "Дом 2";
polygon2.description = "Жилое Помещение";
map.addOverlay(polygon2);

и в ответ тишина - не выводит этот многоугольник :(

Подскажите, как быть? Если есть другие рабочие способы, буду признателен :)

16 комментариев
Подписаться на комментарии к посту
При создании ломаной в конструктор класса YMaps.Polygon нужно передавать массив точек.
В первом случае вы так и делаете, а во втором случае в конструктор вы передаете массив с одним элементом - строкой. Из-за этого возникает javascript-ошибка (ее вы сможете увидеть в любом отладчике).

Побороть можно разными способами. Самый простой в вашем случае - это воспользоваться функцией eval().

Функция eval() преобразует строку в javascript-код. Чтобы ваш вариант заработал с функцией eval(), вам необходимо сохранять в базу строку координат в квадратных скобках. Таким образом результатов выполнения функции eval() будет массив. Этот массив можно будет передать конструктор YMaps.Polygon.

Примерную суть покажу на примере:

// Ваша строка (она берется из базы)
var test_polygon = "[new YMaps.GeoPoint(72.625392,61.07641),new YMaps.GeoPoint(72.62419,61.076649),new YMaps.GeoPoint(72.624211,61.076769), new YMaps.GeoPoint(72.625467,61.076514)]";

var polygon2 = new YMaps.Polygon(eval(test_polygon),{
    style: "polygon#Example",
    hasHint: 1,
    hasBalloon: 1
  });
polygon2.name = "Дом 2";
polygon2.description = "Жилое Помещение";
map.addOverlay(polygon2);

Должно заработать, если не будет получаться - спрашивайте. И тогда сразу еще укажите ссылку на страницу где смотреть ошибки.
Спасибо за совет, но ничего не вышло - карта просто перестала грузиться - пустая белая страница на экране :(
Дайте, пожалуйста, ссылка на вашу страницу.
Ваш совет работает, если я непосредственно присвою значение:

var test_polygon = "[new YMaps.GeoPoint(72.625392,61.07641),new  YMaps.GeoPoint(72.62419,61.076649),new  YMaps.GeoPoint(72.624211,61.076769), new  YMaps.GeoPoint(72.625467,61.076514)]";
var polygon = new YMaps.Polygon(eval(test_polygon),{
    style: "polygon#Example",
    hasHint: 1,
    hasBalloon: 1
  });
polygon.name = "Дом 2";
polygon.description = "Жилое Помещение";
map.addOverlay(polygon);

http://88.204.16.140/map_end1.php - (дом №2)

Если же я сделаю так:

var test_polygon = "";
var polygon = new YMaps.Polygon(eval(test_polygon),{
    style: "polygon#Example",
    hasHint: 1,
    hasBalloon: 1
  });
polygon.name = "Дом 2";
polygon.description = "Жилое Помещение";
map.addOverlay(polygon);

то ничего не произойдёт:
http://88.204.16.140/map_end2.php
В примере map_end2.php у строки добавляются лишние двойные кавычки, что вызвало ошибку в javascript (двойные кавчки внутри двойных должны экранироваться, это правило свойственно и для php). Могу предположить, что вы в базе храните строку сразу с кавычками.
Варианта решения два:
1. Убрать в базе кавычки в начале и в конце строки.
2. в js-коде не ставить дополнительные кавычки.

var test_polygon = ;
Всё вышло :)
Работает в двух случаях:
1. Если в базе координаты сохранены с кавычками в виде:

"[new YMaps.GeoPoint(72.625392,61.07641), new YMaps.GeoPoint(72.62419,61.076649), new YMaps.GeoPoint(72.624211,61.076769), new YMaps.GeoPoint(72.625467,61.076514)]"

и переменая принимает значение:

var test_polygon = ;

2. Если в базе координаты сохранены без кавчек в виде:

[new YMaps.GeoPoint(72.625392,61.07641), new YMaps.GeoPoint(72.62419,61.076649), new YMaps.GeoPoint(72.624211,61.076769), new YMaps.GeoPoint(72.625467,61.076514)]

то работает, если:

а) var test_polygon = ;
б) var test_polygon = "";
в) var test_polygon = "";

Спасибо большое (B)
Попутно появилась еще одна проблема :(
Занёс я, значит, в базе координаты пяти объектов и теперь их нужно соответственно вывести в цикле. На PHP я делал так:

$result = mysql_query("SELECT * FROM map);
$myrow = mysql_fetch_array($result);
do 
{
  //некие действия, нопример
  //echo $myrow[coords]."
";
}
while ($myrow = mysql_fetch_array($result));

По аналогии делаю так же и на JavaScript:

Сначала пишу запросы к таблице:
  include("db.php");
  $result = mysql_query('SELECT * FROM map');
  $myrow = mysql_fetch_array($result);
?>


После нескольких проб пришел к выводу, что у меня не перебираются значения переменной $myrow[coords] - выводит постоянно последнее полученное значение. Помогите пожалуйста ;-)
Сделайте функцию для создания многоугольника. Например,

function createPolygon (str) {
var polygon = new YMaps.Polygon
  (
    eval(str),
    {
      style: "polygon#Example",
      hasHint: 1,
      hasBalloon: 1
    }
  );
  return polygon;
}

Соответственно создавать многоугольники нужно следующим образом:

do {
   map.addOverlay(createPolygon());
} while ('');
Проблему выявил, но не решил - закомментировал строку во фрагменте:

  include("db.php");
  $result = mysql_query('SELECT * FROM map');
//  $myrow = mysql_fetch_array($result);
?>

Далее не выполняется условие:

while ('');

- просто не формируется массив $myrow и соответственно не рисуется ни один многоульник, т.к. не получает координат от $myrow[coords] :(
Извините, в предыдущем комментарии я дал вам неверный код:
do {
   map.addOverlay(createPolygon());
} while ('');

Для начала удалите кавычки в начале и в конце строки с координатами (которые у вас в базе). Далее пишите примерно следующий код:


Функция eval() не понадобится.
На сколько я понимаю, данный фрагмент кода

    include("db.php");
    $result = mysql_query('SELECT * FROM map');
    while ($row = mysql_fetch_array($result)) {
        "map.addOverlay(createPolygon({$row['coords']}));";
    }
?>

не будет работать между тэгами - в чем я и убедился :)
Правда непонятно почему функция eval() не понадобится, но проблема осталась :(
А есть другие способы для добавления объектов на карту из базы? Может они окажутся куда проще и эффективнее?! ;)
С помощью PHP можно делать вставки прямо в html-код, генерируя нужный контент. В частности - генерировать javascript.

Приведу простой пример:



    Пример
   






Скопируйте этот код и сохраните в качестве отдельной странички. При ее просмотре в окно браузера будет выведено сообщение "JavaScript".

По аналогии генерируете нужный вам код. Ну и не забывайте пользоваться отладчиком, чтобы устранять какие-то ошибки (например, для Firefox есть удобное расширение - firebug).
Спасибо - вы здорово помогли :)
Сделано было так:




Есть еще вопрос: можно ли в функции createPolygon(points) задать имя для многоугольника и его описание (name, description)?..
Да, нужно просто туда их передавать.

Например, так:

function createPolygon (points, name, description) {
    var polygon = new YMaps.Polygon(points, {
        style : "polygon#Example",
        hasHint : 1,
        hasBalloon : 1
    });
    polygon.name = name;
    polygon.description = description;
   
    retrun polygon;
}
А можете взять эту функцию из кода, который генерирует конструктор.
Спасибо за советы - всё работает!
Фнукция принимает вид:

function createPolygon (points, name, description)
{
  var polygon = new YMaps.Polygon
  (
    eval(points),
    {
      style : "polygon#Example",
      hasHint : 1,
      hasBalloon : 1
    }
  );
  polygon.name = name;
  polygon.description = description;

  return polygon;
}

Тогда запрос примет вид:

  include("db.php");
  $result = mysql_query('SELECT * FROM mapNY');
  while ($row = mysql_fetch_array($result))
  {
    echo "map.addOverlay(createPolygon({$row['coords']},  \"$row[name]\", \"$row[description]\"));";
  }
?>