Android OSMdroid绘制矩形

Android OSMdroid绘制矩形,android,android-studio,osmdroid,Android,Android Studio,Osmdroid,我正试图画一个矩形,覆盖在一条路的顶部。我将获得3个地质点。第一个代表车祸的位置,它将是矩形的中心。下一个地质点是事故路障或区域的起点,最后一个地质点是路障或区域的终点 我使用OSMDROIDAPI以两种方式解决了这个问题。我尝试过使用pointAsRect()方法处理多边形。但是,这样绘制的矩形不能正确显示道路的角度,它应该是平行的 我尝试过的另一种方法是使用buildRoadOverlay()方法,但它会在最后一个点之前停止,如果我在道路上更远的地方创建另一个区域,它将无法区分 我怎样才能找

我正试图画一个矩形,覆盖在一条路的顶部。我将获得3个地质点。第一个代表车祸的位置,它将是矩形的中心。下一个地质点是事故路障或区域的起点,最后一个地质点是路障或区域的终点

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

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

我怎样才能找到正确的角度来用这3个点绘制矩形

使用多边形:

ArrayList<IGeoPoint>list = new ArrayList<>(5);    
private ArrayList<IGeoPoint> generateRectPoints(){
    Polygon poly = new Polygon();
    ArrayList<IGeoPoint> tempList = new ArrayList<>();        
        tempList = poly.pointsAsRect(points.get(1),5,15);
        for(IGeoPoint geo : tempList){
            GeoPoint p =new GeoPoint(geo.getLatitude(),geo.getLongitude());
            list.add(p);
        }
        IGeoPoint last = list.get(0);
        GeoPoint p =new GeoPoint(last.getLatitude(),last.getLongitude());
        list.add(p);

    return list;
}

好吧,既然没有人回答这个问题,我将分享我自己的解决方案。考虑到我需要使用2个地质点绘制一个矩形,并使其与特定的地图道路平行。 请注意,是我的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旋转矩阵(ArrayList lista){
双a;
双b;
地质点p;
ArrayList coord=新的ArrayList();
ArrayList newList=新的ArrayList();
地理点中点=中点(points.get(0).getLatitude(),points.get(0).getLatitude(),points.get(2).getLatitude(),points.get(2).getLatitude());
//GeoPoint teste=新的地质点(points.get(2.getLatitude(),points.get(2.getLatitude());
角度=点。获取(0)。轴承到(中间);
双安古洛=数学托拉度(角度);
双cosa=Math.cos(安古洛),sina=Math.sin(安古洛);
对于(int i=0;i
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);