Проблема с созданием символа на карте ESRI - PullRequest
0 голосов
/ 26 декабря 2018

У меня проблема в моем клиентском приложении MVVM, переходящем из ESRI.ArcGISRuntime.Toolkit v10.2.7.0 в ESRI ArcGISRuntime v100.1, где символы, которые я использовал для определения местоположения остановки, случайно не создаются.Я передаю список следующим способом:

 private async void SetMapSymbols()
    {
        var previousLayer = GraphicsLayer[SEARCH_LAYER];
        GraphicsLayer.Remove(previousLayer);

        var graphicsOverlay = new GraphicsOverlay() { Id = SEARCH_LAYER };
        var graphicList = new List<Graphic>();

        int order = 0;

        foreach (ObjectInfoModel entry in ObjectList)
        {
            order++;

            if (entry.SiteGeoLat == null || entry.SiteGeoLong == null) continue;

            var pointAttribList = ConvertObjectToDictionary(entry);
            DictionaryUtility.AddItemTodictionaryAttribute(pointAttribList, ORDER_ATTRIBUTE, order.ToString());
            var geo = entry.AltSiteGeoLat != null && entry.AltSiteGeoLong != null ? WebMercatorUtility.ConvertToMercator(entry.AltSiteGeoLong.Value, entry.AltSiteGeoLat.Value) : WebMercatorUtility.ConvertToMercator(entry.SiteGeoLong.Value, entry.SiteGeoLat.Value);
            var graphic = new Graphic(
                        new MapPoint(geo.Lon, geo.Lat, new SpatialReference(SPATIAL_REFERENCE)),
                        pointAttribList,
                     string.IsNullOrEmpty(entry.Area) ? await SymbolUtility.CreateSymbols(order.ToString(), SymbolTypes.Blue, SymbolShapes.Pin) :
                                                                await SymbolUtility.CreateSymbols(order.ToString(), SymbolTypes.Red, SymbolShapes.Arrow));
            if (entry.SiteGeoTypeCode != MAPPABLE)
            {
                graphic.Symbol = string.IsNullOrEmpty(entry.Area) ? await SymbolUtility.CreateSymbols(order.ToString(), SymbolTypes.Blue, SymbolShapes.Pin2) :
                                                                             await SymbolUtility.CreateSymbols(order.ToString(), SymbolTypes.Red, SymbolShapes.Arrow2);
            }

            graphicList.Add(graphic);

        }

        graphicList.ForEach(x => graphicsOverlay.Graphics.Add(x));
        GraphicsLayer.Add(graphicsOverlay);
    }

Как видите, SymbolUtility ожидает создания символа для каждого элемента в списке.Итак, вот этот метод:

        public static async Task<Symbol> CreateSymbols(string text, SymbolTypes type, SymbolShapes shape)
    {
        var iconPath = string.Empty;
        iconPath = string.Format(@"pack://application:,,,/Images/{0}_{1}.png", type.ToString(), shape.ToString());

        var pc = new PictureMarkerSymbol(new Uri(iconPath, UriKind.RelativeOrAbsolute));
        pc.Width = 30;
        pc.Height = 30;

        var cm = new CompositeSymbol();
        var ts = new TextSymbol()
        {
            Color = Colors.Black,
            FontStyle = FontStyle.Normal,
            FontDecoration = FontDecoration.None,
            FontFamily = "Arial",
            FontWeight = FontWeight.Bold,
            Size = 14,
            VerticalAlignment = VerticalAlignment.Middle,
            HorizontalAlignment = HorizontalAlignment.Center,
            OffsetY = shape == SymbolShapes.Arrow ? 5 : 0
        };

        ts.Text = text;
        cm.Symbols.Add(pc);
        cm.Symbols.Add(ts);

        return await Task.Factory.StartNew<Symbol>(() => { return cm; });
    }

Файлы PNG находятся в том же решении, что и утилита, но не в том же проекте.Проблема, которая возникает, заключается в том, что символ не отображает часть PNG случайным образом, но всегда возвращает текстовую часть символа.

Picture with 3 point locations, two without the PNG rendering

Если у кого-то есть какие-либо идеи по этому поводу, я был бы очень признателен.

1 Ответ

0 голосов
/ 26 декабря 2018

Если путь к значку был использован в элементе управления изображением, вы видите изображение?Возможно, неверный путь к значку или необходимо изменить действие сборки или скопировать в выходной каталог (см .: msdn doc ). Если путь к значку правильный, отображается ли символ вне CompositeSymbol (с использованием только PictureMarkerSymbol)?Если да, это исправляется обновлением SDK до 100.4 или обновлением GraphicsRenderingMode или может быть, когда вы увеличиваете / уменьшаете масштаб карты?

Я не могу воспроизвести с помощью следующего кода, где note.pngдобавлен как Контент, Копировать, если новее.

MyMapView.Map = new Map(SpatialReferences.Wgs84);
var symbol = new CompositeSymbol();
symbol.Symbols.Add(new PictureMarkerSymbol(new Uri("pack://application:,,,/note.png")));
symbol.Symbols.Add(new TextSymbol("1", Color.Black, 10, Esri.ArcGISRuntime.Symbology.HorizontalAlignment.Center, Esri.ArcGISRuntime.Symbology.VerticalAlignment.Middle));
var overlay = new GraphicsOverlay();
overlay.Graphics.Add(new Graphic(new MapPoint(0, 0), symbol));
MyMapView.GraphicsOverlays.Add(overlay);

Разработчики ArcGIS Runtime могут помочь вам в этом форуме .

...