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