Соседи в сети / Граф
-
- Завсегдатай
- Сообщения: 460
- Зарегистрирован: 03 фев 2005, 11:46
- Репутация: 15
- Контактная информация:
Соседи в сети / Граф
Привет!
Есть два шейп-файла. Линии и точки-узлы этих линий. У точек есть id.
Подскажите, пожалуйста, правильный порядок действий (инструменты, параметры) для добавления в атрибуты точек [id точек-соседей первого порядка].
Перечень id может быть в текстовом поле через разделитель.
На всякий случай во вложении тестовый набор данных.
Пути, с которыми начинаем (пробовать) разбираться:
- использование пространственного сложение атрибутов узел->линия>узел
- "сборка топологи" и последующий "экспорт служебных параметров"
Спасибо!
Есть два шейп-файла. Линии и точки-узлы этих линий. У точек есть id.
Подскажите, пожалуйста, правильный порядок действий (инструменты, параметры) для добавления в атрибуты точек [id точек-соседей первого порядка].
Перечень id может быть в текстовом поле через разделитель.
На всякий случай во вложении тестовый набор данных.
Пути, с которыми начинаем (пробовать) разбираться:
- использование пространственного сложение атрибутов узел->линия>узел
- "сборка топологи" и последующий "экспорт служебных параметров"
Спасибо!
- Вложения
-
Grid.zip
- Тестовый набор данных
- (4.35 КБ) 341 скачивание
- SS_Rebelious
- Гуру
- Сообщения: 1304
- Зарегистрирован: 24 фев 2009, 16:51
- Репутация: 99
- Ваше звание: GIS pro-fan
- Откуда: Lahti / Газ-ПУТИНбург
- Контактная информация:
Re: Соседи в сети / Граф
Если в хотите работать с этими данными, как с графом, то следует и конвертировать данные в граф. Графы бывают в разных форматах, например, .GML. На сколько я понимаю, GDAL умеет конвертировать shp в .gml (взято в сети):
Теперь можно работать с графом. Советую использовать питоновскую библиотеку Networkx. С помощью функции networkx.readwrite.gml загружаете граф и делаете с ним то, что вам надо. А именно: в атрибуты узлов заносите id соседей. Потом вытаскиваете атрибуты узлов и экспортируете в CSV.
Код: Выделить всё
ogr2ogr -f GML test.gml test.shp
Look for something long enough, and you will find it. Look for something without understanding, and it will find you...
"All paid jobs absorb and degrade the mind." Aristotle
If you take 1 step towards freedom it'll take 2 steps towards you!
"All paid jobs absorb and degrade the mind." Aristotle
If you take 1 step towards freedom it'll take 2 steps towards you!
-
- Завсегдатай
- Сообщения: 460
- Зарегистрирован: 03 фев 2005, 11:46
- Репутация: 15
- Контактная информация:
Re: Соседи в сети / Граф
SS_Rebelious, спасибо! Попробуем разобраться Networkx.
Если у вас есть решение этой задачи для классических десктопных ГИС - поделитесь, пожалуйста. ArcGISInfo, QGIS, gvSIG, GRASS.. Возможно PostGIS. Интересует порядок действий с командами и параметрами, если есть возможность. Спасибо!
Если у вас есть решение этой задачи для классических десктопных ГИС - поделитесь, пожалуйста. ArcGISInfo, QGIS, gvSIG, GRASS.. Возможно PostGIS. Интересует порядок действий с командами и параметрами, если есть возможность. Спасибо!
-
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 792
- Ваше звание: званий не имею
- Откуда: Москва
Re: Соседи в сети / Граф
Поясните задачу ещё раз "на пальцах", пож-та.oleg писал(а): Есть два шейп-файла. Линии и точки-узлы этих линий. У точек есть id.
Подскажите, пожалуйста, правильный порядок действий (инструменты, параметры) для добавления в атрибуты точек [id точек-соседей первого порядка].
Нужно найти и занести в атрибуты всех точек id двух ближайших в ним соседних точек? Как здесь играют линии (движение по графу)?
На картинке, прикреплённой ниже, показаны тестовые данные в GRASS.
Редактор материалов, модератор форума
-
- Завсегдатай
- Сообщения: 460
- Зарегистрирован: 03 фев 2005, 11:46
- Репутация: 15
- Контактная информация:
Re: Соседи в сети / Граф
Александр, спасибо за внимание к вопросу.
Уточняю формулировку – "соседей в сети" (связь с соседом через линию).
Например, для точки #3 в атрибутах нужно получить "2,4", а для точки #7 – "5,6,13,8" итд.
В итоге данные будем выгружать в CSV, где в строке будет id точки и "перечень" id-соседей.
Примерно так - 7;5,6,13,8
Уточняю формулировку – "соседей в сети" (связь с соседом через линию).
Например, для точки #3 в атрибутах нужно получить "2,4", а для точки #7 – "5,6,13,8" итд.
В итоге данные будем выгружать в CSV, где в строке будет id точки и "перечень" id-соседей.
Примерно так - 7;5,6,13,8
-
- Гуру
- Сообщения: 5355
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1021
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Соседи в сети / Граф
Я примерно представляю как это сделать в AutoCAD Map 3D + БД...
А длина у вас там неправильно посчитана... в градусах
А длина у вас там неправильно посчитана... в градусах
-
- Завсегдатай
- Сообщения: 460
- Зарегистрирован: 03 фев 2005, 11:46
- Репутация: 15
- Контактная информация:
Re: Соседи в сети / Граф
Да, в градусах - игнорируйте, пожалуйста, это поле.
Есть идеи как можно эти ID_12 "очистить от дубликатов" ID-узла и сложить в одно текстовое поле?
Возможно, экспортировать в таблицу с координатами, поработать с ней и создать новый точечный слой?
На всякий случай, тестовый точечный слой во вложении.
Двухэтапным Spatial Join создали набор точек для каждого узла (см картинку). Каждая точка в поле "ID_12" имеет ID-соседа или ID-узла сети. Кол-во точек с ID-узла = числу линий.oleg писал(а): Пути, с которыми начинаем (пробовать) разбираться:
- использование пространственного сложение атрибутов узел->линия>узел
Есть идеи как можно эти ID_12 "очистить от дубликатов" ID-узла и сложить в одно текстовое поле?
Возможно, экспортировать в таблицу с координатами, поработать с ней и создать новый точечный слой?
На всякий случай, тестовый точечный слой во вложении.
- Вложения
-
Points_IDs.zip
- (4.98 КБ) 350 скачиваний
-
- SpatialJoin.png (12.63 КБ) 7946 просмотров
-
- Активный участник
- Сообщения: 142
- Зарегистрирован: 16 окт 2009, 22:08
- Репутация: 55
- Откуда: Харьков
Re: Соседи в сети / Граф
пример запроса поиска "соседей" для слоёв, используя PostgreSQL/PostGIS:
на входе линейный слой roads (точечный слой point может быть создан - 1.1 или использован имеющийся)
на выходе слой poifin с 'соседями' в таблице атрибутов
Код: Выделить всё
---------------------------------------------------------------------
--1.1
DROP TABLE IF EXISTS "point";
CREATE TABLE stp AS SELECT ST_StartPoint(the_geom) AS the_geom FROM roads;
CREATE TABLE enp AS SELECT ST_EndPoint(the_geom) AS the_geom FROM roads;
CREATE TABLE point AS
SELECT * FROM stp
UNION
SELECT * FROM enp;
ALTER TABLE "point" ADD COLUMN nam TEXT;
DROP TABLE IF EXISTS stp;
DROP TABLE IF EXISTS enp;
DROP SEQUENCE IF EXISTS point_gid_seq;
CREATE SEQUENCE point_gid_seq START 1;
UPDATE "point" SET nam = NEXTVAL('point_gid_seq');
CREATE INDEX sidx_point_the_geom
ON point
USING gist
(the_geom);
---------------------------------------------------------------------
--1.2
SELECT r.the_geom, r.gid , p.nam INTO roads_with_names FROM roads r, point p WHERE ST_Intersects(r.the_geom,p.the_geom) IS TRUE GROUP BY r.gid, p.nam;
CREATE INDEX sidx_roads_with_names_the_geom
ON roads_with_names
USING gist
(the_geom);
---------------------------------------------------------------------
--1.3
CREATE TABLE roadsdupl AS
SELECT the_geom, array_to_string(array_agg(nam), ',') AS name
FROM roads_with_names
GROUP BY the_geom;
---------------------------------------------------------------------
--1.4
CREATE INDEX sidx_roadsdupl_the_geom
ON roadsdupl
USING gist
(the_geom);
CREATE TABLE poiwithduplname AS
SELECT
poi.the_geom,
poi."nam",
array_to_string(array_agg(name), ',') AS pointsum
FROM
point AS poi,
roadsdupl AS lin
WHERE ST_Intersects(lin.the_geom, poi.the_geom)
GROUP BY poi."nam", lin.name, poi.the_geom;
---------------------------------------------------------------------
--1.5
CREATE INDEX sidx_poiwithduplname_the_geom
ON poiwithduplname
USING gist
(the_geom);
CREATE TABLE poidupl AS
SELECT the_geom, nam, array_to_string(array_agg(pointsum), ',') AS fullname
FROM poiwithduplname
GROUP BY nam, the_geom;
--------------------------------------------------------------------
--1.6
CREATE INDEX sidx_poidupl_the_geom
ON poidupl
USING gist
(the_geom);
DROP TABLE IF EXISTS "poifin";
CREATE TABLE poifin AS
SELECT the_geom, nam, REPLACE(REPLACE(fullname, nam||',', ''), ','||nam, '') AS sosedi FROM poidupl;
---------------------------------------------------------------------
--1.7
DROP TABLE IF EXISTS "roads_with_names";
DROP TABLE IF EXISTS "poiwithduplname";
DROP TABLE IF EXISTS "roadsdupl";
DROP TABLE IF EXISTS "poidupl";
---------------------------------------------------------------------
на выходе слой poifin с 'соседями' в таблице атрибутов
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя