I have tried various solutions from other helpful answers on here but nothing seems to work. Trying to add a local GeoJSON file with multiple polygons to a map via leaflet with zero success so far.
I am new to Leaflet.
This is my code:
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<title></title>
<meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' />
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.6.0/dist/leaflet.css"
integrity="sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ=="
crossorigin=""/>
<script src="https://unpkg.com/leaflet@1.6.0/dist/leaflet.js"
integrity="sha512-gZwIG9x3wUXg2hdXF6+rVkLF/0Vi9U8D2Ntg4Ga5I5BZpVkVxlJWbSQtXPSiUTtC0TjtGOmxa1AJPuV0CPthew=="
crossorigin=""></script>
<script src='https://api.tiles.mapbox.com/mapbox-gl-js/v1.5.0/mapbox-gl.js'></script>
<link href='https://api.tiles.mapbox.com/mapbox-gl-js/v1.5.0/mapbox-gl.css' rel='stylesheet' />
<script src='https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-geocoder/v4.4.1/mapbox-gl-geocoder.min.js'></script>
<link rel='stylesheet' href='https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-geocoder/v4.4.1/mapbox-gl-geocoder.css' type='text/css' />
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
<script src="/js/leaflet-ajax-gh-pages/dist/leaflet.ajax.min.js"></script>
<style>
body { margin:0; padding:0; }
#mapid { position:absolute; top:0; bottom:0; width:100%; }
</style>
</head>
<body>
<div id='mapid'></div>
<script>
var mapboxAccessToken = 'my_access_token';
var map = L.map('mapid').setView([20.0, 0.0], 3);
L.tileLayer('https://api.mapbox.com/styles/v1/mapbox/streets-v11/tiles/{z}/{x}/{y}?access_token=' + mapboxAccessToken, {
attribution: 'Map data © <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="https://www.mapbox.com/">Mapbox</a>',
maxZoom: 18,
tileSize: 512,
zoomOffset: -1
}).addTo(map);
var geojsonLayer = new L.GeoJSON.AJAX("areas.geojson");
geojsonLayer.addTo(map);
</script>
</body>
</html>
This is a sample from the GeoJson file, which I have created by merging multiple layers in QGIS. I wondered if the 'path' field might be causing issues so I've also tried using a single polygon file with only one of the original layers and no 'path' field but still no joy:
{
type: "FeatureCollection",
name: "areas",
crs: { type: "name", properties: { name: "urn:ogc:def:crs:OGC:1.3:CRS84" } },
features: [
{
type: "Feature",
properties: {
iso_a3: "BHR",
iso_ter1: "BHR",
name: "Bahrain",
descriptio: null,
timestamp: null,
begin: null,
end: null,
altitudeMo: null,
tessellate: null,
extrude: null,
visibility: null,
drawOrder: null,
icon: null,
grouping: null,
MRGID: null,
GeoName: null,
MRGID_Ter1: null,
Pol_type: null,
MRGID_Sov1: null,
Territory1: null,
Sovereign1: null,
MRGID_Ter2: null,
MRGID_Sov2: null,
Territory2: null,
ISO_Ter2: null,
Sovereign2: null,
MRGID_Ter3: null,
MRGID_Sov3: null,
Territory3: null,
ISO_Ter3: null,
Sovereign3: null,
x_1: null,
y_1: null,
MRGID_EEZ: null,
Area_km2: null,
layer: "BAHRAIN",
path: "C:/Users/My Name/My Company/R & D - Documents (1)/Areas/My Client/BAHRAIN/BAHRAIN.geojson"
},
geometry: {
type: "MultiPolygon",
coordinates: [[[[50.373287690475138, 26.418289404549846, 0.0]]]]
}
}
]
}
Made some modifications to the html file but getting the following error:
TypeError: this.callInitHooks is not a function. (In
'this.callInitHooks()', 'this.callInitHooks' is undefined)
This is my new code:
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<title></title>
<meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' />
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.6.0/dist/leaflet.css"
integrity="sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ=="
crossorigin=""/>
<script src="https://unpkg.com/leaflet@1.6.0/dist/leaflet.js"
integrity="sha512-gZwIG9x3wUXg2hdXF6+rVkLF/0Vi9U8D2Ntg4Ga5I5BZpVkVxlJWbSQtXPSiUTtC0TjtGOmxa1AJPuV0CPthew=="
crossorigin=""></script>
<link href='https://api.tiles.mapbox.com/mapbox-gl-js/v1.5.0/mapbox-gl.css' rel='stylesheet' />
<script src='https://api.tiles.mapbox.com/mapbox-gl-js/v1.5.0/mapbox-gl.js'></script>
<link rel='stylesheet' href='https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-geocoder/v4.4.1/mapbox-gl-geocoder.css' type='text/css' />
<script src='https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-geocoder/v4.4.1/mapbox-gl-geocoder.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/leaflet-ajax/2.1.0/leaflet.ajax.min.js'></script>
<style>
body { margin:0; padding:0; }
#mapid { position:absolute; top:0; bottom:0; width:100%; }
</style>
</head>
<body>
<div id='mapid'></div>
<script>
var mapboxAccessToken = 'myKey';
var map = L.map('mapid').setView([20.0, 0.0], 3);
L.tileLayer('https://api.mapbox.com/styles/v1/mapbox/streets-v11/tiles/{z}/{x}/{y}?access_token=' + mapboxAccessToken, {
attribution: 'Map data © <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="https://www.mapbox.com/">Mapbox</a>',
maxZoom: 18,
tileSize: 512,
zoomOffset: -1
}).addTo(map);
var areas = L.GeoJSON('areas.geojson');
areas.addTo(map);
</script>
</body>
</html>
Best Answer
First of all your GeoJSON geometry has a Z dimension that a suppose leaflet can't handle:
You must remove the
0.0
value at the end of the arraySecond, you must change the GeoJSON instantiation, the
L.GeoJSON
is the class definition and in order to use that way you must call withnew L.GeoJSON
. In Leaflet documentation they describe the function to instantiate a GeoJSON with the lowercase G, with that in mind the usageL.GeoJSON(args)
became thisL.geoJSON(args)
Third, your map view is set too far away from the described geometry, in the example bellow I have set the view to the geometry coordinates:
https://jsfiddle.net/guihig/2ks1ohwc/5/
Also most of the browsers can't find the path to local files, the files must be served by a http server.