我有一组形成闭合路径(类似于多边形)的位置。有没有可能的方法来检查某个纬度和经度是否在封闭路径内?
问问题
5598 次
4 回答
5
如果对极端情况没有限制,您可以将位置列表添加到 LatLngBounds,然后使用 bounds.contains(lat,lng)。
LatLngBounds.Builder builder = new LatLngBounds.Builder();
builder.include(new LatLng (52.39455,13.73096));
builder.include(new LatLng (52.39650,13.71644));
builder.include(new LatLng (52.38719,13.69940));
LatLngBounds bound = builder.build();
if (bounds.contains(lat,lng)
// your code goes here
注意:如果您想确定该点是否在多边形内,这将不起作用,因为 LatLngBounds 将是一个包含由您的位置列表形成的多边形的框。
于 2015-02-19T13:44:27.463 回答
4
更好的方法,
ArrayList<LatLng> polyLoc = new ArrayList<LatLng>();
public boolean Contains(LatLng location)
{
if (location==null)
return false;
LatLng lastPoint = polyLoc.get(polyLoc.size()-1);
boolean isInside = false;
double x = location.longitude;
for(LatLng point: polyLoc)
{
double x1 = lastPoint.longitude;
double x2 = point.longitude;
double dx = x2 - x1;
if (Math.abs(dx) > 180.0)
{
// we have, most likely, just jumped the dateline (could do further validation to this effect if needed). normalise the numbers.
if (x > 0)
{
while (x1 < 0)
x1 += 360;
while (x2 < 0)
x2 += 360;
}
else
{
while (x1 > 0)
x1 -= 360;
while (x2 > 0)
x2 -= 360;
}
dx = x2 - x1;
}
if ((x1 <= x && x2 > x) || (x1 >= x && x2 < x))
{
double grad = (point.latitude - lastPoint.latitude) / dx;
double intersectAtLat = lastPoint.latitude + ((x - x1) * grad);
if (intersectAtLat > location.latitude)
isInside = !isInside;
}
lastPoint = point;
}
return isInside;
}
请参阅以下链接以获取实际帖子, 检查经度/纬度坐标是否位于嵌入式设备中的复杂多边形内?
于 2013-12-28T04:45:38.460 回答
3
于 2013-08-13T09:22:13.487 回答
2
通过使用光线投射算法。下面是执行此操作的 java 代码
public boolean CheckPointInPolyGon(LocObj locObj,ArrayList<LocObj> ArraylocObjs){
int polyCorners=ArraylocObjs.size()-1;
int j=polyCorners-1;
boolean isPointInPolygon=false;
for (int i=0; i<polyCorners; i++)
{
if ((ArraylocObjs.get(i).lng< locObj.lng && ArraylocObjs.get(j).lng>=locObj.lng
|| ArraylocObjs.get(j).lng< locObj.lng && ArraylocObjs.get(i).lng>=locObj.lng)
&& (ArraylocObjs.get(i).lat<=locObj.lat || ArraylocObjs.get(j).lat<=locObj.lat))
{
if (ArraylocObjs.get(i).lat+(locObj.lng-ArraylocObjs.get(i).lng)/(ArraylocObjs.get(j).lng-ArraylocObjs.get(i).lng)
*(ArraylocObjs.get(j).lat-ArraylocObjs.get(i).lat)<locObj.lat)
{
isPointInPolygon=!isPointInPolygon;
}
}
j=i;
}
return isPointInPolygon;}
在我的例子中,我创建了一个 POJO 类来存储这个位置点,如果你愿意的话,你可以使用“LatLng”类来存储点
public class LocObj{Double lat,lng;
public LocObj(){}
LocObj(Double lat,Double lng){
this.lat=lat;
this.lng=lng;
}}
于 2017-03-08T12:06:27.207 回答