Ошибка Mapbox: стиль не загружен


13

Я пытаюсь нарисовать на карте mapbox, основываясь на результатах Suncalc и используя Geojson. Сначала я попытался создать 2 функции, по одной на каждую линию, которую пытался нарисовать. Но когда я это сделал, он отображал только последнюю вызванную функцию. Поэтому я пришел к выводу, что не знаю, как управлять слоями, так как я новичок в синтаксисе mapbox и листовки.

Используя примеры листовок, я получил этот код:

JAVASCRIPT

    function drawOnMap(sAz){
        //sun calculation stuff, doesn't matter for the problem
        var lt = parseFloat(document.getElementById('lat').value);
        var ln = parseFloat(document.getElementById('long').value);   

        var R = 6371000; //Earth's radius
        var d = 10000* Math.sin(1); // Distance
        var brngSR = deg2rad(sAz);

        var ltr = deg2rad(lt);    

        var latSR = rad2deg(Math.asin( Math.sin(ltr)*Math.cos(d/R) + Math.cos(ltr)*Math.sin(d/R)*Math.cos(brngSR) ));
        var lonSR = ln + rad2deg(Math.atan2(Math.sin(brngSR)*Math.sin(d/R)*Math.cos(ltr), Math.cos(d/R)-Math.sin(ltr)*Math.sin(latSR)));


        var out3 = calculateNOAA(lat, lon, timeZone, year, month, day, out[6], out[7], out[8]);
        var sEl2 = out3[11];
        var sAz2 = out3[9];

        var brngSS = deg2rad(sAz2);   

        var latSS = rad2deg(Math.asin( Math.sin(ltr)*Math.cos(d/R) + Math.cos(ltr)*Math.sin(d/R)*Math.cos(brngSS) ));
        var lonSS = ln + rad2deg(Math.atan2(Math.sin(brngSS)*Math.sin(d/R)*Math.cos(ltr), Math.cos(d/R)-Math.sin(ltr)*Math.sin(latSS)));

        //GeoJSON to display 2 lines 
        var sunPos = [
            {
                "type": "Feature",
                "geometry": {
                    "type": "LineString",
                    "coordinates": [
                        [ln, lt], 
                        [lonSR, latSR]
                    ]
                },
                "properties": {"id": "sunrise"}
            },
            {
                "type": "Feature",
                "geometry": {
                    "type": "LineString",
                    "coordinates": [
                        [ln, lt],
                        [lonSS, latSS]
                    ]
                },
                "properties": {"id": "sunset"}
            }
        ];

        //setting map to current position
        mapboxgl.accessToken = 'pk.<mytoken>'; //I'm using a real token
        var map = new mapboxgl.Map({
            container: 'map',
            style: 'mapbox://styles/mapbox/streets-v9',
            center: [ln, lt],
            zoom: 15
        });    
        var marker = L.icon({
            iconUrl: 'actpin.png',
            iconAnchor: [20, 50]
        });

        L.marker([ln, lt], {icon: marker}).addTo(map);
        //adding the layer to map with different colors each line
        map.on('load', function () {
            L.geoJson(sunPos, {
                style: function(feature) {
                    switch (feature.properties.id) {
                        case 'sunrise': return {color: "#FFFF33"};
                        case 'sunset':   return {color: "#FF9933"};
                    }
                }
            }).addTo(map);
        });
    }

Когда функция вызывается, я получаю следующую ошибку:

Ошибка: стиль не завершен загрузка

"использовать строгий"; стиль функции (e, t, r) {this.animationLoop = t || new AnimationLoop, this.dispatcher = new Dispatcher (r || 1, this), this.spriteAtlas = new SpriteAtlas (512,512), this.lineAtlas = new LineAtlas (256,512), this._layers = {}, this._order = [], this._groups = [], this.sources = {}, this.zoomHistory = {}, util.bindAll ([ "_forwardSourceEvent", "_ forwardTileEvent", "_ forwardLayerEvent", "_ redoPlacement"], this), this._resetUpdates (); var s = function (e, t) {if (e) возвращает void this.fire ("error", {error: e}); if (! validateStyle.emitErrors (this, validateStyle (t))) {this._loaded =! 0, this.stylesheet = t, this.updateClasses (); var r = t.sources; для (var s in r) this.addSource (s, r [s]); t.sprite && (this.sprite = new ImageSprite (t.sprite), this.sprite.on ("загрузка", this.fire.bind ( this, "change"))), this.glyphSource = new GlyphSource (t.глифы), this._resolve (), this.fire ("load")}}. bind (this); "string" == typeof e? ajax.getJSON (normalizeURL (e), s): browser.frame (s) .bind (this, null, e)), this.on ("source.load", function (e) {var t = e.source; if (t && t.vectorLayerIds) для (var r в this._layers) {var s = this._layers [r]; s.source === t.id && this._validateLayer (s)}})} var Evented = require ("../ util / evented"), StyleLayer = require ("./ style_layer "), ImageSprite = требуется (" ./ image_sprite "), GlyphSource = требуется (" ../ символ / glyph_source "), SpriteAtlas = требуется (" ../ символ / sprite_atlas "), LineAtlas = требуется (" ../ рендеринга / line_atlas "), Util = требуется (" ../ Util / Util "), Ajax = требуется (" ../ Util / Ajax "), normalizeURL = требуется (" ../ Util / MapBox "). normalizeStyleURL, браузер = требуется ( "../ UTIL / браузер"),Диспетчерские = требуется ( "../ Util / диспетчер "), AnimationLoop = требуется (" ./ animation_loop "), validateStyle = требуется (" ./ validate_style "), Source = требуется (" ../ источник / источник"), ! styleSpec = требуется ( "./ style_spec "), StyleFunction = требуется (" ./ style_function"); module.exports = Style, Style.prototype = util.inherit (Evented, {_ загружено: 1, _validateLayer: функция (е) {var t = this.sources [e.source]; e.sourceLayer && t && t.vectorLayerIds && - 1 === t.vectorLayerIds.indexOf (e.sourceLayer) && this.fire ("error", {error: new Error ('Исходный уровень) «+ e.sourceLayer +» не существует в источнике «+ t.id +», как указано в слое стиля «+ e.id +« »)})}, загружено: function () {if (! this ._loaded) return! 1; for (var e in this.sources) if (! this.sources [e].загруженный ()) return! 1; return! this.sprite || this.sprite.loaded ()}, _ resol: function () {var e, t; this._layers = {}, this._order = this.stylesheet. layer.map (function (e) {return e.id}); for (var r = 0; rMath.floor (e) && (t.lastIntegerZoom = Math.floor (e + 1), t.lastIntegerZoomTime = Date. сейчас ()), t.lastZoom = е},_checkLoaded: function () {if (! this._loaded) выдает новую ошибку («Стиль не завершен при загрузке»)} , update: function (e, t) {if (! this._updates.changed) возвращает это; if ( this._updates.allLayers) this._groupLayers (), this._updateWorkerLayers (); else {var r = Object.keys (this._updates.layers); r.length && this._updateWorkerLayers (r)} var s, i = Object. ключи (this._updates.sources); для (s = 0; s = 0; r -) для (var s = this._order [r], i = 0; i

Я могу определить ошибку (выделено внутри цитаты), но я не знаю, как ее исправить ... Моя попытка исправить это была с использованием map.on('load', function()), но я все еще получаю ту же ошибку.

Есть предположения?


Добро пожаловать в ГИС ЮВ! Как новый пользователь, обязательно ознакомьтесь с нашим форматом вопросов и ответов.
PolyGeo

Ответы:


13

Возьмите L.marker([ln, lt], {icon: marker}).addTo(map);строку и переместите ее в функцию обратного вызова для map.on('load')(одной строкой непосредственно над тем, где вы добавляете L.geoJsonобъект). Это предотвратит попытки кода добавить маркер на карту до инициализации стиля.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.