Postgisデータベースからgeojsonをロードしていて、マップに表示したいと考えています。ポリゴンを描画した後、追加したポリゴンの範囲にマップをズームします。
データは正常に読み込まれ、マップ上に正しく表示されますが、境界を取得して、新しく追加されたポリゴンにズームを変更する方法を理解できません。 Googleのコードの一部を使用しようとしました データレイヤー:ドラッグアンドドロップのGeoJSONの例 ですが、表示されたマップは、ベイカー諸島に近い太平洋のどこかにズームインしますが、ポリゴンは正しく表示されますルクセンブルク。
ここで私が使用しているコード:
window.addEventListener("load", func1);
function func1(){
//Load mapdata via geoJson
var parzelle = new google.maps.Data();
parzelle.loadGeoJson("./mapdata/get_parzelle_geojson.php<?php echo "?gid=".$_GET['gid'];?>");
// Set the stroke width, and fill color for each polygon
var featureStyle = {
fillColor: '#ADFF2F',
fillOpacity: 0.1,
strokeColor: '#ADFF2F',
strokeWeight: 1
}
parzelle.setStyle(featureStyle);
parzelle.setMap(map);
zoom(map);
}
function zoom(map) {
var bounds = new google.maps.LatLngBounds();
map.data.forEach(function(feature) {
processPoints(feature.getGeometry(), bounds.extend, bounds);
});
map.fitBounds(bounds);
}
function processPoints(geometry, callback, thisArg) {
if (geometry instanceof google.maps.LatLng) {
callback.call(thisArg, geometry);
} else if (geometry instanceof google.maps.Data.Point) {
callback.call(thisArg, geometry.get());
} else {
geometry.getArray().forEach(function(g) {
processPoints(g, callback, thisArg);
});
}
}
それを機能させる方法はありますか? google.maps.data-layers
でポリゴンの境界を取得する簡単な方法はないようです。
投稿されたコードに問題があります。 map.dataを使用してデータレイヤーにアクセスできます。
作業コードスニペット。最初に、GeoJSONのすべての機能にズームします。クリックすると、個々のポリゴンにズームします。
window.addEventListener("load", func1);
var map;
function func1() {
map = new google.maps.Map(document.getElementById('map-canvas'), {
zoom: 4,
center: {
lat: 0,
lng: 0
}
});
// Set the stroke width, and fill color for each polygon
var featureStyle = {
fillColor: '#ADFF2F',
fillOpacity: 0.1,
strokeColor: '#ADFF2F',
strokeWeight: 1
};
// zoom to show all the features
var bounds = new google.maps.LatLngBounds();
map.data.addListener('addfeature', function(e) {
processPoints(e.feature.getGeometry(), bounds.extend, bounds);
map.fitBounds(bounds);
});
// zoom to the clicked feature
map.data.addListener('click', function(e) {
var bounds = new google.maps.LatLngBounds();
processPoints(e.feature.getGeometry(), bounds.extend, bounds);
map.fitBounds(bounds);
});
//Load mapdata via geoJson
map.data.loadGeoJson('https://storage.googleapis.com/maps-devrel/google.json');
}
function processPoints(geometry, callback, thisArg) {
if (geometry instanceof google.maps.LatLng) {
callback.call(thisArg, geometry);
} else if (geometry instanceof google.maps.Data.Point) {
callback.call(thisArg, geometry.get());
} else {
geometry.getArray().forEach(function(g) {
processPoints(g, callback, thisArg);
});
}
}
html,
body,
#map-canvas {
height: 100%;
width: 100%;
margin: 0px;
padding: 0px
}
<script src="https://maps.googleapis.com/maps/api/js"></script>
<div id="map-canvas" style="border: 2px solid #3872ac;"></div>
Maps API(少なくとも今日のV3.26以降)は、さまざまなGeometry
型を抽象化するData.Geometry.prototype.forEachLatLng()
をサポートしています。
GeoJSONをすでにmap.data
にインポートしているので、地図を再ズームして簡単に合わせることができます(「境界に合わせる」):
var bounds = new google.maps.LatLngBounds();
map.data.forEach(function(feature){
feature.getGeometry().forEachLatLng(function(latlng){
bounds.extend(latlng);
});
});
map.fitBounds(bounds);
機能が別の理由(スタイルの設定など)で既に反復されている場合は、このコードを既存のループに組み込んで効率を上げることができます。
こんにちは、次のコードを試してみてください。問題なく動作しました。URLをgeojsonファイルパスに置き換えてください。
$.ajax({
url: url,
dataType: 'JSON',
success: function(data) {
var lat = {}, lng = {};
$(data.features).each(function(key,feature) {
$(feature.geometry.coordinates[0]).each(function(key,val) {
lng['max'] = (!lng['max'] || Math.abs(lng['max']) > Math.abs(val[0])) ? val[0] : lng['max'];
lng['min'] = (!lng['min'] || Math.abs(lng['min']) < Math.abs(val[0])) ? val[0] : lng['min'];
lat['max'] = (!lat['max'] || Math.abs(lat['max']) > Math.abs(val[1])) ? val[1] : lat['max'];
lat['min'] = (!lat['min'] || Math.abs(lat['min']) < Math.abs(val[1])) ? val[1] : lat['min'];
});
});
var bounds = new google.maps.LatLngBounds();
bounds.extend(new google.maps.LatLng(lat.min - 0.01, lng.min - 0.01));
bounds.extend(new google.maps.LatLng(lat.max - 0.01, lng.max - 0.01));
map.fitBounds(bounds);
map.setCenter(bounds.getCenter());
}
});