Initialer Commit
This commit is contained in:
commit
db948566c1
Binary file not shown.
|
After Width: | Height: | Size: 5.8 MiB |
Binary file not shown.
|
After Width: | Height: | Size: 8.5 MiB |
|
|
@ -0,0 +1,9 @@
|
|||
apply plugin: 'groovy'
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compile 'org.codehaus.groovy:groovy-all:2.4.4'
|
||||
}
|
||||
|
|
@ -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"))
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue