MapBox GL JS Настройка спрайтов для свойств иконок - PullRequest
0 голосов
/ 25 марта 2020

Мне трудно обернуть голову вокруг MapBox GL. Я пришел из истории листовки, и мне трудно понять некоторые из абстракций.

Я работаю с большим количеством данных журнала поездок GPS, и мне нужно делать такие вещи, как отображение фрагмента поездки, выделение его части цветом, нанесение на него маркеров с помощью пользовательских выводов. Другая распространенная функция - пометить все юниты на карте с помощью булавок, которые отличаются по своему статусу. Например: Last Reported, Fuel Level, et c.

. Для создания маркеров у меня в настоящее время есть вспомогательный объект, который выплевывает js.

public string EmitJs()
{
    Debug.WriteLine("Emit Marker");
    StringBuilder sb = new StringBuilder();
    sb.AppendFormat("var container{0} = document.createElement('div');", UniqueId).AppendLine();
    sb.AppendFormat("container{0}.className = '{1}';", UniqueId, ContainerCss).AppendLine();
    sb.AppendFormat("var popup{0} = new mapboxgl.Popup({{ offset: 25 }}).setHTML(", UniqueId).AppendLine(); // escape { } with {{ }} in String.Format
    sb.AppendFormat("    \'{0}\'", Point.Label).AppendLine();
    sb.AppendLine(");");
    sb.AppendFormat("var marker{0} = new mapboxgl.Marker(container{1}, {{", UniqueId, UniqueId).AppendLine();
    sb.AppendLine("    anchor: 'bottom'");
    sb.AppendLine("})");
    sb.AppendFormat("  .setLngLat({0})", Point.EmitForMapBox()).AppendLine();
    sb.AppendFormat("  .setPopup(popup{0})", UniqueId).AppendLine();
    sb.AppendLine("  .addTo(map);");
    sb.AppendLine();

    return sb.ToString();
}

, это возвращает:

var container5 = document.createElement('div');
container5.className = 'marker marker-pu-green';
var popup5 = new mapboxgl.Popup({ offset: 25 }).setHTML(
    '<p><b>Name:</b> 1310 PU2003<br /><b>Last Reported:</b> 25/03/2020 11:16:35<br /><b>Last Status:</b> Operating</p>'
);
var marker5 = new mapboxgl.Marker(container5, {
    anchor: 'bottom'
})
  .setLngLat([151.047211,-32.537003])
  .setPopup(popup5)
  .addTo(map);

Позволяет отображать изображения, наложенные на карту, с правилами CSS. Это довольно просто.

Geo Json FeatureCollection, содержит Feature's, которые представляют отдельные маркеры. Я вижу, что свойства значка в объекте Layer предназначены для представления именованных значений в некоторой таблице спрайтов, но, черт побери, если я смогу понять, где это и как его загрузить. Я был через всю Студию и ее документацию. Кажется, это относится к свойству 'sprites': 'path to file' json, которое вы не можете установить или загрузить.

Кроме того, оно хочет, чтобы спрайты были в формате SVG, несмотря на приведение их обратно в растр. как PNG. Это другой вопрос, но мне нужно преобразовать кучу PNG в формат SVG, если я когда-нибудь получу эту работу.

Вопрос

Как сделать Я добавляю собственные спрайты в свой стиль MapBox, чтобы я мог ссылаться на них в свойствах значка Geo Json.

** Редактировать 27 марта 202 **

Следующее вырезано из страницы. Полилинии не включены (они работают хорошо), только линии, чтобы попытаться заставить слой символов работать. Пути к изображениям являются локальными для моей среды разработки и действительны. Они будут переписаны при перемещении в продукт.

<script id="mapScript" type="text/javascript">
var baseUrl = '/';
mapboxgl.accessToken = '[snip]';
var map = new mapboxgl.Map({
    container: 'map',
    style: 'mapbox://styles/fleetlogixmaps/ck6r4knm10smq1irxvnvfmq1b',
    center: [148.381332397461,-21.4777641296387],
    setMinZoom: 13,
    setMaxZoom: 18,
    zoom: 15,
});



map.loadImage('http://localhost:7933/Images/pin_path_start_128x128.png', function(error, image) {
    if (error) throw error;
    map.addImage('pathStart', image);
});

map.loadImage('http://localhost:7933/Images/pin_path_end_128x128.png', function(error, image) {
    if (error) throw error;
    map.addImage('pathEnd', image);
});

map.loadImage('http://localhost:7933/Images/pin_event_start_128x128.png', function(error, image) {
    if (error) throw error;
    map.addImage('eventStart', image);
});

map.loadImage('http://localhost:7933/Images/pin_event_end_128x128.png', function(error, image) {
    if (error) throw error;
    map.addImage('eventEnd', image);
});

var markers = {
    'type': 'FeatureCollection',
    'features': [
        {
            'type': 'Feature',
            'geometry': {
                'type': 'Point',
                'coordinates': 
                    [148.370483398438,-21.4804000854492],
                'properties': {
                    'title': 'Path Start',
                    'icon': 'pathStart'
                }
            }
        },

        {
            'type': 'Feature',
            'geometry': {
                'type': 'Point',
                'coordinates': 
                    [148.381332397461,-21.4777641296387],
                'properties': {
                    'title': 'Event Start',
                    'icon': 'eventStart'
                }
            }
        },

        {
            'type': 'Feature',
            'geometry': {
                'type': 'Point',
                'coordinates': 
                    [148.385375976563,-21.4819965362549],
                'properties': {
                    'title': 'Event End',
                    'icon': 'eventEnd'
                }
            }
        },

        {
            'type': 'Feature',
            'geometry': {
                'type': 'Point',
                'coordinates': 
                    [148.393402099609,-21.4885864257813],
                'properties': {
                    'title': 'Path End',
                    'icon': 'pathEnd'
                }
            }
        }

    ]
};

map.on('load', function() {
    map.addLayer({
        'id': 'markers',
        'source': 'markerSrc',
        'type': 'symbol',
        'layout': {
            'icon-image': ['get', 'icon'],
            'icon-size': 0.25,
        },


    });

});

</script>

1 Ответ

0 голосов
/ 25 марта 2020

Вы путаете Маркеры (HTML элементы, которые расположены над картой) со слоями Символов (изображения, которые существуют на карте, привязаны к источнику, подобному Geo JSON).

Маркеры над не имеет ничего общего со спрайтами: вы вводите их в стиль CSS. См. этот пример .

Если вы действительно хотите использовать слой Symbol, самый простой способ использовать пользовательские изображения - загрузить их в Mapbox Studio, которая сгенерирует файл Sprite для вас.

enter image description here

Кроме того, вы можете использовать loadImage для динамической загрузки изображений.

...