Страница 1 из 1
Соседи в сети / Граф
Добавлено: 31 июл 2013, 13:52
oleg
Привет!
Есть два шейп-файла. Линии и точки-узлы этих линий. У точек есть id.
Подскажите, пожалуйста, правильный порядок действий (инструменты, параметры) для добавления в атрибуты точек [id точек-соседей первого порядка].
Перечень id может быть в текстовом поле через разделитель.
На всякий случай во вложении тестовый набор данных.
Пути, с которыми начинаем (пробовать) разбираться:
- использование пространственного сложение атрибутов узел->линия>узел
- "сборка топологи" и последующий "экспорт служебных параметров"
Спасибо!
Re: Соседи в сети / Граф
Добавлено: 31 июл 2013, 15:33
SS_Rebelious
Если в хотите работать с этими данными, как с графом, то следует и конвертировать данные в граф. Графы бывают в разных форматах, например, .GML. На сколько я понимаю, GDAL умеет конвертировать shp в .gml (взято в сети):
Теперь можно работать с графом. Советую использовать питоновскую библиотеку
Networkx. С помощью функции networkx.readwrite.gml загружаете граф и делаете с ним то, что вам надо. А именно: в атрибуты узлов заносите id соседей. Потом вытаскиваете атрибуты узлов и экспортируете в CSV.
Re: Соседи в сети / Граф
Добавлено: 01 авг 2013, 12:54
oleg
SS_Rebelious, спасибо! Попробуем разобраться Networkx.
Если у вас есть решение этой задачи для классических десктопных ГИС - поделитесь, пожалуйста. ArcGISInfo, QGIS, gvSIG, GRASS.. Возможно PostGIS. Интересует порядок действий с командами и параметрами, если есть возможность. Спасибо!
Re: Соседи в сети / Граф
Добавлено: 03 авг 2013, 13:34
Александр Мурый
oleg писал(а):
Есть два шейп-файла. Линии и точки-узлы этих линий. У точек есть id.
Подскажите, пожалуйста, правильный порядок действий (инструменты, параметры) для добавления в атрибуты точек [id точек-соседей первого порядка].
Поясните задачу ещё раз "на пальцах", пож-та.
Нужно найти и занести в атрибуты всех точек id двух ближайших в ним соседних точек? Как здесь играют линии (движение по графу)?
На картинке, прикреплённой ниже, показаны тестовые данные в GRASS.

- graph_test_grass.png (14.49 КБ) 8065 просмотров
Re: Соседи в сети / Граф
Добавлено: 05 авг 2013, 11:40
oleg
Александр, спасибо за внимание к вопросу.
Уточняю формулировку – "соседей в сети" (связь с соседом через линию).
Например, для точки #3 в атрибутах нужно получить "2,4", а для точки #7 – "5,6,13,8" итд.
В итоге данные будем выгружать в CSV, где в строке будет id точки и "перечень" id-соседей.
Примерно так - 7;5,6,13,8
Re: Соседи в сети / Граф
Добавлено: 05 авг 2013, 12:54
trir
Я примерно представляю как это сделать в AutoCAD Map 3D + БД...
А длина у вас там неправильно посчитана... в градусах
Re: Соседи в сети / Граф
Добавлено: 05 авг 2013, 19:03
oleg
Да, в градусах - игнорируйте, пожалуйста, это поле.
oleg писал(а):
Пути, с которыми начинаем (пробовать) разбираться:
- использование пространственного сложение атрибутов узел->линия>узел
Двухэтапным Spatial Join создали набор точек для каждого узла (см картинку). Каждая точка в поле "ID_12" имеет ID-соседа или ID-узла сети. Кол-во точек с ID-узла = числу линий.
Есть идеи как можно эти ID_12 "очистить от дубликатов" ID-узла и сложить в одно текстовое поле?
Возможно, экспортировать в таблицу с координатами, поработать с ней и создать новый точечный слой?
На всякий случай, тестовый точечный слой во вложении.
Re: Соседи в сети / Граф
Добавлено: 13 окт 2013, 18:04
HasT
пример запроса поиска "соседей" для слоёв, используя 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 с 'соседями' в таблице атрибутов