Выделение геометрий при событии клика по карте. Sharpmap

Вопросы по нескольким пакетам сразу, или вопросы, которые непонятно к какой ГИС отнести
Ответить
timur_orudzhov
Новоприбывший
Сообщения: 2
Зарегистрирован: 23 июн 2012, 18:49
Репутация: 0

Выделение геометрий при событии клика по карте. Sharpmap

Сообщение timur_orudzhov »

Всем привет! Очень нужна помощь.

В своем приложении для рендеринга карты я использую SharpMap, в качестве провайдера данных использую postgis/postgresql. Для выбора полигонов я использую следующий код в обработчике события клика по контролу:

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

        private void renderGisControl_MouseClick(object sender, MouseEventArgs m)
        {
            SharpMap.Geometries.Point p = renderGisControl.Map.ImageToWorld(m.Location);
            FeatureDataSet selectedBuild = new FeatureDataSet();

            SharpMap.Layers.VectorLayer buildingsLayer = cityMap.FindLayer("polygons").FirstOrDefault() as
                SharpMap.Layers.VectorLayer;
            if (!buildingsLayer.DataSource.IsOpen)
                buildingsLayer.DataSource.Open();

            buildingsLayer.DataSource.ExecuteIntersectionQuery(p.GetBoundingBox(), selectedBuild);
            buildingsLayer.DataSource.Close();

            foreach (SharpMap.Data.FeatureDataRow current in selectedBuild.Tables[0].Rows)
                if (!selectedBuildings.Contains(current.Geometry))
                    selectedBuildings.Add(current.Geometry);
                else
                    selectedBuildings.Remove(current.Geometry);
            renderGisControl.Refresh();
        }
Данный код отлично работает, но когда я попытался таким же образом организовать выбор геометрий с типом "линия", меня ждало разочарование.

Не могли бы подсказать, в чем я заблуждаюсь? Как организовать выбор "линий"? Заранее спасибо за любую помощь, и извините, если что-то не так сформулировал, так как я еще новичок в этой области.
yellow-sky
Гуру
Сообщения: 588
Зарегистрирован: 30 мар 2009, 21:53
Репутация: 55
Откуда: Королев

Re: Выделение геометрий при событии клика по карте. Sharpmap

Сообщение yellow-sky »

При вызове ExecuteIntersectionQuery для PostGIS datasource SharpMap использует родную для БД функцию ST_Intersect, которая в свою очередь соответствует стандарту OpenGIS Simple Features Implementation Specification for SQL 1.1. Поэтому datasource будет возвращать только действительно пересекающиеся геометрии. Попасть точкой в линию - практически невозможно из-за разности точности хранения/точности ввода. Поэтому, обычно делается запрос на пересечение с некоторым буфером, вокруг указанной точки - например выбрать объекты лежащие в пределах 100 метров от указанной точки (размер буфера указывается в зависимости от системы координат и необходимой точности поиска). Поэтому в вашем случае необходимо вызывать не

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

buildingsLayer.DataSource.ExecuteIntersectionQuery(p.GetBoundingBox(), selectedBuild);
а

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

double bufferSize=100;
buildingsLayer.DataSource.ExecuteIntersectionQuery(p.GetBoundingBox().Grow(bufferSize), selectedBuild);
bufferSize для метрических систем обычно выбирается больше 1 и исчисляется десятками и сотнями метров, а для градусных - сотые и десятые части градуса - обычно 0.0001, что соответствует примерно 11 метрам на экваторе.
В результат могут попадать объекты, которые не будут действительно пересекаться с указанной точкой, но такова природа идеальных линий :)
timur_orudzhov
Новоприбывший
Сообщения: 2
Зарегистрирован: 23 июн 2012, 18:49
Репутация: 0

Re: Выделение геометрий при событии клика по карте. Sharpmap

Сообщение timur_orudzhov »

Yellow-sky, огромное спасибо за подробнейшее объяснение :D !!!
Ответить

Вернуться в «Общий - ПО»

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

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