Вот пример (с использованием API Javascript).Идея была бы точно такой же в Android.
В проекции Меркатора максимальная северная широта не 90, а около 85.05113.В JavaScript вы можете сделать:
Math.atan(Math.sinh(Math.PI)) * 180 / Math.PI;
Таким образом, вы можете найти реальные северные и южные края проекции (чтобы покрыть весь мир вашим полигоном).
Тогда вам нужносоздайте как минимум 1 полигон (с отверстием в нем) для достижения желаемого эффекта.Если вам нужно, чтобы область была окрашена, вам понадобится второй полигон (см. Второй фрагмент).
function initialize() {
var mapOptions = {
zoom: 1,
center: new google.maps.LatLng(24.886436490787712, -70.2685546875),
mapTypeId: google.maps.MapTypeId.TERRAIN
};
var map = new google.maps.Map(document.getElementById('map-canvas'),
mapOptions);
// Find the min/max latitude
var maxLat = Math.atan(Math.sinh(Math.PI)) * 180 / Math.PI;
var worldCoords = [
new google.maps.LatLng(-maxLat, -180),
new google.maps.LatLng(maxLat, -180),
new google.maps.LatLng(maxLat, 180),
new google.maps.LatLng(-maxLat, 180),
new google.maps.LatLng(-maxLat, 0)];
var EuropeCoords = [
new google.maps.LatLng(29.7, -23.7),
new google.maps.LatLng(29.7, 44.8),
new google.maps.LatLng(71.8, 44.8),
new google.maps.LatLng(71.8, -23.7)];
// Construct the polygon
var poly = new google.maps.Polygon({
paths: [worldCoords, EuropeCoords],
strokeOpacity: 0,
strokeWeight: 0,
fillColor: '#000000',
fillOpacity: 0.2
});
poly.setMap(map);
}
#map-canvas {
height: 200px;
}
<!-- Replace the value of the key parameter with your own API key. -->
<script async differ src="http://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&callback=initialize"></script>
<div id="map-canvas"></div>
Второй пример с цветной областью Полигон:
function initialize() {
var mapOptions = {
zoom: 1,
center: new google.maps.LatLng(24.886436490787712, -70.2685546875),
mapTypeId: google.maps.MapTypeId.TERRAIN
};
var map = new google.maps.Map(document.getElementById('map-canvas'),
mapOptions);
// Find the min/max latitude
var maxLat = Math.atan(Math.sinh(Math.PI)) * 180 / Math.PI;
var worldCoords = [
new google.maps.LatLng(-maxLat, -180),
new google.maps.LatLng(maxLat, -180),
new google.maps.LatLng(maxLat, 180),
new google.maps.LatLng(-maxLat, 180),
new google.maps.LatLng(-maxLat, 0)];
var EuropeCoords = [
new google.maps.LatLng(29.7, -23.7),
new google.maps.LatLng(29.7, 44.8),
new google.maps.LatLng(71.8, 44.8),
new google.maps.LatLng(71.8, -23.7)];
// Construct the outer polygon
var worldPoly = new google.maps.Polygon({
paths: [worldCoords, EuropeCoords],
strokeOpacity: 0,
strokeWeight: 0,
fillColor: '#000000',
fillOpacity: 0.2,
map: map
});
// Construct the inner polygon
var europePoly = new google.maps.Polygon({
path: EuropeCoords,
strokeColor: 'red',
strokeOpacity: 1,
strokeWeight: 3,
fillColor: 'yellow',
fillOpacity: 0.5,
map: map
});
}
#map-canvas {
height: 200px;
}
<!-- Replace the value of the key parameter with your own API key. -->
<script async differ src="http://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&callback=initialize"></script>
<div id="map-canvas"></div>
Примечание : Android SDK даже делает это проще.В документации упоминается:
Многоугольник может быть выпуклым или вогнутым, он может охватывать 180 меридианов и иметь незаполненные отверстия.
Отверстия : Отверстие - это область внутри многоугольника, которая не заполнена.Отверстие указано точно так же, как контур.Отверстие должно быть полностью заключено в контур.Можно указать несколько отверстий, однако перекрывающиеся отверстия не поддерживаются.