ThinkGeo.com    |     Documentation    |     Premium Support

Marker is not showing in exact location

 In my web application iam using shape files.from shape file points i am creating a location.in that location iam showing marker but the marker is not showing exactly on that particular shape file point.but my client is asking when we craete any marker from shape file point that marker should be show on the shape file point but marker is showing in somw what different place.is it possible to show exactly the marker should shown on the Layer point.


for your reference i am adding a screen shot of that one.



 Hi rajanikanth,


Thanks for you post, and from the description, I guess there may be 2 reasons shown as following:


 


1. Maybe something wrong with the projection used for the Markers, seems like you are using GooglMap as the base layer, so please make sure you are using Proj4Projection.GetGoogleProjectionString(). Also can you let us know which markerOverlay you are using? SimpleMarkerOverlay, InMemoryMarkerOverlay or FeatureSourceMarkerOverlay?


 


2. I noticed that you are using a popup div which contains a map on the right, and there is another Div on the left for a treeview, so i'm not sure whethere is some problems related to that div or treeview used on the left, mabye some Javascript conflictions, can you try removing the treeview and related js file to check if it works fine?


If it still runs into problem, can you provide us a dmeo for debug?


Thanks,


Johnny



 how to set projection for markers can you show me one example so that i will get it.


for layers iam using like this code


 


   Proj4Projection proj4 = new Proj4Projection();


                            string prjFileText = System.IO.File.ReadAllText("D:/Map/" + cname + "/" + lname + ".prj"); //get the text of the .prj file.


                            proj4.InternalProjectionParametersString = Proj4Projection.ConvertPrjToProj4(prjFileText); //set the internal projection.  The new ConvertPrjToProj4 methid is the key to this process.


                            proj4.ExternalProjectionParametersString = Proj4Projection.GetGoogleMapParametersString(); //set the external projection.  In this case, it's Spherical Mercator (which google/bing, etc all use).


                            worldLayer.FeatureSource.Projection = proj4;


first iam getting prjfile text according to that i find whether shape file is meter or decimal degree then iam using internal and external projection strings for my layer .for showing markers iam using simpleMarkeroverlay


 



Hi Rajanikanth, 
 
Please try the following code as following:
 
 




                Proj4Projection proj4 = new Proj4Projection();

                proj4.InternalProjectionParametersString = Proj4Projection.ConvertPrjToProj4(prjFileText);

                proj4.ExternalProjectionParametersString = Proj4Projection.GetGoogleMapParametersString();

 

                FeatureSourceMarkerOverlay markerOverlay = new FeatureSourceMarkerOverlay("Markers");

                 ……

                markerOverlay.FeatureSource.Projection = proj4;

                Map1.CustomOverlays.Add(markerOverlay);


 
 
Hope it helps,
 
 
Johnny

 hello john,


iam using simple marker overlay for showing different marker images on the map.for simple marker overlay can we set projection.even i check for inmemorymarker overlay if i set projection it is showing same as previous.it is not showing exact location.so by using simplemarkeroverlay i want to show my marker in exact layer point location.


here  iam taking location lat and long values besd on map click event.according to that iam adding location in my dtabase.then based on those lat and long values iam showing markers on the map.whether iam taking lat and long values taking based on map click event is it wrong.


 


   dlongitude = Convert.ToDouble(e.Location.X.ToString());


            dlatitude = Convert.ToDouble(e.Location.Y.ToString());


like this iam getting lat and long values.based on this lat and long values iam dipalying markers.


if i add new location from layer point with low zoom level (ex:zoomlevel 6).then if click on show markers button .then marker is showing near to that layer point.if i increase map zoom level them marker is showing in some where when compare with layer point.i think may be getting lat and long values from e.location iam getting this issue.tell me whether iam doing any thing wrong here.so that i can show marker on exactly on layer points.


 



Hi rajanikanth, 
  
 Seems like there are some differences when we get the lon/lat from the user clicked, it should be the e.Position rather than the e.Location. 
      dlongitude = Convert.ToDouble(e.Position.X.ToString()); 
     dlatitude = Convert.ToDouble(e. Position.Y.ToString()); 
  
 Except the things mentioned above, everything works fine for us, can you make a demo for us to reproduct it? 
  
 Thanks, 
 Johnny

 Hello Johnny ,


Please check my below sample application how i implemented in my web application.


 


this is my aspx page



<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Demo_map._Default" %>


 


<%@ Register Assembly="WebEdition" Namespace="ThinkGeo.MapSuite.WebEdition" TagPrefix="cc1" %>


 



 




    




    <form> id="form1" runat="server">


    


        <asp:Button ID="btnshapefile" runat="server" Text="Shapefile" 


            onclick="btnshapefile_Click" />


        <asp:Button ID="btnmarkers" runat="server" Text="markers" 


            onclick="btnmarkers_Click" />


        <asp:ScriptManager ID="ScriptManager1" runat="server">


        </asp:ScriptManager>


        <cc1:Map ID="Map1" runat="server" Height="480px" Width="100%" 


            onclick="Map1_Click">


        


        </cc1:Map>


    


    </form>




This is MY .cs page
 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Configuration;
using ThinkGeo.MapSuite.WebEdition;
using ThinkGeo.MapSuite.Core;
using System.Data.SqlClient;
using System.Collections.ObjectModel;
using System.Data;
namespace Demo_map
{
    public partial class _Default : System.Web.UI.Page
    {
        GoogleOverlay google = new GoogleOverlay("Google Map");
        protected void Page_Load(object sender, EventArgs e)
        {
           
            if (!IsPostBack)
            {
                Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#E5E3DF"));
                Map1.CurrentExtent = new RectangleShape(-13939426.6371, 6701997.4056, -7812401.86, 2626987.386962);
                Map1.MapUnit = GeographyUnit.Meter;
              
                //    Map1.MapTools.OverlaySwitcher.Enabled = true;
                Map1.MapTools.MouseCoordinate.Enabled = true;
 
 
                google.JavaScriptLibraryUri = new Uri(ConfigurationManager.AppSettings["GoogleUriV3"]);
                google.GoogleMapType = GoogleMapType.Normal;
                Map1.CustomOverlays.Add(google);
                // Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#94aac6"));
                // Map1.CurrentExtent = new RectangleShape(-131.22, 55.05, -54.03, 16.91);
                Map1.MapTools.ScaleLine.Enabled = true;
            }
 
          
        }
 
        protected void btnshapefile_Click(object sender, EventArgs e)
        {
          
            ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(MapPath("~/Map/culvert.shp"));
            ShapeFileFeatureSource.BuildIndexFile(MapPath("~/Map/culvert.shp"), BuildIndexMode.DoNotRebuild);
            worldLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.Capital1; 
            worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            Proj4Projection proj4 = new Proj4Projection();
            string prjFileText = System.IO.File.ReadAllText(MapPath("~/Map/culvert.prj")); //get the text of the .prj file.
            proj4.InternalProjectionParametersString = Proj4Projection.ConvertPrjToProj4(prjFileText); //set the internal projection.  The new ConvertPrjToProj4 methid is the key to this process.
            proj4.ExternalProjectionParametersString = Proj4Projection.GetGoogleMapParametersString(); //set the external projection.  In this case, it's Spherical Mercator (which google/bing, etc all use).
            worldLayer.FeatureSource.Projection = proj4;
            
            worldLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle.OverlappingRule = LabelOverlappingRule.NoOverlapping;
           
          
           
          
            Map1.StaticOverlay.Layers.Add(worldLayer);
            Map1.StaticOverlay.Redraw();
            Map1.StaticOverlay.IsBaseOverlay = false;
            worldLayer.Open();
            proj4.Open();
 
            Map1.CurrentExtent = worldLayer.GetBoundingBox(); 
         //   Map1.ZoomToScale(100000);
        }
 
        protected void Map1_Click(object sender, MapClickedEventArgs e)
        {
            if (Map1.StaticOverlay.Layers.Count > 0)
            {
                Session["layerfieldid"] = 0; double dlongitude, dlatitude;
                if (Map1.StaticOverlay.Layers.Count > 0)
                {
                    Session["layerfieldid"] = 0;
                    foreach (ShapeFileFeatureLayer item in Map1.StaticOverlay.Layers)
                    {
                        item.Open();
                        ShapeFileType shapeFileType = item.GetShapeFileType();
                        if (shapeFileType == ShapeFileType.Point || shapeFileType == ShapeFileType.Multipoint)
                        {
                            double resolution = Math.Max(Map1.CurrentExtent.Width / Map1.WidthInPixels, Map1.CurrentExtent.Height / Map1.HeightInPixels);
 
                            double clickScreenTolerance = 4;
                            double clickWorldTolerance = clickScreenTolerance * resolution;
                            RectangleShape clickArea = new RectangleShape(e.Position.X - clickWorldTolerance, e.Position.Y + clickWorldTolerance, e.Position.X + clickWorldTolerance, e.Position.Y - clickWorldTolerance);
 
                            Collection<Feature> features = item.QueryTools.GetFeaturesIntersecting(clickArea, ReturningColumnsType.AllColumns);
                            item.Close();
                            if (features.Count > 0)
                            {
                                int id = Convert.ToInt32(features[0].Id.ToString());
 
                            }
 
 
                        }
                    }
                    dlongitude = Convert.ToDouble(e.Position.X.ToString());
                    dlatitude = Convert.ToDouble(e.Position.Y.ToString());
 
 
                    //  here feature id and map position latitude and longitude values  saved in database. 
 
                }
            }
        }
 
        protected void btnmarkers_Click(object sender, EventArgs e)
        {
            DataTable Dttt = new DataTable();//here iam getting all location data from my database
            double pplat=0, pplong=0;
            string pid;
            Marker mar = new Marker();
            SimpleMarkerOverlay markers = new SimpleMarkerOverlay();
            for (int i = 0; i < Dttt.Rows.Count; i++)
            {
                if (Convert.ToString(Dttt.Rows["LocStartLatitude"].ToString()) != "")
                {
                    pplat = Convert.ToDouble(Dttt.Rows["LocStartLatitude"].ToString());
                }
                if (Convert.ToString(Dttt.Rows["LocStartLongitude"].ToString()) != "")
                {
                    pplong = Convert.ToDouble(Dttt.Rows["LocStartLongitude"].ToString());
                }
                 pid = Convert.ToString(Dttt.Rows["LocId"].ToString());
 
                if (pplong != 0 && pplat != 0)
                {
                    string name = "";// = Convert.ToString(Dttt.Rows["ImageName"].ToString());
                    if (Convert.ToString(Dttt.Rows["ImageName"].ToString()) != "")
                    {
                        name = Convert.ToString(Dttt.Rows["ImageName"].ToString());
                        mar = new Marker(pplong, pplat, new WebImage("../../Documents/" + name, 21, 25));
                    }
                    else
                    {
                        mar = new Marker(pplong, pplat, new WebImage("../../images/Unknown.png", 21, 25));
                    }
                    mar.Id = pid;
                    markers.Markers.Add(mar);
                }
                
            }
            Map1.CustomOverlays.Add(markers);
            Proj4Projection proj4 = new Proj4Projection();
            string prjFileText = System.IO.File.ReadAllText(MapPath("~/Map/Culvert.prj")); //get the text of the .prj file.
            proj4.InternalProjectionParametersString = Proj4Projection.ConvertPrjToProj4(prjFileText); //set the internal projection.  The new ConvertPrjToProj4 methid is the key to this process.
            proj4.ExternalProjectionParametersString = Proj4Projection.GetGoogleMapParametersString(); //set the external projection.  In this case, it's Spherical Mercator (which google/bing, etc all use).
 
 
            //so here iam unable assign projection for simple marker overlay
 
 
            
        }
    }
}

 
 
 
so plaese check this code and suugest how to show marker on the layer points.
 



 Hi Rajanikanth,


 
Seems like I found a possible problem in the code, when “e.Position.X” and “e.Position.Y”  are stored to database, it is in Spherical Mercator Projection,  so when it is got from the database, it is no necessarity to set its projection to Mecator Projection again. In attached sample, you could see that without setting the InMemoryMarkerOverlay.FeatureSource.Projection, the marker still  exist in the right position
 
Hope it helps
 
Johnny

Post_11116sample.txt (1.49 KB)

hello john, 


 Still i am not getting my marker location on exact layer points.my client already buy this think geo product and  he is waiting for this requirement please give me a solution for this problem.iam not using any projection on markers.


 


                  Marker mar = new Marker();


                    SimpleMarkerOverlay markers = new SimpleMarkerOverlay();                   


                    BMSI.WebService.BMSIWebService WebSer = new BMSI.WebService.BMSIWebService();


                    DataTable Dttt = WebSer.GetAssetMapData(assetqry, e.Node.Checked);


                   // Session["Dttt"] = Dttt;


                    h1.Value = "1";


                    divr1.Visible = false; divr2.Visible = true; divr3.Visible = false;


                    // ds = BMSIBL.WorkOrderBase.GetWorkOrderassetMapData(assetqry, pCompanyID);


                    //  InMemoryFeatureLayer pointLayer = new InMemoryFeatureLayer();


                    for (int i = 0; i < Dttt.Rows.Count; i++)


                    {


                        string x = "";


                        double pplat = 0; double pplong = 0;


                        string pid = Convert.ToString(Dttt.Rows["ID"].ToString());



                        if (Convert.ToString(Dttt.Rows["LocStartLatitude"].ToString()) != "")



                        {


                            pplat = Convert.ToDouble(Dttt.Rows["LocStartLatitude"].ToString());



                        }


                        if (Convert.ToString(Dttt.Rows["LocStartLongitude"].ToString()) != "")



                        {


                            pplong = Convert.ToDouble(Dttt.Rows["LocStartLongitude"].ToString());



                        }


                        //  ClusterMarkerStyle clusterMarkerStyle = new ClusterMarkerStyle(20, 1024, 768);


                        if (pplong != 0 && pplat != 0)


                        {


                            string name = "";// = Convert.ToString(Dttt.Rows["ImageName"].ToString());



                            if (Convert.ToString(Dttt.Rows["ImageName"].ToString()) != "")



                            {


                                name = Convert.ToString(Dttt.Rows["ImageName"].ToString());



                                mar = new Marker(pplong, pplat, new WebImage("../../Documents/" + name, 21, 25));


                            }


                            else


                            {


                                mar = new Marker(pplong, pplat, new WebImage("../../images/Unknown.png", 21, 25));


                            }


                            mar.Id = pid;


                            markers.Markers.Add(mar);               


              }


                    }                   


                    Map1.CustomOverlays.Add(markers);


 


like this iam displaying markers on my Map layers.but it is not showing exactly on layer points,it shows some where from layer point.


 




 Hi Rajanikanth,


 
Sorry for the inconvenience, but we can't recreate the problem, attachment is our test sample which I load points from shapefile then store the points’ lat and lon to database, then read them from the database and display them, but the positions are all correct, would you please check if we missed anything there? Or would you please give us a small runnable sample with a backup of your database to recreate the problem, you could send them to forumsupport@thinkgeo.com.  Here is the table design:
 
CREATE TABLE [dbo].[PointPosition](
      [longitude] [float] NULL,
      [latitude] [float] NULL,
      [imagename] [varchar](50) NULL
) ON [PRIMARY]
GO
 
Hope it helps
 
Gary
 

post11116sample.txt (3.17 KB)

 Thank you Gray its working fine but the marker is showing in the bottom of the point can we show on top of the point so that we can clearly mention that this marker belongs to that point.



Map1.png (34.4 KB)

 


Hi rajanikanth,
The upper-left corner of the image is placed at the coordinate where it should be, if you would like to show image top and center of the point, please set the “ImageWidth/ImageHeight” properties of the WebImage at first, and then change the “ImageOffsetX/ImageOffsetY” to a proper value, just like the code as following:
                markerOverlay.ZoomLevelSet.ZoomLevel01.DefaultMarkerStyle.WebImage.ImageOffsetX = -10.5f;
                markerOverlay.ZoomLevelSet.ZoomLevel01.DefaultMarkerStyle.WebImage.ImageOffsetY = -25f;
                markerOverlay.ZoomLevelSet.ZoomLevel01.DefaultMarkerStyle.WebImage.ImageWidth = 21;
                markerOverlay.ZoomLevelSet.ZoomLevel01.DefaultMarkerStyle.WebImage.ImageHeight = 25;
 
Thanks,
Johnny