我正在使用Google Maps API 3在几个美国上绘制网格。在将我自己的解决方案拼凑在一起,其中涉及迭代地绘制了超过62,000条折线之后,我发现将Google的Overlay Map Type example简化为我需要的网格尺寸变得更加容易且不那么密集,其中每个正方形的边长都在缩放20级相当于90英尺。到目前为止,这个功能很好。
我现在的问题有两个:
我怀疑解决方案涉及用poly.containsLocation()检查每个网格方块的坐标(并且可能在zoom_changed上运行),但Google的示例页面没有充分解释如何访问单个网格方块,所以我没有任何检查它们的方法。
如何访问这些网格方块?或者我是否需要制作新的OverlayView?
我的代码到目前为止。
var map;
function CoordMapType(tileSize) {
this.tileSize = tileSize;
}
CoordMapType.prototype.getTile = function(coord, zoom, ownerDocument) {
var div = ownerDocument.createElement('div');
div.innerHTML = coord;
div.style.width = this.tileSize.width + 'px';
div.style.height = this.tileSize.height + 'px';
div.style.fontSize = '10';
div.style.color = '#FFFFFF';
div.style.borderStyle = 'solid';
div.style.borderWidth = '1px';
div.style.borderColor = '#FFFFFF';
return div;
};
function initMap() {
map = new google.maps.Map(document.getElementById('map'), {
center: {lat: 38.2711991, lng: -82.6292357},
zoom: 7,
mapTypeId: google.maps.MapTypeId.SATELLITE
});
map.overlayMapTypes.insertAt(0, new CoordMapType(new google.maps.Size(233, 233)));
gridBox();
}
function gridBox(){
var gridBox = [
new google.maps.LatLng(40.638, -75.387),
new google.maps.LatLng(36.497, -75.387),
new google.maps.LatLng(36.497, -89.539),
new google.maps.LatLng(40.638, -89.539),
];
gridBoxSet = new google.maps.Polygon({
path: gridBox,
geodesic: false,
strokeColor: "#AAAAAA",
strokeOpacity: 1,
strokeWeight: 4,
fillColor: "#FFFFFF",
fillOpacity: 0.2
});
gridBoxSet.setMap(map);
}
答案 0 :(得分:1)
Google Maps JavaScript API提供了一个OverlayView类,用于创建自己的自定义叠加层。 OverlayView是一个基类,它提供了在创建叠加层时必须实现的几种方法。该类还提供了一些方法,可以在地图上的屏幕坐标和位置之间进行转换。
添加自定义叠加层
以下是创建自定义叠加层所需步骤的摘要:
google.maps.OverlayView()
的新实例。实际上,这将是覆盖类的子类。onAdd()
方法,并将叠加层附加到地图上。当地图准备好附加叠加层时,将调用OverlayView.onAdd()
。OverlayView.draw()
。onRemove()
方法来清理您在叠加层中添加的所有元素。您还可以在此处查看完整,有效的示例:https://developers.google.com/maps/documentation/javascript/examples/overlay-simple
答案 1 :(得分:0)
在意识到getTile方法如何将坐标值写入每个div的innerHTML之后,我想出了如何限制绘制哪些。这是我的代码。这是非常hackish并没有直接检查瓷砖与边界,但它的工作和性能方面非常顺利。
var map;
var zoom;
function CoordMapType() {
this.tileSize = new google.maps.Size(233, 233);
}
var firstX = 289496; //coord.x of top left of rectangle
var firstY = 433476; //coord.y of top left of rectangle
var lastX = 45290; //width of rectangle in tiles
var lastY = 16959; //height of rectangle in tiles
CoordMapType.prototype.getTile = function(coord, zoom, ownerDocument) {
var coordX = coord.x-(firstX/(Math.pow(2,(20-zoom))));
var coordY = coord.y-(firstY/(Math.pow(2,(20-zoom))));
var maxX = lastX/(Math.pow(2,(20-zoom)));
var maxY = lastY/(Math.pow(2,(20-zoom)));
var div = ownerDocument.createElement('div');
div.innerHTML = "("+coordX.toFixed(0)+","+coordY.toFixed(0)+")";
div.style.width = this.tileSize.width + 'px';
div.style.height = this.tileSize.height + 'px';
div.style.fontSize = '10';
div.style.color = '#FFFFFF';
div.style.borderStyle = 'solid';
div.style.borderWidth = '1px';
div.style.borderColor = '#FFFFFF';
if((coordX>-1 && coordX<maxX) && (coordY>-1 && coordY<maxY)){
return div;
} else{
return null;
}
};
function initMap() {
map = new google.maps.Map(document.getElementById('map'), {
center: {lat: 38.2711991, lng: -82.6292357},
zoom: 7,
mapTypeId: google.maps.MapTypeId.SATELLITE
});
map.setTilt(0);
map.addListener('zoom_changed', function() {
zoom = map.getZoom();
console.log(zoom);
});
drawGrid();
map.overlayMapTypes.insertAt(0, new CoordMapType());
}