我需要显示一个带有显示其边界的邮政编码的交互式地图,并且邮政编码具有不同的颜色,如下所示:
http://www.usnaviguide.com/zip.htm
输入美国邮政编码,然后单击“查找邮政编码”。
也许我忽略了它,但我还没有在 Google Maps API 文档中找到这方面的示例和专门讨论此内容的文档。我正在尝试在上面的网页链接上查看源代码,但对我来说它是如何工作的似乎并不明显。页面上还有其他东西,我不知道它是否是我需要的一部分。
一些简单的代码示例将非常有帮助!谢谢!
我需要显示一个带有显示其边界的邮政编码的交互式地图,并且邮政编码具有不同的颜色,如下所示:
http://www.usnaviguide.com/zip.htm
输入美国邮政编码,然后单击“查找邮政编码”。
也许我忽略了它,但我还没有在 Google Maps API 文档中找到这方面的示例和专门讨论此内容的文档。我正在尝试在上面的网页链接上查看源代码,但对我来说它是如何工作的似乎并不明显。页面上还有其他东西,我不知道它是否是我需要的一部分。
一些简单的代码示例将非常有帮助!谢谢!
这是我与 FusionTablesLayers 放在一起的美国邮政编码地图:
http://www.geocodezip.com/geoxml3_test/v3_FusionTables_zipcode_map.html
它没有不同的颜色,但你可以改变它。
John Coryat 使用图块服务器制作了该地图,您可以使用 Google Maps API v3 自定义地图进行相同操作。
示例中的代码片段:
google.load('visualization', '1', {'packages':['corechart', 'table', 'geomap']});
var map;
var labels = [];
var layer;
var tableid = 1499916;
function initialize() {
geocoder = new google.maps.Geocoder();
map = new google.maps.Map(document.getElementById('map_canvas'), {
center: new google.maps.LatLng(37.23032838760389, -118.65234375),
zoom: 6,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
layer = new google.maps.FusionTablesLayer(tableid);
layer.setQuery("SELECT 'geometry' FROM " + tableid);
layer.setMap(map);
codeAddress("11501" /*document.getElementById("address").value*/ );
google.maps.event.addListener(map, "bounds_changed", function() {
displayZips();
});
google.maps.event.addListener(map, "zoom_changed", function() {
if (map.getZoom() < 11) {
for (var i=0; i<labels.length; i++) {
labels[i].setMap(null);
}
}
});
}
function codeAddress(address) {
geocoder.geocode( { 'address': address}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
map.setCenter(results[0].geometry.location);
var marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location
});
if (results[0].geometry.viewport)
map.fitBounds(results[0].geometry.viewport);
} else {
alert("Geocode was not successful for the following reason: " + status);
}
});
}
function displayZips() {
//set the query using the current bounds
var queryStr = "SELECT geometry, ZIP, latitude, longitude FROM "+ tableid + " WHERE ST_INTERSECTS(geometry, RECTANGLE(LATLNG"+map.getBounds().getSouthWest()+",LATLNG"+map.getBounds().getNorthEast()+"))";
var queryText = encodeURIComponent(queryStr);
var query = new google.visualization.Query('http://www.google.com/fusiontables/gvizdata?tq=' + queryText);
// alert(queryStr);
//set the callback function
query.send(displayZipText);
}
var infowindow = new google.maps.InfoWindow();
function displayZipText(response) {
if (!response) {
alert('no response');
return;
}
if (response.isError()) {
alert('Error in query: ' + response.getMessage() + ' ' + response.getDetailedMessage());
return;
}
if (map.getZoom() < 11) return;
FTresponse = response;
//for more information on the response object, see the documentation
//http://code.google.com/apis/visualization/documentation/reference.html#QueryResponse
numRows = response.getDataTable().getNumberOfRows();
numCols = response.getDataTable().getNumberOfColumns();
/* var queryStr = "SELECT geometry, ZIP, latitude, longitude FROM "+ tableid + " WHERE ST_INTERSECTS(geometry, RECTANGLE(LATLNG"+map.getBounds().getSouthWest()+",LATLNG"+map.getBounds().getNorthEast()+"))";
*/
for(i = 0; i < numRows; i++) {
var zip = response.getDataTable().getValue(i, 1);
var zipStr = zip.toString()
while (zipStr.length < 5) { zipStr = '0' + zipStr; }
var point = new google.maps.LatLng(
parseFloat(response.getDataTable().getValue(i, 2)),
parseFloat(response.getDataTable().getValue(i, 3)));
// bounds.extend(point);
labels.push(new InfoBox({
content: zipStr
,boxStyle: {
border: "1px solid black"
,textAlign: "center"
,backgroundColor:"white"
,fontSize: "8pt"
,width: "50px"
}
,disableAutoPan: true
,pixelOffset: new google.maps.Size(-25, 0)
,position: point
,closeBoxURL: ""
,isHidden: false
,enableEventPropagation: true
}));
labels[labels.length-1].open(map);
}
// zoom to the bounds
// map.fitBounds(bounds);
}
google.maps.event.addDomListener(window,'load',initialize);
#map_canvas { width: 610px; height: 400px; }
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" src="http://google-maps-utility-library-v3.googlecode.com/svn/trunk/infobox/src/infobox.js"></script>
<script type="text/javascript" src="http://geoxml3.googlecode.com/svn/branches/polys/geoxml3.js"></script>
<form>
<span class="style51"><span class="style49">Show</span>:</span>
<input id="address" type="text" value="11501" ></input>
<input id="geocode" type="button" onclick="codeAddress(document.getElementById('address').value);" value="Geocode"></input>
<div id="map_canvas"></div>
我在寻找可以在网站上使用的邮政编码地图时遇到了同样的问题。我偶然发现了这个有点慢但完全符合我的要求的免费项目: http ://www.openheatmap.com/
非常适合个人使用,向用户展示时不太好。如果有人和我有同样的情况,我希望这能帮助他们。
一个简单的 API 来获得你想要的东西: https ://www.mashape.com/vanitysoft/boundaries-io
上面的 API 按邮政编码、城市和州显示美国边界(GeoJson)。您应该以编程方式使用 API 来处理大型结果。
例如: