You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by si...@apache.org on 2011/09/14 22:06:10 UTC
svn commit: r1170830 - in /labs/magma/trunk/beans-map/src:
main/java/org/apache/magma/beans/ test/java/org/apache/magma/beans/
Author: simoneg
Date: Wed Sep 14 20:06:10 2011
New Revision: 1170830
URL: http://svn.apache.org/viewvc?rev=1170830&view=rev
Log:
Added even more geometry calcs and tests
Modified:
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MapCoordinate.java
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MapSegment.java
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MapShape.java
labs/magma/trunk/beans-map/src/test/java/org/apache/magma/beans/TestGeomery.java
Modified: labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MapCoordinate.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MapCoordinate.java?rev=1170830&r1=1170829&r2=1170830&view=diff
==============================================================================
--- labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MapCoordinate.java (original)
+++ labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MapCoordinate.java Wed Sep 14 20:06:10 2011
@@ -5,7 +5,16 @@ public class MapCoordinate {
private float latitude;
private float longitude;
+ private static long
+ avgRadius = 6371009;
+
+ public MapCoordinate() {}
+ public MapCoordinate(float latitude, float longitude) {
+ this.latitude = latitude;
+ this.longitude = longitude;
+ }
+
public float getLatitude() {
return latitude;
}
@@ -39,4 +48,21 @@ public class MapCoordinate {
return degrees * Math.PI / 180d;
}
+ public double findDistanceFrom(MapCoordinate other) {
+ double lat1 = this.getRadLatitude();
+ double lon1 = this.getRadLongitude();
+ double lat2 = other.getRadLatitude();
+ double lon2 = other.getRadLongitude();
+
+
+ double dLat = lat2 - lat1;
+ double dLon = lon2 - lon1;
+
+ double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
+ Math.cos(lat1) * Math.cos(lat2) *
+ Math.sin(dLon/2) * Math.sin(dLon/2);
+
+ double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
+ return avgRadius * c;
+ }
}
Modified: labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MapSegment.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MapSegment.java?rev=1170830&r1=1170829&r2=1170830&view=diff
==============================================================================
--- labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MapSegment.java (original)
+++ labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MapSegment.java Wed Sep 14 20:06:10 2011
@@ -2,9 +2,6 @@ package org.apache.magma.beans;
public class MapSegment {
- private static long
- avgRadius = 6371009;
-
private MapCoordinate from,to;
private double distance = -1;
@@ -13,27 +10,22 @@ public class MapSegment {
this.from = from;
this.to = to;
}
+
+
+ public MapCoordinate getFrom() {
+ return from;
+ }
+
+ public MapCoordinate getTo() {
+ return to;
+ }
+
+
public synchronized double getDistance() {
if (distance != -1) return distance;
-
- double lat1 = from.getRadLatitude();
- double lon1 = from.getRadLongitude();
- double lat2 = to.getRadLatitude();
- double lon2 = to.getRadLongitude();
-
-
- double dLat = lat2 - lat1;
- double dLon = lon2 - lon1;
- double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
- Math.cos(lat1) * Math.cos(lat2) *
- Math.sin(dLon/2) * Math.sin(dLon/2);
-
- double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
- double d = avgRadius * c;
-
- distance = d;
+ distance = from.findDistanceFrom(to);
return distance;
}
@@ -62,5 +54,44 @@ public class MapSegment {
ret.setLongitude((float)(lon1 + dLon));
return ret;
}
+
+
+ public MapCoordinate findNearestTo(MapCoordinate coordinates) {
+ double ax = from.getLongitude();
+ double ay = from.getLatitude();
+ double bx = to.getLongitude();
+ double by = to.getLatitude();
+
+ double cx = coordinates.getLongitude();
+ double cy = coordinates.getLatitude();
+
+ double r_numerator = (cx-ax)*(bx-ax) + (cy-ay)*(by-ay);
+ double r_denomenator = (bx-ax)*(bx-ax) + (by-ay)*(by-ay);
+ double r = r_numerator / r_denomenator;
+
+ double px = ax + r*(bx-ax);
+ double py = ay + r*(by-ay);
+
+ //(xx,yy) is the point on the lineSegment closest to (cx,cy)
+ double xx = px;
+ double yy = py;
+
+ if (!((r >= 0) && (r <= 1))) {
+ double dist1 = (cx-ax)*(cx-ax) + (cy-ay)*(cy-ay);
+ double dist2 = (cx-bx)*(cx-bx) + (cy-by)*(cy-by);
+ if (dist1 < dist2) {
+ xx = ax;
+ yy = ay;
+ } else {
+ xx = bx;
+ yy = by;
+ }
+ }
+ return new MapCoordinate((float)yy,(float)xx);
+ }
+ public double findDistanceFrom(MapCoordinate coordinates) {
+ MapCoordinate nearest = findNearestTo(coordinates);
+ return nearest.findDistanceFrom(coordinates);
+ }
}
Modified: labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MapShape.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MapShape.java?rev=1170830&r1=1170829&r2=1170830&view=diff
==============================================================================
--- labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MapShape.java (original)
+++ labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MapShape.java Wed Sep 14 20:06:10 2011
@@ -122,4 +122,48 @@ public class MapShape {
return ret;
}
+ public MapCoordinate findNearestTo(MapCoordinate coord) {
+ MapSegment seg = findNearestSegment(coord);
+ return seg.findNearestTo(coord);
+ }
+
+ private int findNearestSegmentIndex(MapCoordinate coord) {
+ double acmin = Double.MAX_VALUE;
+ int acind = -1;
+ List<MapSegment> segs = getSegments();
+ for (int i = 0; i < segs.size(); i++) {
+ MapSegment seg = segs.get(i);
+ double dist = seg.findDistanceFrom(coord);
+ if (dist < acmin) {
+ acmin = dist;
+ acind = i;
+ }
+ }
+ return acind;
+ }
+
+ public MapSegment findNearestSegment(MapCoordinate coord) {
+ int acind = findNearestSegmentIndex(coord);
+ if (acind == -1) return null;
+ return getSegments().get(acind);
+ }
+
+ public double findDistanceAt(MapCoordinate coord) {
+ int acind = findNearestSegmentIndex(coord);
+ if (acind == -1) return -1;
+
+ double ret = 0;
+ MapSegment seg = null;
+ List<MapSegment> segs = getSegments();
+ for (int i = 0; i < acind; i++) {
+ seg = segs.get(i);
+ ret += seg.getDistance();
+ }
+ seg = segs.get(acind);
+ MapCoordinate nearest = seg.findNearestTo(coord);
+ MapSegment subseg = new MapSegment(seg.getFrom(), nearest);
+ ret += subseg.getDistance();
+ return ret;
+ }
+
}
Modified: labs/magma/trunk/beans-map/src/test/java/org/apache/magma/beans/TestGeomery.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/beans-map/src/test/java/org/apache/magma/beans/TestGeomery.java?rev=1170830&r1=1170829&r2=1170830&view=diff
==============================================================================
--- labs/magma/trunk/beans-map/src/test/java/org/apache/magma/beans/TestGeomery.java (original)
+++ labs/magma/trunk/beans-map/src/test/java/org/apache/magma/beans/TestGeomery.java Wed Sep 14 20:06:10 2011
@@ -79,6 +79,69 @@ public class TestGeomery {
assertNotNull(pointAt);
seg1 = new MapSegment(p2, pointAt);
assertEquals(20.0f, seg1.getDistance(), 0.1f);
+ }
+
+ @Test
+ public void nearestPointOnSegment() throws Exception {
+ MapCoordinate p1 = new MapCoordinate();
+ p1.setLatitude(41.9116146f);
+ p1.setLongitude(12.5099185f);
+
+ MapCoordinate p2 = new MapCoordinate();
+ p2.setLatitude(41.9113917f);
+ p2.setLongitude(12.50954219f);
+
+ MapCoordinate p3 = new MapCoordinate();
+ p3.setLatitude(41.911497f);
+ p3.setLongitude(12.509836f);
+
+
+ MapSegment seg = new MapSegment(p1, p2);
+
+ double dist = seg.findDistanceFrom(p3);
+ assertEquals(6.5f,dist,0.5f);
+
+ MapCoordinate nearest = seg.findNearestTo(p3);
+ assertEquals(41.91155f,nearest.getLatitude(), 0.0001f);
+ assertEquals(12.509806f,nearest.getLongitude(), 0.0001f);
+
+ p3.setLatitude(41.911907f);
+ p3.setLongitude(12.509184f);
+ dist = seg.findDistanceFrom(p3);
+ assertEquals(64.5f,dist,0.5f);
+ }
+
+
+ @Test
+ public void distanceInShape() throws Exception {
+ MapCoordinate p1 = new MapCoordinate();
+ p1.setLatitude(41.9116146f);
+ p1.setLongitude(12.5099185f);
+
+ MapCoordinate p2 = new MapCoordinate();
+ p2.setLatitude(41.9113917f);
+ p2.setLongitude(12.50954219f);
+
+ MapCoordinate p3 = new MapCoordinate();
+ p3.setLatitude(41.911202f);
+ p3.setLongitude(12.5092689f);
+
+
+ MapShape shape = new MapShape();
+ shape.addCoordinates(p3,p2,p1);
+ shape.setType(MapShape.TYPE_LINE);
+
+
+ MapCoordinate p4 = new MapCoordinate();
+ p4.setLatitude(41.911497f);
+ p4.setLongitude(12.509836f);
+
+ MapCoordinate nearest = shape.findNearestTo(p4);
+ assertEquals(41.91155f,nearest.getLatitude(), 0.0001f);
+ assertEquals(12.509806f,nearest.getLongitude(), 0.0001f);
+ double dist = shape.findDistanceAt(nearest);
+ assertEquals(59f, dist,0.5f);
}
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org