Google maps api 3 谷歌地图API V3-多边形平滑边
是否可以平滑多边形的线/边?它现在非常尖锐,有角度,如果这些角度真的有曲率,那就太棒了。有什么想法吗?在多边形中添加其他点。绘制的点越多,曲线就越平缓。这里有一个基于bSpline的平滑算法,它在Android上为我工作,灵感来自Google maps api 3 谷歌地图API V3-多边形平滑边,google-maps-api-3,polygon,curve,smoothing,Google Maps Api 3,Polygon,Curve,Smoothing,是否可以平滑多边形的线/边?它现在非常尖锐,有角度,如果这些角度真的有曲率,那就太棒了。有什么想法吗?在多边形中添加其他点。绘制的点越多,曲线就越平缓。这里有一个基于bSpline的平滑算法,它在Android上为我工作,灵感来自 公共列表bspline(列表多边形){ 如果(poly.get(0).latitude!=poly.get(poly.size()-1).纬度| | poly.get(0).经度!=poly.get(poly.size()-1).经度){ poly.add(新的Lat
公共列表bspline(列表多边形){
如果(poly.get(0).latitude!=poly.get(poly.size()-1).纬度| | poly.get(0).经度!=poly.get(poly.size()-1).经度){
poly.add(新的LatLng(poly.get(0).纬度,poly.get(0).经度));
}
否则{
poly.remove(poly.size()-1);
}
poly.add(0,新LatLng(poly.get(poly.size()-1).纬度,poly.get(poly.size()-1).经度);
poly.add(新的LatLng(poly.get(1).纬度,poly.get(1).经度));
Double[]lats=新的Double[poly.size()];
Double[]lons=新的Double[poly.size()];
对于(int i=0;我也需要这个,所以如果你找到了一个好方法,请告诉我。我假设你必须将一组点(映射的多边形的顶点)传递给曲线平滑/拟合算法,然后该算法将生成一组新的点(最有可能超过原始点集)您可以在地图上显示。但是,您必须手动将每个添加的点拖动到其新位置。最好使用一些算法(如果Maps API有内置的算法就更好了)。
public List<LatLng> bspline(List<LatLng> poly) {
if (poly.get(0).latitude != poly.get(poly.size()-1).latitude || poly.get(0).longitude != poly.get(poly.size()-1).longitude){
poly.add(new LatLng(poly.get(0).latitude,poly.get(0).longitude));
}
else{
poly.remove(poly.size()-1);
}
poly.add(0,new LatLng(poly.get(poly.size()-1).latitude,poly.get(poly.size()-1).longitude));
poly.add(new LatLng(poly.get(1).latitude,poly.get(1).longitude));
Double[] lats = new Double[poly.size()];
Double[] lons = new Double[poly.size()];
for (int i=0;i<poly.size();i++){
lats[i] = poly.get(i).latitude;
lons[i] = poly.get(i).longitude;
}
double ax, ay, bx, by, cx, cy, dx, dy, lat, lon;
float t;
int i;
List<LatLng> points = new ArrayList<>();
// For every point
for (i = 2; i < lats.length - 2; i++) {
for (t = 0; t < 1; t += 0.2) {
ax = (-lats[i - 2] + 3 * lats[i - 1] - 3 * lats[i] + lats[i + 1]) / 6;
ay = (-lons[i - 2] + 3 * lons[i - 1] - 3 * lons[i] + lons[i + 1]) / 6;
bx = (lats[i - 2] - 2 * lats[i - 1] + lats[i]) / 2;
by = (lons[i - 2] - 2 * lons[i - 1] + lons[i]) / 2;
cx = (-lats[i - 2] + lats[i]) / 2;
cy = (-lons[i - 2] + lons[i]) / 2;
dx = (lats[i - 2] + 4 * lats[i - 1] + lats[i]) / 6;
dy = (lons[i - 2] + 4 * lons[i - 1] + lons[i]) / 6;
lat = ax * Math.pow(t + 0.1, 3) + bx * Math.pow(t + 0.1, 2) + cx * (t + 0.1) + dx;
lon = ay * Math.pow(t + 0.1, 3) + by * Math.pow(t + 0.1, 2) + cy * (t + 0.1) + dy;
points.add(new LatLng(lat, lon));
}
}
return points;
}