# 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

### Extrair por atributo

### Extrair por expressao

### 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.

exemplo para cluster de 25Km

### Agrupamento de pontos por limite de grupos
Quando processado adiciona parametros CLUSTER_ID e CLUSTER_SIZE na camada alvo

exemplo para cluster de 25 agrupamentos para pontos clientes

# 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;

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

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

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.
:::

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

## 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;
```

### 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
