Openlayers - архив информации в popupmarker - PullRequest
0 голосов
/ 01 марта 2011

У меня есть соединение с базой данных (дБ).Я получаю lon, lat и name из БД и очищаю их:

while ($row_ChartRS = mysql_fetch_array($sql1))
{
$latitude=$row_ChartRS['latitude'];
$longitude=$row_ChartRS['longitude'];
$bus_name =$row_ChartRS['short_name'];
//echo  $latitude.'--'.$longitude.'<br>';
echo  $bus_name;

Затем я создаю карту для отображения данных.Маркеры работают нормально для всех мест.Код:

function init()
  {

    projLonLat   = new OpenLayers.Projection("EPSG:4326");   // WGS 1984
    projMercator = new OpenLayers.Projection("EPSG:900913"); // Spherical Mercator

    overviewMap = new OpenLayers.Control.OverviewMap();

    //adding scale ruler
    scale = new OpenLayers.Control.ScaleLine();
    scale.geodesic = true; // get the scale projection right, at least on small

    map = new OpenLayers.Map('demoMap',
                             { controls: [ new OpenLayers.Control.Navigation(),    // direct panning via mouse drag
                                           new OpenLayers.Control.Attribution(),   // attribution text
                                           new OpenLayers.Control.MousePosition(),    // where am i?
                                           new OpenLayers.Control.LayerSwitcher(),    // switch between layers
                                           new OpenLayers.Control.PanZoomBar(),    // larger navigation control
                                           scale,
                                           overviewMap                             // overview map
                                         ]
                             }
                            );

    map.addLayer(new OpenLayers.Layer.OSM.Mapnik("Mapnik"));
    map.addLayer(new OpenLayers.Layer.OSM.Osmarender("Osmarender"));


    //Create an explicit OverviewMap object and maximize its size after adding it to the map so that it shows
    //as activated by default.
    overviewMap.maximizeControl();

    //Adding a marker
    markers = new OpenLayers.Layer.Markers("Vehicles");
    map.addLayer(markers);

    vectorLayer = new OpenLayers.Layer.Vector('Routes');
    map.addLayer(vectorLayer);

    for (k in Locations)
    {

    //adding a popup for the marker
    var feature = new OpenLayers.Feature(markers, new OpenLayers.LonLat(Locations[k].lon, Locations[k].lat).transform(projLonLat,projMercator));

    //true to close the box
    feature.closeBox = true;

    feature.popupClass = new OpenLayers.Class(OpenLayers.Popup.AnchoredBubble,
    {
      //create the size of the box
      'autoSize': true,
      'maxSize': new OpenLayers.Size(100,100)
    });

    //add info into box
    for (z in names)
    {
    feature.data.popup = new OpenLayers.Feature(new OpenLayers.LonLat(names[z]).transform(projLonLat,projMercator));

    }

    //puts a scroll button on box to scroll down to txt
    //feature.data.overflow = "auto";

    marker = feature.createMarker();
    marker.display(true);

    markerClick = function (evt) {
      if (this.popup == null) {
        this.popup = this.createPopup(this.closeBox);
        map.addPopup(this.popup);
        this.popup.show();
      } else {
        this.popup.toggle();
      }
      currentPopup = this.popup;
      OpenLayers.Event.stop(evt);
    };

    marker.events.register("mousedown", feature, markerClick);
    markers.addMarker(marker);
    map.setCenter(new OpenLayers.LonLat(Locations[k].lon, Locations[k].lat).transform(projLonLat,projMercator), zoom);

    var lonLat1 = new OpenLayers.LonLat(Locations[k].lon,Locations[k].lat).transform(new OpenLayers.Projection('EPSG:4326'), map.getProjectionObject());
    var pos2=new OpenLayers.Geometry.Point(lonLat1.lon,lonLat1.lat);
    points1.push(pos2);


    //Uncomment to put boxes in when map opens
    //feature.popup = feature.createPopup(feature.closeBox);
    //map.addPopup(feature.popup);
    //feature.popup.show()
      }

  var lineString = new OpenLayers.Geometry.LineString(points1);
  var lineFeature = new OpenLayers.Feature.Vector(lineString,'',style_green);
  vectorLayer.addFeatures([lineFeature]);
  map.setCenter(lonLat1,zoom);

  } //function

Однако имя во всплывающем маркере одинаково для всех маркеров.т.е. фамилия вытащила из БД.Может кто-нибудь, пожалуйста, помогите с этим - я потратил 3 полных дня, пытаясь это исправить!

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 09 июля 2014

У меня была такая же проблема, и я ее решаю ... проблема перезаписана Вы не должны зацикливаться внутри своей функции, сделайте цикл для функции, например:

function init(z)
{
    feature.data.popup = new OpenLayers.Feature(new OpenLayers.LonLat(names[z]).transform(projLonLat,projMercator));
}


for (z in names)
{
    init(z)
}
0 голосов
/ 01 марта 2011

Несколько комментариев:

  1. Размещенный вами PHP-код совершенно неактуален, поскольку он нигде не используется.
  2. Объекты names и Locations нигде не объявлены в коде, который вы опубликовали.Что они содержат?
  3. В приведенном ниже коде вы создаете несколько новых Feature объектов, но назначаете их все одному и тому же свойству (таким образом, каждый раз перезаписывая это свойство).Это преднамеренно?

    //add info into box
    for (z in names) {
        feature.data.popup = new OpenLayers.Feature(new OpenLayers.LonLat(names[z]).transform(projLonLat,projMercator));
    }
    

Редактировать: Похоже, что это происходит неправильно.Вы должны удалить цикл for ... z и заменить его следующим кодом:

//add info into box
feature.data.popup = new OpenLayers.Feature(new OpenLayers.LonLat(names[k]).transform(projLonLat,projMercator));

Поскольку в PHP вы используете один и тот же индекс ($v) для заполнения обоих массивов, онимеет смысл использовать один и тот же индекс для чтения их в javascript ...


Кроме того, использование цикла for...in в массивах Javascript не считается хорошей практикой, для рядапричины .Лучше использовать следующее:

for (k = 0; k < Locations.length; k += 1) {
    // your code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...