ThinkGeo.com    |     Documentation    |     Premium Support

AutoRefreshInterval Makes Markers invisible

I call AddSimpleVehicleMarkers event to display markers on the Map. When I work with project there is no problem on my pc but when I deploy it to the server it shows me the markers when the page is loaded  but when the time interval is arrived make them invisible.


Server : Windows Server 2008 R2 Enterprise 64bit turkish


My Pc : Windows 7 64bit turkish,visual studio 2008.



protected void Page_Load(object sender, EventArgs e)
{  
 ...
 ...
 ...
 SimpleMarkerOverlay smMarkerOverlay = new SimpleMarkerOverlay("Vehicles"); 
 smMarkerOverlay.AutoRefreshInterval = TimeSpan.FromMilliseconds(interval);
 smMarkerOverlay.Tick += new EventHandler<EventArgs>(AddSimpleVehicleMarkers);
 Map1.CustomOverlays.Add(smMarkerOverlay);
    AddSimpleVehicleMarkers(this.Page,e);
}
void AddSimpleVehicleMarkers(object sender, EventArgs e)
{
 List<double> lx = new List<double>();
 List<double> ly = new List<double>();
 
 GetVehicleData(rid == 0 ? currentFleet : 0, rid, userid, filter, groupId, HatId);
     
 SimpleMarkerOverlay smMarkerOverlay = (SimpleMarkerOverlay)Map1.CustomOverlays["Vehicles"];
 
 smMarkerOverlay.Markers.Clear();
 Map1.Popups.Clear();
 for (int i = 0; i < staticDt.Rows.Count; i++)

 if ((Convert.ToDouble(staticDt.Rows[i]["X"].ToString()) != 0) && (Convert.ToDouble(staticDt.Rows[i]["Y"].ToString()) != 0))
 {
 string uid = staticDt.Rows[i]["CIHAZID"].ToString();
     string plaka = staticDt.Rows[i]["PLAKA"].ToString();
 string hiz = staticDt.Rows[i]["SPEED"].ToString();
 string tarih = staticDt.Rows[i]["DATE"].ToString();
 string adres = HttpContext.Current.Server.HtmlEncode(staticDt.Rows[i]["LOCATION"].ToString());
    double xCoord = 0;
 double.TryParse(staticDt.Rows[i]["X"].ToString(), out xCoord);
 double yCoord = 0;
 double aci = 0;
 double.TryParse(staticDt.Rows[i]["DIRECTION"].ToString(), out aci);
 double.TryParse(staticDt.Rows[i]["Y"].ToString(), out yCoord);
 int kontak = (int)staticDt.Rows[i]["KONTAK"];
 int aractip = (int)staticDt.Rows[i]["ARACTIPID"];
 bool rolanti = (bool)staticDt.Rows[i]["ROLANTI"];
 bool status = Convert.ToInt32(staticDt.Rows[i]["STATUS"]) != 0;
 int imgH = 0, imgW = 0;
 DateTime InsertDate = Convert.ToDateTime(staticDt.Rows[i]["INSERTDATE"].ToString());
 int iStatus = 0;
   TimeSpan tm = DateTime.Now - InsertDate;
 if ((!status) && (tm.TotalMinutes >= 60))
 {
 iStatus = 4;
 }
 else
 {
 if (kontak == 1 && !rolanti) iStatus = 1;
 else if (kontak == 1 && rolanti) iStatus = 2;
 else if (kontak == 0) iStatus = 3;
 }

 string vStatus = String.Format("{0:000}", iStatus);
 string vFolder = (aractip > 0) ? aractip.ToString() + "/" : "";
 string imagePath = String.Format("images/vTypes/{0}{1}.gif", vFolder, vStatus);

 Vertex v = MapGlobals.ConvertCoord(xCoord, yCoord, true);
 lx.Add(v.X);
 ly.Add(v.Y);
     Marker vm = new Marker(v.X, v.Y);

 vm.WebImage = new WebImage(imagePath, 15,15 );
 vm.Popup = GetPopupStyle(uid, plaka, hiz, adres, tarih);
 vm.Popup.HasCloseButton = false;
 vm.Popup.IsVisible = false;
 smMarkerOverlay.Markers.Add(vm);
 }
 }

 lx.Sort();
 ly.Sort();
 if (lx.Count > 0)
 {
 double x1 = lx[0];
 double y1 = ly[0];
 double x2 = lx.Last<double>();
 double y2 = ly.Last<double>();
 if (!IsPostBack)
 {
 if (!useKmlFile)
 {
 Map1.CurrentExtent = ExtentHelper.GetDrawingExtent(new RectangleShape(x1, y2, x2, y1), Convert.ToSingle(Map1.Width.Value), Convert.ToSingle(Map1.Height.Value));
 double CurrentScale = ExtentHelper.GetScale(new RectangleShape(x1, y2, x2, y1), Convert.ToSingle(Map1.Width.Value), Map1.MapUnit);
 if (CurrentScale > 1004000)
 {
 PointShape point = Map1.CurrentExtent.GetCenterPoint();
 Map1.ZoomTo(point, Map1.ClientZoomLevelScales[1]);
 }
 }
 }
 }
}


Thanks, 


Ayhan 


 



Hi Ayhan,


We created a simple web site (AutoRefreshTest.zip) and deploy it in the same environment (Windows Server 2008 R2 Enterprise 64bit turkish) as yours. But we can't re-produce the issue you mentioned.


Please use the sample web site to have another try and let us know if you have any questions.


Regards,


Ivan


 



AutoRefreshTest.zip (5.66 KB)

Hi Ivan, 
    I saw that example, you are giving new position for the maker you don’t clear the markes but in my stuation I retrive new data from database so I must first clear them than add again because I don’t kwow which data is for which marker. 
  
 Thanks, 
  
 Ayhan

Ivan, 

I found the way to do it with giving new position. But this time when I deploy it to the server it works for a few times and then stop working (it means doesn't fire the event) without any error . What should be the reason for this? 



Thanks, 



Ayhan



Hi Ayhan, 
  
 We can’t recreate your issue even if we clear markers then add again. Could you please provide us a sample to recreate this issue? Or you can use eventlog to track what happen inside your tick event on your deployment server. 
  
 Regards, 
  
 Ivan

Ivan, 
    I found the reason. I was using Dictionary<> to obtain our uniq Id and markers Id (Dictionary<int, string>). I was adding the marker id like (Marker vm = new Marker(v.X, v.Y); if (dicMarkers.ContainsKey(Convert.ToInt32(uid)) != true) dicMarkers.Add(Convert.ToInt32(uid), vm.Id.ToString()); ) until here no problem. 
      But when the tick event fires the if condition doesn’t work (if (dicMarkers.ContainsKey(uid))  
                    smMarkerOverlay.Markers[hstMarkers[uid].ToString()].Position = new PointShape(v.X, v.Y); 
                    smMarkerOverlay.Markers[hstMarkers[uid].ToString()].WebImage = new WebImage(imagePath);//, imgW, imgH); 
                    smMarkerOverlay.Markers[hstMarkers[uid].ToString()].Popup = GetPopupStyle(uid.ToString(), plaka, hiz, adres, tarih); 
                    smMarkerOverlay.Markers[hstMarkers[uid].ToString()].Popup.HasCloseButton = true; 
                    smMarkerOverlay.Markers[hstMarkers[uid].ToString()].Popup.IsVisible = false;   ). The dicMarkers is a static Dictionary<> variable and it works on my pc but not on server side. What sould be there and is there an other way to do it?. 
  
 Thanks, 
  
 Ayhan

Hi Ayhan,


From your code snippet we can't check what happen to "dicMarkers", could you please show us the whole logic in tick event?


We must be careful while using static member in asp.net web page ( please refer to blogs.msdn.com/b/tom/archive...tic-s.aspx), maybe you need to use another persistence solution (for example, ViewState).


Regards,


Ivan



Thank you Ivan, 
    
    it is about static variable. I changed it and it works now. 
  
 Thanks, 
  
 Ayhan.

Ayhan, 
  
 It’s our pleasure to find the solution for you. Just feel free to ask us any questions while using ThinkGeo products, we’ll do our best to assist you. 
  
 Regards, 
  
 Ivan

Ivan, 

An other problem with popups. when the tick event fires, popups don't move their new positions.


 



private static CustomPopup AddLableToVehicle(string _label, Vertex _vertex, ref string _sId)
        {
            StringBuilder htmlText = new StringBuilder();
            htmlText.Append("");
            htmlText.Append("");
            htmlText.Append(_label.ToLower());
            htmlText.Append("");
            htmlText.Append("");
             
            CustomPopup popup = new CustomPopup();
            popup.ContentHtml = htmlText.ToString();
            popup.AutoSize = true;           
            popup.HasCloseButton = false;
            popup.IsVisible = true;
            _sId = popup.Id.ToString();
            popup.Position = new PointShape(_vertex.X, _vertex.Y);
            
            return popup;
        }
 
 how I add popups
 Map1.Popups.Add(AddLableToVehicle(plaka, v, ref sPopupId));
 lstPopupId.Add(sPopupId);

 giving their new position on tick event
 Map1.Popups[lstPopupId[index].ToString()].Position = new PointShape(v.X, v.Y);


thanks, Ayhan



Hi Ayhan,


We recommend you use the following code to add popups for markers. In this way, the popup's postion will be refreshed when the marker's position changes.


marker.Popup = new CustomPopup(Guid.NewGuid().ToString(), marker.Position,"

Sample

");


Regards,


Ivan



Hi Ivan, 
  I use that code for makers which shows more detail about marker. But the other one is always visible and shows only plate for each vehicles. So I should find a way for refreshing their position. 
  
 Thanks, 
  
 Ayhan.

Hi Ayhan, 
  
 From your description, are all the popups related to markers? If so, we recommend you use marker’s popup instead of Map.Popups. 
  
 Hint: MarkerOverlay’s tick event is raised from a call back event, so it will not refresh Map.Popups. 
  
 Regards, 
  
 Ivan

Hi Ivan, 
  
    Yes all the popus are related to markers. Bu I can give one popup for each markers and I gived and contains more info about marker. So I need an other one that shows only plate for each marker and it always must be visible and also refreshed its position. 
  
 thanks, 
  
 Ayhan

Hi Ayhan, 
  
 Do you need multiple popups for a single marker? In current “WebEdition”, I’m afraid you can only implement it by using multiple markers with the same position. 
  
 For example, we need 2 popup for marker A, we must do the following steps: 
  
 1. Add marker A1 to MarkerOverlay, A1 has the same position and style with A 
 2. Add popup for marker A1, then customize the popup’s offsets 
 3. In tick event, update A1 and A’s position as the same position 
  
 Please let us know if you have further questions. 
  
 Regards, 
  
 Ivan