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