Вопрос по Sharpmap

Кроме QGIS
Ответить
crook
Интересующийся
Сообщения: 22
Зарегистрирован: 30 мар 2009, 09:12
Репутация: 0

Вопрос по Sharpmap

Сообщение crook » 05 ноя 2010, 15:21

Вопрос в том, как используя шарпмап сделать скл-запрос и получить выборку, а не забирать целиком таблицу, как сделано в коде?

Во-вторых, как можно обратиться к определенному полигону или какому-нибудь объекту слоя?

Код: Выделить всё

public Map InitializeMap()
        {
            string connStr = "Server=127.0.0.1;Port=5432;User Id=postgres;Password=xxx;Database=postgis"; //Connectionstring
            string tablename = "graph_sos"; //Name of table in database
            string idColumn = "gid"; //Name of object ID column - MUST be integer!

            //Initialize map object

            if (chSos.Checked)
            {
                psgLayer = new SharpMap.Layers.VectorLayer("Сосны"); //Create layer
                psgLayer.Style.Fill = Brushes.Green;
                psgLayer.Style.Outline = Pens.Black;
                psgLayer.Style.EnableOutline = true;
                psgLayer.Style.Enabled = true;
                psgLayer.DataSource = new SharpMap.Data.Providers.PostGIS(connStr, tablename, "the_geom", idColumn); //Set the datasource to the PostGreSQL table
                map.Layers.Add(psgLayer);
            }


            if (chEl.Checked)
            {
                tablename = "graph_e";
                psgLayer = new SharpMap.Layers.VectorLayer("Ели"); //Create layer
                psgLayer.Style.Fill = Brushes.YellowGreen;
                psgLayer.Style.Outline = Pens.Black;
                psgLayer.Style.EnableOutline = true;
                psgLayer.Style.Enabled = true;
                psgLayer.DataSource = new SharpMap.Data.Providers.PostGIS(connStr, tablename, "the_geom", idColumn);
                map.Layers.Add(psgLayer);
            }

            if (chB.Checked)
            {
                tablename = "graph_b";
                psgLayer = new SharpMap.Layers.VectorLayer("Береза"); //Create layer
                psgLayer.Style.Fill = Brushes.SpringGreen;
                psgLayer.Style.Outline = Pens.Black;
                psgLayer.Style.EnableOutline = true;
                psgLayer.Style.Enabled = true;
                psgLayer.DataSource = new SharpMap.Data.Providers.PostGIS(connStr, tablename, "the_geom", idColumn);
                map.Layers.Add(psgLayer);
            }

            if (chL.Checked)
            {
                tablename = "graph_l";
                psgLayer = new SharpMap.Layers.VectorLayer("Лиственница"); //Create layer
                psgLayer.Style.Fill = Brushes.Yellow;
                psgLayer.Style.Outline = Pens.Black;
                psgLayer.Style.EnableOutline = true;
                psgLayer.Style.Enabled = true;
                psgLayer.DataSource = new SharpMap.Data.Providers.PostGIS(connStr, tablename, "the_geom", idColumn);
                map.Layers.Add(psgLayer);
            }
            
            map.ZoomToExtents(); //Zoom to extents

            return map;
        }

    }
И еще, подскажите пожалуйста как работать с шарпмап2? Хотяб просто вывести слой, используя постгис. Никак не могу разобраться. :oops:

crook
Интересующийся
Сообщения: 22
Зарегистрирован: 30 мар 2009, 09:12
Репутация: 0

Re: Вопрос по Sharpmap

Сообщение crook » 08 ноя 2010, 00:46

ап

Никто не подскажет?

Аватара пользователя
JEY
Активный участник
Сообщения: 228
Зарегистрирован: 17 июл 2008, 13:42
Репутация: 1

Re: Вопрос по Sharpmap

Сообщение JEY » 12 ноя 2010, 15:59

Подскажу, если немного подробнее опишите цель поставленной задачи. По вашему сообщению не совсем понятно, что именно не получается? Не получается отобразить слои, и не получается обратиться к объектам на карте?

crook
Интересующийся
Сообщения: 22
Зарегистрирован: 30 мар 2009, 09:12
Репутация: 0

Re: Вопрос по Sharpmap

Сообщение crook » 14 ноя 2010, 16:33

Да, я не могу обратиться в объекту( полигону). Мне надо на клик мыши по карте получать атрибутивную информацию из базы данных. Например, в БД есть таблица с картографией и связанная с ней атрибутивная таблица. При отрисовке создаем слой из таблицы с графикой. Вопрос в том, как получиться данные из атрибутивной таблицы?

Вопрос номер 2. Слой делается целиком из таблицы с полем the_geom (т.е. все данные, которые находятся в ней).

Код: Выделить всё

psgLayer.DataSource = new SharpMap.Data.Providers.PostGIS(connStr, tablename, "the_geom", idColumn);
                map.Layers.Add(psgLayer);
Как отобразить только часть данных, удовлетворяющих какому либо критерию?

И еще 1 вопросик, как отключить автоматическое центрирование по клику мыши по карте?

Аватара пользователя
JEY
Активный участник
Сообщения: 228
Зарегистрирован: 17 июл 2008, 13:42
Репутация: 1

Re: Вопрос по Sharpmap

Сообщение JEY » 15 ноя 2010, 09:28

Попробую последовательно ответить на каждый вопрос:

1. Как получить атрибутивные данные при выборе объекта(ов) карте?

Насколько я помню, в SharpMap API вообще не было функции выбора объектов на карте, поэтому мне пришлось реализовать ее самостоятельно. Правда, на тот момент актуальной была версия 0.9, сейчас уже 2.0.

Может что-нибудь изменилось, но я решил эту проблему так:

Код: Выделить всё

ShapMap.Forms.MapImage mapImage = Map.MapImage;

mapImage.ActiveTool = SharpMap.Forms.MapImage.Tools.Query;

SharpMap.Layers.VectorLayer layer = Map.GetLayerByName("Станции");
SharpMap.Data.Providers.MsAccess provider = layer.DataSource;

layer.DataSource.Open();

string selector = "Envelope_MinX>" + (string)(x - 0.0005) + " AND " + "Envelope_MinY>" + (string)(y - 0.0005) + " AND " + "Envelope_MaxX<" + (string)(x + 0.0005) + " AND " + "Envelope_MaxY<" + (string)(y + 0.0005);

DataRow rows[] = provider.GetTable.Select(string.Replace(selector, ",", ".")); //Полученный массив строк содержит в себе объекты, удовлетворяющие пространственному критерию.

layer.DataSource.Close();

2. Как отобразить только часть данных, удовлетворяющих какому-либо критерию?

За ответом на этот вопрос можно частично обратиться к предыдущему примеру, вот только полученный массив строк нужно добавить в экземпляр объекта класса SharpMap.Data.Providers.GeometryProvider.

3. Как отключить автоматическое центрирование по клику мыши на карте?

Не замечал такого поведения за SharpMap, однако можно изменить исходный код компонента, подключив его к проекту в Visual Studio, таким образом, чтобы он не изменял текущего обзора карты.

Ответить

Вернуться в «Свободные, бесплатные, открытые ГИС»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 15 гостей