谷歌地图渲染逆时针定向多边形的逆

时间:2015-01-09 10:21:04

标签: google-maps polygon

我发现了一些Google地图呈现我定义的多边形的反转的情况。起初,我认为它与从-180经度延伸到+180经度的多边形有关,但我用(-179,+ 179)重复了所有这些测试,并发现了完全相同的行为。

考虑从-60纬度到-85纬度的以下理想化多边形:

// Ideal Polygon
POLYGON ((-180 -85, 180 -85, 180 -60, -180 -60, -180 -85))

在javascript中,外环上的点数组如下:

var points180 = [
    new google.maps.LatLng(-85, -180),
    new google.maps.LatLng(-85, 180),
    new google.maps.LatLng(-60, 180),
    new google.maps.LatLng(-60, -180),
    new google.maps.LatLng(-85, -180)
];

当出现此多边形时,Google地图会在±180经度上呈现零宽度矩形,而不是预期的块。见http://jsfiddle.net/StephenM/489aveLr/3/

如果沿多边形边缘添加冗余的中间点,Google地图将正确渲染它。以下多边形有效:

var points = [
    new google.maps.LatLng(-85, -180),
    new google.maps.LatLng(-85, -90),
    new google.maps.LatLng(-85, 0),
    new google.maps.LatLng(-85, 90),
    new google.maps.LatLng(-85, 180),
    new google.maps.LatLng(-72.5, 180),
    new google.maps.LatLng(-60, 180),
    new google.maps.LatLng(-60, 90),
    new google.maps.LatLng(-60, 0),
    new google.maps.LatLng(-60, -90),
    new google.maps.LatLng(-60, -180),
    new google.maps.LatLng(-72.5, -180),
    new google.maps.LatLng(-85, -180)
];

请参阅:http://jsfiddle.net/StephenM/489aveLr/4/

当使用像这样的琐碎,手工制作的多边形时,添加中间点很容易而且不是真正的问题,即使在我看来它不是必需的。

不幸的是,现实场景不那么简单。

我在现实世界的数据源中发现了多边形,有点像上面第二个例子,但中间点只在一条边上。像这样:

var points = [
    new google.maps.LatLng(-85, -180),
    new google.maps.LatLng(-85, 180),
    new google.maps.LatLng(-60, 180),
    new google.maps.LatLng(-60, 90),
    new google.maps.LatLng(-60, 0),
    new google.maps.LatLng(-60, -90),
    new google.maps.LatLng(-60, -180),
    new google.maps.LatLng(-85, -180)
];

谷歌地图再次失败以呈现此情况并呈现相反的情况。请参阅:http://jsfiddle.net/StephenM/489aveLr/5/

显然,谷歌地图并不关心这些是逆时针方向的戒指,并随心所欲。

在现实世界的情况下,当多边形不是手工制作时,是否有某种方法可以修改它们以使它们正确渲染,或者配置Google地图以注意绕组或方向?

到目前为止,我最好的想法是将冗余中间点添加到超过某个阈值长度的边缘。

更新:OpenLayers v.3正确渲染多边形

似乎迁移到OpenLayers v.3是解决问题的一种方法。即使在最简化(四个顶点)的形式中,它也能完美呈现多边形。见http://jsfiddle.net/StephenM/489aveLr/6/

多边形对象定义如下:

var polygon = new ol.geom.Polygon([[
    ol.proj.transform([-180, -85], sourceProjection, viewProjection),
    ol.proj.transform([180, -85], sourceProjection, viewProjection),
    ol.proj.transform([180, -60], sourceProjection, viewProjection),
    ol.proj.transform([-180, -60], sourceProjection, viewProjection),
    ol.proj.transform([-180, -85], sourceProjection, viewProjection),
]]);

(在OpenLayers下不需要重复起始顶点。)

0 个答案:

没有答案