Initialer Commit

This commit is contained in:
Johannes Bialek 2016-08-19 20:40:33 +02:00
commit db948566c1
5 changed files with 199 additions and 0 deletions

BIN
MG131-1.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 MiB

BIN
MG131-2.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 MiB

9
build.gradle Normal file
View File

@ -0,0 +1,9 @@
apply plugin: 'groovy'
repositories {
mavenCentral()
}
dependencies {
compile 'org.codehaus.groovy:groovy-all:2.4.4'
}

View File

@ -0,0 +1,128 @@
package de.daggit.domap.stitch
import groovy.util.logging.Log
import javax.imageio.ImageIO
import java.awt.Graphics2D
import java.awt.image.BufferedImage
/**
* Created by jbialek on 13.07.16.
*/
@Log
class Stitcher {
double ppm = 10 // Pixel Per Meter
double x
double y
String base
int tilePixelWidth = 2048
int tilePixelHeight = 2048
String tmpDir
double getTileWidth() {
return tilePixelWidth/ppm
}
double getTileHeight() {
return tilePixelHeight/ppm
}
Stitcher(String base, double x, double y) {
this.base = base
this.x = x
this.y = y
this.tmpDir = System.currentTimeMillis() as String
}
BufferedImage load() {
List<Tile> firstRow = []
List<Tile> firstColumn = []
Tile tile = null
while ((tile==null)||!tile.isLastX()) {
tile = load(firstRow.size(), 0)
firstRow << tile
}
tile = firstRow[0]
firstColumn << tile
while ((tile==null)||!tile.isLastY()) {
tile = load(0, firstColumn.size())
firstColumn << tile
}
BufferedImage img = new BufferedImage(tilePixelWidth * firstRow.size(), tilePixelHeight * firstColumn.size(), BufferedImage.TYPE_INT_ARGB)
Graphics2D g = img.createGraphics()
firstRow.eachWithIndex { Tile entry, int i ->
g.drawImage(entry.image, i * tilePixelWidth, 0, null)
}
firstColumn.eachWithIndex { Tile entry, int i ->
g.drawImage(entry.image, 0, i * tilePixelHeight, null)
}
int max = firstRow.size() * firstColumn.size()
int cnt = firstRow.size() + firstColumn.size() -1
for (int u=1; u<firstRow.size(); u++) {
for (int v=1; v<firstColumn.size(); v++) {
Tile t = load(u, v)
g.drawImage(t.image, u * tilePixelWidth, v * tilePixelHeight, null)
printProgress(u, v, max, cnt)
cnt++
}
}
g.dispose()
new File(tmpDir).deleteDir()
return img
}
def printProgress(int u, int v, int max, int cnt) {
print("\r[")
int w = 25
for (int i=0; i<w; i++) {
if (((double)w / max * cnt) > i) {
print("#")
} else {
print("-")
}
}
double percent = Math.round(100d/max*cnt)
print("] $percent%")
}
Tile load(int u, int v) {
Tile tile = new Tile(u: u, v: v)
tile.tmpDir = tmpDir
tile.x1 = this.x + u * tileWidth
tile.y1 = this.y + -v * tileHeight
tile.x2 = this.x + (u+1) * tileWidth
tile.y2 = this.y + (-v+1) * tileHeight
URL url = new URL("${base}${tile}&WIDTH=$tilePixelWidth&HEIGHT=$tilePixelHeight")
//log.info("Tile $u/$v -> $url")
int retryCount = 3
for(;;) {
try {
tile.image = ImageIO.read(url)
break
} catch (IOException ioe) {
retryCount--
if (!retryCount) {
throw ioe
}
log.warning("${ioe.class.simpleName}: ${ioe.message}, Retrying...")
}
}
return tile
}
static void main(def args) {
//http://geoweb1.digistadtdo.de:80/OWSServiceProxy/bplan.sws?SEC_DATA=//fsgeop01/doris/Doris/BPLAN/Mengede/Mg131ooo01.map&LAYERS=Bebauungsplan&STYLES=&HEIGHT=520&WIDTH=923&SRS=EPSG%3A31466&FORMAT=image%2Fgif&TRANSPARENT=true&FEATUREINFO=true&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&BBOX=2596042.5177248,5715999.2721278,2596530.9382944,5716274.4386458
BufferedImage b1 = new Stitcher("http://geoweb1.digistadtdo.de:80/OWSServiceProxy/bplan.sws?SEC_DATA=//fsgeop01/doris/Doris/BPLAN/Mengede/Mg131ooo01.map&LAYERS=Bebauungsplan&STYLES=&SRS=EPSG%3A31466&FORMAT=image%2Fgif&TRANSPARENT=true&FEATUREINFO=true&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&BBOX=",
2596042.5177248,5715999.2721278
).load()
ImageIO.write(b1, "gif", new File("b1.gif"))
BufferedImage b2 = new Stitcher("http://geoweb1.digistadtdo.de:80/OWSServiceProxy/bplan.sws?SEC_DATA=//fsgeop01/doris/Doris/BPLAN/Mengede/Mg131ooo02.map&LAYERS=Bebauungsplan&STYLES=&SRS=EPSG%3A31466&FORMAT=image%2Fgif&TRANSPARENT=true&FEATUREINFO=true&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&BBOX=",
2596056.0014041,5715363.062297
).load()
ImageIO.write(b2, "gif", new File("b2.gif"))
}
}

View File

@ -0,0 +1,62 @@
package de.daggit.domap.stitch
import javax.imageio.ImageIO
import java.awt.image.BufferedImage
/**
* Created by jbialek on 13.07.16.
*/
class Tile {
String tmpDir
int u
int v
double x1
double y1
double x2
double y2
File img
double getWidth() {
return x2-x1
}
double getHeight() {
return y2-y1
}
@Override
String toString() {
return [x1,y1,x2,y2].join(",")
}
void setImage(BufferedImage image) {
File tmp = new File("$tmpDir/tile${u},${v}.gif")
if (!tmp.parentFile.exists()) {
tmp.parentFile.mkdirs();
}
ImageIO.write(image, "gif", tmp)
img = tmp
}
BufferedImage getImage() {
if (img.exists()) {
return ImageIO.read(img)
}
return null
}
boolean isLastX() {
BufferedImage img = image
def a = img.raster.getPixel(image.width -1, 0, null as int[])
return a[0] == 0
}
boolean isLastY() {
def a = image.raster.getPixel(0, 0, null as int[])
return a[0] == 0
}
def test() {
def a = 9
def x = a <= 9
return 1 != 3
}
}