【问题标题】:Google Maps API V3 - Polygon SMOOTHED edgesGoogle Maps API V3 - 多边形平滑边缘
【发布时间】:2012-03-26 17:07:13
【问题描述】:

是否可以平滑多边形的线条/边缘?它目前非常锋利和有角度,如果这些角度实际上对它们有曲率,那就太好了。有什么想法吗?

【问题讨论】:

  • 我也需要这个,所以如果你找到了一个好方法,请告诉我。我假设您必须将一组点(映射的多边形的顶点)传递给曲线平滑/拟合算法,然后该算法将生成一组新的点(最有可能超过原始组),您可以在其上显示地图。

标签: google-maps-api-3 polygon curve smoothing


【解决方案1】:

在多边形中添加额外的点。绘制的点越多,曲线就越平缓。

【讨论】:

  • 但是您必须手动将每个添加的点拖动到其新位置。最好使用一些算法(如果 Maps API 有一个内置算法就好了)。
【解决方案2】:

这是一个基于 bSpline 的平滑算法,适用于我的 Android,灵感来自 https://johan.karlsteen.com/2011/07/30/improving-google-maps-polygons-with-b-splines/

 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;

    }

【讨论】:

    猜你喜欢
    • 2014-05-09
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2015-04-14
    • 1970-01-01
    相关资源
    最近更新 更多