OSMdroid绘制矩形
OSMdroid draw rectangle
我正在尝试绘制一个覆盖在道路顶部的矩形。我将获得 3 个地理点。第一个代表车祸事故的位置,它将是矩形的中心。下一个地理点是事故路障或区域的起点,最后一个地理点是事故路障或区域的终点。
我使用 OSMdroid API 以两种方式解决了这个问题。我已经尝试使用 pointAsRect() 方法来处理 Polygon。然而这样绘制的矩形并没有正确显示道路的角度,它应该是平行的。
我尝试过的另一种方法是使用 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;
}
使用 buildRoadOverlay:
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();
好吧,因为没有人回答这个问题,我将分享我自己的解决方案。考虑到我需要使用 2 个 Geopoints 绘制一个矩形并将其倾斜成与特定地图道路平行的角度。
请注意,points 是我拥有的 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);
我正在尝试绘制一个覆盖在道路顶部的矩形。我将获得 3 个地理点。第一个代表车祸事故的位置,它将是矩形的中心。下一个地理点是事故路障或区域的起点,最后一个地理点是事故路障或区域的终点。
我使用 OSMdroid API 以两种方式解决了这个问题。我已经尝试使用 pointAsRect() 方法来处理 Polygon。然而这样绘制的矩形并没有正确显示道路的角度,它应该是平行的。
我尝试过的另一种方法是使用 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;
}
使用 buildRoadOverlay:
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();
好吧,因为没有人回答这个问题,我将分享我自己的解决方案。考虑到我需要使用 2 个 Geopoints 绘制一个矩形并将其倾斜成与特定地图道路平行的角度。 请注意,points 是我拥有的 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);