Mercurial > dive4elements > gnv-client
comparison geo-backend/src/main/java/de/intevation/gnv/geobackend/sde/datasources/ArcSDEStatement.java @ 547:23d5cc37dd5b
Fixed access to raster data.
geo-backend/trunk@518 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Sat, 09 Jan 2010 12:41:26 +0000 |
parents | 210716612c30 |
children | 7615ee5d1345 |
comparison
equal
deleted
inserted
replaced
546:210716612c30 | 547:23d5cc37dd5b |
---|---|
35 import com.vividsolutions.jts.geom.Point; | 35 import com.vividsolutions.jts.geom.Point; |
36 import com.vividsolutions.jts.geom.Polygon; | 36 import com.vividsolutions.jts.geom.Polygon; |
37 import com.vividsolutions.jts.io.WKTReader; | 37 import com.vividsolutions.jts.io.WKTReader; |
38 | 38 |
39 | 39 |
40 /** | 40 /** |
41 * @author Tim Englich <tim.englich@intevation.de> | 41 * @author Tim Englich (tim.englich@intevation.de) |
42 * | 42 * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) |
43 */ | 43 */ |
44 public class ArcSDEStatement implements Statement { | 44 public class ArcSDEStatement implements Statement { |
45 | 45 |
46 /** | 46 /** |
47 * the logger, used to log exceptions and additonaly information | 47 * the logger, used to log exceptions and additonaly information |
482 * @param pSeQuery | 482 * @param pSeQuery |
483 * @return | 483 * @return |
484 * @throws SeException | 484 * @throws SeException |
485 */ | 485 */ |
486 private ResultSet handleResultSet(SeQuery pSeQuery, boolean isRaster, Geometry geometry) throws SeException { | 486 private ResultSet handleResultSet(SeQuery pSeQuery, boolean isRaster, Geometry geometry) throws SeException { |
487 log.debug("ArcSDEStatement,handleResultSet()"); | 487 |
488 boolean debug = log.isDebugEnabled(); | |
489 | |
490 if (debug) { | |
491 log.debug("ArcSDEStatement.handleResultSet()"); | |
492 } | |
493 | |
488 SDEResultSet lSet = new SDEResultSet(); | 494 SDEResultSet lSet = new SDEResultSet(); |
489 SeRow row = null;; | 495 SeRow row = null;; |
490 int lCount; | 496 int lCount; |
491 if (!isRaster){ | 497 if (!isRaster){ |
492 for (lCount = 0; (row = pSeQuery.fetch()) != null; lCount++) { | 498 for (lCount = 0; (row = pSeQuery.fetch()) != null; lCount++) { |
493 // one time execution | 499 // one time execution |
494 if (lCount == 0) { | 500 if (lCount == 0) { |
495 // analyze cols of result set | 501 // analyze cols of result set |
496 SeColumnDefinition[] lCols = row.getColumns(); | 502 SeColumnDefinition[] lCols = row.getColumns(); |
497 for (SeColumnDefinition lCol : lCols) { | 503 for (SeColumnDefinition lCol : lCols) { |
498 lSet.addCol(new ColDefinition(lCol.getName(), lCol.getType()));// notice: esri-types have been copied into colDefinition class! | 504 lSet.addCol(new ColDefinition(lCol.getName(), lCol.getType())); |
505 // notice: esri-types have been copied into colDefinition class! | |
499 } | 506 } |
500 } | 507 } |
501 short lNumCols = row.getNumColumns(); | 508 short lNumCols = row.getNumColumns(); |
502 Row lBackingRow = new Row(lNumCols); | 509 Row lBackingRow = new Row(lNumCols); |
503 for (int i = 0; i < lNumCols; i++) { | 510 for (int i = 0; i < lNumCols; i++) { |
505 } | 512 } |
506 lSet.addRow(lBackingRow); | 513 lSet.addRow(lBackingRow); |
507 } | 514 } |
508 }else{ | 515 }else{ |
509 try { | 516 try { |
510 | |
511 int rasterSize = 128; | |
512 pSeQuery.execute(); | 517 pSeQuery.execute(); |
513 row = pSeQuery.fetch(); | 518 row = pSeQuery.fetch(); |
514 SeRasterAttr attr = row.getRaster(0); | 519 SeRasterAttr attr = row.getRaster(0); |
515 SeRaster raster = attr.getRasterInfo(); | 520 SeRaster raster = attr.getRasterInfo(); |
516 SeRasterBand[] bands = raster.getBands(); | 521 SeRasterBand [] bands = raster.getBands(); |
517 SeRasterBand rasterBand = bands[0]; | 522 SeRasterBand rasterBand = bands[0]; |
518 | |
519 | |
520 int height = rasterBand.getBandHeight(); | |
521 int width = rasterBand.getBandWidth(); | |
522 | 523 |
523 SeExtent extent = rasterBand.getExtent(); | 524 SeExtent extent = rasterBand.getExtent(); |
524 log.debug("Extent: "+ extent.getMinX() +" "+extent.getMinY()+" "+extent.getMaxX()+ " "+extent.getMaxY() ); | 525 |
525 log.debug("Querygeometry: "+geometry.toText()); | 526 /* |
527 if (debug) { | |
528 log.debug("Extent: " + | |
529 extent.getMinX() + " " + extent.getMinY() + " "+ | |
530 extent.getMaxX() + " " + extent.getMaxY()); | |
531 log.debug("Query geometry: "+geometry.toText()); | |
532 } | |
533 */ | |
526 | 534 |
527 double x = ((Point)geometry).getX(); | 535 double x = ((Point)geometry).getX(); |
528 double y = ((Point)geometry).getY(); | 536 double y = ((Point)geometry).getY(); |
529 boolean isPointInRaster = false; | 537 |
530 if ((x >= extent.getMinX() && x <= extent.getMaxX()) && (y >= extent.getMinY() && y <= extent.getMaxY())){ | 538 boolean isPointInRaster = |
531 isPointInRaster = true; | 539 x >= extent.getMinX() && x <= extent.getMaxX() |
532 } | 540 && y >= extent.getMinY() && y <= extent.getMaxY(); |
533 | |
534 double dxNature = x - extent.getMinX(); | |
535 double dyNature = extent.getMaxY() - y;//y-extent.getMinY(); | |
536 double widthNature = extent.getMaxX()-extent.getMinX(); | |
537 double heightNature = extent.getMaxY()-extent.getMinY(); | |
538 | |
539 int pixelX = (int)Math.round(dxNature * width / widthNature); | |
540 int pixelY = (int)Math.round(dyNature * height/ heightNature); | |
541 | |
542 log.debug("Rasterdimesion (Pixel) " + width + " / " + height); | |
543 log.debug ("Required Pixel: " + pixelX + " / "+ pixelY); | |
544 int bandNumber = rasterBand.getBandNumber(); | |
545 log.debug("BAND-ID "+rasterBand.getId().longValue()); | |
546 int maxLevel = 0; | |
547 log.debug("Maxlevel: "+maxLevel); | |
548 | 541 |
549 if (isPointInRaster){ | 542 if (isPointInRaster){ |
550 | 543 |
551 if (row == null){ | 544 if (row == null){ |
552 pSeQuery.execute(); | 545 pSeQuery.execute(); |
553 row = pSeQuery.fetch(); | 546 row = pSeQuery.fetch(); |
554 } | 547 } |
548 | |
549 double midX = 0.5d*(extent.getMinX() + extent.getMaxX()); | |
550 double midY = 0.5d*(extent.getMinY() + extent.getMaxY()); | |
551 | |
552 SDEPoint origin = rasterBand.getTileOrigin(); | |
553 | |
554 double maxX = origin.getX() < midX | |
555 ? extent.getMaxX() | |
556 : extent.getMinX(); | |
557 | |
558 double maxY = origin.getY() < midY | |
559 ? extent.getMaxY() | |
560 : extent.getMinY(); | |
561 | |
562 /* | |
563 0 = origin.getX()*mx + bx | |
564 rasterBand.getBandWidth() = maxX + bx | |
565 | |
566 rasterBand.getBandWidth() = (maxX-origin.getX())*mx | |
567 */ | |
568 | |
569 double mx = rasterBand.getBandWidth()/(maxX-origin.getX()); | |
570 double bx = -origin.getX()*mx; | |
571 double px = mx*x + bx; | |
572 | |
573 double my = rasterBand.getBandHeight()/(maxY-origin.getY()); | |
574 double by = -origin.getY()*my; | |
575 double py = my*y + by; | |
576 | |
577 /* | |
578 if (debug) { | |
579 log.debug("p(x, y): " + px + " / " + py); | |
580 } | |
581 */ | |
582 | |
555 SeRasterConstraint constraint = new SeRasterConstraint(); | 583 SeRasterConstraint constraint = new SeRasterConstraint(); |
556 constraint.setLevel(maxLevel); | 584 constraint.setLevel(0); // best resolution |
557 constraint.setBands(bandNumber); | 585 constraint.setBands(rasterBand.getBandNumber()); |
558 constraint.setEnvelope(pixelX / rasterSize, pixelY / rasterSize, pixelX / rasterSize, pixelY / rasterSize); | 586 int tx = (int)Math.floor(px / rasterBand.getTileWidth()); |
587 int ty = (int)Math.floor(py / rasterBand.getTileHeight()); | |
588 constraint.setEnvelope(tx, ty, tx, ty); | |
589 | |
559 pSeQuery.queryRasterTile(constraint); | 590 pSeQuery.queryRasterTile(constraint); |
560 SeRasterTile tile = row.getRasterTile(); | 591 SeRasterTile tile = row.getRasterTile(); |
561 | 592 |
562 if(tile != null){ | 593 if (tile != null){ |
563 log.debug("BAND-ID Tile "+tile.getBandId().longValue()); | |
564 log.debug("Pixel "+ tile.getNumPixels()); | |
565 log.debug("Column / Row "+tile.getColumnIndex()+" / "+tile.getRowIndex()); | |
566 | |
567 | |
568 double[] tileValues = new double[tile.getNumPixels()]; | 594 double[] tileValues = new double[tile.getNumPixels()]; |
569 tileValues = tile.getPixels(tileValues); | 595 tileValues = tile.getPixels(tileValues); |
570 lSet.addCol(new ColDefinition("tile",ColDefinition.FLOAT64)); | 596 lSet.addCol(new ColDefinition("tile", ColDefinition.FLOAT64)); |
571 Row lBackingRow = new Row(1); | 597 Row lBackingRow = new Row(1); |
572 Envelope envelope = new Envelope( | 598 |
573 new Coordinate(extent.getMinX(), | 599 /* |
574 extent.getMinY()), | 600 0 = wx1*mt + bt |
575 new Coordinate(extent.getMaxX(), | 601 tileWidth-EPS = wx2*mt + bt |
576 extent.getMaxY())); | 602 tileWidth-EPS = mt*(wx2 - wx1) |
577 RasterObject ro = new RasterObject(envelope, | 603 */ |
578 tileValues, | 604 |
579 rasterSize, | 605 double wx1 = (rasterBand.getTileWidth()*tx - bx)/mx; |
580 tile.getRowIndex(), | 606 double wx2 = (rasterBand.getTileWidth()*(tx+1) - bx)/mx; |
581 tile.getColumnIndex(), | 607 double mxt = (rasterBand.getTileWidth()-1e-5d)/(wx2 - wx1); |
582 width, | 608 double bxt = -wx1*mxt; |
583 height); | 609 |
584 lBackingRow.addObject(ro,0); | 610 double wy1 = (rasterBand.getTileHeight()*ty - by)/my; |
611 double wy2 = (rasterBand.getTileHeight()*(ty+1) - by)/my; | |
612 double myt = (rasterBand.getTileHeight()-1e-5d)/(wy2 - wy1); | |
613 double byt = -wy1*myt; | |
614 | |
615 RasterObject ro = new RasterObject( | |
616 mxt, bxt, | |
617 myt, byt, | |
618 tile.getColumnIndex(), | |
619 tile.getRowIndex(), | |
620 tileValues, | |
621 rasterBand.getTileWidth(), | |
622 rasterBand.getTileHeight()); | |
623 lBackingRow.addObject(ro, 0); | |
585 lSet.addRow(lBackingRow); | 624 lSet.addRow(lBackingRow); |
625 | |
626 /* | |
627 if (debug) { | |
628 log.debug("x / y: " + x + " / " + y); | |
629 log.debug("wx1: " + wx1); | |
630 log.debug("wx1 -> " + (wx1*mxt+bxt)); | |
631 log.debug("wx2: " + wx2); | |
632 log.debug("wx2 -> " + (wx2*mxt+bxt)); | |
633 log.debug("wx2 - wx1: " + Math.abs(wx2-wx1)); | |
634 log.debug("wy2 - wy1: " + Math.abs(wy2-wy1)); | |
635 log.debug("pix: " + (x*mxt + bxt)+ " " + (y*myt + byt)); | |
636 log.debug("requesting tile: " + tx + " / " + ty); | |
637 log.debug("got tile: " + tile.getColumnIndex() + " / " + tile.getRowIndex()); | |
638 log.debug("tile orig: " + origin.getX() + " / " + origin.getY()); | |
639 log.debug("tile width: " + rasterBand.getTileWidth()); | |
640 log.debug("tile height: " + rasterBand.getTileHeight()); | |
641 log.debug("Rasterdimesion (Pixel) " + | |
642 rasterBand.getBandWidth() + " / " + rasterBand.getBandHeight()); | |
643 log.debug("BAND-ID "+rasterBand.getId().longValue()); | |
644 log.debug("Pixels: "+ tile.getNumPixels()); | |
645 log.debug("Column / Row "+tile.getColumnIndex()+" / "+tile.getRowIndex()); | |
646 } | |
647 */ | |
586 } | 648 } |
587 | 649 } |
588 }else{ | 650 else{ |
589 log.debug("The Query doesn't deliver any Information because the Point is located outside the Raster."); | 651 log.debug("The Query doesn't deliver any Information " + |
652 "because the Point is located outside the Raster."); | |
590 } | 653 } |
591 } catch (Exception e) { | 654 } catch (Exception e) { |
592 log.error(e,e); | 655 log.error(e,e); |
593 } | 656 } |
594 } | 657 } |
611 return false; | 674 return false; |
612 } | 675 } |
613 | 676 |
614 public <T> T unwrap(Class<T> iface) throws SQLException { | 677 public <T> T unwrap(Class<T> iface) throws SQLException { |
615 return null; | 678 return null; |
679 | |
616 } | 680 } |
617 | |
618 } | 681 } |