---
# System prepended metadata

title: QGIS - Helpers

---

# QGIS - Helpers

[toc]

## Escalas Graus  => Metros

|Graus|metros|km|
|:-:|:-:|:-:|
|1|100.000|100|
|0.1|10.000|10|
|0.01|1.000|1|
|0.001|100|0.100|
|0.0001|10|0.010|


:::info

Aqui penso que o mais correto seria partirmos de um SRID com suporte a medicoes em metros mas ainda nao fui feliz na busca.

### TABELA COM SRIDs

|SRID|UNIDADE|NOME|OBSERVACAO||
|:-:|:-:|:-:|:-:|:-:|
|4988| metros |SIRGAS 2000 |-|https://epsg.io/4988|
|4674| graus |SIRGAS 2000 |-|https://epsg.io/4674|
|4326| graus |WGS 84 |-|https://epsg.io/4326|
|4328| graus |WGS 84 |DEPRECATED|https://epsg.io/4328|
|31982| metros |SIRGAS_2000 UTM_zone_22S |indicacao GPT|https://epsg.io/31982|
|31983| metros |SIRGAS_2000 UTM_zone_23S |indicacao GPT|https://epsg.io/31983|
|31984| metros |SIRGAS_2000 UTM_zone_24S |indicacao GPT|https://epsg.io/31984|

:::




## Rotas Massivas com Valhalla

processo para geração de rotas massivas:
podemos carregar 2 CSVs contendo LABEL;LAT;LONG e entao cruza-los

podemos ainda...
dada uma lista de pontos:
e dada uma camada de fribras conhecidas...

1- linha mais curta entre feicoes
2- extrair vertices especificos (0(primeiro ponto) e -1(ultimo ponto))
3- usar valhalla para gerar rotas entre estes 2 pontos;
 - no valhalla utilizamos a opcao 'pedestrian - directions from points to layers'

## Comandos Uteis no Qgis

### Extrair por localização
![image](https://hackmd.io/_uploads/Bkb_9s4BT.png)

### Extrair por atributo
![image](https://hackmd.io/_uploads/Sy35coVra.png)

### Extrair por expressao
![image](https://hackmd.io/_uploads/H1KnqsVH6.png)

### soma comprimento de linha


### Diferença

### Ajustar geometrias a camada
dado um ponto solto, podemos move-lo para cima de uma linha definindo uma distancia limite para este ajuste

### linha mais curta entre feicoes
utilizamos este para dada uma lista de ponto, encontrar o ponto de toque mais proximo a uma outra camada

### extrair vertices
utilizamos este apos gerar a linha mais curta entre feicoes
extraindo vertice 0 temos ponto inicial e isso gera uma camada com os resultados
extraindo vertice -1 temos ponto final e isso gera uma camada com os resultados

### Valhalla - Directions From Points 2 Layers 
utilizamos este em conjunto com as 2 camadas de vertices extraidas.
com isso geramos de forma massiva a geracao de rotas rodoviarias.

### Caminho mais curto (ponto para ponto)
Esta função gera a rota mais curta sobre as geometrias de uma camada com a possibilidade de se incluir uma TOLERANCIA DA TOPOLOGIA para ignorar falhas no cadastro.


--- 
### Agrupamento de pontos por Distancia
Quando processado adiciona parametros CLUSTER_ID e CLUSTER_SIZE na camada alvo.
Agrupamento por distancia, lembrando que valor dem Graus entao deve-se dividir por 111 para em Kms.
![image](https://hackmd.io/_uploads/rylpLW3Yp.png)

exemplo para cluster de 25Km
![image](https://hackmd.io/_uploads/By_9v-nKa.png)


### Agrupamento de pontos por limite de grupos
Quando processado adiciona parametros CLUSTER_ID e CLUSTER_SIZE na camada alvo
![image](https://hackmd.io/_uploads/BJICIZhYp.png)

exemplo para cluster de 25 agrupamentos para pontos clientes
![image](https://hackmd.io/_uploads/HyF6vZ2tp.png)



# POC - SISTEMA ELETRICO

baixamos do https://gisepeprd2.epe.gov.br/WebMapEPE/ as camadas: 
 - sistema eletrico existente
     - subestacoes - base existente
     - linhas de transmissao - base existente

vamos camar as SubEstacoes de SE e as Linhas de Transmissao de LT;

![](https://hackmd.io/_uploads/S1Oaq8MBn.png)
analisando as nossas 2 camadas, temos que as LTs NAO se conectam as SEs.

## solucao usando buffer
para as SE, usamos a funcao "buffer" com distancia de 0.0035 que representa algo PROXIMO a 350mts
![](https://hackmd.io/_uploads/r1a7iUfB3.png)
analisando resultado agora temos a camada buffer cobrindo todas as terminacoes de LT.


## solucao usando linha mais curta entre feicoes

tentamos utilizar a funcao "linha mais curta entre feicoes" para solucionar o problema
usamos como camada de origem as LT... e como camada destino as SE
![](https://hackmd.io/_uploads/rkjsn8fB2.png)
apesar de na teoria resolver, na pratica, por algum motivo ela nao processou todas as LTs

### extrair vertices especificos.

vamos tentar resolver o problema anterior extraindo as 2 extremidades de cada LT, nestes pontos daí processamos a linha mais curta.

criamos vertice_0 com a funcao "extrair vertices especificos" na camada de entreada LT e usando indice de vertice 0
criamos vertice_-1 com a funcao "extrair vertices especificos" na camada de entreada LT e usando indice de vertice -1

criamos "linha mais curta 0" usando funcao "linha mais curta entre feicoes" usando camada origem vertice_0 camada destino SE;
criamos "linha mais curta -1" usando funcao "linha mais curta entre feicoes" usando camada origem vertice_-1 camada destino SE;

:::danger
limitamos a distancia em "0,005" pois estavamos conectando pontos muito distantes de nosso interesse.
:::
![](https://hackmd.io/_uploads/rkZ3bwfB2.png)
agora resultado ficou perfeito!

## mesclando linhas novas com LTs
usando a funcao "mesclar camadas vetoriais" mesclamos as nossas linhas de conexao com a camada LT
![](https://hackmd.io/_uploads/rkN5zDfr2.png)


## Gerando rotas sobre as LTs

vamos carregar no banco nossa camada de LTs, para isso utilizamos o QGIS para facilitar o processo.

depois vamos preparar para suporte ao PGR_DIJSKTRA
```sql=
-- criando colunas source target e cost
ALTER TABLE public.poc_linhas_de_transmissao_eletrica ADD COLUMN "source" integer;
ALTER TABLE public.poc_linhas_de_transmissao_eletrica ADD COLUMN "target" integer;
ALTER TABLE public.poc_linhas_de_transmissao_eletrica ADD COLUMN cost double precision;
-- criando indices
CREATE INDEX floripa_fibras_tratadas_source_idx ON floripa_fibras_tratadas (source);
CREATE INDEX floripa_fibras_tratadas_target_idx ON floripa_fibras_tratadas (target);

-- populando source e target
SELECT pgr_createTopology('poc_linhas_de_transmissao_eletrica', 0.001, 'geom', 'id');

-- populando custos
UPDATE public.poc_linhas_de_transmissao_eletrica SET cost = ST_Length(geom);



-- CONSULTA SIMPLES GERANDO ROTA 
SELECT 
	* 
FROM   pgr_Dijkstra(
         'SELECT  id, source, target, cost FROM poc_linhas_de_transmissao_eletrica',
         2,-- ID ORIGEM
         1530, -- ID DESTINO
         FALSE
);

-- CONSULTA TRAZENDO DETALHES DAS GEOMETRIAS
SELECT * FROM   pgr_Dijkstra(
         'SELECT  id, source, target, cost FROM poc_linhas_de_transmissao_eletrica',
         2,-- ID ORIGEM
         1530, -- ID DESTINO
         FALSE 
) AS   di
JOIN   poc_linhas_de_transmissao_eletrica AS pt
  ON   di.edge = pt.id

```

:::




### consulta para dados 2 nodes, gerar GeoJSON com trecho
 ```sql
 SELECT json_build_object(
    'type', 'FeatureCollection',
    'features', json_agg(
        json_build_object(
            'type', 'Feature',
            'geometry', ST_AsGeoJSON(ST_Transform(di.geom, 4326))::json,
            'properties', json_build_object(
                'id', di.id,
                'source', di.source,
                'target', di.target,
                'teste', di."Nome"
            )
        )
    )
) AS geojson
FROM (
    SELECT *
    FROM pgr_dijkstra(
        'SELECT id, source, target, cost FROM poc_linhas_de_transmissao_eletrica',
        2, 1530, FALSE
    ) AS dij
    JOIN poc_linhas_de_transmissao_eletrica AS pt ON dij.edge = pt.id
) AS di;
 ```
 
 ![](https://hackmd.io/_uploads/ByFjkYXB3.png)

 
 ### transformando geometria 3d em 2d
 ```sql
 ALTER TABLE public.last_artur_com_conexoes  
  ALTER COLUMN geom TYPE geometry(MULTILINESTRING, 4326) 
    USING ST_Force2D(geom);
 ```


# Terminologias PgRouting
 
![](https://hackmd.io/_uploads/SJiVaY-F2.png)
