Revision 29277
branches/v2_0_0_prep/libraries/libFMap_mapcontext/src/org/gvsig/fmap/mapcontext/layers/Tiling.java | ||
---|---|---|
3 | 3 |
*/ |
4 | 4 |
package org.gvsig.fmap.mapcontext.layers; |
5 | 5 |
|
6 |
import java.awt.Rectangle;
|
|
6 |
import java.awt.Dimension;
|
|
7 | 7 |
import java.awt.geom.AffineTransform; |
8 | 8 |
import java.awt.geom.NoninvertibleTransformException; |
9 |
import java.awt.geom.Rectangle2D; |
|
9 | 10 |
|
10 | 11 |
import org.gvsig.fmap.geom.GeometryLocator; |
11 | 12 |
import org.gvsig.fmap.geom.GeometryManager; |
... | ... | |
38 | 39 |
private int tileMaxWidth, tileMaxHeight; |
39 | 40 |
private int numRows, numCols; |
40 | 41 |
private double[][] srcPts; |
41 |
private Rectangle[] tile; |
|
42 |
private Rectangle2D[] tile;
|
|
42 | 43 |
private double width = 500, height = 500; |
43 | 44 |
private AffineTransform mat; |
44 | 45 |
private ViewPort vp; |
45 | 46 |
|
46 | 47 |
public Tiling(){} |
47 | 48 |
|
48 |
public Tiling(int tileW, int tileH, Rectangle r) { |
|
49 |
public Tiling(int tileW, int tileH, Rectangle2D r) {
|
|
49 | 50 |
int[] size = this.calcMaxTileSize(tileW, tileH, r); |
50 | 51 |
tileMaxWidth = size[0]; |
51 | 52 |
tileMaxHeight = size[1]; |
... | ... | |
55 | 56 |
int altoAux, anchoAux; |
56 | 57 |
|
57 | 58 |
//Vamos a hacerlo en trozos de AxH |
58 |
numCols = 1+(int) (r.width) / tileMaxWidth;
|
|
59 |
numRows = 1+(int) (r.height) / tileMaxHeight;
|
|
59 |
numCols = 1+(int) (r.getWidth()) / tileMaxWidth;
|
|
60 |
numRows = 1+(int) (r.getHeight()) / tileMaxHeight;
|
|
60 | 61 |
|
61 | 62 |
srcPts = new double[numCols*numRows][8]; |
62 |
tile = new Rectangle[numCols*numRows]; |
|
63 |
tile = new Rectangle2D[numCols*numRows];
|
|
63 | 64 |
|
64 |
yProv = (int) r.y;
|
|
65 |
yProv = (int) r.getY();
|
|
65 | 66 |
for (stepY=0; stepY < numRows; stepY++) { |
66 | 67 |
if ((yProv + tileMaxHeight) > r.getMaxY()) |
67 | 68 |
altoAux = (int) r.getMaxY() - yProv; |
68 | 69 |
else |
69 | 70 |
altoAux = tileMaxHeight; |
70 | 71 |
|
71 |
xProv = (int) r.x;
|
|
72 |
xProv = (int) r.getX();
|
|
72 | 73 |
for (stepX=0; stepX < numCols; stepX++) { |
73 | 74 |
if ((xProv + tileMaxWidth) > r.getMaxX()) |
74 | 75 |
anchoAux = (int) r.getMaxX() - xProv; |
... | ... | |
87 | 88 |
srcPts[tileCnt][6] = xProv; |
88 | 89 |
srcPts[tileCnt][7] = yProv + altoAux+1; |
89 | 90 |
|
90 |
tile[tileCnt] = new Rectangle(xProv, yProv, anchoAux+1, altoAux+1); |
|
91 |
tile[tileCnt] = new Rectangle2D.Float(xProv, yProv, anchoAux+1, altoAux+1);
|
|
91 | 92 |
|
92 | 93 |
xProv += tileMaxWidth; |
93 | 94 |
} |
... | ... | |
102 | 103 |
* @param tileH Alto del tile |
103 | 104 |
* @param r Rectangulo que define el area de la imagen |
104 | 105 |
*/ |
105 |
public int[] calcMaxTileSize(int tileW, int tileH, Rectangle r){ |
|
106 |
if(r.width < tileW || r.height < tileH){ |
|
106 |
public int[] calcMaxTileSize(int tileW, int tileH, Rectangle2D r){ |
|
107 |
|
|
108 |
if(r.getWidth() < tileW || r.getHeight() < tileH){ |
|
107 | 109 |
int[] sizeTiles = {tileW, tileH}; |
108 | 110 |
return sizeTiles; |
109 | 111 |
} |
... | ... | |
112 | 114 |
tileW += MIN_SIZE; |
113 | 115 |
do{ |
114 | 116 |
tileW -= MIN_SIZE; |
115 |
int numCols = (int) (r.width / tileW);
|
|
117 |
int numCols = (int) (r.getWidth() / tileW);
|
|
116 | 118 |
int w = 0; |
117 | 119 |
for(int i = 0; i < numCols; i++) |
118 | 120 |
w += tileW; |
119 |
wLastCol = r.width - w;
|
|
121 |
wLastCol = ((int) r.getWidth()) - w;
|
|
120 | 122 |
}while(wLastCol < MIN_SIZE && tileW > (MIN_SIZE * 2)); |
121 | 123 |
|
122 | 124 |
int hLastRow = 0; |
123 | 125 |
tileH += MIN_SIZE; |
124 | 126 |
do{ |
125 | 127 |
tileH -= MIN_SIZE; |
126 |
int numRows = (int) (r.height / tileH);
|
|
128 |
int numRows = (int) (r.getHeight() / tileH);
|
|
127 | 129 |
int h = 0; |
128 | 130 |
for(int i = 0; i < numRows; i++) |
129 | 131 |
h += tileH; |
130 |
hLastRow = r.height - h;
|
|
132 |
hLastRow = ((int) r.getHeight()) - h;
|
|
131 | 133 |
}while(hLastRow < MIN_SIZE && tileH > (MIN_SIZE * 2)); |
132 | 134 |
|
133 | 135 |
tileMaxWidth = tileW; |
... | ... | |
144 | 146 |
return srcPts[num]; |
145 | 147 |
} |
146 | 148 |
|
147 |
public Rectangle getTileSz(int colNr, int rowNr) { |
|
149 |
public Rectangle2D getTileSz(int colNr, int rowNr) {
|
|
148 | 150 |
return tile[rowNr*numCols+colNr]; |
149 | 151 |
} |
150 | 152 |
|
151 |
public Rectangle getTile(int num) { |
|
153 |
public Rectangle2D getTile(int num) {
|
|
152 | 154 |
return tile[num]; |
153 | 155 |
} |
154 | 156 |
|
... | ... | |
192 | 194 |
|
193 | 195 |
double imgPxX = viewPort.getImageWidth(); |
194 | 196 |
double dWcX = viewPort.getAdjustedExtent().getLength(0); |
195 |
double tileWcW = (getTile(vpCnt).getSize().getWidth() * dWcX) / imgPxX;
|
|
197 |
double tileWcW = (getTile(vpCnt).getWidth() * dWcX) / imgPxX; |
|
196 | 198 |
|
197 | 199 |
double imgPxY = viewPort.getImageHeight(); |
198 | 200 |
double dWcY = viewPort.getAdjustedExtent().getLength(1); |
199 |
double tileWcH = (getTile(vpCnt).getSize().getHeight() * dWcY) / imgPxY;
|
|
201 |
double tileWcH = (getTile(vpCnt).getHeight() * dWcY) / imgPxY; |
|
200 | 202 |
|
201 | 203 |
viewPortList[0] = viewPort.cloneViewPort(); |
202 |
viewPortList[0].setImageSize(getTile(vpCnt).getSize()); |
|
204 |
|
|
205 |
int auxw = (int) getTile(vpCnt).getWidth(); |
|
206 |
int auxh = (int) getTile(vpCnt).getHeight(); |
|
207 |
Dimension auxdim = new Dimension(auxw, auxh); |
|
208 |
|
|
209 |
viewPortList[0].setImageSize(auxdim); |
|
203 | 210 |
Envelope r=viewPort.getAdjustedExtent(); |
204 | 211 |
try { |
205 | 212 |
viewPortList[0].setEnvelope(geomManager.createEnvelope(r.getMinimum(0), r.getMaximum(1) - tileWcH,r.getMinimum(0)+tileWcW, r.getMaximum(1), SUBTYPES.GEOM2D)); |
... | ... | |
226 | 233 |
wt = Math.abs(viewPort.getAdjustedExtent().getMaximum(0) - xt); |
227 | 234 |
|
228 | 235 |
viewPortList[vpCnt] = viewPort.cloneViewPort(); |
229 |
viewPortList[vpCnt].setImageSize(getTile(vpCnt).getSize()); |
|
236 |
|
|
237 |
auxw = (int) getTile(vpCnt).getWidth(); |
|
238 |
auxh = (int) getTile(vpCnt).getHeight(); |
|
239 |
auxdim = new Dimension(auxw, auxh); |
|
240 |
|
|
241 |
viewPortList[vpCnt].setImageSize(auxdim); |
|
242 |
|
|
230 | 243 |
try { |
231 | 244 |
viewPortList[vpCnt].setEnvelope(geomManager.createEnvelope(xt, yt,xt + wt, yt + ht, SUBTYPES.GEOM2D)); |
232 | 245 |
} catch (CreateEnvelopeException e) { |
... | ... | |
256 | 269 |
|
257 | 270 |
double [] dstPts = new double[8]; |
258 | 271 |
double [] srcPts = getTilePts(tileNr); |
259 |
Rectangle tile = getTile(tileNr); |
|
272 |
Rectangle2D tile = getTile(tileNr);
|
|
260 | 273 |
//Rectangle newRect = new Rectangle((int)srcPts[0], (int)srcPts[1], tileSz[0], tileSz[1]); |
261 | 274 |
|
262 | 275 |
mat.inverseTransform(srcPts, 0, dstPts, 0, 4); |
... | ... | |
274 | 287 |
//Extent extent = new Extent(rectCuadricula); |
275 | 288 |
|
276 | 289 |
ViewPort vp = viewPort.cloneViewPort(); |
277 |
vp.setImageSize(tile.getSize()); |
|
290 |
|
|
291 |
|
|
292 |
int auxw = (int) tile.getWidth(); |
|
293 |
int auxh = (int) tile.getHeight(); |
|
294 |
Dimension auxdim = new Dimension(auxw, auxh); |
|
295 |
|
|
296 |
vp.setImageSize(auxdim); |
|
278 | 297 |
//vp.setOffset(tile.getLocation()); |
279 | 298 |
vp.setEnvelope(rectCuadricula); |
280 | 299 |
vp.setAffineTransform(mat); |
Also available in: Unified diff