1

我有一组形成闭合路径(类似于多边形)的位置。有没有可能的方法来检查某个纬度和经度是否在封闭路径内?

4

4 回答 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

你需要一个光线投射算法。有人已经这样做了,这对你有好处:;-)

多边形算法中的点

对于一些背景知识:

https://en.wikipedia.org/wiki/Point_in_polygon

于 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 回答