ThinkGeo.com    |     Documentation    |     Premium Support

Drawing an InMemoryFeatureLayer on Google map

 Greetings


i need to draw an inMemoryFeatureLayer on an existing google map i saw the sample "ShapeFiles over Google map" but its not working here is my code below



InMemoryFeatureLayer inMemoryFeatureLayer = new InMemoryFeatureLayer();


        inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.CreateSimpleCircleStyle(GeoColor.FromArgb(180, 102, 255, 102), 10, GeoColor.StandardColors.DarkGreen, 1);


        inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.Green, 4, true);


        inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.FromArgb(180, 102, 255, 102), GeoColor.StandardColors.DarkGreen, 1);


        inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;


        inMemoryFeatureLayer.DrawingQuality = DrawingQuality.HighQuality;


        


        inMemoryFeatureLayer.Open();


        inMemoryFeatureLayer.EditTools.BeginTransaction();


 


        PointShape point = new PointShape();


        //Builds the polygon based on the structure of the text files with X and Y comma separated.


        int i = 0;


        while (i <= streamReaders.Length - 1)


        {


            PolygonShape polygonShape = new PolygonShape();


            RingShape ringShape = new RingShape();


            string line = null;


            while (line != "")


            {


                line = streamReaders.ReadLine();


                if (line != null)


                {     


                    string[] strSplit = line.Split(';');


                    ringShape.Vertices.Add(new Vertex(Convert.ToDouble(strSplit[0]), Convert.ToDouble(strSplit[1])));


                    point = new PointShape(new Vertex(Convert.ToDouble(strSplit[0]), Convert.ToDouble(strSplit[1])));


                }


                else


                {


                    break;


                }


            }


            //Remember to add the last vertex with the same X and Y as the first vertex to enclose completely the polygon.


            ringShape.Vertices.Add(new Vertex(ringShape.Vertices[0].X, ringShape.Vertices[0].Y));


            polygonShape.OuterRing = ringShape;


            AreaLB.Text = Convert.ToString(polygonShape.GetArea(GeographyUnit.DecimalDegree, AreaUnit.SquareMeters));


            inMemoryFeatureLayer.EditTools.Add(new Feature(polygonShape));


            


            i = i + 1;


        }


        inMemoryFeatureLayer.EditTools.CommitTransaction();


 


        ShapeFileFeatureLayer AdminLayer1 = new ShapeFileFeatureLayer(MapPath("App_Data\\KSA_Adminbndy\\Adminbndy1.shp"));


        ShapeFileFeatureLayer.BuildIndexFile(MapPath("App_Data\\KSA_Adminbndy\\Adminbndy1.shp"), BuildIndexMode.DoNotRebuild);


        AdminLayer1.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;


        AdminLayer1.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;


        ShapeFileFeatureLayer AdminLayer3 = new ShapeFileFeatureLayer(MapPath("App_Data\\KSA_Adminbndy\\Adminbndy3.shp"));


        ShapeFileFeatureLayer.BuildIndexFile(MapPath("App_Data\\KSA_Adminbndy\\Adminbndy3.shp"), BuildIndexMode.DoNotRebuild);


        AdminLayer3.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;


        AdminLayer3.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;


        AdminLayer3.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = TextStyles.CreateSimpleTextStyle("POLYGON_NM", "Arial", 10, DrawingFontStyles.Regular, GeoColor.StandardColors.Black, 3, 3);


        AdminLayer3.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;


        ShapeFileFeatureLayer AdminLayer5 = new ShapeFileFeatureLayer(MapPath("App_Data\\KSA_Adminbndy\\Adminbndy5.shp"));


        ShapeFileFeatureLayer.BuildIndexFile(MapPath("App_Data\\KSA_Adminbndy\\Adminbndy5.shp"), BuildIndexMode.DoNotRebuild);


        AdminLayer5.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;


        AdminLayer5.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;


        AdminLayer5.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = TextStyles.CreateSimpleTextStyle("POLYGON_NM", "Arial", 10, DrawingFontStyles.Regular, GeoColor.StandardColors.Black, 3, 3);


        AdminLayer5.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;


 


        layerOverlay = new LayerOverlay("الخريطة المبدئية");


        layerOverlay.Layers.Add("AdminLayer1", AdminLayer1);


        layerOverlay.Layers.Add("AdminLayer3", AdminLayer3);


        layerOverlay.Layers.Add("AdminLayer5", AdminLayer5);


        layerOverlay.Layers.Add("inMemoryFeatureLayer", inMemoryFeatureLayer);


 


        ShapeFileFeatureLayer shapeFileFeatureLayer = new ShapeFileFeatureLayer();


        shapeFileFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.FromArgb(100, 212, 220, 184), GeoColor.FromArgb(255, 132, 132, 154), 1);


        shapeFileFeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;


 


        Proj4Projection proj4 = new Proj4Projection();


        proj4.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4326);


        proj4.ExternalProjectionParametersString = Proj4Projection.GetGoogleMapParametersString();


        shapeFileFeatureLayer.FeatureSource.Projection = proj4;


        google = new GoogleOverlay("خريطة جوجل");


        google.JavaScriptLibraryUri = new Uri(ConfigurationManager.AppSettings["GoogleUri"]);


        google.GoogleMapType = GoogleMapType.Normal;


     


        LayerOverlay shapeOverlay = new LayerOverlay("خريطة الحيازة", false, TileType.SingleTile);


        shapeOverlay.Layers.Add("inMemoryFeatureLayer", inMemoryFeatureLayer);


        shapeOverlay.TransitionEffect = TransitionEffect.None;


        Map1.CustomOverlays.Add(shapeOverlay);


        inMemoryFeatureLayer.Close();



Thanks



Hi Saddam,
 
What’s your Map1.MapUnit? Is it Meter? I think that’s the problem, if there is still problem, could you please send us the shape file to forumsupport@thinkgeo.com so we could have a test?
 
Thanks,
 
Edgar 

Hi Edgar 
  
 The map unit is decimal degrees, and also i dont want to draw an existing shape file i want to draw an inMemoryFeature which is a polygon that i have its vertices in lat and long in a text file. 
  
 Thanks

Hi saddam, 



Can you describe what is 'not working'? Is the Polygon not being displayed at all? Is the polygon drawn but in the incorrect location? 



If you are displaying the polygon on top of a GoogleMap and your polygon points are Decimal Degrees/LatLong you need to reproject your polygon points that you are placing into the InMemoryFeatureLayer to the GoogleMap projection just you did with your ShapefileFeatureLayers. 



For the polygon to match up with the shapefiles and the Google Map it needs to be in the same projection. 



You can use the same ProjectionParameters you used on the ShapeFileFeature Layers, just apply it to your InMemoryFeature Layer as well.


Finally if you are using GoogleMaps as a background you need to set your MapUnit = GeographyUnits.Meter as meters is the unit system for the Spherical Mercator projection which is the Google Maps projection.



Hello Ryan 
  
 The problem i was having is that i wanted to be able to display the same polygon either on a shape file or on google maps, i am able to display it on google maps by changing the map unit to meters but i need the map unit to be in decimal degrees for further functions, is there any way that this can work? 
  
 Thanks

Hi saddam,


You are encountering a situation where you will need to perform some 'Reprojection' of your polygon to match the projection/coordinate system of the background data.


If you are using GoogleMaps as your background you will need to use a MapUnit = GeographyUnit.Meters. So if you have coordinates for your polygon in DecimalDegrees you will need to convert these to the Google Projection (Spherical Mercator) which uses meters.


We have several methods by which you can perform reprojection. We have a .Projection parameter on the Layer that can allow you to apply a projection to a all the Features contained in a Layer. We also have a ConvertToInternalProjection or ConvertToExternalProjection that can allow you to convert individual Features, Vertices , or BaseShapes. Thus when you read your vertices from your text file you could run each of them through a  ConvertToExternalProjection and add these projected vertices to the RingShape for your Polygon.


In your situation I would set up the following:



//Setup Projection
                Proj4Projection proj4Projection = new Proj4Projection();
                proj4Projection.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4326);
                proj4Projection.ExternalProjectionParametersString = Proj4Projection.GetGoogleMapParametersString();

                //Vertices for your Polygon
                Vertex vertex = new Vertex(x,y);
                proj4Projection.ConvertToExternalProjection(vertex);

                //Add vertex to the Polygon's Ringshape
 



If you don't want to convert from DecimalDegrees to Meters and back depending on if your shapefile is the background or GoogleMaps is the background, you could make it so all your data is in the same projection and coordinate system by reprojecting your shapefile to the Google projection (Spherical Mercator) too.



Hi Ryan 
  
 Thanks ill try it ans ill tell you how it goes, but on another matter i have used calculate area to see the area of the polygon and used another program that give the area of the same polygon but had different numbers can u explain to me how the GetArea does the calculations to get the area here are the numbers. 
 The area using GetArea is 62039786182.125 and using another program 61470364126 this is squared meters as you can see there is a big difference between the two numbers can you explain that to me? 
  
 Thanks

Hi Saddam, 
  
 I think the area you got was from the projected polygon,  right? The area might be changed after re-projecting, only with the original unit, e.g. decimal degree in your scenario, it would get the accurate result. 
  
 Regards, 
  
 Edgar

Hi Edgar 
  
 Thanks for the quick reply, I’m working on the issues i discussed with you and ill keep you posted. 
  
 Saddam

OK, please let us know the status as you find anything. 
  
 Edgar

Greetings  
  
 I finally drew the polygon on the map the problem is that the polygon is not drawn in its location its shifted can you help me with that 
  
 thanks

Saddam, 
  
 Are you using the Projection? I think that’s the reason which caused it shifted, if you want to draw the polygon at its original location, please remove the projection. 
  
 Regards, 
 Edgar

Edgar 
  
 even if i remove the projection the polygon is still shifted any ideas? 
  
 thanks  
  
 Saddam

Saddam, 
  
 Could you please send the shape file to us? If it’s less than 500kb, it can be attached here, or you can send it to forumsupport@thinkgeo.com
  
 Thanks, 
 Edgar

Hello Edgar 
  
 I sent the solution with the shape files to your email  
  
 Thanks in advance

Hi Saddam,


We received your e-mail but the shapefiles were not included. If possible please create a Customer Portal Ticket by logging into helpdesk.thinkgeo.com. You should be able to attach your shapefiles to a Ticket.



Hi Ryan 
  
 the shape files are in the folder App_Data  
  
 Thanks

Saddam, 
  
 You must have forgot to attach the files, we just received your e-mail without any attachment, could you please reattach it? 
  
 Thanks, 
 Edgar

Saddam,


I wrote a sample to display the files but I can get the correct result.



Attached is my sample code.


Regards,


Edgar



post10750.txt (2.26 KB)

Hi Edgar 
  
 Its working fine now thank you for helping me with the projection. 
  
 Regards