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 }

http://dive4elements.wald.intevation.org