Программируем MapServer: работа с атрибутивной таблицей

by Dmitry [dimaka] Pavlov 28. May 2010 23:12

В предыдущем посте “Программируем MapServer: первое приложение” я описал демо приложение, программно взаимодействующее с MapServer на .NET (C#). На втором этапе я реализовал редактирование атрибутивной таблицы с перерисовкой изменений на карте. Это мне понадобилось для редактирования легенды к карте (цвет, положение и размер обозначений в легенде). Использовались данные о геологическом возрасте подразделений, которые загружались из XML файла, сохранялись в шейп файл с помощью .NET обертки над shapelib.

Внешний вид демо приложения:

MapServer Demo .NET Edit and Re-Draw Shapefile (.SHP)

Основной проблемой была перерисовка, рещить поторую удалось лишь клонированием объекта катры. Вот код для этого трюка:

/// <summary>
/// Отобразить карту в Image
/// </summary>
public void RefreshMap()
{
    if (_map == null) return;

    _map.width = MapBox.Width;
    _map.height = MapBox.Height;

    byte[] imageBytes = null;
    bool failed = false;

    // Если имеем какое-то выделение в текущем слое - рисуем в клоне карты
    // Это необходимо для устранения проблем с различными проекциями карты и слоя
    try
    {
        if (LayersTree.SelectedNode != null)
        {
            layerObj layer = GetLayerByMetaData("WMS_TITLE", LayersTree.SelectedNode.Text);
            if (layer != null)
            {
                // Необходимо, чтобы отработал запрос
                layer.template = "query";

                // Отрисовать выделение в клоне карты 
                using (mapObj clone = _map.clone())
                {
                    // Добавить в запрос все текущие выделенные мышью объекты по их индексам
                    if (_selectedShapeIndeces != null)
                    {
                        foreach (int shapeIndex in _selectedShapeIndeces)
                        {
                            layer.queryByIndex(clone, -1, shapeIndex, mapscript.MS_TRUE);
                        }
                    }

                    imageBytes = clone.drawQuery().getBytes();
                }
            }
        }
    }
    catch (Exception)
    {
        failed = true;
    }

    // Если ничего не было выделено или произошел сбой - просто отрисовать карту
    if (failed || imageBytes == null)
    {
        imageBytes = _map.draw().getBytes();
    }
    
    using (MemoryStream ms = new MemoryStream(imageBytes))
    {
        MapBox.Image = Image.FromStream(ms);
    }
}

Возможно, код окажется кому-то полезным!

Tags:

.NET | Coding | GIS | Tricks | по-русски

Comments

Calendar

<<  February 2012  >>
MoTuWeThFrSaSu
303112345
6789101112
13141516171819
20212223242526
2728291234
567891011

View posts in large calendar