如何删除开发者中的特定标记 [英] how to remove a specific marker in openlayer
问题描述
这是来自capdragon的新代码,但现在它不会创建标记。我现在不知道如何解决这个问题。
我认为代码片段是解决我之前识别标记问题的一个非常聪明的方法,它现在可能是一个非常小的事情。
< title> Open Street Map< / title>
< style type =text / css>
html,body,#demo {
position:absolute;剩余
:2%;
width = 25%
}
html,body,#activePlanes {
position:absolute;剩余
:2%;
width = 25%
}
html,body,#mapBox {
position:fixed;
top:0;
right:0;
宽度:75%;
身高:100%;
}
< / style>
< script src =http://www.openlayers.org/api/OpenLayers.js>< / script>
< script type =text / javascript>
var arrMarkers = [];
函数AddPlaneMarker(planeID,lonlat)
{
var markers = new OpenLayers.Layer.Markers(Markers);
map.addLayer(markers);
var marker = new OpenLayers.Marker(lonlat);
marker.PlaneID = planeID;
markers.addMarker(marker);
arrMarkers.push(marker);
函数RemovePlaneMarker(planeID)
{
(arrMarkers中的var x)
{
if(arrMarkers [x]。 PlaneID == planeID)
{
arrMarkers.splice(x,1);
markers.removeMarker(arrMarkers [x]);
return;
$ b函数GetPlaneMarker(planeID)
{
(arrMarkers中的var x)
{
if(arrMarkers [x] .PlaneID == planeID)
{
return arrMarkers [x];
function displayPlane()
{
var x = document.getElementById('planeList');
var newPlane = document.createElement('option');
newPlane.text = document.getElementById(plane_ID)。value;
if(newPlane.text == null || newPlane.text ==)
{
alert(请指定飞机ID);
}
else
{
try
{
x.add(newPlane,x.newPlane [null]); //符合标准;在IE
中无效
catch(e)
{
x.add(newPlane,null); // document only
}
var lonLat = new OpenLayers.LonLat(document.getElementById(long).value,document.getElementById(lat).value).transform(
新的OpenLayers.Projection(EPSG:4326),
map.getProjectionObject());
var planeID = document.getElementById(plane_ID);
AddPlaneMarker(planeID,lonLat);
函数init()
{
map = new OpenLayers.Map(mapBox);
map.addLayer(new OpenLayers.Layer.OSM());
focusPoint = new OpenLayers.LonLat(-81.04818,29.18710)
focusPoint.transform(new OpenLayers.Projection(EPSG:4326),map.getProjectionObject());
map.setCenter(focusPoint,14);
函数newLonLat()
{
var newValues = prompt(请指定飞机的新位置,-81.07870 29.17210);
var theValues = newValues.split();
var newPixel = map.getLayerPxFromViewPortPx(map.getPixelFromLonLat(new OpenLayers.LonLat(theValues [0],theValues [1])。transform(
new OpenLayers.Projection(EPSG:4326),
map.getProjectionObject())));
marker.moveTo(newPixel);
函数removePlane()
{
var x = document.getElementById(planeList);
x.remove(x.selectedIndex);
var planeID = x.options [x.selectedIndex] .text;
RemovePlaneMarker(planeID);
}
< / script>
< body onload =init();>
< div id =mapBox>< / div>
< / body>
< body>
< br />< div id =demo>
Aircraft ID:< input type =textid =plane_IDvalue =AA5024/>< br />
Longitude:& nbsp;< input type =textid =longvalue = - 81.04818/>< br />
Latitude:& nbsp;& nbsp;& nbsp;< input type =textid =latvalue =29.18710/>< br /><< br / ; br />
dd& nbsp;& nbsp;& nbsp;& nbsp;< button value =Add AircraftOnClick =displayPlane()> Add Aircraft< / button>< / DD>
< br />< br />
< h3>>< dd> Active Planes< / dd>< / h3>
< select id =planeListsize =10multiple =multiplestyle =text-align:centerondblclick =newLonLat()>
< option> ---------- Plane ID ----------< / option>
< / select>< br />
< dd><按钮值=移除飞机OnClick =removePlane()>移除飞机< /按钮>< / dd>
< / div>
< / body>
marker
看起来不像它们在 removePlane()
范围内可用。
尝试在全局范围内声明它们,并在实例化它们时移除 var
:
< script type =text / javascript>
...
var markers,marker;
...
函数displayPlane()
...
markers = new OpenLayers.Layer.Markers(name);
...
marker = new OpenLayers.Marker(lonLat);
...
每条评论更新:
我真的很喜欢我最后的选择最好的
我会跟踪他们在我自己的Plane对象的数组中,这些对象包含对标记。像这样:
var arrPlaneObjects = [];
函数AddPlaneMarker(planeID,lonlat){
var objPlane = {};
objPlane.ID = planeID;
objPlane.Marker = new OpenLayers.Marker(lonLat);
//添加到图层。
markers.addMarker(objPlane.Marker);
//添加到数组。
arrPlaneObjects.push(objPlane);
}
函数RemovePlaneMarker(planeID){
(arrPlaneObjects中的var x){
if(arrPlaneObjects [x] .ID == planeID){
//从数组中移除。
arrPlaneObjects.splice(x,1);
//从图层中移除。
markers.removeMarker(arrPlaneObjects [x] .Marker);
return;
}
}
}
然后你可以使用它来轻松添加和删除标记:
AddPlaneMarker(AA5024,lonLat) ;
RemovePlaneMarker(AA2222);
另一个选择是保持跟踪数组中的标记并将平面ID存储在这样的标记:
var arrMarkers = [];
函数AddPlaneMarker(planeID,lonlat){
var marker = new OpenLayers.Marker(lonLat);
marker.PlaneID = planeID;
//添加到图层。
markers.addMarker(marker);
//添加到数组。
arrMarkers.push(marker);
}
函数RemovePlaneMarker(planeID){
(arrMarkers中的var x){
if(arrMarkers [x] .PlaneID == planeID){
//从图层中移除。
markers.removeMarker(arrMarkers [x]);
//从数组中移除。
arrMarkers.splice(x,1);
return;
稍后调用它们:
pre $ 函数GetPlaneMarker(planeID){
(arrMarkers中的var x){
if(arrMarkers [x] .PlaneID == planeID){
return arrMarkers [x];
}
}
}
var myPlaneMarker = GetPlaneMarker(AA2222);
解决方案更新
< title> Open Street Map< / title>
< style type =text / css>
html,body,#demo {
position:absolute;剩余
:2%;
width = 25%
}
html,body,#activePlanes {
position:absolute;剩余
:2%;
width = 25%
}
html,body,#mapBox {
position:fixed;
top:0;
right:0;
宽度:75%;
身高:100%;
}
< / style>
< script src =http://www.openlayers.org/api/OpenLayers.js>< / script>
< script type =text / javascript>
var arrMarkers = [];
var markers;
函数AddPlaneMarker(planeID,lonlat){
var marker = new OpenLayers.Marker(lonlat);
marker.PlaneID = planeID;
markers.addMarker(marker);
arrMarkers.push(marker);
函数RemovePlaneMarker(planeID){
(arrMarkers中的var x){
if(arrMarkers [x] .PlaneID == planeID ){
markers.removeMarker(arrMarkers [x]);
arrMarkers.splice(x,1);
return;
$ b函数GetPlaneMarker(planeID){
(arrMarkers中的var x){
if(arrMarkers [x ] .PlaneID == planeID){
return arrMarkers [x];
function displayPlane(){
var x = document.getElementById('planeList');
var newPlane = document.createElement('option');
newPlane.text = document.getElementById(plane_ID)。value;
if(newPlane.text == null || newPlane.text ==){
alert(请指定飞机ID);
}
else {
try {
x.add(newPlane,x.newPlane [null]); //符合标准;在IE
中不起作用}
catch(e){
x.add(newPlane,null); // document only
}
var lonLat = new OpenLayers.LonLat(document.getElementById(long).value,document.getElementById(lat).value).transform(
新的OpenLayers.Projection(EPSG:4326),
map.getProjectionObject());
var planeID = document.getElementById(plane_ID).value;
AddPlaneMarker(planeID,lonLat);
函数init(){
map = new OpenLayers.Map(mapBox);
map.addLayer(new OpenLayers.Layer.OSM());
focusPoint = new OpenLayers.LonLat(-81.04818,29.18710)
focusPoint.transform(new OpenLayers.Projection(EPSG:4326),map.getProjectionObject());
map.setCenter(focusPoint,14);
markers = new OpenLayers.Layer.Markers(Markers);
map.addLayer(markers);
}
函数newLonLat(){
var newValues = prompt(请指定飞机的新位置,-81.07870 29.17210);
var theValues = newValues.split();
var newPixel = map.getLayerPxFromViewPortPx(map.getPixelFromLonLat(new OpenLayers.LonLat(theValues [0],theValues [1])。transform(
new OpenLayers.Projection(EPSG:4326),
map.getProjectionObject())));
marker.moveTo(newPixel);
function removePlane(){
var x = document.getElementById(planeList);
var id = x.options [x.selectedIndex] .value;
x.remove(x.selectedIndex);
RemovePlaneMarker(id);
}
< / script>
< body onload =init();>
< div id =mapBox>< / div>
< br />< div id =demo>
Aircraft ID:< input type =textid =plane_IDvalue =AA5024/>< br />
Longitude:& nbsp;< input type =textid =longvalue = - 81.04818/>< br />
Latitude:& nbsp;& nbsp;& nbsp;< input type =textid =latvalue =29.18710/>< br /><< br / ; br />
dd& nbsp;& nbsp;& nbsp;& nbsp;< button value =Add AircraftOnClick =displayPlane()> Add Aircraft< / button>< / DD>
< br />< br />
< h3>>< dd> Active Planes< / dd>< / h3>
< select id =planeListsize =10multiple =multiplestyle =text-align:centerondblclick =newLonLat()>
< option> ---------- Plane ID ----------< / option>
< / select>< br />
< dd><按钮值=移除飞机OnClick =removePlane()>移除飞机< /按钮>< / dd>
< / div>
< / body>
This is the new code with the update from capdragon, but now it would not create markers. I don't know how to fix this now. I think the code snippet was a really smart way to fix my previous problem of identifying the markers, and it is probably a really small things i am missing now. Any help again would be greatly appreciated.
<title>Open Street Map</title>
<style type="text/css">
html, body, #demo {
position: absolute;
left: 2%;
width = 25%
}
html, body, #activePlanes {
position: absolute;
left: 2%;
width = 25%
}
html, body, #mapBox {
position: fixed;
top: 0;
right: 0;
width: 75%;
height: 100%;
}
</style>
<script src="http://www.openlayers.org/api/OpenLayers.js"></script>
<script type="text/javascript">
var arrMarkers = [];
function AddPlaneMarker(planeID, lonlat)
{
var markers = new OpenLayers.Layer.Markers("Markers");
map.addLayer(markers);
var marker = new OpenLayers.Marker(lonlat);
marker.PlaneID = planeID;
markers.addMarker(marker);
arrMarkers.push(marker);
}
function RemovePlaneMarker(planeID)
{
for(var x in arrMarkers)
{
if(arrMarkers[x].PlaneID == planeID)
{
arrMarkers.splice(x, 1);
markers.removeMarker(arrMarkers[x]);
return;
}
}
}
function GetPlaneMarker(planeID)
{
for(var x in arrMarkers)
{
if(arrMarkers[x].PlaneID == planeID)
{
return arrMarkers[x];
}
}
}
function displayPlane()
{
var x = document.getElementById('planeList');
var newPlane = document.createElement('option');
newPlane.text = document.getElementById("plane_ID").value;
if (newPlane.text == null || newPlane.text == "")
{
alert("Please specify an Aircraft ID");
}
else
{
try
{
x.add(newPlane, x.newPlane[null]); // standards compliant; doesn't work in IE
}
catch(e)
{
x.add(newPlane, null); // IE only
}
var lonLat = new OpenLayers.LonLat(document.getElementById("long").value, document.getElementById("lat").value).transform(
new OpenLayers.Projection("EPSG:4326"),
map.getProjectionObject());
var planeID = document.getElementById("plane_ID");
AddPlaneMarker(planeID,lonLat);
}
}
function init()
{
map = new OpenLayers.Map("mapBox");
map.addLayer(new OpenLayers.Layer.OSM());
focusPoint = new OpenLayers.LonLat(-81.04818, 29.18710)
focusPoint.transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
map.setCenter(focusPoint, 14);
}
function newLonLat()
{
var newValues = prompt("Please specify new location of the Aircraft", "-81.07870 29.17210");
var theValues = newValues.split(" ");
var newPixel = map.getLayerPxFromViewPortPx(map.getPixelFromLonLat(new OpenLayers.LonLat(theValues[0], theValues[1]).transform(
new OpenLayers.Projection("EPSG:4326"),
map.getProjectionObject())));
marker.moveTo(newPixel);
}
function removePlane()
{
var x=document.getElementById("planeList");
x.remove(x.selectedIndex);
var planeID = x.options[x.selectedIndex].text;
RemovePlaneMarker(planeID);
}
</script>
<body onload="init();">
<div id="mapBox"></div>
</body>
<body>
<br /><div id="demo">
Aircraft ID: <input type="text" id="plane_ID" value="AA5024"/><br />
Longitude: <input type="text" id="long" value="-81.04818" /><br />
Latitude: <input type="text" id="lat" value="29.18710" /><br /><br />
<dd> <button value="Add Aircraft" OnClick="displayPlane()">Add Aircraft</button></dd>
<br /><br />
<h3><dd>Active Planes</dd></h3>
<select id="planeList" size="10" multiple="multiple" style="text-align:center" ondblclick="newLonLat()">
<option>----------Plane ID----------</option>
</select><br />
<dd><button value="Remove Aircraft" OnClick="removePlane()">Remove Aircraft</button></dd>
</div>
</body>
markers
and marker
don't look like they are available in the scope of removePlane()
.
Try declaring them in the global scope and removing the var
when you instantiate them.:
<script type="text/javascript">
...
var markers, marker;
...
function displayPlane()
...
markers = new OpenLayers.Layer.Markers(name);
...
marker = new OpenLayers.Marker(lonLat);
...
Update per comment:
I actually like my last option best
I would keep track of them in an array of my own Plane objects that contain a reference to the Markers. Something like this:
var arrPlaneObjects = [];
function AddPlaneMarker(planeID, lonlat){
var objPlane = {};
objPlane.ID = planeID;
objPlane.Marker = new OpenLayers.Marker(lonLat);
//Add to layer.
markers.addMarker(objPlane.Marker);
//Add to array.
arrPlaneObjects.push(objPlane);
}
function RemovePlaneMarker(planeID){
for(var x in arrPlaneObjects){
if(arrPlaneObjects[x].ID == planeID){
//Remove from array.
arrPlaneObjects.splice(x, 1);
//Remove from layer.
markers.removeMarker(arrPlaneObjects[x].Marker);
return;
}
}
}
Then you could use this to easily add and remove markers:
AddPlaneMarker("AA5024", lonLat);
RemovePlaneMarker("AA2222");
Another option would be to just keep of track of the markers in an array and store the plane id within that marker like such:
var arrMarkers = [];
function AddPlaneMarker(planeID, lonlat){
var marker = new OpenLayers.Marker(lonLat);
marker.PlaneID = planeID;
//Add to layer.
markers.addMarker(marker);
//Add to array.
arrMarkers.push(marker);
}
function RemovePlaneMarker(planeID){
for(var x in arrMarkers){
if(arrMarkers[x].PlaneID == planeID){
//Remove from layer.
markers.removeMarker(arrMarkers[x]);
//Remove from array.
arrMarkers.splice(x, 1);
return;
}
}
}
To call them later on:
function GetPlaneMarker(planeID){
for(var x in arrMarkers){
if(arrMarkers[x].PlaneID == planeID){
return arrMarkers[x];
}
}
}
var myPlaneMarker = GetPlaneMarker("AA2222");
Solution Update
<title>Open Street Map</title>
<style type="text/css">
html, body, #demo {
position: absolute;
left: 2%;
width = 25%
}
html, body, #activePlanes {
position: absolute;
left: 2%;
width = 25%
}
html, body, #mapBox {
position: fixed;
top: 0;
right: 0;
width: 75%;
height: 100%;
}
</style>
<script src="http://www.openlayers.org/api/OpenLayers.js"></script>
<script type="text/javascript">
var arrMarkers = [];
var markers;
function AddPlaneMarker(planeID, lonlat) {
var marker = new OpenLayers.Marker(lonlat);
marker.PlaneID = planeID;
markers.addMarker(marker);
arrMarkers.push(marker);
}
function RemovePlaneMarker(planeID) {
for (var x in arrMarkers) {
if (arrMarkers[x].PlaneID == planeID) {
markers.removeMarker(arrMarkers[x]);
arrMarkers.splice(x, 1);
return;
}
}
}
function GetPlaneMarker(planeID) {
for (var x in arrMarkers) {
if (arrMarkers[x].PlaneID == planeID) {
return arrMarkers[x];
}
}
}
function displayPlane() {
var x = document.getElementById('planeList');
var newPlane = document.createElement('option');
newPlane.text = document.getElementById("plane_ID").value;
if (newPlane.text == null || newPlane.text == "") {
alert("Please specify an Aircraft ID");
}
else {
try {
x.add(newPlane, x.newPlane[null]); // standards compliant; doesn't work in IE
}
catch (e) {
x.add(newPlane, null); // IE only
}
var lonLat = new OpenLayers.LonLat(document.getElementById("long").value, document.getElementById("lat").value).transform(
new OpenLayers.Projection("EPSG:4326"),
map.getProjectionObject());
var planeID = document.getElementById("plane_ID").value;
AddPlaneMarker(planeID, lonLat);
}
}
function init() {
map = new OpenLayers.Map("mapBox");
map.addLayer(new OpenLayers.Layer.OSM());
focusPoint = new OpenLayers.LonLat(-81.04818, 29.18710)
focusPoint.transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
map.setCenter(focusPoint, 14);
markers = new OpenLayers.Layer.Markers("Markers");
map.addLayer(markers);
}
function newLonLat() {
var newValues = prompt("Please specify new location of the Aircraft", "-81.07870 29.17210");
var theValues = newValues.split(" ");
var newPixel = map.getLayerPxFromViewPortPx(map.getPixelFromLonLat(new OpenLayers.LonLat(theValues[0], theValues[1]).transform(
new OpenLayers.Projection("EPSG:4326"),
map.getProjectionObject())));
marker.moveTo(newPixel);
}
function removePlane() {
var x = document.getElementById("planeList");
var id = x.options[x.selectedIndex].value;
x.remove(x.selectedIndex);
RemovePlaneMarker(id);
}
</script>
<body onload="init();">
<div id="mapBox"></div>
<br /><div id="demo">
Aircraft ID: <input type="text" id="plane_ID" value="AA5024"/><br />
Longitude: <input type="text" id="long" value="-81.04818" /><br />
Latitude: <input type="text" id="lat" value="29.18710" /><br /><br />
<dd> <button value="Add Aircraft" OnClick="displayPlane()">Add Aircraft</button></dd>
<br /><br />
<h3><dd>Active Planes</dd></h3>
<select id="planeList" size="10" multiple="multiple" style="text-align:center" ondblclick="newLonLat()">
<option>----------Plane ID----------</option>
</select><br />
<dd><button value="Remove Aircraft" OnClick="removePlane()">Remove Aircraft</button></dd>
</div>
</body>
这篇关于如何删除开发者中的特定标记的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!