/[xulu]/trunk/src/appl/parallel/util/PartitionUtil.java
ViewVC logotype

Contents of /trunk/src/appl/parallel/util/PartitionUtil.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 114 - (show annotations)
Mon Jul 11 11:31:25 2011 UTC (13 years, 5 months ago) by mojays
File size: 6639 byte(s)
SCHMITZM library updated to current version (2.6-SNAPSHOT)
Added gt-xsd-filter.jar, gt-xsd-gml2.jar, picocontainer.jar and xsd.jar from Geotools 2.6.5
1 package appl.parallel.util;
2
3 import java.awt.Rectangle;
4 import java.awt.image.DataBuffer;
5
6 import appl.parallel.data.WritableGridArrayPartition;
7 import appl.parallel.spmd.split.SplittableResource;
8 import appl.parallel.spmd.split.WritableGridPartition;
9 import de.appl.util.RasterMetaData;
10 import de.schmitzm.geotools.data.WritableGrid;
11
12 /**
13 * See method description for details.
14 *
15 * @author Dominik Appl
16 */
17 public class PartitionUtil {
18
19 /**
20 * Returns partition of a {@link WritableGrid} as a {@link WritableGridArray}.
21 * Notice, that the minX and minY values are ignored and will be set to 0
22 * (see {@link WritableGrid} for more information about minX and minY). If
23 * the given {@link WritableGrid} is not an instance of
24 * {@link WritableGridPartition} it is assumed that the topLeft corner of
25 * the source grid is (0,0) (like in standard image processing).<br>
26 * If the partition is a {@link WritableGridPartition} it is assumed that
27 * the the bounds of the two Partition refer to the same coordinate system.
28 * Real coordinates are supposed to reference the South(!)-West Corner.
29 *
30 * @param sourceGrid
31 * the grid to be partitioned
32 * @param partitionBounds
33 * the rectangle describing the partition
34 * @param rootID
35 * the id to identify the root partition
36 * @return the new partition including the given corners
37 * @see SplittableResource#getRootID()
38 */
39 public static WritableGridPartition getPartitialGrid2D(WritableGrid sourceGrid,
40 Rectangle partitionBounds, int rootID) {
41
42 // (int) partitionBounds.getX(),
43 // (int) partitionBounds.getY(),
44 // (int) (partitionBounds.getX() + partitionBounds.getWidth() - 1),
45 // (int) (partitionBounds.getY() + partitionBounds.getHeight() - 1));
46
47 // get Metadata of the big Grid
48 RasterMetaData bigMeta = new RasterMetaData(sourceGrid);
49
50 //create MetaData for the new partitial Grid
51 //Height an width of the partitial Grid
52 int pHeight = (int) partitionBounds.getHeight();
53 int pWidth = (int)partitionBounds.getWidth();
54
55 //real coordinates of the partitial Grid (which are referenced by the SW Corner)
56 double pX = partitionBounds.getX() * bigMeta.getCellWidth() + bigMeta.getX();
57 double pY = (partitionBounds.getY() + partitionBounds.getHeight() - 1) * bigMeta.getCellHeight() + bigMeta.getY();
58 double pRealWidth = pWidth * bigMeta.getCellWidth();
59 double pRealHeight = pHeight * bigMeta.getCellHeight();
60
61 //the MetaData of the new Grid
62 RasterMetaData pMetaData = new RasterMetaData(bigMeta.getDataType(),
63 pWidth, pHeight, 0, 0, pX, pY, pRealWidth, pRealHeight, bigMeta.getCoordinateReferenceSystem());
64
65 //create empty return Grid
66 WritableGridPartition pGrid;
67 switch(bigMeta.getDataType()){
68 case DataBuffer.TYPE_INT:
69 pGrid = new WritableGridArrayPartition.Integer(pMetaData,rootID,partitionBounds);
70 break;
71 case DataBuffer.TYPE_DOUBLE:
72 pGrid = new WritableGridArrayPartition.Double(pMetaData,rootID,partitionBounds);
73 break;
74 default:
75 pGrid = new WritableGridArrayPartition.Float(pMetaData,rootID,partitionBounds);
76 }
77
78 //if the sourceGrid is a partition itself then we do not want to to start reading from (0,0)
79 //but shifted relative to the global coordinate system. So we calculate now the start values:
80
81 //for standard WritableGrids these are simply the bounds of the new partition...
82 int startX = (int) partitionBounds.getX();
83 int startY = (int) partitionBounds.getY();
84
85 // ...but for partitions these values are shifted:
86 if(sourceGrid instanceof WritableGridPartition){
87 Rectangle srcBounds = ((WritableGridPartition) sourceGrid).getPartitionBounds();
88 startX -= srcBounds.getX();
89 startY -= srcBounds.getY();
90 }
91 //read the data into the raster from left to right and downwards
92 int x=0,y=0;
93 try{
94 for (y = 0; y < pHeight; y++)
95 for (x = 0; x < pWidth; x++)
96 pGrid.setRasterSample(
97 sourceGrid.getRasterSample(startX + x, startY + y),
98 x,
99 y);
100 }catch (Exception e) {
101 System.out.println("stop");
102 }
103 return pGrid;
104 }
105
106 /**
107 * Overwrites the data at the location specified by the {@link Rectangle} with
108 * the given partition-data. If the given baseGrid is NOT an instance
109 * of {@link WritableGridPartition} it is assumed that its the topLeft corner (0,0).
110 * If it IS a {@link WritableGridPartition} it is assumed that the the
111 * bounds of the two Partition refer to the same coordinate system and the partition
112 * is inserted at the correct absolut position.
113 *
114 * @param baseGrid the grid in which the data is inserted
115 * @param gridPartition the grid to be inserted
116 * @param partitionBounds the excact location in coordinates of the baseGrid
117 */
118 public static void setPartition(WritableGrid baseGrid, WritableGrid gridPartition, Rectangle partitionBounds) {
119 //Check if partition and the rectangle fit
120 if((gridPartition.getWidth()!=partitionBounds.getWidth()) ||
121 (gridPartition.getHeight()!=partitionBounds.getHeight()))
122 throw new UnsupportedOperationException("The partition width/height does not match the rectangle width/height");
123
124 //if the baseeGrid is a partition itself then we do not want to to start writing from (0,0)
125 //but shifted relative to the global coordinate system. So we calculate now the start values:
126
127 //for standard WritableGrids these are simply the bounds of the new partition...
128 int startX = (int) partitionBounds.getX();
129 int startY = (int) partitionBounds.getY();
130
131 // ...but for partitions these values are shifted:
132 if(baseGrid instanceof WritableGridPartition){
133 Rectangle targetBounds = ((WritableGridPartition) baseGrid).getPartitionBounds();
134 startX -= targetBounds.getX();
135 startY -= targetBounds.getY();
136 }
137 //check if the partition fits in
138 // if(((partitionBounds.getX()+partitionBounds.getWidth()-1)>baseGrid.getWidth() ||
139 // (partitionBounds.getY()+partitionBounds.getHeight()-1)>baseGrid.getHeight()))
140 // System.out.println("X");
141 //throw new UnsupportedOperationException("The partition does not fit in the Grid!");
142 //write the partition into the Grid
143
144 for(int y = 0; y < partitionBounds.getHeight();y++)
145 for(int x = 0; x < partitionBounds.getWidth(); x++)
146 baseGrid.setRasterSample(
147 gridPartition.getRasterSample(x,y),
148 x + startX,
149 y + startY);
150
151 }
152
153 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26