ThinkGeo.com    |     Documentation    |     Premium Support

GeoTIFF fails to display to correct extent

Since moving to Version 7.0, our GeoTIFFs are failing to render properly. They appear to have an extent of 0 (appear at [0°,0°] as a single pixel.



GeoTiffRasterLayer layer = new GeoTiffRasterLayer(file);
layer.LibraryType = GeoTiffLibraryType.UnmanagedLibTiff;
layer.UpperThreshold = double.MaxValue;
layer.LowerThreshold = 0;
layer.IsGrayscale = false;
layer.IsNegative = false;
layer.IsVisible = true;
layer.Name = name;
layer.Open();


If I manually supply an extent to the constructor of GeoTiffRasterLayer then it draws into that extent. 



So it would appear that version 7.0 is no longer correctly parsing the extent information out of GeoTIFFs and possibly default constructing an empty extent.



Any suggestions to get this working? Or is this bug likely to be fixed in an upcoming release? (and no, using a .tfw world file is not an option unfortunately).



Hi Richard, 
  
 We haven’t modfiy the constructor of GeoTiffRasterLayer from 2010, but maybe other changes caused your problem.  
  
 For render GeoTiff, we think an specified extent should be necessary, or map control don’t know where to locate the tiff image. 
  
 User should specify extent manually or set the extent in .tfw file, that’s the recommended usage. 
  
 Any question please let us know. 
  
 Regards, 
  
 Don 
  


Hi Don, 



Specifying an Extent shouldn’t be necessary as that information is contained within the GeoTIFF metadata. That is the point of a GeoTIFF. Without it… well they would just be TIFFs!



As you say you have not modified the constructor for GeoTiffRasterLayer, but it is possible that the GDAL (or whatever library you use for handling geotiff) has changed its interface and you may need to call a separate constructor for the non-TFW supplied case.



Any chance you could look into this?

Hi Richard,



Very sorry I put tiff and geotiff confused. Yes, you are right, for geotiff world information contained by itself.



We did many tests and as below should be the solution:
1. Delete these folder:
For x64:
C:\Windows\SysWOW64\Map Suite 7.0\GeoTiffX86
C:\Windows\SysWOW64\Map Suite 7.0\GeoTiffX64
For x86:
C:\Windows\System32\Map Suite 7.0\GeoTiffX86
C:\Windows\System32\Map Suite 7.0\GeoTiffX64
2. Download latest dll package and install the Unmanaged Dependencies msi, for example: Map Suite Unmanaged Dependencies 7.0.124.0.msi
3. Install the msi it should works now.



As below is my test result with a GeoTiff file without its world file.




Please let me know whether that works for you.



And I want to make sure whether you are using win7 operation system.



Regards,



Don

Hi Don, sorry for my tardy reply. I had stopped checking this page for updates.



I downloaded the latest (WpfDesktopEditionEvaluation7.0.149.0DllPackage.zip) and followed your instructions.



Note, I am conducting my test on our deployment hardware (we use the merge modules for installation of the libraries, I assume the steps would be equivalent as both the merge module and the 'Map Suite Unmanaged Dependencies 7.0.0.124.msi put the geotiff DLLs in the same location).



When I attempt to load a (invalid) geotiff the following exception is thrown:

Failed to load geotiff because : System.AccessViolationException: Attempted to read or write protected memory.
This is often an indication that other memory is corrupt.
   at System.Runtime.InteropServices.Marshal.ReadByte(IntPtr ptr, Int32 ofs)
   at oxQ=./Uk=.EEo=(String EUo=)
   at ThinkGeo.MapSuite.Core.UnmanagedGeoTiffRasterSource.PB8=(Byte[] PR8=)
   at ThinkGeo.MapSuite.Core.UnmanagedGeoTiffRasterSource.OpenCore()
   at ThinkGeo.MapSuite.Core.RasterSource.Open()
   at ThinkGeo.MapSuite.Core.RasterSource.Open()
   at L3.Iras.AnalyserMap.MapViewModel.LoadGeoTiffCharts(List`1 files, ZoomLevelSet zoomLevels)


Edit - the above error I discovered was when I was loading an apparently invalid GEOTIFF. When I attempt to load a GeoTIFF that is successfully loaded with our other library I see the same issue as before, that is the extent is set to zero. It makes me think I am possibly not getting the correct DLLs?



Using Dependency Walker I can see that the GEOTIFFX64.DLL file in syswow64 is being loaded. There is no version information in this DLL but its modified data was 9th of September 2013 which makes me think I have the wrong DLL? However this DLL appeared after I ran the 'Map Suite Unmanaged Dependencies 7.0.124.0.msi installer - I also ran the 7.0.0.91.msi installer from WpfDesktopEditionFull7.0.0.151.DllPackage.zip - same thing).



Both our dev systems and the target application system run Windows 7 64-bit.



Are there any other DLLs that need to be updated (ie MapSuiteCore.dll)?

Hi Richard, 
  
 The dlls modified on 9th of September 2013 should be the latest dlls since we never modified after that. So I guess what you get should be correct dlls. What I expect is you can provide us your tiff files which always get the zero extent and then we can debug into further. 
  
 Waiting for your feedback. 
 Thanks, 
 Johnny 


Hi Johnny, I’ve attached an example geotiff that previously loaded in MapSuite 6 that is failing to load in MapSuite 7.



I’m somewhat confused by your comment that nothing has been modified as it seems that Don suggested he had found an issue, fixed it, and produced a new daily build with a fix?



Note when I attempt to load the Geotiff with Mapsuite 7 I receive the following warnings printed to stdout, but they appear to be printed only when the application is shutdown, ie they don’t appear during the layer.open() call.



TIFFReadDirectory: Warning, Unknown field with tag 33550 (0x830e) encountered.

TIFFReadDirectory: Warning, Unknown field with tag 33922 (0x8482) encountered.

TIFFReadDirectory: Warning, Unknown field with tag 34735 (0x87af) encountered.

TIFFReadDirectory: Warning, Unknown field with tag 33550 (0x830e) encountered.

TIFFReadDirectory: Warning, Unknown field with tag 33922 (0x8482) encountered.

TIFFReadDirectory: Warning, Unknown field with tag 34735 (0x87af) encountered.






A00334.zip (1.74 MB)

Hi Richard,



I built a simple sample and render your tiff file correct.



Could you please try to run it in your side and let me know whether the warning still there?



Regards,



Don









Hi Don,



I am unable to download your attachment. I get a "XML Parsing Error: no element found" in Firefox and a blank page in internet explorer. I can download my Geotiff attachment however.

Hi Richard,



That’s strange, I cannot download that succeed now.



I have uploaded the file again.





Regards,



Don

11593Sample.zip (1.69 MB)

Hi Don, I built the sample code supplied and added references to the same DLLs that I use on our application (details below) and received the same behaviour, that is the image seems to be displayed in a 1x1 pixel even at full zoom. There are no errors/output displayed in the command window.







I added a single line of debug output after the extent is output on wpf1:
Console.WriteLine(“Extent is : {0}w {1}h”, wpfMap1.CurrentExtent.Width, wpfMap1.CurrentExtent.Height);
with the result of:
Extent is : 0.0016629695892334w 0.00106751918792725h

When I close the MainWindow the following appears in the command window:
TIFFReadDirectory: Warning, Unknown field with tag 33550 (0x830e) encountered.
TIFFReadDirectory: Warning, Unknown field with tag 33922 (0x8482) encountered.
TIFFReadDirectory: Warning, Unknown field with tag 34735 (0x87af) encountered.
TIFFReadDirectory: Warning, Unknown field with tag 33550 (0x830e) encountered.
TIFFReadDirectory: Warning, Unknown field with tag 33922 (0x8482) encountered.
TIFFReadDirectory: Warning, Unknown field with tag 34735 (0x87af) encountered.


Note: The TIFFReadDirectory warnings only appear with the example built for ‘Any CPU’ target. Building for x64 or x86 does not show the warning, but also does not show the GeoTIFF.



The versions of DLL that I am using are:

GeoAPI.dll - 1.1.0.0

MapSuiteCore.dll - 7.0.0.0

WpfDesktopEdition.dll 7.0.0.0

I’m not sure what GeoTiff DLLs from the merge module it is using as I cant seem to find it being loaded using depends22.exe. I’ve listed all DLLs i have:

GeoTiffX64.dll (in System32/Map Suite 7.0/GeoTiffX64) - no version details in properties… modified 29/05/2013

GeoTiffX64.dll (in SysWOW64/Map Suite 7.0/GeoTiffX64) - no version details in properties… modified 29/05/2013

GeoTiffX86.dll (in SysWOW64/Map Suite 7.0/GeoTiffX86) - no version details in properties… modified 9/09/2013


Hi Richard, 
  
 I think the problem is the GeoTiffX64 locked by system, so install our package haven’t overwrite it succeed. 
  
 Please delete your 2013.05.29 version and reinstall Map Suite Unmanaged Dependencies to make GeoTiffX64.dll to 2013.09.09 version. 
  
 Please let me know whether that solved your problem. 
  
 Regards, 
  
 Don

Hi Don,



I deleted all DLLs from the System32/SYSWow64 directories and reinstalled the Unmanaged Assemblies from the latest daily dev build (7.0.0.164).



Still the same issue.



I then updated the references in the sample project for MapSuiteCore.dll/WpfDesktopEdition.dll from the 7.0.0.0 version to the daily dev build version (7.0.164.0).



And it works! There must be a change in the core/desktop edition DLL since the original release, not the GeoTIFF.dll (or both)

Hi Richard, 
  
 I guess you might be right. There might be some related modified codes in Core or Desktop dlls. 
 We are glad to hear it works. 
  
 Regards, 
 Johnny

Hello,



I have the same Problem as the Thread Starter.



I evaluated the Version 8.0.0.286 in the Product Center and added the WPFDesktopEdition and the MapSuiteCore to the sample Projekt which Don uploaded here in this Thread. Then I let the small Programm load my tiff File and immediately after refreshing the map, I get a AccessViolationException with the Message that the Programm tried to read or write in protected Memory.



If I use my old 7.0.0.0 DLLs, it does not crash and my tif file is rendered but I can not zoom at all. I assume because of the already very small scale at Level 1.



It will only be rendered when the TileType is SingleTile. With Hybrid or Multiple I get just a White map.



 BoundingBox of tif in 7.0.0.0: {-5E-06,5E-06,-5E-06,5E-06}

BoundingBox of tif in 8.0.0.286: {5494999.96825,5656600.03175,5496999.96431383,5654600.03568617}



targetScale of tif in 7.0.0.0: 0.000094963057665628679

targetScale of tif in 8.0.0.286: 18992.57415404011



It is a tiff file without a world file (.tfw). So I must use the GeoTiffRasterLayer.



I attach my tiff File in the attachments. I can not upload the whole projekt because it exceed the 2mb Limit.



I hope you can help me. Thanks.



Additionally my code in the wpfMap1_Loaded Event:






GeoTiffRasterLayer tiffRasterLayer = new GeoTiffRasterLayer(@"…\Data\ALK_5495000_5654600.tif");
            tiffRasterLayer.LibraryType = GeoTiffLibraryType.UnmanagedLibTiff;
            tiffRasterLayer.LowerThreshold = 0;
 
 
            LayerOverlay layerOverlay = new LayerOverlay();
            layerOverlay.TileType = TileType.SingleTile;
            layerOverlay.Layers.Add(tiffRasterLayer);
            wpfMap1.Overlays.Add(layerOverlay);
            wpfMap1.MapUnit = GeographyUnit.Meter;
 
            Collection
<baseshape> boundingBox = 
new Collection
<baseshape>();

            foreach (var overlay in wpfMap1.Overlays)
            {
                RectangleShape rect = overlay.GetBoundingBox();
                if (rect != null)
                {
                    boundingBox.Add(rect);
                }
            }
 
            RectangleShape oldtargetExtent = ExtentHelper.GetBoundingBoxOfItems(boundingBox);
 
            RectangleShape newtargetExtent = MapEngine.GetDrawingExtent(oldtargetExtent, (float)wpfMap1.ActualWidth, (float)wpfMap1.ActualHeight);
 
            double targetScale = ExtentHelper.GetScale(newtargetExtent, (float)wpfMap1.ActualWidth, GeographyUnit.Meter);
 
            ZoomLevelSet set new ZoomLevelSet();
            for (int i = 0; i < 20; i++)
            {
                set.CustomZoomLevels.Add(new ZoomLevel(targetScale));
                targetScale = targetScale / 1.4;
            }
 
            wpfMap1.ZoomLevelSet = set;
 
            wpfMap1.CurrentExtent = newtargetExtent;
            wpfMap1.RestrictExtent = newtargetExtent;
 
            wpfMap1.Refresh();


ALK_5495000_5654600.7z (133 KB)

Hi Richard, 
  
 I have fixed this bug, you can get the Map Suite Setup Unmanaged dependencies 8.0.288.0.msi from your product center or download the GeoTiffWrapper latest version from ap.thinkgeo.com:5001/fbsharing/e8ZjC3XT.  
  
 For downloading the independence zip package, You can unzip this package and replace “System32/SysWow64\MapSuite 8.0\GeoTiffX64/GeoTiffX86” with the unzipped files. 
  
 Thanks,

Hi Don,



in the Product Center I only see version 8.0.286.0 in the Evaluation Development, 8.0.0.287 in the Evaluation Production and the other link you provided does not seem to work.



Daniel

Hi Daniel,



Seems something wrong with our daily build server, it is stuck at there. Our developer will work on that. 



If the higher version still unacceptable when you see this. Please try the second option.



1. Download the GeoTiffWrapper latest version from ap.thinkgeo.com:5001/fbsharing/e8ZjC3XT.

2. Extract the zip, copy the unziped files to “System32/SysWow64\MapSuite 8.0\GeoTiffX64/GeoTiffX86” and replace the older files.



Hope this would be helpful and if any question please feel free to let us know.



Thanks,

Kevin

Hi Kevin,



I could download the new Version from the product Center. Thank you for the fast bugfix. By the way the link still does not work for me. After about 30 sec loading, my browser (IE) says "the page cannot be displayed" and thats it. I even tried it in Chrome but same Problem. Whatever now I have the 8.0.288.0 Version and I will immediatly test your bugfix.



Thanks again.

Daniel

Hi,



after testing the new Version I encounterd no more exceptions. But my file is rendering very slowly. I tested it with all 3 TileTypes of the overlay and additionally changed the DrawingQuality of the layer to HighSpeed but in all cases it was extremly slow.



I will attach all my 6 test files to this post. In the end the map must render all 6 files at the same time and with a good Speed after zooming and panning.



Is this another bug or what could be the cause?



Thanks.



Regards

Daniel