다각형 간 흐름 전송 (연결 + 값)


14

QGIS에는 셀과 하나의 추가 레이어 간 이동 데이터를 나타내는 두 개의 shapefile이 있습니다 (아래 이미지 참조).

Example_of_shape 파일


다음에 의해 정의 된 데이터 이동 :

  • 다각형 "LayerA"(빨간색 윤곽선이있는 투명 사각형). 또한 그것은 "LayerA"지오 센터의 위치에 시각화 된 세포 내 움직임을 나타내는 원과 관련이 있습니다.

    LayerA_AT

  • 폴리 라인 레이어 "Flows"(노란색 / 회색 화살표), "LayerA"지형의 중심 중심 간의 연결을 통해 값을 전달

    Flows_AT


대상 레이어 :

  • 다각형 "LayerB"(진한 회색 윤곽선이있는 연한 라일락 피처).

    LayerB_AT

또한 "FLUX"셀 내에서 폴리곤 "LayerA"으로 값 을 이미 전송 하고 이동했습니다 "LayerB". 이전 질문 : QGIS에서 폴리곤간에 상속 된 값? . 그것은 사용하여 수행되었다 %$area계산.


전사 의미 용액 / 방법이있을 수 / 송신 / 변형 유동 연결 로 표현 "Flows"의 관계에서 그 값 "LayerA"의 관계로 "LayerB".

폴리 라인으로 이러한 연결을 어떻게 달성 할 수 있습니까?

또한 새 흐름은와 유사한 스타일을 상속합니다 "Flows".

요청에 따라 데이터 샘플을 제공 할 수 있습니다.

흐름의 기능 사이에하지 존재하지 않을 것이다 "LayerA", 그러나 의 기능 사이 "LayerB" . 주요 목표는 가능한 테이블 / 원래 목적지 매트릭스 "FLUX"간의 연결을위한 속성 (즉, 출발 / "LayerB"도착 ) 을 달성하는 것입니다 .


준수해야 할 몇 가지 요구 사항 / 기준 이 있습니다.

1. 동일한 셀에서 피처 부품 (노란색으로 선택) 사이에 흐름 연결이 없습니다.

condition_1

2. 동일한 피처가 서로 다른 셀에 있어도 동일한 피처간에 연결이 없습니다

condition_2

3. 기능 이 완전히 두 개의 개별 셀 기능 내에있는 경우 기능의 일부 "LayerB"( "Union"출력 기반) 간에 연결이 존재 "LayerA"합니다.

condition_3

4."FLUX" 전달되는 새로운 값은 아래 이미지와 같이 계산됩니다.

예를 들어, 두 셀 간의 연결이 I하고 II, "FLUX"된다 100. 다른 값을 가정하면 "NEW_FLUX"사이 A'와 사이에 B''있습니다 1.5625. 100하나의 예일뿐입니다.

condition_4


참고 문헌 :


1
편집 해 주셔서 감사합니다. 이해하기 시작했지만 확실하지 않습니다. 원래 결과를 한 번 더 편집하여 예상 결과를 추가 할 수 있습니까? (예 : 아래에이 필드가있는 polygon_b 중심 사이의 선 레이어 :- "field1": 설명, 시도한 데이터 등)
J. Monticolo

1
명확히하기 위해이 GSE 대화방에서 더 자유롭게 토론 할 수 있습니까 : chat.stackexchange.com/rooms/92038/… ?
J. Monticolo

1
기술적 인 관점에서 모든 것이 가능하지만 실제로 달성하려는 것은 무엇입니까? 일반화 된 그리드에서보다 세분화 된 지리로 데이터를 보간하려고하는 것 같습니다. 내가 잘못 이해하지 않으면 결과가 매우 잘못 될 수 있습니다. "레이어 B"레벨의 플로우에 대한 데이터가없는 경우 수학적인 속임수로 다시 만들 수 없습니다. 픽셀 수준에서 확대 / 축소하는 것과 동일하며 부정확 한 경찰 영화에서 저해상도 사진을 사용하여 3D 회전을 수행합니다.
MarHoff

답변:


4

이론적으로 가상 레이어를 사용하면 가능합니다 (셰이프 파일을 사용하면 프로세스가 훨씬 오래 걸리지 만 레이어가 공간 데이터베이스에 있으면 훨씬 빠릅니다).

여기 코드가 있습니다 :

WITH inter_ab AS ( 
--create intersection between LayerA and LayerB 
SELECT LayerA.id || '_' || LayerB.FLAECHEID AS id, 
LayerA.id AS id_a, 
ST_AREA(LayerA.geometry) AS area_a, 
LayerB.FLAECHEID AS id_b, 
ST_INTERSECTION(LayerB.geometry, LayerA.geometry) AS geom 
FROM LayerA, LayerB 
WHERE ST_INTERSECTION(layerB.geometry, layerA.geometry) IS NOT NULL 
),

--calculation of the new flux value 
new_flux AS (SELECT t1.id_b AS origine, 
t2.id_b AS dest, 
SUM(Flows.flux * ST_AREA(t1.geom) / t1.area_a * ST_AREA(t2.geom) / t2.area_a) AS value  
FROM inter_ab t1, inter_ab t2, flows 
-- no connection between the same feature 
WHERE t1.id <> t2.id 
-- rule 1 
AND t1.id_a <> t2.id_a 
-- rule 2 
AND t1.id_b <> t2.id_b 
-- get flow data 
AND flows.origine = t1.id_a 
AND flows.dest = t2.id_a 
GROUP BY t1.id_b, t2.id_b
)

--create flows between original layerB features
SELECT new_flux.origine,
new_flux.dest,
new_flux.value AS flux,
make_line(ST_CENTROID(t3.geometry), ST_CENTROID(t4.geometry)) AS geom --ST_MakeLine under postGIS
FROM LayerB t3,
LayerB t4,
new_flux
WHERE t3.FLAECHEID = new_flux.origine
AND t4.FLAECHEID = new_flux.dest

그래픽 출력은 다음과 같습니다

산출

결과는 수동으로 테스트되었습니다. "FLUX"값 의 차이 는 무시할 수 있습니다.

최종 출력은 "Flow"다음과 같은 스타일을 상속받습니다.

출력 _ 최종

몇 가지 데이터로 테스트하는 것이 좋으며 큰 데이터 세트에 너무 오래 걸리면 쿼리를 단계별로 실행하고 ( "inter_ab", "new_flux") 결과를 저장하고 다음 쿼리를 실행하십시오.


1
죄송합니다, 저는 프랑스어이며 오픈 프랑스어 타운 쉽 데이터베이스를 Polygon_b레이어 로 사용하며 주요 필드는 id_geofla입니다. 나는 수정했다.
J. Monticolo

1
설명을 추가하고 도움이되기를 바랍니다.
J. Monticolo

1
예, 다각형을 갖는 것이 맞습니다. 흐름이 연결되면 전체 polygon_b 레이어와 polygon_a . ** 값 ** 을 갖도록 수정했습니다 . 나에게 결과는 선 레이어가 아니라 흐름 레이어로 가져온 polygon_a 값을 가진 직접 polygon_b 레이어입니다 .
J. Monticolo

4

세 계층간에 조인을 수행 한 다음로 집계 할 수 layerB있습니다. 가상 레이어를 사용할 수 있습니다. 중요한 데이터가 레이어 에 있는지 layerA또는 flow레이어 에 있는지 확실하지 않습니다 . 여기에 (예상치 않은) 가능성이 있습니다.

SELECT b.id, b.geometry, sum(a.myVar)
FROM layerB b
LEFT JOIN flow f
   ON ST_Intersects(ST_EndPoint(f.geometry),b.geometry)
 JOIN layerA a
   ON ST_Intersects(ST_StartPoint(f.geometry),a.geometry)
GROUP BY b.id

이 솔루션을 사용해 보았습니다. 중요한 데이터는에 "Flows"있습니다.
Taras

@ 타 라스 그레이트! 당신은 또한 같은 집계를 사용할 수 있습니다 sum(f.flow_var)또는sum(fl.flow_var * a.poly_var)
JGH
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.