2011-03-01 33 views
0

我有一个连接到数据库(db)。我越来越LON,纬度和名称从DB和stroing他们:Openlayers - 弹出信息到popupmarker

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天的时间来修复它!

在此先感谢!

回答

0

几点意见:

  1. 你张贴的PHP代码是完全不相干的,因为它没有看到任何地方使用。
  2. 对象namesLocations未在您发布的代码中的任何位置声明。它们包含什么?
  3. 在下面引用的代码中,您正在创建多个新的Feature对象,但是将它们全部分配给相同的属性(从而每次都覆盖该属性)。那是故意的吗?

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

编辑: 这确实出现了到哪里去错误的。您应该删除了... Z循环,并用下面的代码替换:

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

因为在PHP,您使用的是相同的指数($v)填写两个阵列,它是有道理的使用相同指数从除了阅读他们的JavaScript ...


,使用JavaScript的数组for...in循环不被认为是很好的做法,为a number of reasons。这是更好地使用以下命令:

for (k = 0; k < Locations.length; k += 1) { 
    // your code 
} 
+0

@ Martijn谢谢你的回应。请参阅上面的代码,看看它们是如何使用的。 – user639439 2011-03-01 14:34:20

+0

@ user639439:感谢您的PHP代码。我已经更新了我的答案;如果您按照建议更改代码,它应该可以工作。 – Martijn 2011-03-01 15:07:14

0

我有同样的问题,我解决它... 问题是覆盖 你不必循环的功能里面,做循环为功能例如:

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


for (z in names) 
{ 
    init(z) 
}