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: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to