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

Основной проблемой была перерисовка, рещить поторую удалось лишь клонированием объекта катры. Вот код для этого трюка:
/// <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);
}
}
Возможно, код окажется кому-то полезным!