Соседи в сети / Граф

Вопросы общего характера по ГИС и дистанционному зондированию, не связанные с конкретным ПО.
Ответить
oleg
Завсегдатай
Сообщения: 460
Зарегистрирован: 03 фев 2005, 11:46
Репутация: 15
Контактная информация:

Соседи в сети / Граф

Сообщение oleg » 31 июл 2013, 13:52

Привет!

Есть два шейп-файла. Линии и точки-узлы этих линий. У точек есть id.

Подскажите, пожалуйста, правильный порядок действий (инструменты, параметры) для добавления в атрибуты точек [id точек-соседей первого порядка].

Перечень id может быть в текстовом поле через разделитель.

На всякий случай во вложении тестовый набор данных.

Пути, с которыми начинаем (пробовать) разбираться:
- использование пространственного сложение атрибутов узел->линия>узел
- "сборка топологи" и последующий "экспорт служебных параметров"


Спасибо!
Вложения
Grid.zip
Тестовый набор данных
(4.35 КБ) 341 скачивание

Аватара пользователя
SS_Rebelious
Гуру
Сообщения: 1304
Зарегистрирован: 24 фев 2009, 16:51
Репутация: 99
Ваше звание: GIS pro-fan
Откуда: Lahti / Газ-ПУТИНбург
Контактная информация:

Re: Соседи в сети / Граф

Сообщение SS_Rebelious » 31 июл 2013, 15:33

Если в хотите работать с этими данными, как с графом, то следует и конвертировать данные в граф. Графы бывают в разных форматах, например, .GML. На сколько я понимаю, GDAL умеет конвертировать shp в .gml (взято в сети):

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

ogr2ogr -f GML test.gml test.shp 
Теперь можно работать с графом. Советую использовать питоновскую библиотеку Networkx. С помощью функции networkx.readwrite.gml загружаете граф и делаете с ним то, что вам надо. А именно: в атрибуты узлов заносите id соседей. Потом вытаскиваете атрибуты узлов и экспортируете в CSV.
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!

oleg
Завсегдатай
Сообщения: 460
Зарегистрирован: 03 фев 2005, 11:46
Репутация: 15
Контактная информация:

Re: Соседи в сети / Граф

Сообщение oleg » 01 авг 2013, 12:54

SS_Rebelious, спасибо! Попробуем разобраться Networkx.

Если у вас есть решение этой задачи для классических десктопных ГИС - поделитесь, пожалуйста. ArcGISInfo, QGIS, gvSIG, GRASS.. Возможно PostGIS. Интересует порядок действий с командами и параметрами, если есть возможность. Спасибо!

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Соседи в сети / Граф

Сообщение Александр Мурый » 03 авг 2013, 13:34

oleg писал(а): Есть два шейп-файла. Линии и точки-узлы этих линий. У точек есть id.
Подскажите, пожалуйста, правильный порядок действий (инструменты, параметры) для добавления в атрибуты точек [id точек-соседей первого порядка].
Поясните задачу ещё раз "на пальцах", пож-та.
Нужно найти и занести в атрибуты всех точек id двух ближайших в ним соседних точек? Как здесь играют линии (движение по графу)?

На картинке, прикреплённой ниже, показаны тестовые данные в GRASS.
graph_test_grass.png
graph_test_grass.png (14.49 КБ) 8057 просмотров
Редактор материалов, модератор форума

oleg
Завсегдатай
Сообщения: 460
Зарегистрирован: 03 фев 2005, 11:46
Репутация: 15
Контактная информация:

Re: Соседи в сети / Граф

Сообщение oleg » 05 авг 2013, 11:40

Александр, спасибо за внимание к вопросу.

Уточняю формулировку – "соседей в сети" (связь с соседом через линию).
Например, для точки #3 в атрибутах нужно получить "2,4", а для точки #7 – "5,6,13,8" итд.

В итоге данные будем выгружать в CSV, где в строке будет id точки и "перечень" id-соседей.
Примерно так - 7;5,6,13,8

trir
Гуру
Сообщения: 5355
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Соседи в сети / Граф

Сообщение trir » 05 авг 2013, 12:54

Я примерно представляю как это сделать в AutoCAD Map 3D + БД...
А длина у вас там неправильно посчитана... в градусах

oleg
Завсегдатай
Сообщения: 460
Зарегистрирован: 03 фев 2005, 11:46
Репутация: 15
Контактная информация:

Re: Соседи в сети / Граф

Сообщение oleg » 05 авг 2013, 19:03

Да, в градусах - игнорируйте, пожалуйста, это поле.
oleg писал(а): Пути, с которыми начинаем (пробовать) разбираться:
- использование пространственного сложение атрибутов узел->линия>узел
Двухэтапным Spatial Join создали набор точек для каждого узла (см картинку). Каждая точка в поле "ID_12" имеет ID-соседа или ID-узла сети. Кол-во точек с ID-узла = числу линий.

Есть идеи как можно эти ID_12 "очистить от дубликатов" ID-узла и сложить в одно текстовое поле?
Возможно, экспортировать в таблицу с координатами, поработать с ней и создать новый точечный слой?

На всякий случай, тестовый точечный слой во вложении.
Вложения
Points_IDs.zip
(4.98 КБ) 350 скачиваний
SpatialJoin.png
SpatialJoin.png (12.63 КБ) 7944 просмотра

HasT
Активный участник
Сообщения: 142
Зарегистрирован: 16 окт 2009, 22:08
Репутация: 55
Откуда: Харьков

Re: Соседи в сети / Граф

Сообщение HasT » 13 окт 2013, 18:04

пример запроса поиска "соседей" для слоёв, используя PostgreSQL/PostGIS:

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

---------------------------------------------------------------------
--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";
---------------------------------------------------------------------
на входе линейный слой roads (точечный слой point может быть создан - 1.1 или использован имеющийся)
на выходе слой poifin с 'соседями' в таблице атрибутов

Ответить

Вернуться в «Общие вопросы»

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

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