2012-08-23 46 views
4

我有geopoints的一組列表中定義的區域,我需要知道,如果一個座標是否在此區域使用Path2D如何定義一個確定點是否在一個區域lat,long?

public class Region{ 
    List<Coordinate> boundary; 

} 

public class Coordinate{ 

    private double latitude; 
    private double longitude; 

} 

public static boolean isInsideRegion(Region region, Coordinate coordinate){ 


} 

+0

我做從數據庫這只是處理數據,所以我沒有從谷歌地圖或Bing處理此地圖api –

+0

什麼是「地區」?什麼是「座標」。除非我們告訴我們這些類是什麼,否則我們不能回答 – Bohemian

+0

座標是一個具有緯度和經度值的點,如地圖座標在地圖上由一組地理點標記的區域 –

回答

7

您可以應用Computational Geometry問題集中的Point in polygon算法。

Paul Bourke用C編寫了四種算法,你可以看到代碼here。有一個適應Java技術Processing Forum,以防萬一你不能使用Java7:

public class RegionUtil { 

    boolean coordinateInRegion(Region region, Coordinate coord) { 
     int i, j; 
     boolean isInside = false; 
     //create an array of coordinates from the region boundary list 
     Coordinate[] verts = (Coordinate)region.getBoundary().toArray(new Coordinate[region.size()]); 
     int sides = verts.length; 
     for (i = 0, j = sides - 1; i < sides; j = i++) { 
      //verifying if your coordinate is inside your region 
      if (
       (
       (
        (verts[i].getLongitude() <= coord.getLongitude()) && (coord.getLongitude() < verts[j].getLongitude()) 
       ) || (
        (verts[j].getLongitude() <= coord.getLongitude()) && (coord.getLongitude() < verts[i].getLongitude()) 
       ) 
       ) && 
       (coord.getLatitude() < (verts[j].getLatitude() - verts[i].getLatitude()) * (coord.getLongitude() - verts[i].getLongitude())/(verts[j].getLongitude() - verts[i].getLongitude()) + verts[i].getLatitude()) 
       ) { 
       isInside = !isInside; 
      } 
     } 
     return isInside; 
    } 
} 
+0

感謝Luigi但在我的情況下,我得到一個包含緯度列表的對象,經度我無法弄清楚代碼中形狀的頂點是什麼?我怎樣才能確定這些座標的頂點是什麼? –

+1

@ B.TIger我根據您的需求更新了代碼。 –

+0

非常感謝 –

4

構建區域邊界形狀。然後,使用Path2D創建一個Area,您可以快速查詢contains以確定您的點是否包含在該區域中。 :-)

/* assuming a non-zero winding rule */ 
final Path2D boundary = new Path2D.Double(); 
/* initialize the boundary using moveTo, lineTo, quadTo, etc. */ 
final Area area = new Area(boundary); 
... 
/* test for whether a point is inside */ 
if (area.contains(...)) { 
    ... 
} 

注:沒有理由推出自己的RegionCoordinate類什麼的Java幾何類提供。我建議你放棄Coordinate(這在技術上是一個用詞不當,因爲它實際上是一個的關鍵座標)贊成Point2D


注意,有一個Polygon類,雖然它是邁向顯卡實際使用和過去的遺蹟定製。它只支持int座標,這在使用地理點時可能不會有什麼好處!

+0

Path2D已經有一個包含() 方法。創建區域有沒有優勢?否則一個很好的答案(你打了我一分鐘)。 +1 – user949300

+0

我建議他使用'Area',因爲它似乎更專門針對區域(vs形狀)進行調整,並支持添加/差異等操作:-) – oldrinb

相關問題