-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Dear List,
I've a strange problem. I use to work with Geotools 2.5 and try to store
results form a triangulation patch in a GeoTiff. The patch operates on a
double matrix. But when I build the GeoTiff, I get an int32
context. Are there mistakes in my code?
Sorry it's a little bit long.
1. I use routine createDoubleGridCovarage to create the cover. I do
this in a normal way via JAI.
2. I use the routine sampleTriangleGeoTiff to create the sampling cover.
3. Main put this things together.
4. There is the gdalinfo output with
Band 1 Block=123x16 >>>> Type=Int32, <<< ColorInterp=Gray
//______________________________________________________________________
/**
* Create a GridCoverage with a double sampling model.
* <pre>
* It is important to have the height/width order here !
* int count = 0;
* for (int h = 0; h < height; h++) {
* for (int w = 0; w < width; w++) {
* doubleBuffer[count++] = (double) .....
* }
* }
* </pre>
* @param title title of the coverage
* @param env envelope
* @param double Buffer data content
* @param width width of the buffer
* @param height height of the buffer
* @return a GridCoverage 2D in a geo referenced context
* @todo Problem double goes in int32 comes out?
*/
public static GridCoverage2D createDoubleGridCovarage(
String title,
Envelope2D env, double[] doubleBuffer,
int width, int height) {
//___________________________________________________________
// The default way to create a double tiff
DataBuffer dataBuffer = new javax.media.jai.DataBufferDouble(
doubleBuffer, width * height);
SampleModel sampleModel =
RasterFactory.createBandedSampleModel(
DataBuffer.TYPE_DOUBLE, width, height, 1);
ColorModel colorModel =
PlanarImage.createColorModel(sampleModel);
Raster rasterModel =
RasterFactory.createWritableRaster(sampleModel,
dataBuffer, new java.awt.Point(0, 0));
TiledImage img = new TiledImage(0, 0, width, height, 0, 0,
sampleModel, colorModel);
img.setData(rasterModel);
//_____________________________________________________________
// The geotiff part
GridCoverageFactory fac = CoverageFactoryFinder.
getGridCoverageFactory(null);
GridCoverage2D result = fac.create(title, img, env);
return result;
}
//__________________________________________________________________________
/**
* Conversation of a triangulation set to a coverage by a given
raster width.
* @param tringleList The triangulation list
* @param inverseHeight switch the skalar field into a negative one
* @param srcEPSG Source Cooordinate reference Sytem
* @param dstEPSG Target Coordinate reference system
* @param rasterWidth Rasterwidth of the cell
* @param valueNaN Values for areas without triangles
* @return The double GeoCoverage2D
* @throws org.opengis.referencing.NoSuchAuthorityCodeException
* @throws org.opengis.referencing.FactoryException
* @throws org.opengis.geometry.MismatchedDimensionException
* @throws org.opengis.referencing.operation.TransformException
* @throws java.io.IOException
* @todo int32 comes out
* @todo exchange the raster width by using the inverse of
* the transformation set of a source cover?
*/
public static GridCoverage2D sampleTriangleGeoTiff(
TriangleList tringleList,
boolean inverseHeight,
int srcEPSG, int dstEPSG,
double rasterWidth,
double valueNaN) throws
NoSuchAuthorityCodeException, FactoryException,
MismatchedDimensionException,
TransformException, IOException {
//_______________________________________________________________
CoordinateReferenceSystem dstCRS =
CRS.decode("EPSG:" + dstEPSG, true);
CoordinateReferenceSystem srcCRS =
CRS.decode("EPSG:" + srcEPSG, true);
//_______________________________________________________________
// Recalculate the triangulation into the tatrger CRS
if (srcEPSG != dstEPSG) {
tringleList.transform(srcEPSG, dstEPSG);
}
//_______________________________________________________________
// Now Envelope in the target CRS
Envelope triEnv = tringleList.getEnvelope();
//_______________________________________________________________
// Envlope 2D
Envelope2D env = new Envelope2D(dstCRS,
triEnv.getMinX(), triEnv.getMinY(),
triEnv.getWidth(), triEnv.getHeight());
//________________________________________________________________
// Create a Data Buffer from the values on the single image array.
double fWidht = (double) (triEnv.getWidth() / rasterWidth);
double fHeight = (double) (triEnv.getHeight() / rasterWidth);
int width = (int)Math.round(fWidht);
int height =(int)Math.round(fHeight);
double[] doubleBuffer = new double[width * height];
//_______________________________________________________________
// Create an empty coverage to get the transformation data
GridCoverage2D result = createDoubleGridCovarage(
"What Transforms", env, doubleBuffer,
width, height);
// Transformation from grid to world coordinates
MathTransform2D trfmGridToWorldCRS =
result.getGridGeometry().getGridToCRS2D();
// Transformation from world to grid coordinates
MathTransform2D trfmWorldToGridCRS = trfmGridToWorldCRS.inverse();
//_______________________________________________________________
// Resampling of triangle into the doubleBuffer
// It is important to have the height/width order here !
int count = 0;
for (int h = 0; h < height; h++) {
for (int w = 0; w < width; w++) {
// translate the grid coordinate into a
// point for transformation
Point2D.Double pntImage = new Point2D.Double(w, h);
Point2D.Double pntWorld = new Point2D.Double();
trfmGridToWorldCRS.transform(pntImage, pntWorld);
// Find matching triangles at coordinate
// @todo do that in a window
// w-rasterWidth, h-rasterWidth
// w+rasterWidth, h+rasterWidth
// to get more triangles in case of small pieces
Coordinate samplePoint =
new Coordinate(pntWorld.x, pntWorld.y);
ArrayList<Triangle> lst =
triangelList.findTrianglesAtCoordinate(samplePoint);
// resample the triangle set
//@todo other operators than average
double d = 0;
if (lst != null && lst.size() > 0) {
// collect the data set
for (int i = 0; i < lst.size(); i++) {
Triangle tmp = lst.get(i);
d += ConvexCombination.calcCombi(
tmp, samplePoint);
}
// create the average value
d = d / lst.size();
} else {
d = valueNaN;
}
if (inverseHeight) {
doubleBuffer[count++] = (double) -d;
} else {
doubleBuffer[count++] = (double) d;
}
}
}
// Create the coverage
result = createDoubleGridCovarage(
"Resampled Cover", env, doubleBuffer,
width, height);
// ready
return result;
}
//__________________________________________________________________________
public static void main(String[] args) {
try {
// Triangulation set made by J. Shewchuck triangle
String inFile = "data/files/0-cover-base.1";
String outFile = inFile + ".tif";
TriangleList list =
Triangulator.readPlainTriangulationSet(inFile);
GridCoverage2D cover = TriangleList.sampleTriangleGeoTiff(
list, true, // list, swapValues
4326, 3035, // EPSG's
50, 9999); // rasterWidth, NaN
File out = new File(outFile);
GeoTiffWriter geoTiffWriter = new GeoTiffWriter(out);
geoTiffWriter.write(cover, null);
} catch (Exception e) {
e.printStackTrace();
}
}
//__________________________________________________________________
~/data/files/> gdalinfo S433846_84.bltz.3.tif
Driver: GTiff/GeoTIFF
Files: S433846_84.bltz.3.tif
Size is 123, 103
Coordinate System is:
PROJCS["ETRS89 / ETRS-LAEA",
GEOGCS["ETRS89",
DATUM["European_Terrestrial_Reference_System_1989",
SPHEROID["GRS 1980",6378137,298.2572221010002,
AUTHORITY["EPSG","7019"]],
AUTHORITY["EPSG","6258"]],
PRIMEM["Greenwich",0],
UNIT["degree",0.0174532925199433],
AUTHORITY["EPSG","4258"]],
UNIT["metre",1,
AUTHORITY["EPSG","9001"]],
AUTHORITY["EPSG","3035"]]
Origin = (4561911.309193897061050,3481239.348060310818255)
Pixel Size = (49.819593262010656,-50.213355504722308)
Metadata:
AREA_OR_POINT=Point
TIFFTAG_XRESOLUTION=1
TIFFTAG_YRESOLUTION=1
TIFFTAG_RESOLUTIONUNIT=1 (unitless)
Image Structure Metadata:
INTERLEAVE=BAND
Corner Coordinates:
Upper Left ( 4561911.309, 3481239.348)
Lower Left ( 4561911.309, 3476067.372)
Upper Right ( 4568039.119, 3481239.348)
Lower Right ( 4568039.119, 3476067.372)
Center ( 4564975.214, 3478653.360)
Band 1 Block=123x16 Type=Int32, ColorInterp=Gray
- --
Alexander Weidauer
__________________ _ __ ______ ______
/ _/ __/ ____/ __ \ | / / / _/ |/ / |
/ // /_/ / __/ / / / | / /_____ / // /|_/ / /| |
_/ // __/ /_/ / /_/ /| |/ /_____// // / / / ___ |
/___/_/ \____/_____/ |___/ /___/_/ /_/_/ |_|
Institut für Geodatenverarbeitung
Informationsdienste, -modelle und -applikationen
Tel.: 038333-527
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.4-svn0 (GNU/Linux)
Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org
iD8DBQFKK3s2MC1o6iopHygRAo6jAJ9NNZTFJoM8yF22MUWShHF6w770kwCfbdbP
K5MzBzVpduRUgrH2lAt301s=
=Qz5s
-----END PGP SIGNATURE-----
------------------------------------------------------------------------------
OpenSolaris 2009.06 is a cutting edge operating system for enterprises
looking to deploy the next generation of Solaris that includes the latest
innovations from Sun and the OpenSource community. Download a copy and
enjoy capabilities such as Networking, Storage and Virtualization.
Go to: http://p.sf.net/sfu/opensolaris-get
_______________________________________________
Geotools-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/geotools-devel