Hi,
I'm new to ArcGIS runtime sdk for java.
I need my app to open my own base map that represented by about 6-7 .ecw files (including of course matching .aux files).
How do I add a layer from .ecw file to JMap?
I tried:
JMap map = new JMap(); ... String rasterPath = "k5521.ecw"; //the file is in the folder of the project
FileRasterSource rasterSource;
try {
rasterSource = new FileRasterSource(rasterPath);
RasterLayer rasterLayer = new RasterLayer(rasterSource);
map.getLayers().add(rasterLayer);
} catch (IllegalArgumentException iex) {
// handle exception
} catch (FileNotFoundException fe) {
// handle exception
} catch (RuntimeException re) { // handle exception }
and also:
FileRasterSource rasterSource = new FileRasterSource("k5521.ecw");
rasterSource.project(map.getSpatialReference());
RasterLayer rasterLayer = new RasterLayer(rasterSource);
map.getLayers().add(rasterLayer);
what am I doing wrong?
you can add these line before adding to the JMap. and then see.
StretchRenderer stretchRenderer = new StretchRenderer();
StdDevStretchParameters stretchParams = new StretchParameters.StdDevStretchParameters();
stretchParams.setStdDev(2.5f);
stretchRenderer .setStretchParameters(stretchParams);
RasterLayer rasterLayer = new RasterLayer(rasterSource);
rasterLayer.setRenderer(stretchRenderer );
rasterLayer.setName(fileName); // Here file name is the your raster file name. e.g.= "k5521.ecw".
map.getLayers().add(rasterLayer);
It should work.
what is the "rasterSource" you mentioned on the fifth line of the code?
Yes,
e.g.
FileRasterSource rasterSource = new FileRasterSource(rasterPath);
it doesn't work, here is the whole code, what am I getting wrong?
what needs to be the value in "rasterPath"? again: "k5221.ecw"?
import java.awt.EventQueue;
import javax.swing.JFrame;
import java.awt.BorderLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.FileNotFoundException;
import com.esri.runtime.ArcGISRuntime;
import com.esri.core.raster.FileRasterSource;
import com.esri.core.renderer.StretchParameters;
import com.esri.core.renderer.StretchParameters.StdDevStretchParameters;
import com.esri.core.renderer.StretchRenderer;
import com.esri.map.JMap;
import com.esri.map.MapOptions;
import com.esri.map.MapOptions.MapType;
import com.esri.map.RasterLayer;
public class newclass {
private JFrame window;
private JMap map;
public newclass() throws Exception {
window = new JFrame();
window.setSize(800, 600);
window.setLocationRelativeTo(null); // center on screen
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.getContentPane().setLayout(new BorderLayout(0, 0));
// dispose map just before application window is closed.
window.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent windowEvent) {
super.windowClosing(windowEvent);
map.dispose();
}
});
map = new JMap();
FileRasterSource rasterSource = new FileRasterSource("k5521.ecw");
StretchRenderer stretchRenderer = new StretchRenderer();
StdDevStretchParameters stretchParams = new StretchParameters.StdDevStretchParameters();
stretchParams.setStdDev(2.5f);
stretchRenderer .setStretchParameters(stretchParams);
RasterLayer rasterLayer = new RasterLayer(rasterSource);
rasterLayer.setRenderer(stretchRenderer );
rasterLayer.setName("k5521.ecw"); // Here file name is the your raster file name. e.g.= "k5521.ecw".
map.getLayers().add(rasterLayer);
window.getContentPane().add(map);
}
/**
* Starting point of this application.
* @param args
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
newclass application = new newclass();
application.window.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
FileRasterSource should have the full path of the .ecw file. So if your ecw file in under C:\GIS\data\
then change this
FileRasterSource rasterSource = new FileRasterSource("k5521.ecw");
to
FileRasterSource rasterSource = new FileRasterSource("C:\GIS\data\k5521.ecw");
its still doesn't work.
I don't think it has anything to do with the full file path because the file is inside the folder of the project.
As a good practice whenever in doubt always use the full path. Can you print the exception message you are getting?
I don't have a sample ecw file to test but it may well be a BUG. This method already has several issues. I dont know if they have added support for ECW for this method. Please check with ESRI support !!!
I can send you a .ecw file if you'll write your email...
as far as I understood it suppose to support .ecw.
more than that- the full software support it for certain.
the exception I keep getting:
Java version : 1.7.0_45 (Oracle Corporation) x86
Rendering engine : DirectX
java.lang.RuntimeException: java.lang.RuntimeException: Failed to open raster dataset: k5521.ecw. - Failed to open raster dataset: k5521.ecw.
at com.esri.core.raster.FileRasterSource.<init>(Unknown Source)
at NewMapUI.<init>(NewMapUI.java:42)
at NewMapUI$2.run(NewMapUI.java:66)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
Caused by: java.lang.RuntimeException: Failed to open raster dataset: k5521.ecw. - Failed to open raster dataset: k5521.ecw.
at com.esri.core.raster.FileRasterSource.nativeCreate(Native Method)
at com.esri.core.raster.FileRasterSource.<init>(Unknown Source)
... 16 more
This raster format is actually not supported in the Java API.
A definitive list of supported raster data types are found here: Add raster data—ArcGIS Runtime SDK for Android | ArcGIS for Developers