-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- performance optimization (without caching it's faster)
- more robust affine calculation (with linear solver) - binary data loading instead of ASCII
- Loading branch information
Showing
15 changed files
with
357 additions
and
323 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
23 changes: 0 additions & 23 deletions
23
src/main/java/com/sinergise/geometry/crs/sitrans96/CachingTriangleProvider.java
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
76 changes: 0 additions & 76 deletions
76
src/main/java/com/sinergise/geometry/crs/sitrans96/TriangleFromTinProvider.java
This file was deleted.
Oops, something went wrong.
70 changes: 68 additions & 2 deletions
70
src/main/java/com/sinergise/geometry/crs/sitrans96/TriangleProvider.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,73 @@ | ||
package com.sinergise.geometry.crs.sitrans96; | ||
|
||
import java.util.Arrays; | ||
|
||
import org.locationtech.jts.geom.Coordinate; | ||
import org.locationtech.jts.geom.Envelope; | ||
import org.locationtech.jts.triangulate.IncrementalDelaunayTriangulator; | ||
import org.locationtech.jts.triangulate.quadedge.QuadEdge; | ||
import org.locationtech.jts.triangulate.quadedge.QuadEdgeSubdivision; | ||
import org.locationtech.jts.triangulate.quadedge.TriangleVisitor; | ||
|
||
public class TriangleProvider { | ||
QuadEdgeSubdivision delaunay; | ||
TriangularTransformationPoint[] points; | ||
|
||
public TriangleProvider(TriangularTransformationPoint[] pointData) { | ||
this.points = pointData; | ||
this.delaunay = buildTriangles(pointData); | ||
} | ||
|
||
public TriangleProvider inverse() { | ||
TriangularTransformationPoint[] invPoints = new TriangularTransformationPoint[points.length]; | ||
for (int i = 0; i < invPoints.length; i++) { | ||
invPoints[i] = points[i].reverse(); | ||
} | ||
return new TriangleProvider(invPoints); | ||
} | ||
|
||
public TriangularTransformationTriangle getTriangleAt(Coordinate pos) { | ||
QuadEdge e = delaunay.locate(pos); | ||
if (e != null) { | ||
TriangularTransformationTriangle data = (TriangularTransformationTriangle) e.getData(); | ||
if (data != null) { | ||
return data; | ||
} | ||
} | ||
throw new IllegalArgumentException("Coordinate out of bounds " + pos + " ENV: " + delaunay.getEnvelope()); | ||
} | ||
|
||
private static final QuadEdgeSubdivision buildTriangles(TriangularTransformationPoint[] points) { | ||
QuadEdgeSubdivision subdiv = new QuadEdgeSubdivision(aggregateEnvelope(points), 0); | ||
|
||
IncrementalDelaunayTriangulator triangulator = new IncrementalDelaunayTriangulator(subdiv); | ||
triangulator.insertSites(Arrays.asList(points)); | ||
|
||
buildTriangleObjects(subdiv); | ||
|
||
return subdiv; | ||
} | ||
|
||
private static Envelope aggregateEnvelope(TriangularTransformationPoint[] points) { | ||
Envelope e = new Envelope(); | ||
for (TriangularTransformationPoint tp : points) { | ||
e.expandToInclude(tp.src()); | ||
} | ||
return e; | ||
} | ||
|
||
public interface TriangleProvider { | ||
TriangularTransformationTriangle getTriangleAt(Coordinate pos); | ||
private static void buildTriangleObjects(QuadEdgeSubdivision subdiv) { | ||
TriangleVisitor triVisitor = new TriangleVisitor() { | ||
public void visit(QuadEdge[] triEdges) { | ||
TriangularTransformationTriangle tri = new TriangularTransformationTriangle(// | ||
(TriangularTransformationPoint) triEdges[0].orig(), | ||
(TriangularTransformationPoint) triEdges[1].orig(), | ||
(TriangularTransformationPoint) triEdges[2].orig()); | ||
triEdges[0].setData(tri); | ||
triEdges[1].setData(tri); | ||
triEdges[2].setData(tri); | ||
} | ||
}; | ||
subdiv.visitTriangles(triVisitor, false); | ||
} | ||
} |
45 changes: 17 additions & 28 deletions
45
.../java/com/sinergise/geometry/crs/sitrans96/TriangularTransformationTinFromFileLoader.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,53 +1,42 @@ | ||
package com.sinergise.geometry.crs.sitrans96; | ||
|
||
import static java.lang.Double.parseDouble; | ||
|
||
import java.io.IOException; | ||
import java.io.InputStream; | ||
import java.io.InputStreamReader; | ||
import java.io.LineNumberReader; | ||
import java.nio.ByteBuffer; | ||
import java.nio.DoubleBuffer; | ||
import java.nio.channels.Channels; | ||
import java.util.ArrayList; | ||
|
||
import org.locationtech.jts.geom.Coordinate; | ||
|
||
import com.sinergise.geometry.crs.util.Util; | ||
|
||
public class TriangularTransformationTinFromFileLoader { | ||
private static final String FNAME_TRANS_POINTS = "/GK2TM_VVT4.csv"; | ||
private static final String FNAME_TRANS_POINTS_BIN = "/GK2TM_VVT4.bin"; | ||
|
||
public static TriangleFromTinProvider loadTin() { | ||
return new TriangleFromTinProvider(loadPointDataFromFile()); | ||
public static TriangleProvider loadTin() { | ||
return new TriangleProvider(loadPointDataFromFile()); | ||
} | ||
|
||
private static TriangularTransformationPoint[] loadPointDataFromFile() { | ||
ArrayList<TriangularTransformationPoint> ret = new ArrayList<TriangularTransformationPoint>(1000); | ||
|
||
LineNumberReader rdr = null; | ||
InputStream is = null; | ||
try { | ||
is = TriangularTransformationTinFromFileLoader.class.getResourceAsStream(FNAME_TRANS_POINTS); | ||
rdr = new LineNumberReader(new InputStreamReader(is)); | ||
|
||
String curLine; | ||
while ((curLine = rdr.readLine()) != null) { | ||
ret.add(readPointFromLine(curLine)); | ||
try { | ||
is = TriangularTransformationTinFromFileLoader.class.getResourceAsStream(FNAME_TRANS_POINTS_BIN); | ||
ByteBuffer buf = ByteBuffer.allocate(is.available()); | ||
Channels.newChannel(is).read(buf); | ||
buf.rewind(); | ||
DoubleBuffer dbuf = buf.asDoubleBuffer(); | ||
while (dbuf.hasRemaining()) { | ||
ret.add(new TriangularTransformationPoint(new Coordinate(dbuf.get(), dbuf.get()), | ||
new Coordinate(dbuf.get(), dbuf.get()))); | ||
} | ||
|
||
return ret.toArray(new TriangularTransformationPoint[ret.size()]); | ||
} catch(IOException e) { | ||
} catch (IOException e) { | ||
throw new RuntimeException(e); | ||
} finally { | ||
Util.closeSilent(rdr, is); | ||
Util.closeSilent(is); | ||
} | ||
} | ||
|
||
private static TriangularTransformationPoint readPointFromLine(String curLine) { | ||
String[] parts = curLine.trim().split("\\s+"); | ||
|
||
double gkE = parseDouble(parts[3]); | ||
double gkN = parseDouble(parts[4]); | ||
double d96e = parseDouble(parts[1]); | ||
double d96n = parseDouble(parts[2]); | ||
return new TriangularTransformationPoint(new Coordinate(gkE, gkN), new Coordinate(d96e, d96n)); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.