OSMdroid绘制矩形

时间:2018-02-02 15:28:02

标签: android android-studio osmdroid

我正在尝试在道路顶部绘制一个覆盖它的矩形。我将获得3个地理位置。第一个代表车祸事故的位置,它将是矩形的中心。下一个地点是事故路障或区域的开始,最后一个地点是路障或区域的终点。

我使用OSMdroid API以两种方式解决了这个问题。我使用pointAsRect()方法尝试使用Polygon。但是,通过这种方式绘制的矩形不能正确显示道路的角度,它应该是平行的。

我尝试过的另一种方法是使用buildRoadOverlay()方法,但它会在最后一点之前停止,如果我在路上创建另一个区域,则无法区分。

如何找到用这3个点绘制矩形的正确角度?

使用多边形:

RoadManager roadManager = new OSRMRoadManager(getApplicationContext());

            Road road = roadManager.getRoad(points);

            Polyline roadOverlay = RoadManager.buildRoadOverlay(road, Color.argb(40, 100, 0, 255),140f);
            map.getOverlays().add(roadOverlay);
            map.invalidate();

使用buildRoadOverlay:

expression()

1 个答案:

答案 0 :(得分:0)

好吧,因为没有人回答这个,我会分享我自己的解决方案。考虑到我需要2个Geopoints绘制一个矩形并使其与特定的地图道路平行。 请注意, 积分 是我拥有的3个积分的列表。

我定制了一种方法:

private ArrayList<GeoPoint> rotationMatrix(ArrayList<GeoPoint> lista){
    double a;
    double b;
    GeoPoint p ;
    ArrayList<Double> coord = new ArrayList<>();        
    ArrayList<GeoPoint> newList = new ArrayList<>();
    GeoPoint mid = midPoint(points.get(0).getLatitude(),points.get(0).getLongitude(), points.get(2).getLatitude(), points.get(2).getLongitude());
    //GeoPoint teste = new GeoPoint(points.get(2).getLatitude(), points.get(2).getLongitude());
    angle = points.get(0).bearingTo(mid);
    double angulo = Math.toRadians(angle);
    double cosa = Math.cos(angulo), sina=Math.sin(angulo);

    for (int i=0; i<lista.size();i++){
        coord.add(lista.get(i).getLatitude());
        coord.add(lista.get(i).getLongitude());
    }

    for(int j=0; j<coord.size(); j+=2){
        if(j+1 < coord.size()){
            p = new GeoPoint(0.0,0.0);                
            double dx = (coord.get(j) - mid.getLatitude());
            double dy = (coord.get(j+1) - mid.getLongitude());
            a = mid.getLatitude() +  (dx*cosa - dy*sina);
            b = mid.getLongitude() + (dx*sina + dy*cosa);
            p.setLatitude(a);
            p.setLongitude(b);
            newList.add(p);

        }else{
            break;
        }

    }
    return newList;
}

有了这个我的矩阵旋转。我把它应用到了这个

ArrayList<GeoPoint> temp = polygon.pointsAsRect(mid, 10.0, distanceAsDouble(mid, points.get(0))*2);
ArrayList<GeoPoint> rotated = rotateMatrix(temp);