maps - Openlayers - 如何在日期变更线两侧绘制多边形

标签 maps gis openlayers

我需要在 map 上画几个大多边形。必须在日期变更线的所有边上复制多边形。它们应该与谷歌地图上的绘制方式相同 My example .

1) 请给出您的意见,当多边形跨越日期变更线时如何绘制多边形? 我把这个问题和example中一样卖了,但是当多边形穿过日期变更线时,我在绘制多边形时遇到了麻烦。这就是为什么我在经度上添加了 360 度 - 这是正确的吗?

for (var i = 1; i < polygonPoints.length; i++) {
      var dY = polygonPoints[i][1] - polygonPoints[i-1][1];
      if(Math.abs(dY) > 180)
           polygonPoints[i][1] += 360;
}

2)请告知,在日期变更线两侧绘制多边形的正确方法是什么?

您能检查一下我的变体吗:

    var map;    // openlayers map

    // [[latitude, longitude], ...]
    var polygonPoints = [[10, -100],[30, -70],[38, -30],[40, 0],[38, 50 ],[20, 100],[50, 170],[55, 180],
                        [50, -170], [40, -160],[10, 170],[0, -170],[-10, -160],[-25, -170], [-30, 100 ],
                        [-45, 10 ],[-50, -20],[-55, 30],[-35, -160],[-40, -160],[-60, 30],  [-50, -30 ],
                        [-40, 10 ],[-25, 100], [-20, -175],[-10, -165],[0, -180 ],[10, 165],[50, -180],
                        [45, 170],[15, 100],[33, 50 ],[35, 0 ],[35, -30],[25, -70],[5, -100],[10, -100] ];
    function InitOL(){
        var wgs84Projection = new OpenLayers.Projection("EPSG:4326");
        var epsg900913 = new OpenLayers.Projection('EPSG:900913');

        var options = {
            div: "openLayersMap",
            projection: wgs84Projection,
            displayProjection: epsg900913,
            allOverlays: true,
            zoom: 1
        };

        map = new OpenLayers.Map(options);
        var mapserv = new OpenLayers.Layer.MapServer( "OpenLayers Basic",
                    "http://vmap0.tiles.osgeo.org/wms/vmap0",
                    {layers: 'basic'},
                    {wrapDateLine: true} );

        var polygonsLayer = new OpenLayers.Layer.Vector("PolygonsLayer", null, { wrapDateLine: true });

        map.addLayers([mapserv, polygonsLayer]);
        map.addControl(new OpenLayers.Control.LayerSwitcher());
        map.addControl(new OpenLayers.Control.MousePosition());
        map.zoomToMaxExtent();
        map.setCenter(new OpenLayers.LonLat(-100, 0));

        for (var i = 1; i < polygonPoints.length; i++) {
            var dY = polygonPoints[i][1] - polygonPoints[i-1][1];
            if(Math.abs(dY) > 180)
                polygonPoints[i][1] += 360;
        }

        var olPoints = [];
        for (var j = 0; j < polygonPoints.length; j++) {
            olPoints.push(new OpenLayers.Geometry.Point(polygonPoints[j][1], polygonPoints[j][0]));
        }
        var linearRing = new OpenLayers.Geometry.LinearRing(olPoints);
        var bounds = new OpenLayers.Bounds([-180, -90, 180, 90]);
        linearRing.setBounds(bounds);

        var polygonStyle = {
                strokeColor: "#770077",
                strokeOpacity: 1,
                strokeWidth: 2,
                fillColor: "#770077",
                fillOpacity: 0.5
            };

        var olPolygon = new OpenLayers.Geometry.Polygon(linearRing);
        var polygonFeature = new OpenLayers.Feature.Vector(olPolygon);
        polygonFeature.style = polygonStyle;
        polygonsLayer.addFeatures(polygonFeature);
    }

最佳答案

这看起来像是 OpenLayers 当前绘制多边形的方式的限制。 您可能需要提交错误报告并希望它能够得到修补或自己修补...... 当您检测到这种情况时,您可以自己生成第二个多边形。

关于maps - Openlayers - 如何在日期变更线两侧绘制多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14581049/

相关文章:

javascript - 传单计时器。每秒突出显示不同的城镇(多边形)

javascript - 为什么这个 map 不显示?

javascript - 如何在 OpenLayers 中为 poi 添加事件?

angular - 将 OpenLayers 4 与 Angular 5 结合使用

python - Ruby 是否有相当于在 Python 中使用 matplotlib 和 basemap 的功能?

javascript - 交互式地理 map 的网络技术堆栈?

gis - 检查多多边形是否包含 GeoDjango 中的点

java - 如何使用preparedstatement更新SQL Server列中 "Geometry"的数据

Javascript Maze Runner 出现 Codewars 错误

android - 在 list 和源代码 android 中隐藏 API key