Получение из слоя координат точек

0 голосов
спросил 03 Июль, 10 от Ilya_Zaycev (380 баллов) в категории Программные продукты Esri
    Господа! Помогите решить проблему, ни как не могу разобрать в работе с классом IPointCollection. Для работы мне нужно извлечь из файла shp координаты точек.

9 Ответы

0 голосов
ответил 03 Июль, 10 от TDenis (42,620 баллов)
Покажите, что уже есть.
Чтоб хоть видеть - какой язык, откуда слой берётся, что за фигурки в слое, куда извлекать и осилили ли создать курсор.
0 голосов
ответил 05 Июль, 10 от Ilya_Zaycev (380 баллов)
Язык C# Вот код:public static List<string> GetPointProp(string LayerName)
        {
            IMap maps = m_doc.Maps.get_Item(0);
            int LayerIndex = GetLayerIndexByName(LayerName);
            if (LayerIndex == -1) return null;
            IFeatureLayer Flayer = maps.get_Layer(LayerIndex) as IFeatureLayer;
            IFeatureClass FlayerClass = Flayer.FeatureClass as IFeatureClass;
            IFeature FtrPnt;
            IPointCollection Pnt;
            IFeatureCursor FtrCrrPnt;
            FtrCrrPnt = FlayerClass.Search(null, true);
            FtrPnt = FtrCrrPnt.NextFeature();
0 голосов
ответил 05 Июль, 10 от Ilya_Zaycev (380 баллов)
осилил его, а дальше остановился. Обработчик находится в отдельном классе и впоследствии вызывается в класс формы.
0 голосов
ответил 05 Июль, 10 от TDenis (42,620 баллов)
Язык C# Вот код:public static List<string> GetPointProp(string LayerName)
        {
            IMap maps = m_doc.Maps.get_Item(0);
            int LayerIndex = GetLayerIndexByName(LayerName);
            if (LayerIndex == -1) return null;
            IFeatureLayer Flayer = maps.get_Layer(LayerIndex) as IFeatureLayer;
            IFeatureClass FlayerClass = Flayer.FeatureClass as IFeatureClass;
            IFeature FtrPnt;
            IPointCollection Pnt;
            IFeatureCursor FtrCrrPnt;
            FtrCrrPnt = FlayerClass.Search(null, true);


while ((FtrPnt = FtrCrrPnt.NextFeature()) != null)

{
    Pnt = FtrPnt as IPointCollection;
    ...
}


После чего можно c помощью PointCount и get_Point пройтись в цикле по всем точкам IPointCollection и выписать координаты. Некоторые точки могут иметь одинаковые координаты, например первая и последняя точка полигона.
В конце не забудьте корректно убить курсор, чтобы освободить ресурсы/блокировку.

http://resources.esri.com/help/9.3/ArcGISDesktop/dotnet/bdb9558a-d78d-446c-a9d8-f35f9eb44a5b.htm#Search_Cursors
0 голосов
ответил 05 Июль, 10 от pooperec (10,820 баллов)
TDenis
Спасибо за ссылку, ещё вопрос, в СШп+.НЕТ при освобождении указателя или выходе за пределы видимости переменной, объект разве не освобождается автоматически системой?
0 голосов
ответил 05 Июль, 10 от TDenis (42,620 баллов)
в СШп+.НЕТ при освобождении указателя или выходе за пределы видимости переменной, объект разве не освобождается автоматически системой?

Сборщик мусора в .NET - вещь дорогостоящая, и поэтому запускается как можно реже. Может быть он вызовется через секунду, может быть через час, когда память будет заканчиваться. Тогда он подсчитает число ссылок на объект, если оно будет равно 0 - прибьёт этот объект. Но даже не факт, что за один проход. Всё это время ресурс будет блокирован.
Если нужно твёрдо знать, что ресурсы (типа подключений в БД) освобождены - приходится освобождать их явно.
0 голосов
ответил 05 Июль, 10 от pooperec (10,820 баллов)
TDenis
Спасибо за пояснения. Возникли дополнительные вопросы:
1. "Всё это время ресурс будет блокирован" - в чём это выражается, какие "симптомы"?
2. Всю дорогу думал что менеджмент СОМ объектов лежит на плечах ОС. И самое тяжёлое что происходило это "неявная оптимизация", выражается это в том что созданный, но некорректно освобожденный объект висит в памяти и при повторном вызове запускает почти "многновенно"...
    

"В догонку":
3. Всё приватные и локальные переменные которые базируются на COM классах требуют такого обращения, или тут есть связь с типом апартаментов/поточностью?
0 голосов
ответил 05 Июль, 10 от TDenis (42,620 баллов)
к БД, разумеется. Опечатки :)
1. "Всё это время ресурс будет блокирован" - в чём это выражается, какие "симптомы"?

Ситуация - кто-то сохранил что-то в класс БГД, отключился давным-давно, а другие по-прежнему не могут открыть этот класс на редактирование, или не могут схему поменять, пока тот первый из программы не выйдет (ну или домен не грохнет).
Т.е. обычная блокировка схемы БГД, или блокировка файлов. Пока не отключился - блокировка сохраняется.
Когда сборщик мусора сам всё это сделает - неизвестно. Его можно вызвать явно (GC.Collect), но это будет относительно долго, ведь он предварительно остановит все потоки, будет бродить по "куче", считать ссылки, убивать объекты из своего собственного потока и т.п.

2. Всю дорогу думал что менеджмент СОМ объектов лежит на плечах ОС.

Но ведь она должна знать, когда можно грохать объект, когда на него не остаётся больше ссылок. Где-то достаточно написать x = null (nil, Nothing или как-то ещё), а где-то такое не пройдёт.

3. Всё приватные и локальные переменные которые базируются на COM классах требуют такого обращения, или тут есть связь с типом апартаментов/поточностью?

Слава богу требуют далеко не все, подобный "геморой" только для дорогостоящих ресурсов, стратегия работы с которыми - подключился как можно позже, сделал что требуется, и отключился как можно раньше.
Об освобождении подавляющего большинства закрытых/открытых ArcObjects можно не заморачиваться, и вообще не предпринимать никаких попыток их явно освободить - ну умрут чуть раньше или чуть позже, какая разница.
Когда переменная открытая (публичная) и мы хотим её явно освободить, то, конечно, делать это надо аккуратно. Если кто-то обратится к такой переменной после её освобождения - будет очень нехорошо.

http://msdn.microsoft.com/ru-ru/magazine/cc163316.aspx
http://resources.esri.com/help/9.3/ArcGISDesktop/dotnet/fe9f7423-2100-4c70-8bd6-f4f16d5ce8c0.htm
Если будет желание во внутренностях и всяких нюансах покопаться, можно почитать Джефри Рихтера:
http://www.ozon.ru/context/detail/id/1300904/
http://www.ozon.ru/context/detail/id/5047621/
   
P.S. Если не освободить курсор, возможно, ничего страшного и не случится. Но ведь всегда лучше перестраховаться.
    
0 голосов
ответил 05 Июль, 10 от pooperec (10,820 баллов)
TDenis
Спасибо)
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...