我发现了一些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下不需要重复起始顶点。)