0

経度と緯度を使用して、電話がこのポリゴンにあるかどうかを判断しようとしています。

ここに画像の説明を入力してください

それは私の最初のテストポイントで機能しました。2番目のテストポイント(緑色の点)は、ポリゴンの外側にあることを返します。AndroidはPolygonクラスを使用できないため、いくつかの異なるサイトから見つけたコードを使用して独自のクラスを作成しました。

public class Polygon {

    private double[] polyY, polyX;
    private int polySides;

    public Polygon( double[] px, double[] py, int ps ) {
        polyX = px;
        polyY = py;
        polySides = ps;
    }
    public boolean contains( double x, double y ) {
        boolean oddTransitions = false;
        for( int i = 0, j = polySides -1; i < polySides; j = i++ ) {
            if( ( polyY[ i ] < y && polyY[ j ] >= y ) || ( polyY[ j ] < y && polyY[ i ] >= y ) ) {
                if( polyX[ i ] + ( y - polyY[ i ] ) / ( polyY[ j ] - polyY[ i ] ) * ( polyX[ j ] - polyX[ i ] ) < x ) {
                    oddTransitions = !oddTransitions;          
                }
            }
        }
        return oddTransitions;
    }
}

データベースにクエリを実行して、このテーブルから経度と緯度を取得します。

db.execSQL("insert into " + DATABASE_TABLE_POLYGON  + " select null as " + KEY_ROWID
                + ", 0 as " + KEY_BUILDING
                + ", -95.929635 as " + KEY_LONG
                + ", 41.223459 as " + KEY_LAT  
                + " union select null,0,-95.931544, 41.223491"
                + " union select null,0,-95.931587, 41.224734"
                + " union select null,0,-95.929484, 41.224782"
                + " union select null,0,-95.929227, 41.227655"
                + " union select null,0,-95.929184, 41.229656"
                + " union select null,0,-95.926437, 41.23006"
                + " union select null,0,-95.92633, 41.228478"
                + " union select null,0,-95.924141, 41.227413"
                + " union select null,0,-95.920944, 41.22617"
                + " union select null,0,-95.921073, 41.225299"
                + " union select null,0,-95.922811, 41.224008"
                + " union select null,0,-95.92706, 41.22099"
                + " union select null,0,-95.927553, 41.221022"
                + " union select null,0,-95.927811, 41.222943"
                + " union select null,0,-95.929334, 41.222991";

失敗しているコードは次のとおりです。

Polygon p = new Polygon(xArray,yArray,numPoints);
if(p.contains(-95.927714, 41.225281)){
    textView.setText("in polygon");
}else{
    textView.setText("outside polygon");
}

出力:ポリゴンの外側

その他の情報:
私が作成した別のアプリで動作しているようです。
エミュレーターとモックロケーションを使用しています。
また、組み込みのPolygonクラスを使用できるように、通常のJavaクラスを作成しましたが、
これは、ポリゴンの外側にあることも示しています。
ポイントがポリゴンの内側にあることを完全に確認するために、オンラインポリゴングラファーを使用しました。
ポイントは時計回りに進みます。

このポイントが「ポリゴンの外側」を返すのはなぜですか?

4

1 に答える 1

0

私は問題を理解しました。ついに、すべてのポイントが経度でソートされていることに気づきました。したがって、データを挿入してソートしたクエリ(上に表示)、または経度と緯度を選択したクエリのいずれかです。ポイントは正しい順序である必要があります。そうでない場合、contains()メソッドは機能しません。私の解決策は、テーブルに別の列を追加して、各ポイントに番号を付けることです。次に、ポイントをクエリするたびに、この新しい列で並べ替えて、常に正しい順序になるようにします。

于 2012-06-12T15:20:33.877 に答える