2016-12-17 5 views
2

AndroidでGoogle Maps APIを使用してパズルを作成しています。このリンクには、私がアフリカ諸国を描くのに使ったデータが含まれています:World countries coordinatesAndroidのGoogle Maps APIでポイントがポリゴンになっていることを確認してください。

ユーザーが地図をクリックすると、地図が適切な国にあるかどうかを確認するテストが行​​われます。右国内部

  • 点:現在の国は赤色

リスト反復以下のコードで着色されている:右国は別の既知の国内部グリーン

  • 点で着色されていますアフリカ諸国(複数の多角形を含むことがあります)が、クリックされた点を含むものを見つけ、それを適切な国と比較します。

    mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() { 
        @Override 
        public void onMapClick(LatLng latLng) { 
    
         if(isPointInPolygon(latLng,answerPolygon)) { 
          // right answer 
          Toast.makeText(MapsActivity.this, "point inside the right polygon", Toast.LENGTH_SHORT).show(); 
          Polygon p = mMap.addPolygon(new PolygonOptions().addAll(answerPolygon)); 
          p.setStrokeWidth(p.getStrokeWidth()/5); 
          p.setFillColor(0x7F00FF00); 
         } 
         else { 
          // wrong answer 
          // search current polygon 
          // color current polygon in red 
          if (colorPolygonInRed(latLng)){ 
           Polygon p = mMap.addPolygon(new PolygonOptions().addAll(answerPolygon)); 
           p.setStrokeWidth(p.getStrokeWidth()/5); 
           p.setFillColor(0x7F00FF00); 
           Toast.makeText(MapsActivity.this, "point in known polygons", Toast.LENGTH_SHORT).show(); 
          } 
          else { 
           Toast.makeText(MapsActivity.this, "point in unknown polygons", Toast.LENGTH_SHORT).show(); 
          } 
         } 
        } 
    }); 
    

    機能isPointInPolygon()はジオメトリ(光線が交差)に基づいているため、マップ上の1つのポリゴンでのみ機能します。私の場合はうまくいかない。 たとえば、チャドの国(青い点はthis picture)をクリックすると、エジプトは赤で色付けされています(リストはアルファベット順にソートされていますので、エジプトは光線が交差することを確認するクリック点の右側にあります調子)。

    public boolean rayCastIntersect(LatLng tap, LatLng vertA, LatLng vertB) { 
        double aY = vertA.latitude; 
        double bY = vertB.latitude; 
        double aX = vertA.longitude; 
        double bX = vertB.longitude; 
        double pY = tap.latitude; 
        double pX = tap.longitude; 
    
        if ((aY>pY && bY>pY) || (aY<pY && bY<pY) || (aX<pX && bX<pX)) { 
         return false; // a and b can't both be above or below pt.y, and a or b must be east of pt.x 
        } 
    
        double m = (aY-bY)/(aX-bX);    // Rise over run 
        double bee = (-aX) * m + aY;    // y = mx + b 
        double x = (pY - bee)/m;     // algebra is neat! 
    
        return x > pX; 
    } 
    public boolean colorPolygonInRed(LatLng point){ 
        for (Country country:countryList){ 
         for (ArrayList<LatLng> polygon : country.getCoordinates()){ 
          if(isPointInPolygon(point,polygon)) { 
           Polygon p = mMap.addPolygon(new PolygonOptions().addAll(polygon)); 
           p.setStrokeWidth(p.getStrokeWidth()/5); 
           p.setFillColor(0x7FE00808); 
           return true; 
          } 
         } 
        } 
        return false; 
    } 
    

    私のリストからクリックされたポリゴンを取得する正しい方法はありますか?

  • 答えて

    4

    Google Maps Android API Utility LibraryPolyUtil.containsLocationメソッドを使用できます。 the documentationから:

    パブリック静的ブールcontainsLocation(緯度経度点、 java.util.Listにポリゴン、 ブール測地線)

    は、与えられたポイントが指定されたポリゴンの内側にあるかどうかを計算します。ポリゴンは、最後の点が最初の点と等しいかどうかにかかわらず、常に閉じたとみなされます。内部は南極を含まないと定義されています - 南極は常に外にあります。ポリゴンは、測地線が真であれば大きな円のセグメントで、そうでなければ麻痺(loxodromic)セグメントで形成されます。

    +0

    回答ありがとうございました!これはまさに私が探していたものです。 –

    関連する問題