【问题标题】:how to check if the geopoint lies within the closed polygon drawn on osmdroid bonus pack如何检查地理点是否位于 osmdroid 奖励包上绘制的封闭多边形内
【发布时间】:2016-03-21 18:53:08
【问题描述】:

我在 android 中使用 osmdroid 库以及 osmdroid 奖励包。我已经使用提名状态多边形点为状态绘制了一个多边形。现在我想检查 Geopoint 是否位于绘制的多边形内。我该怎么做?

【问题讨论】:

  • 欢迎来到 SO。你为什么不给我们看一些代码?例如。你是如何存储你的地理点的?到目前为止你尝试了什么?

标签: polygon osmdroid geopoints


【解决方案1】:

请尝试以下使用 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));
    }
}

【讨论】:

    【解决方案2】:

    OSMBonusPack Polygon 提供了一个“包含”方法。

    但是,如 javadoc 中所述,只有在之前绘制过多边形并且 MapView 的位置没有改变时,此方法才会返回正确的结果。

    因此,触摸事件检测确实很好,但可能不适用于各种用途。

    如果它不适合您的上下文,您将不得不实现该功能。

    【讨论】:

    • 你能举一个多边形和点的例子吗? contains 方法希望 MotionEvent 作为 agrument,我不知道该怎么做以及为什么它需要 MotionEvent 来检查地理点是否在多边形内
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 2015-12-18
    相关资源
    最近更新 更多