ThinkGeo.com    |     Documentation    |     Premium Support

To overlay non geo- referenced image

Hi,



     I want to overlay image which is not geo-referenced. I have gone through example of attaching worldfile with image but it not worked for me. 

Please guide to achieve this.



Thanks & Regards,

Goral


Hi Goral,



I guess you can use the GdiPlusRasterLayer to contain your image. Then in order to make the layer display in the map, we need to specify a world file which is with a same name as the image’s or we can pass the imageExtent in the layer’s constructor. The imageExtent is the extent where you want to image covers in the world map.



If you are still confused, would you please provide us your codes?

Please let me know if you have any questions.

Thanks,

Troy

Hi,



    Thank you for reply. Here I have given my code please go through this.


wfMap.MapUnit = GeographyUnit.DecimalDegree;
  
 wfMap.CurrentExtent = new RectangleShape(-8, 90, 20, -10);
 
 wfMap.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);
 ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(Application.StartupPath + @"\Data\Countries02.shp");
 Proj4Projection proj4 = new Proj4Projection();
  
 proj4.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4326); //WGS84(Longitude/Latitude)
 proj4.ExternalProjectionParametersString = Proj4Projection.GetWgs84ParametersString(); ; //Spherical Mercator projection(Google Map, Bing Map etc)
 
 worldLayer.FeatureSource.Projection = proj4;
 worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
 worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
 LayerOverlay coverlay = new LayerOverlay();
  
 worldLayer.Transparency = 60;
 coverlay.Layers.Add("CountryLayer", worldLayer);
 wfMap.Overlays.Add(coverlay);
 
 GdiPlusRasterLayer gf = new GdiPlusRasterLayer(Application.StartupPath + @"\Image.jpeg", new       RectangleShape(19.9999998360872, 64.9999984018505, 106.230003103614, -18.0000029094517));
 
 LayerOverlay test = new LayerOverlay();
 test.Layers.Add(gf);
  
wfMap.Overlays.Add(test);
    wfMap.Overlays.Add(coverlay);
 
 wfMap.Refresh();

   My image contains Lat long from 50E -160E and 20S-60N. So I have tried to give RectangleShape(19.9999998360872, 64.9999984018505, 106.230003103614, -18.0000029094517)) set image on proper latlong.



Thanks & Regards,

Goral

 

Hi Goral,



Thanks for your codes and your codes looks very well. But when I used your codes to load a jpeg image without a world file in my end, seems it works fine, the attached is what I get.

I am wondering which version you are referring? and would you please double check your sample again or send us your sample with the images?

Thanks,

Troy

025_Untitled.png (34.3 KB)

Hi,



   Thanks for reply. Ya I got it on the same code. Now I have another doubt. If I want to change projection and want to overlay image on it. I have changed code as below.


wfMap.MapUnit = GeographyUnit.DecimalDegree;
   
 wfMap.CurrentExtent = new RectangleShape(-8, 90, 20, -10);
  
 wfMap.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);
 ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(Application.StartupPath + @"\Data\Countries02.shp");
 Proj4Projection proj4 = new Proj4Projection();
   
 proj4.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4326); //WGS84(Longitude/Latitude)
 proj4.ExternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(32642); ; //UTM(42N)
  
 worldLayer.FeatureSource.Projection = proj4;
 worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
 worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
 LayerOverlay coverlay = new LayerOverlay();
   
 worldLayer.Transparency = 60;
 coverlay.Layers.Add("CountryLayer", worldLayer);
 wfMap.Overlays.Add(coverlay);
  
 GdiPlusRasterLayer gf = new GdiPlusRasterLayer(Application.StartupPath + @"\Image.jpeg", new       RectangleShape(-15,70, 130, -30));
  
 LayerOverlay test = new LayerOverlay();
 test.Layers.Add(gf);
   
wfMap.Overlays.Add(test);
    wfMap.Overlays.Add(coverlay);
  
 wfMap.Refresh();

Please go through this and suggest.









Hi Goral,



It looks like a projection issue. For the projection conversion, we need to make sure which is the target(or external) projection. Based on your codes, I noticed you are using EPSG 32642 as the target projection, but as I know this projection range is from 66°E to 72°E which means your current map extent and countries02.shp extent is too big for it. Besides, you need to change the map unit as meter and add a projection on all the layers.



I guess your question is your target project is EPSG 4326 and want to reproject an image from 32642 to 4326. If yes, then we just need to project the image extent. For example, you want to convert the image extent from EPSG 32642 to EPSG 4326 and don’t need add the projection on the countries02 layer as this layer is under EPSG 4326 already.



GdiPlusRasterLayer gf = new GdiPlusRasterLayer(Application.StartupPath + @"\Image.jpeg", prj4.ConvertToInternalProjection(new RectangleShape(166021.4431, 0.0000, 833978.5569, 9329005.1825)));



Please let me know if I misunderstand anything.

Thanks,

Troy


Hi Goral,



It looks like a projection issue. For the projection conversion, we need to make sure which is the target(or external) projection. Based on your codes, I noticed you are using EPSG 32642 as the target projection, but as I know this projection range is from 66°E to 72°E which means your current map extent and countries02.shp extent is too big for it. Besides, you need to change the map unit as meter and add a projection on all the layers.



I guess your question is your target project is EPSG 4326 and want to reproject an image from 32642 to 4326. If yes, then we just need to project the image extent. For example, you want to convert the image extent from EPSG 32642 to EPSG 4326 and don’t need add the projection on the countries02 layer as this layer is under EPSG 4326 already.



GdiPlusRasterLayer gf = new GdiPlusRasterLayer(Application.StartupPath + @"\Image.jpeg", prj4.ConvertToInternalProjection(new RectangleShape(166021.4431, 0.0000, 833978.5569, 9329005.1825)));



Please let me know if I misunderstand anything.

Thanks,

Troy

Hi,



   My problem is I have different images in different projections. I want to overlay it on map. One solution I got from your reply is to reproject image extent to internal projection. In that I have one doubt is how to decide RectangleShape(166021.4431, 0.0000, 833978.5569, 9329005.1825) values.  Because its not directly lat long value so I am not able to identify the extent.



  Second if you have any other suggestion to fulfil my requirement please guide.



Thanks & Regards,

Goral

Goral,



The RectangleShape(166021.4431, 0.0000, 833978.5569, 9329005.1825) is an extent which we assume this is the image’s extent under projection UTM(42N) and because we want to overlop it on a decimal degree map which is under projection 4326. So, we need to do a convertion on this extent to make their match.



I have a question on “My problem is I have different images in different projections”, How do you  get the projection information for each of the images? and do you have known their image extent under their projection or do their images have its world file?



If your images don’t have its world file but we know their image extent, we want to overlap them on a 4326 projection map. Then the below codes might be helpful:


//This Projection covert 32642 projection image extent to decimal degree.
            ManagedProj4Projection proj4From32642 = new ManagedProj4Projection();
            proj4From32642.InternalProjectionParametersString = ManagedProj4Projection.GetEpsgParametersString(32642); //UTM(42N)
            proj4From32642.ExternalProjectionParametersString = ManagedProj4Projection.GetEpsgParametersString(4326);  //WGS84(Longitude/Latitude)
            proj4From32642.Open();
 
            //Let’s assume this extent is known, and its projection is Epsg 32642
            RectangleShape image1Extent = new RectangleShape(69424.4579503739, 8097561.04435344, 957797.722261842, 6720392.77948917);
            //Before set display extent for image1, we need convert the extent projection to map projection (ESPG 4326), after this, image extent will be RectangleShape(56,73,83,60). 
            GdiPlusRasterLayer imageLayer1 = new GdiPlusRasterLayer(Application.StartupPath + @"\Image.jpg", proj4From32642.ConvertToExternalProjection(image1Extent));
 
            //This proj4 is used to convert google projection to decimal degree.
            ManagedProj4Projection proj4FromGoogle = new ManagedProj4Projection();
            proj4FromGoogle.InternalProjectionParametersString = ManagedProj4Projection.GetGoogleMapParametersString();
            proj4FromGoogle.ExternalProjectionParametersString = ManagedProj4Projection.GetDecimalDegreesParametersString();
            proj4FromGoogle.Open();
 
            //Assume this extent is known as the display extent for image2.
            RectangleShape image2Extent = new RectangleShape(7256367.52998595, 8602987.18874583, 8206632.57135357, 7381222.17932268);
 
            //Need to converte the image extent to decimal degree, after convert, it will be RectangleShape(65,61,73,55)
            GdiPlusRasterLayer imageLayer2 = new GdiPlusRasterLayer(Application.StartupPath + @"\Image2.jpg", proj4FromGoogle.ConvertToExternalProjection(image2Extent));
 
            LayerOverlay test = new LayerOverlay();
            test.Layers.Add(imageLayer1);
            test.Layers.Add(imageLayer2);


Thanks,

Troy

Hi,



  Thanks for reply. Ok first point I got is we need to convert image extent to internal projection.



  Answer to your question is from the source which I am getting images on the site it is written there it is in particular projection. I am not getting any header file. Seeing image itself I am getting idea about extent. Because latitude and logitude lines are there. To convert extent to internal projection extent we should know extent in external projection unit. For example image is of UTM(42N) then we have to give extent in meter unit.



 Can you please explain the same thing as per given scenario?



Thanks & Regards,

Goral

Hi Goral,



I think you might have some confusions on the image’s extent projection issue. I will try to explain it more clear in below.



For the image extent, this is an extent where you want to cover your image on your map and we should make suite this extent and map is under the same projection. 

For instance, the map is using decimal degree(projection is EPSG 4326) and we want the image covering on (19, 64, 106, -18). As both sides are under decimal degree with a same unit, we don’t need to a projection conversion on the image extent. But if we know the image original area unit is meter but the map is under decimal degree, then we need to do a conversion on the image extent to make sure they keep a same unit(projection).



Thanks,

Troy

Hi,



  Thanks for reply. Ya I also feel like that there is some confusion at my end.  Can you give me email id so I can send you the image? You can go through it to understand easily and guide me to overcome my doubt.



  One more thing I want to ask is can you please explain fundamental of Internalprojection string and externalprojection string?

Thanks & Regards,

Goral

Hi Coral,



You can send your images to forumsupport@thinkgeo.com. Please don’t forget to add the necessary information in the email.



For the concept of InternalProjection and ExternalProjection string: Both of them are the Proj4 string, which represents a kind of projection. We can search all the projection in spatialreference.org/ and find its proj4 string. For example, the most common projection is EPSG 4326(longitude and latitude) and its proj4 string is “+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs”.



In map suite projection system, the InternalProjection means which projection your original shape are built in and the ExternalProjection means this is a target projection your want to convert the original shape to. Let’s see the sample:


Proj4Projection proj4 = new Proj4Projection();
proj4.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4326); // longlat 
proj4.ExternalProjectionParametersString = Proj4Projection.GetGoogleMapParametersString();// meter(google map projection)
proj4.Open();
RectangleShape sourceShape = new RectangleShape(-180, 90, 180, -90);
RectangleShape targetShape = proj4.ConvertToExternalProjection(sourceShape); //-20037508.2314698,20037508.2314698,20037508.2314698,-20037508.2314698

The above sample is we convert the sourceshape from decimal degree to meter. On the contrary, if the sourceshape is under meter unit, then we call ConvertToInternalProjection method to convert to decimal degree.



Besides, the above shows the projection on single shape level, we can still apply the projection on the layer level:

                ShapeFileFeatureLayer shapeFileFeatureLayer = new ShapeFileFeatureLayer("…");
                proj4.Open();
                shapeFileFeatureLayer.FeatureSource.Projection = proj4;
This means we want to convert all the feature in the shape file from its InternalProjection to ExternalProjection.



Hope those would make it clear.

Thanks,

Troy


Hi,



   Thanks for reply. I understand the logic of internal and external projection string. I got success by overlaying mercator projection images. Still I am facing problem in Polar Stereographic projection images. First suggest EPSG or ESRI projection string number. Second thing, can we set center latitude longitude in any projection to see it from different view? 



Thanks & Regards,

Goral

Goral,



More details about Polar Stereographic projection, please refer to spatialreference.org/ref/?search=Polar+Stereographic



For your second question "can we set center latitude longitude in any projection to see it from different view?", If you mean you want to set the images with difference projection center at the map, yes, we can do it. Since your base layer is under decimal degree, we need to add a projection on each image layer, then call the layer.GetBoundingBox().GetCenterPoint() method can get the center point with longitude/Latitude. 



Thanks,

Troy