OSMBonusPack:检查我的GeoPoint是否在多边形内

包米克·贝拉尼

我正在与osmdroid奖励包一起在android中使用osmdroid。我画了一个多边形。现在我要检查GeoPoint(Latitude,经度)是否位于绘制的多边形内。我该怎么做?

在这里,我正在使用contains方法,该方法仅接受MotionEvent对象,并且不起作用。还有其他方法吗?

我的代码如下。

GeoPoint gPt0 = new GeoPoint(23.215210, 72.648600);
GeoPoint gPt1 = new GeoPoint(23.216030, 72.648340);
GeoPoint gPt2 = new GeoPoint(23.217400, 72.649070);
GeoPoint gPt3 = new GeoPoint(23.216570, 72.650290);
GeoPoint gPt4 = new GeoPoint(23.214750, 72.649130);

List<GeoPoint> list = new ArrayList<>();
list.add(gPt0);
list.add(gPt1);
list.add(gPt2);
list.add(gPt3);
list.add(gPt4);
Polygon polygon = new Polygon(getApplication());
polygon.setPoints(list);
GeoPoint center = new GeoPoint(23.21612, 72.64933);
map.getOverlays().add(polygon);

MotionEvent event = MotionEvent.obtain(1, 1, MotionEvent.ACTION_HOVER_ENTER, (float)23.21602, (float) 72.64926, 1);

Log.e("CONTAINS", polygon.contains(event)+"");
拉杰·达兰姆德

请尝试以下使用Java的算法

class Point
{
    int x, y;
 
    Point()
    {}
 
    Point(int p, int q)
    {
        x = p;
        y = q;
    }
}
 
public class Position_Point_WRT_Polygon
{
 
    public static boolean onSegment(Point p, Point q, Point r)
    {
        if (q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x)
                && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y))
            return true;
        return false;
    }
 
    public static int orientation(Point p, Point q, Point r)
    {
        int val = (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
 
        if (val == 0)
            return 0;
        return (val > 0) ? 1 : 2;
    }
 
    public static boolean doIntersect(Point p1, Point q1, Point p2, Point q2)
    {
 
        int o1 = orientation(p1, q1, p2);
        int o2 = orientation(p1, q1, q2);
        int o3 = orientation(p2, q2, p1);
        int o4 = orientation(p2, q2, q1);
 
        if (o1 != o2 && o3 != o4)
            return true;
 
        if (o1 == 0 && onSegment(p1, p2, q1))
            return true;
 
        if (o2 == 0 && onSegment(p1, q2, q1))
            return true;
 
        if (o3 == 0 && onSegment(p2, p1, q2))
            return true;
 
        if (o4 == 0 && onSegment(p2, q1, q2))
            return true;
 
        return false;
    }
 
    public static boolean isInside(Point polygon[], int n, Point p)
    {
        int INF = 10000;
        if (n < 3)
            return false;
 
        Point extreme = new Point(INF, p.y);
 
        int count = 0, i = 0;
        do
        {
            int next = (i + 1) % n;
            if (doIntersect(polygon[i], polygon[next], p, extreme))
            {
                if (orientation(polygon[i], p, polygon[next]) == 0)
                    return onSegment(polygon[i], p, polygon[next]);
 
                count++;
            }
            i = next;
        } while (i != 0);
 
        return (count & 1) == 1 ? true : false;
    }
 
    public static void main(String args[])
    {
        Point polygon1[] = { new Point(0, 0), new Point(10, 0),
                new Point(10, 10),new Point(5, 5), new Point(0, 10) };
        int n = 5;
 
        Point p = new Point(5, 7);
        System.out.println("Point P(" + p.x + ", " + p.y
                + ") lies inside polygon1: " + isInside(polygon1, n, p));
        p = new Point(11, 11);
        System.out.println("Point P(" + p.x + ", " + p.y
                + ") lies inside polygon1: " + isInside(polygon1, n, p));
 
        Point polygon2[] = { new Point(0, 0), new Point(5, 5), new Point(5, 0) };
        n = 3;
 
        p = new Point(3, 3);
        System.out.println("Point P(" + p.x + ", " + p.y
                + ") lies inside polygon2: " + isInside(polygon2, n, p));
        p = new Point(5, 1);
        System.out.println("Point P(" + p.x + ", " + p.y
                + ") lies inside polygon2: " + isInside(polygon2, n, p));
        p = new Point(8, 1);
        System.out.println("Point P(" + p.x + ", " + p.y
                + ") lies inside polygon2: " + isInside(polygon2, n, p));
 
        Point polygon3[] = { new Point(0, 0), new Point(10, 0),
                new Point(10, 10), new Point(0, 10), new Point(5, 5) };
        n = 5;
 
        p = new Point(-1, 10);
        System.out.println("Point P(" + p.x + ", " + p.y
                + ") lies inside polygon3: " + isInside(polygon3, n, p));
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

检查Latlng是否在多边形内

检查坐标是否在KML多边形内

检查位置(纬度经度)是否在 KML 多边形内

检查点坐标是否在多边形内

检查点是否在本机地图的多边形内?

检查多边形内的点(加速)

多边形内的检查点

检查一个多边形是否在PHP中的另一个多边形内

查找坐标是否在多边形内

是否有CGAL函数检查点是否在带孔的线性多边形内?

如何检查点是否在 MySQL 表中的多边形内?

谷歌地图扑检查多边形内是否有点

Java-如何检查经/纬度坐标是否在多边形内

检查点是否在python中的多边形内的最快方法是什么

检查多边形点是否在传单中的另一个点内

检查点是否在OpenLayers 3中的多边形内

从文本文件获取坐标行并检查点是否在多边形内

使用google_maps_flutter检查坐标是否在抖动中的多边形内

检查多边形是否为Shapely中的多边形

PostGIS 和坐标,确定点是否在多边形/多多边形 (kml) 内

如何检查多边形是否包含点?

检查多边形是否在 R 中相交

mongodb检查点是否在多边形中

检查坐标是否位于多边形中

如何检查栅格和多边形是否重叠?

从PHP检查Google Map Point是否在多边形中

检查多边形是否与每个群集中的其他多边形相交

是否有R函数用于检查指定的GeoJSON对象(多边形或多多边形)是否包含指定点?

如何使用Python检查纬度/经度坐标是否在多边形内。(考虑到大圈子。)