bdgd2dss


Namebdgd2dss JSON
Version 0.0.5 PyPI version JSON
download
home_pageNone
SummaryFerramenta para modelagem de alimentadores da BDGD para uso com OpenDSS
upload_time2025-07-31 15:51:31
maintainerWellington Maycon Santos Bernardes
docs_urlNone
authorArthur Gomes de Souza
requires_python>=3.7
licenseMIT License
keywords bdgd2dss bdgd
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <!-- References (Formatting): -->
<!-- https://portal.revendadesoftware.com.br/manuais/base-de-conhecimento/sintaxe-markdown -->
<!-- https://docs.github.com/en/enterprise-cloud@latest/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax -->

![PyPI](https://img.shields.io/pypi/v/bdgd2dss)
![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20Linux-brightgreen)
![License](https://img.shields.io/github/license/ArthurGS97/bdgd2dss)
![Downloads](https://static.pepy.tech/badge/bdgd2dss)

# bdgd2dss

Conjunto de arquivos referente a biblioteca **bdgd2dss** desenvolvida na linguagem *Python*, que transforma as planilhas oriundas da Base de Dados Geográfica da Distribuidora (BDGD) em arquivos *.dss* para simulação e estudos de alimentadores de sistemas de distribuição de energia elétrica no ambiente *OpenDSS*. A ferramenta em questão foi criada pelo Mestrando em Engenharia Elétrica Arthur Gomes de Souza que desenvolve pesquisas com o foco em proteção de sistemas elétricos de potência, sob orientação do prof. Dr. Wellington Maycon Santos Bernardes (Universidade Federal de Uberlândia).

Instalação
------------

Para instalar e utilizar a biblioteca **bdgd2dss**, siga os passos abaixo. Recomenda-se iniciar criando um ambiente virtual no terminal do VSCode para isolar as dependências do projeto.

1. Criar o ambiente virtual:

    ```bash
    python -m venv .venv
    ```

2. Ativar o Ambiente Virtual:

    ```bash
    .venv\Scripts\Activate
    ```

3. Instalando a biblioteca:

    ```bash
    pip install bdgd2dss
    ```

4. A seguir, são apresentados os procedimentos para exportação dos dados e a utilização da biblioteca. Serão detalhadas a estrutura da base de dados e as instruções para seu uso em conjunto com a biblioteca.

   
## 1 - Base de Dados Geográfica da Distribuidora - BDGD

A BDGD faz parte integrante do Sistema de Informação Geográfico Regulatório da Distribuição (SIG-R). Em adição, é um modelo geográfico estabelecido com o objetivo de representar de forma simplificada o sistema elétrico real da distribuidora, visando refletir tanto a situação real dos ativos quanto as informações técnicas e comerciais de interesse. De forma a emular a rede elétrica dos agentes envolvidos, a BDGD é estruturada em entidades, modelos abstratos de dados estabelecidos com o objetivo de representar informações importantes, como as perdas estimadas pelos agentes. Cada uma dessas entidades é detalhada em diversos dados, dentre as quais constam aquelas que devem observar a codificação pré-estabelecida pelo Dicionário de Dados da Agência Nacional de Energia Elétrica (ANEEL) (DDA), o qual especifica padrões de dados a serem utilizados na BDGD, visando a normalização das informações. Em relação aos dados cartográficos, eles são disponibilizados em um arquivo *Geodatabase* (*.gdb*), por distribuidora. O Manual de Instruções da BDGD (https://www.gov.br/aneel/pt-br/centrais-de-conteudos/manuais-modelos-e-instrucoes/distribuicao) e o Módulo 10 do PRODIST (https://www.gov.br/aneel/pt-br/centrais-de-conteudos/procedimentos-regulatorios/prodist) contém informações úteis para entender a BDGD, como as entidades disponibilizadas e as definições dos campos [1]. 

Inicialmente, os dados da BDGD são classificados como entidades geográficas e não geográficas, as Tabelas 1 e 2 mostram as camadas que as compõe, respectivamente.


**Tabela 1: Entidades geográficas da BDGD.** 
| id  | Sigla  | Nome                                                       |
|-----|--------|------------------------------------------------------------|
| 22  | ARAT   | Área e Atuação                                             |
| 23  | CONJ   | Conjunto                                                   |
| 24  | PONNOT | Ponto Notável                                              |
| 25  | SSDAT  | Segmento do Sistema de Distribuição de Alta Tensão         |
| 26  | SSDBT  | Segmento do Sistema de Distribuição de Baixa Tensão        |
| 27  | SSDMT  | Segmento do Sistema de Distribuição de Média Tensão        |
| 28  | SUB    | Subestação                                                 |
| 38  | UNCRAT | Unidade Compensadora de Reativo de Alta Tensão             |
| 29  | UNCRBT | Unidade Compensadora de Reativo de Baixa Tensão            |
| 30  | UNCRMT | Unidade Compensadora de Reativo de Média Tensão            |
| 39  | UCAT   | Unidade Consumidora de Alta Tensão                         |
| 40  | UCBT   | Unidade Consumidora de Baixa Tensão                        |
| 41  | UCMT   | Unidade Consumidora de Média Tensão                        |
| 42  | UGAT   | Unidade Geradora de Alta Tensão                            |
| 43  | UGBT   | Unidade Geradora de Baixa Tensão                           |
| 44  | UGMT   | Unidade Geradora de Média Tensão                           |
| 31  | UNREAT | Unidade Reguladora de Alta Tensão                          |
| 32  | UNREMT | Unidade Reguladora de Média Tensão                         |
| 33  | UNSEAT | Unidade seccionadora de Alta Tensão                        |
| 34  | UNSEBT | Unidade seccionadora de Baixa Tensão                       |
| 35  | UNSEMT | Unidade seccionadora de Média Tensão                       |
| 36  | UNTRD  | Unidade Transformadora da Distribuição                     |
| 37  | UNTRS  | Unidade Transformadora da Subestação                       |

**Fonte:** Adaptado de ANEEL (2021) [2].

**Tabela 1: Entidades não geográficas da BDGD.**

| id  | Sigla   | Nome                                          |
|-----|---------|-----------------------------------------------|
| 3   | BE      | Balanço de Energia                            |
| 0   | BAR     | Barramento                                    |
| 1   | BASE    | Base                                          |
| 2   | BAY     | _Bay_                                         |
| 4   | CTAT    | Circuito de Alta Tensão                       |
| 5   | CTMT    | Circuito de Média Tensão                      |
| 6   | EP      | Energia Passante                              |
| 7   | EQCR    | Equipamento Compensador de Reativo            |
| 8   | EQME    | Equipamento Medidor                           |
| 9   | EQRE    | Equipamento Regulador                         |
| 10  | EQSE    | Equipamento Seccionador                       |
| 11  | EQSIAT  | Equipamento do Sistema de Aterramento         |
| 12  | EQTRD   | Equipamento Transformador da Distribuição     |
| 13  | EQTRM   | Equipamento Transformador de Medida           |
| 14  | EQTRS   | Equipamento Transformador da Subestação       |
| 15  | EQTRSX  | Equipamento Transformador do Serviço Auxiliar |
| 16  | INDGER  | Indicadores Gerenciais                        |
| 18  | PNT     | Perdas não Técnicas                           |
| 19  | PT      | Perdas Técnicas                               |
| 17  | PIP     | Ponto de Iluminação Pública                   |
| 20  | RAMLIG  | Ramal de Ligação                              |
| 21  | SEGCON  | Segmento Condutor                             |

**Fonte:** Adaptado de ANEEL (2021) [2].

### 1.2 - *Download* dos arquivos

Para realizar o *download* dos dados de uma distribuidora, basta acessar o link: https://dadosabertos-aneel.opendata.arcgis.com/search?tags=distribuicao [1] e pesquisá-la. Assim sendo, aparecerá mais de um arquivo, correspondente a cada ano. A Figura 1 mostra essa etapa.

![dadosabertos_f1](https://raw.githubusercontent.com/ArthurGS97/bdgd2dss/main/Prints_git/dadosabertos_f1.png "dadosabertos_f1")


**Figura 1: Captura de tela dos dados da BDGD.**

**Fonte:** ANEEL (2024) [1].

Escolhendo o arquivo correspondente, basta baixar como mostra a Figura 2. Alerta-se que essa etapa pode demorar um pouco. 

![download_f2](https://raw.githubusercontent.com/ArthurGS97/bdgd2dss/main/Prints_git/download_f2.png "download_f2")

**Figura 2: Captura de tela de *download* dos dados da BDGD.**

**Fonte:** Adaptado de ANEEL (2024) [1].

## 2 - Tratamento dos arquivos no *QGIS*

### 2.1 - Gerenciador de Fonte de Dados

Após realizado o *download*, será possível trabalhar com os arquivos. Para isso deve-se usar a ferramenta *QGIS* [6], um *software* livre com código-fonte aberto, e multiplataforma. Basicamente é um sistema de informação geográfica (SIG) que permite a visualização, edição e análise de dados georreferenciados. O *download* pode ser feito no *link*: https://qgis.org/download/. Abrindo o *QGIS*, deve-se ir em "Gerenciador da Fonte de Dados" (opção Vetor). Ao selecionar a opção "Diretório", coloca-se a codificação em "Automático", em Tipo escolhe-se a opção "Arquivo aberto GDB", e em Base de Vetores escolhe a pasta do arquivo BDGD baixado e extraído. Finalmente em *LIST_ALL_TABLES* coloca-se em "*YES*" para ser possível uma pré-visualização das camadas disponíveis e selecionar aquelas que desejar visualizar, todas as camadas devem ser selecionadas no campo "Selecionar Todas" e, em seguida, deve-se clicar em "Adicionar Camadas" para prosseguir com a visualização. Essas etapas são mostradas na Figura 3 e 4. 

![fontededados_f3](https://raw.githubusercontent.com/ArthurGS97/bdgd2dss/main/Prints_git/fontededados_f3.png "fontededados_f3")

**Figura 3: Captura de tela do carregamento dos dados no *QGIS*.**

**Fonte:** O autor (2024). 

![f4_todas_camadas](https://raw.githubusercontent.com/ArthurGS97/bdgd2dss/main/Prints_git/f4_todas_camadas.png "f4_todas_camadas")

**Figura 4: Captura de tela do *QGIS* mostrando as camadas da BDGD**

**Fonte:** O Autor (2024).

### 2.2 - Escolha da Zona Específica a Ser Estudada

Para otimizar as simulações e reduzir a quantidade de dados, é recomendável focar em uma área / região / zona específica, em vez de utilizar todos os dados da distribuidora. Por exemplo, pode-se escolher um município, como Uberlândia - Minas Gerais (ou outro à escolha do usuário), e trabalhar apenas com as informações dessa cidade. Para isso, é necessário filtrar as camadas, mantendo apenas os dados relevantes ao município. Uma maneira eficaz de fazer isso é identificar as subestações correspondentes e realizar o filtro em todas as camadas, já que quase todas possuem o atributo referente a uma subestação (SE). Para localizar as subestações e obter o código correspondente, clique com o botão direito na camada das SEs, e selecione a opção "Abrir tabela de atributos". A Figura 5 mostra essa etapa.

![atributos_f5](https://raw.githubusercontent.com/ArthurGS97/bdgd2dss/main/Prints_git/atributos_f5.png "atributos_f5")

**Figura 5: Captura de tela do *QGIS* para abrir a Tabela de Atributos.**

**Fonte:** O Autor (2024).

Com a Tabela de atributos aberta, deve-se localizar as subestações de Uberlândia (município escolhido para a realização dos testes), e salvar os COD_ID delas, como mostra a Figura 6 em sequência.

![SEs_f6](https://raw.githubusercontent.com/ArthurGS97/bdgd2dss/main/Prints_git/SEs_f6.png "SEs_f6")

**Figura 6: Captura de tela do *QGIS* pra identificação das subestações**

**Fonte:** O Autor (2024).

### 2.3 - Filtragem das Camadas e Exportando Planilhas

Com essas informações, será possível acessar todas as camadas e aplicar a filtragem necessária. Para isso, utilizaremos um código em *Python* no *QGIS* para realizar o filtro, gerar um arquivo com as coordenadas e exportar as camadas em arquivos *.csv*, que serão utilizados na modelagem. A Figura 7 ilustra o procedimento para abrir o terminal Python no QGIS. Após abrir o terminal, deve-se selecionar a opção "Abrir Editor".

![terminal_py](https://raw.githubusercontent.com/ArthurGS97/bdgd2dss/main/Prints_git/terminal_py.png "terminal_py")
**Figura 7: Captura de tela do *QGIS* para abrir o terminal *python***

E copiar e colar o código no editor que foi aberto:

```bash
import os
import time
import csv

inicio = time.time()

output_dir = "C:/BA/Inputs"  # Ajuste conforme necessário

# Valores válidos para o campo SUB
sub_values = ('COD', 'BRE', 'BRN', '')

# Definir os sufixos das camadas que serão exportadas
layers_to_export = [
    'CRVCRG', 'CTMT', 'EQRE', 'EQTRMT', 'PIP', 'RAMLIG', 'SEGCON',
    'SSDBT', 'SSDMT', 'UCBT_tab', 'UCMT_tab', 'UGBT_tab', 'UGMT_tab',
    'UNCRMT', 'UNREMT', 'UNSEBT', 'UNSEMT', 'UNTRMT', 'SUB'
]


# Obter todas as camadas carregadas
all_layers = list(QgsProject.instance().mapLayers().values())

if not all_layers:
    raise Exception("Nenhuma camada carregada no projeto.")

# Extrair prefixo do nome da primeira camada
first_layer_name = all_layers[0].name()
pref = first_layer_name.split(' — ')[0]
print(f"Prefixo extraído: {pref}")

# Criar lista de camadas que não serão exportadas (a serem removidas)
layers_to_remove = [
    layer for layer in all_layers
    if not any(layer.name().endswith(f' — {suffix}') for suffix in layers_to_export)
]

# Remover essas camadas do projeto com segurança
for layer in layers_to_remove:
    layer_name = layer.name()  # <- ESSA LINHA É ESSENCIAL
    QgsProject.instance().removeMapLayer(layer)
    print(f"Camada {layer_name} removida do projeto.")

# Re-obter as camadas restantes após a remoção
filtered_layers = list(QgsProject.instance().mapLayers().values())

# Aplicar filtros condicionais nas camadas
for layer in filtered_layers:
    if layer.type() == QgsMapLayer.VectorLayer:
        layer_fields = [field.name() for field in layer.fields()]
        
        if layer.name().endswith(" — SUB") and 'COD_ID' in layer_fields:
            filter_expression = f"COD_ID IN {sub_values}"
            layer.setSubsetString(filter_expression)
            print(f"Camada {layer.name()} filtrada com COD_ID em {sub_values}.")
        
        elif 'SUB' in layer_fields:
            filter_expression = f"SUB IN {sub_values}"
            layer.setSubsetString(filter_expression)
            print(f"Camada {layer.name()} filtrada com SUB em {sub_values}.")


# Garantir que o diretório existe
if not os.path.exists(output_dir):
    os.makedirs(output_dir)

# Exportar apenas as camadas especificadas
for layer in filtered_layers:
    if any(layer.name().endswith(f' — {suffix}') for suffix in layers_to_export):
        csv_filename = os.path.join(output_dir, f"{layer.name()}.csv")
        error = QgsVectorFileWriter.writeAsVectorFormat(layer, csv_filename, "utf-8", layer.crs(), "CSV")
        if error[0] == QgsVectorFileWriter.NoError:
            print(f"Camada {layer.name()} exportada com sucesso para {csv_filename}.")
        else:
            print(f"Erro ao exportar camada {layer.name()}.")

# Gerar o arquivo de coordenadas baseado na camada SSDMT
ssdmt_layer_name = f"{pref} — SSDMT"
ssdmt_layers = QgsProject.instance().mapLayersByName(ssdmt_layer_name)

if not ssdmt_layers:
    raise Exception(f"Camada '{ssdmt_layer_name}' não encontrada.")
    
ssdmt = ssdmt_layers[0]

file_path = os.path.join(output_dir, f"{pref} — Coordenadas.csv")

with open(file_path, mode='w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(["CTMT", "PAC1", "Coord1", "PAC2", "Coord2"])

    for feature in ssdmt.getFeatures():
        ctmt = feature["CTMT"]
        pac_1 = feature["PAC_1"]
        pac_2 = feature["PAC_2"]
        geom = feature.geometry()

        if geom.isMultipart():
            line = geom.asMultiPolyline()[0]
        else:
            line = geom.asPolyline()

        if len(line) >= 2:
            coord_1_str = f"{line[0].x()}, {line[0].y()}"
            coord_2_str = f"{line[-1].x()}, {line[-1].y()}"
            writer.writerow([ctmt, pac_1, coord_1_str, pac_2, coord_2_str])

fim = time.time()
print("Arquivo coordenadas.csv gerado com sucesso!")
print(f"Tempo de execução: {fim - inicio:.2f} segundos.")
```

Com o script aberto, podemos agora realizar a filtragem das subestações e a exportação dos dados. A Figura 8 apresenta o trecho de código com dois campos configuráveis pelo usuário:

1 - O primeiro define o diretório onde os arquivos exportados serão salvos. Para isso, o usuário deve criar uma pasta chamada Inputs na raiz do projeto e utilizá-la como destino da exportação.

2 - O segundo campo, também destacado na figura, corresponde aos COD_ID das subestações que se deseja exportar, e deve ser preenchido conforme a necessidade da análise.

 Após preencher esses campos, basta executar o script. Vale notar que essa etapa pode demorar, durante a qual o QGIS poderá ficar temporariamente travado; isso é esperado, então é necessário aguardar até a finalização do processo. Por exemplo, nos testes com todas as subestações de Uberlândia, esse procedimento levou cerca de 30 minutos em uma máquina com as seguintes especificações: *Intel Core i5-8500 de 8ª geração @ 3.00GHz, 8 GB de RAM, Windows 10 Pro e SSD NVMe*. Quanto maior a base de dados e o volume de dados a serem exportados, maior será o tempo de execução.

![f9_exportaqgis_entrada](https://raw.githubusercontent.com/ArthurGS97/bdgd2dss/main/Prints_git/f9_exportaqgis_entrada.png "f9_exportaqgis_entrada")
**Figura 8: Captura de tela do *QGIS* do script com o foco nas variáveis de entrada do usuário**

Finalizado o processo de exportação das camadas, deve-se criar um arquivo na raíz do diretório para rodar as simulações, abaixo um exemplo do modelo de código a ser utilizado, recomenda-se salvar como *main.py*.

```bash
import bdgd2dss as b2d
import time

################ DADOS DE ENTRADA #####################
mvasc3 = 227.8  # potência de curto-circuito trifásico
mvasc1 = 234.9  # potência de curto-circuito monofásico
#######################################################

if __name__ == "__main__":
    start_total = time.time()

    # Chamando a função para obter a lista de alimentadores disponíveis nessa BDGD
    feeders_all = b2d.feeders_list()
    print(f"Alimentadores disponíveis: {feeders_all}") # Exibe a lista de alimentadores disponíveis na BDGD
    
    # Escolhe os alimentadores que deseja simular, pode ser apenas um, vários ou todos, no formato especificado
    feeders = ['ULAD202']

    # Chamando a função para modelar os alimentadores escolhidos usando processamento paralelo
    #b2d.feeders_modelling(feeders, mvasc3, mvasc1)

    # Chamando a função para verificar a viabilidade dos alimentadores
    #b2d.feeders_feasibility(feeders)

    end_total = time.time()
    print(f"\nTempo total: {end_total - start_total} s") # Exibe o tempo total de execução do script
```

Se todas as etapas anteriores forem executadas corretamente, a estrutura final do projeto será a seguinte:

```plaintext
pasta/                        #Pasta criada pelo usuário para utilização da biblioteca
│
├── .venv/                    # Ambiente virtual com os pacotes necessários (inclusive o bdgd2dss)
├── Inputs/                   # Pasta que ficará salvo os dados exportados a partir do QGIS
├── main.py                   # Script para rodar a biblioteca e funções, disponível no texto
```

## 3 - Convertendo BDGD em *.dss* usando *Python*

Para realizar a modelagem dos alimentadores utilizando a biblioteca **bdgd2dss**, utiliza-se o arquivo criado com o código acima. A estrutura do código é mostrado na Figura 9.

![novomain](https://raw.githubusercontent.com/ArthurGS97/bdgd2dss/main/Prints_git/novomain.png "novomain")

**Figura 9: Captura de tela do Visual Code do códifo *feeders_processing.py* sendo utilizado**

**Fonte:** O Autor (2024).

Os dados de entrada necessários são os níveis de curto-circuito trifásico (*mvasc3*) e monofásico (*mvasc1*), ambos em MVA.

A execução do script inicia-se no bloco *if __name__ == "__main__":*, onde as funções principais são chamadas em sequência:

1 - Listagem dos alimentadores disponíveis:
A função *b2d.feeders_list()* retorna todos os alimentadores presentes na base de dados exportada. Essa lista é exibida no terminal como referência.
Em seguida, define-se a lista feeders, que contém os identificadores dos alimentadores a serem simulados. Essa lista deve ser informada no formato de strings.

2 - Modelagem dos alimentadores:
A função *b2d.feeders_modelling(feeders, mvasc3, mvasc1)* realiza a modelagem dos alimentadores selecionados, levando em consideração os dados de curto-circuito especificados. O processo de modelagem é executado com paralelismo, garantindo maior desempenho.

3 - Verificação da viabilidade elétrica:
Após a modelagem, pode-se utilizar a função *b2d.feeders_feasibility(feeders)* para verificar a viabilidade elétrica dos alimentadores simulados.

Importante:
A função *b2d.feeders_feasibility()* deve permanecer comentada (símbolo # no início da linha) caso os alimentadores ainda não tenham sido modelados. Para evitar reprocessamento desnecessário, recomenda-se comentar temporariamente a função de modelagem ao executar apenas a verificação de viabilidade.

> No [vídeo](https://www.youtube.com/@LEAPSE), explicamos a utilização da biblioteca, o que facilita seu entendimento e aplicação. 
> Mais detalhes no link: https://github.com/ArthurGS97/bdgd2dss
> Qualquer inconsistência ou dificuldade na utilização da biblioteca pode contactar os autores.

## [](#header-2)3 - Como citar esta biblioteca:

```Bash
@misc{bdgd2dss,
  author       = {Arthur Gomes de Souza and Wellington Maycon Santos Bernardes},
  title        = {bdgd2dss: Ferramenta para modelagem de alimentadores da BDGD para uso com OpenDSS},
  year         = {2025},
  howpublished = {\url{https://pypi.org/project/bdgd2dss/}},
  note         = {Versão 0.0.5, disponível no PyPI}
}

```

Utilizando essa biblioteca, cite os seguintes trabalhos: 

>SOUZA, Arthur Gomes de; BERNARDES, Wellington M. Santos. Parametrização de religadores com apoio da base de dados geográfica da distribuidora, OpenDSS e Python. In: CONGRESSO BRASILEIRO DE AUTOMÁTICA (CBA), 25., 2024, Rio de Janeiro, Brasil. Anais. Rio de Janeiro: CBA, 2024. p. 1–7.

>SOUZA, Arthur Gomes de; JUNIOR, Julio; GUEDES, Michele; BERNARDES, Wellington Maycon S. Coordinating distribution power system protection in a utility from Uberlândia - MG using a geographic database, QGIS and OpenDSS. *In*: THE XIV LATIN-AMERICAN CONGRESS ON ELECTRICITY GENERATION AND TRANSMISSION - CLAGTEE 2022, 14., 2022, Rio de Janeiro, Brazil. Anais... Rio de Janeiro, 2022. p. 1-9. 

>SOUZA, Arthur Gomes de; BERNARDES, Wellington Maycon S.; PASSATUTO, Luciana A. T. Aquisição de dados topológicos e coordenação de religadores usando as ferramentas de apoio QGIS e OpenDSS. *In*: IEEE INTERNATIONAL CONFERENCE ON INDUSTRY APPLICATIONS (INDUSCON), 15., 2023, São Bernardo do Campo, Brazil. Anais... São Bernardo do Campo: IEEE, 2023. p. 607-608. doi: 10.1109/INDUSCON58041.2023.10374830.

>SOUZA, Arthur Gomes de; BERNARDES, Wellington M. Santos. Topological data acquisition and recloser coordination using QGIS and OpenDSS Tools. In: CONGRESSO BRASILEIRO DE PLANEJAMENTO ENERGÉTICO (CBPE), 14., 2024, Manaus, AM. Anais... Manaus: Sociedade Brasileira de Planejamento Energético, 2024. p. 2605–2617.

>PASSATUTO, Luiz Arthur. T.; SOUZA, Arthur Gomes de; BERNARDES, Wellington Maycon S.; FREITAS, Lúcio C. G.; RESENDE, Ênio C. Assignment of Responsibility for Short-Duration Voltage Variation via QGIS, OpenDSS and Python. *In*: INTERNATIONAL WORKSHOP ON ARTIFICIAL INTELLIGENCE AND MACHINE LEARNING FOR ENERGY TRANSFORMATION (AIE), 2024, Vaasa, Finland. Anais... Vaasa: IEEE, 2024. p. 1-6. doi: 10.1109/AIE61866.2024.10561325.

## Referências


[1]: AGÊNCIA NACIONAL DE ENERGIA ELÉTRICA (ANEEL). Dados abertos do Banco de Dados Geográficos de Distribuição - BDGD. Disponível em: [https://dadosabertos-aneel.opendata.arcgis.com/search](https://dadosabertos-aneel.opendata.arcgis.com/search). Acesso em: 29 jul. 2025.

[2]: AGÊNCIA NACIONAL DE ENERGIA ELÉTRICA (ANEEL). Manual de Instruções da BDGD. Disponível em: [https://www.gov.br/aneel/pt-br/centrais-de-conteudos/manuais-modelos-e-instrucoes/distribuicao](https://www.gov.br/aneel/pt-br/centrais-de-conteudos/manuais-modelos-e-instrucoes/distribuicao). Acesso em: 29 jul. 2025.

[3]: AGÊNCIA NACIONAL DE ENERGIA ELÉTRICA (ANEEL). Procedimentos de Distribuição de Energia Elétrica no Sistema Elétrico Nacional – PRODIST: Módulo 10. Disponível em: [https://www.gov.br/aneel/pt-br/centrais-de-conteudos/procedimentos-regulatorios/prodist](https://www.gov.br/aneel/pt-br/centrais-de-conteudos/procedimentos-regulatorios/prodist). Acesso em: 29 jul. 2025.

[4]: MICROSOFT. Visual Studio Code. Disponível em: [https://code.visualstudio.com/download](https://code.visualstudio.com/download). Acesso em: 29 jul. 2025.

[5]: PYTHON SOFTWARE FOUNDATION. Python. Disponível em: [https://www.python.org/downloads/](https://www.python.org/downloads/). Acesso em: 29 jul. 2025.

[6]: QGIS. QGIS Geographic Information System. Disponível em: [https://qgis.org/download/](https://qgis.org/download/). Acesso em: 29 jul. 2025.


            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "bdgd2dss",
    "maintainer": "Wellington Maycon Santos Bernardes",
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": "wmsbernardes@ufu.br",
    "keywords": "bdgd2dss bdgd",
    "author": "Arthur Gomes de Souza",
    "author_email": "arthurgomesba@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/e8/90/7bbb561556d711cd83369851928d3169d9ac04d935e5cc4816859ca5c792/bdgd2dss-0.0.5.tar.gz",
    "platform": null,
    "description": "<!-- References (Formatting): -->\r\n<!-- https://portal.revendadesoftware.com.br/manuais/base-de-conhecimento/sintaxe-markdown -->\r\n<!-- https://docs.github.com/en/enterprise-cloud@latest/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax -->\r\n\r\n![PyPI](https://img.shields.io/pypi/v/bdgd2dss)\r\n![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20Linux-brightgreen)\r\n![License](https://img.shields.io/github/license/ArthurGS97/bdgd2dss)\r\n![Downloads](https://static.pepy.tech/badge/bdgd2dss)\r\n\r\n# bdgd2dss\r\n\r\nConjunto de arquivos referente a biblioteca **bdgd2dss** desenvolvida na linguagem *Python*, que transforma as planilhas oriundas da Base de Dados Geogr\u00e1fica da Distribuidora (BDGD) em arquivos *.dss* para simula\u00e7\u00e3o e estudos de alimentadores de sistemas de distribui\u00e7\u00e3o de energia el\u00e9trica no ambiente *OpenDSS*. A ferramenta em quest\u00e3o foi criada pelo Mestrando em Engenharia El\u00e9trica Arthur Gomes de Souza que desenvolve pesquisas com o foco em prote\u00e7\u00e3o de sistemas el\u00e9tricos de pot\u00eancia, sob orienta\u00e7\u00e3o do prof. Dr. Wellington Maycon Santos Bernardes (Universidade Federal de Uberl\u00e2ndia).\r\n\r\nInstala\u00e7\u00e3o\r\n------------\r\n\r\nPara instalar e utilizar a biblioteca **bdgd2dss**, siga os passos abaixo. Recomenda-se iniciar criando um ambiente virtual no terminal do VSCode para isolar as depend\u00eancias do projeto.\r\n\r\n1. Criar o ambiente virtual:\r\n\r\n    ```bash\r\n    python -m venv .venv\r\n    ```\r\n\r\n2. Ativar o Ambiente Virtual:\r\n\r\n    ```bash\r\n    .venv\\Scripts\\Activate\r\n    ```\r\n\r\n3. Instalando a biblioteca:\r\n\r\n    ```bash\r\n    pip install bdgd2dss\r\n    ```\r\n\r\n4. A seguir, s\u00e3o apresentados os procedimentos para exporta\u00e7\u00e3o dos dados e a utiliza\u00e7\u00e3o da biblioteca. Ser\u00e3o detalhadas a estrutura da base de dados e as instru\u00e7\u00f5es para seu uso em conjunto com a biblioteca.\r\n\r\n   \r\n## 1 - Base de Dados Geogr\u00e1fica da Distribuidora - BDGD\r\n\r\nA BDGD faz parte integrante do Sistema de Informa\u00e7\u00e3o Geogr\u00e1fico Regulat\u00f3rio da Distribui\u00e7\u00e3o (SIG-R). Em adi\u00e7\u00e3o, \u00e9 um modelo geogr\u00e1fico estabelecido com o objetivo de representar de forma simplificada o sistema el\u00e9trico real da distribuidora, visando refletir tanto a situa\u00e7\u00e3o real dos ativos quanto as informa\u00e7\u00f5es t\u00e9cnicas e comerciais de interesse. De forma a emular a rede el\u00e9trica dos agentes envolvidos, a BDGD \u00e9 estruturada em entidades, modelos abstratos de dados estabelecidos com o objetivo de representar informa\u00e7\u00f5es importantes, como as perdas estimadas pelos agentes. Cada uma dessas entidades \u00e9 detalhada em diversos dados, dentre as quais constam aquelas que devem observar a codifica\u00e7\u00e3o pr\u00e9-estabelecida pelo Dicion\u00e1rio de Dados da Ag\u00eancia Nacional de Energia El\u00e9trica (ANEEL) (DDA), o qual especifica padr\u00f5es de dados a serem utilizados na BDGD, visando a normaliza\u00e7\u00e3o das informa\u00e7\u00f5es. Em rela\u00e7\u00e3o aos dados cartogr\u00e1ficos, eles s\u00e3o disponibilizados em um arquivo *Geodatabase* (*.gdb*), por distribuidora. O Manual de Instru\u00e7\u00f5es da BDGD (https://www.gov.br/aneel/pt-br/centrais-de-conteudos/manuais-modelos-e-instrucoes/distribuicao) e o M\u00f3dulo 10 do PRODIST (https://www.gov.br/aneel/pt-br/centrais-de-conteudos/procedimentos-regulatorios/prodist) cont\u00e9m informa\u00e7\u00f5es \u00fateis para entender a BDGD, como as entidades disponibilizadas e as defini\u00e7\u00f5es dos campos [1]. \r\n\r\nInicialmente, os dados da BDGD s\u00e3o classificados como entidades geogr\u00e1ficas e n\u00e3o geogr\u00e1ficas, as Tabelas 1 e 2 mostram as camadas que as comp\u00f5e, respectivamente.\r\n\r\n\r\n**Tabela 1: Entidades geogr\u00e1ficas da BDGD.** \r\n| id  | Sigla  | Nome                                                       |\r\n|-----|--------|------------------------------------------------------------|\r\n| 22  | ARAT   | \u00c1rea e Atua\u00e7\u00e3o                                             |\r\n| 23  | CONJ   | Conjunto                                                   |\r\n| 24  | PONNOT | Ponto Not\u00e1vel                                              |\r\n| 25  | SSDAT  | Segmento do Sistema de Distribui\u00e7\u00e3o de Alta Tens\u00e3o         |\r\n| 26  | SSDBT  | Segmento do Sistema de Distribui\u00e7\u00e3o de Baixa Tens\u00e3o        |\r\n| 27  | SSDMT  | Segmento do Sistema de Distribui\u00e7\u00e3o de M\u00e9dia Tens\u00e3o        |\r\n| 28  | SUB    | Subesta\u00e7\u00e3o                                                 |\r\n| 38  | UNCRAT | Unidade Compensadora de Reativo de Alta Tens\u00e3o             |\r\n| 29  | UNCRBT | Unidade Compensadora de Reativo de Baixa Tens\u00e3o            |\r\n| 30  | UNCRMT | Unidade Compensadora de Reativo de M\u00e9dia Tens\u00e3o            |\r\n| 39  | UCAT   | Unidade Consumidora de Alta Tens\u00e3o                         |\r\n| 40  | UCBT   | Unidade Consumidora de Baixa Tens\u00e3o                        |\r\n| 41  | UCMT   | Unidade Consumidora de M\u00e9dia Tens\u00e3o                        |\r\n| 42  | UGAT   | Unidade Geradora de Alta Tens\u00e3o                            |\r\n| 43  | UGBT   | Unidade Geradora de Baixa Tens\u00e3o                           |\r\n| 44  | UGMT   | Unidade Geradora de M\u00e9dia Tens\u00e3o                           |\r\n| 31  | UNREAT | Unidade Reguladora de Alta Tens\u00e3o                          |\r\n| 32  | UNREMT | Unidade Reguladora de M\u00e9dia Tens\u00e3o                         |\r\n| 33  | UNSEAT | Unidade seccionadora de Alta Tens\u00e3o                        |\r\n| 34  | UNSEBT | Unidade seccionadora de Baixa Tens\u00e3o                       |\r\n| 35  | UNSEMT | Unidade seccionadora de M\u00e9dia Tens\u00e3o                       |\r\n| 36  | UNTRD  | Unidade Transformadora da Distribui\u00e7\u00e3o                     |\r\n| 37  | UNTRS  | Unidade Transformadora da Subesta\u00e7\u00e3o                       |\r\n\r\n**Fonte:** Adaptado de ANEEL (2021) [2].\r\n\r\n**Tabela 1: Entidades n\u00e3o geogr\u00e1ficas da BDGD.**\r\n\r\n| id  | Sigla   | Nome                                          |\r\n|-----|---------|-----------------------------------------------|\r\n| 3   | BE      | Balan\u00e7o de Energia                            |\r\n| 0   | BAR     | Barramento                                    |\r\n| 1   | BASE    | Base                                          |\r\n| 2   | BAY     | _Bay_                                         |\r\n| 4   | CTAT    | Circuito de Alta Tens\u00e3o                       |\r\n| 5   | CTMT    | Circuito de M\u00e9dia Tens\u00e3o                      |\r\n| 6   | EP      | Energia Passante                              |\r\n| 7   | EQCR    | Equipamento Compensador de Reativo            |\r\n| 8   | EQME    | Equipamento Medidor                           |\r\n| 9   | EQRE    | Equipamento Regulador                         |\r\n| 10  | EQSE    | Equipamento Seccionador                       |\r\n| 11  | EQSIAT  | Equipamento do Sistema de Aterramento         |\r\n| 12  | EQTRD   | Equipamento Transformador da Distribui\u00e7\u00e3o     |\r\n| 13  | EQTRM   | Equipamento Transformador de Medida           |\r\n| 14  | EQTRS   | Equipamento Transformador da Subesta\u00e7\u00e3o       |\r\n| 15  | EQTRSX  | Equipamento Transformador do Servi\u00e7o Auxiliar |\r\n| 16  | INDGER  | Indicadores Gerenciais                        |\r\n| 18  | PNT     | Perdas n\u00e3o T\u00e9cnicas                           |\r\n| 19  | PT      | Perdas T\u00e9cnicas                               |\r\n| 17  | PIP     | Ponto de Ilumina\u00e7\u00e3o P\u00fablica                   |\r\n| 20  | RAMLIG  | Ramal de Liga\u00e7\u00e3o                              |\r\n| 21  | SEGCON  | Segmento Condutor                             |\r\n\r\n**Fonte:** Adaptado de ANEEL (2021) [2].\r\n\r\n### 1.2 - *Download* dos arquivos\r\n\r\nPara realizar o *download* dos dados de uma distribuidora, basta acessar o link: https://dadosabertos-aneel.opendata.arcgis.com/search?tags=distribuicao [1] e pesquis\u00e1-la. Assim sendo, aparecer\u00e1 mais de um arquivo, correspondente a cada ano. A Figura 1 mostra essa etapa.\r\n\r\n![dadosabertos_f1](https://raw.githubusercontent.com/ArthurGS97/bdgd2dss/main/Prints_git/dadosabertos_f1.png \"dadosabertos_f1\")\r\n\r\n\r\n**Figura 1: Captura de tela dos dados da BDGD.**\r\n\r\n**Fonte:** ANEEL (2024) [1].\r\n\r\nEscolhendo o arquivo correspondente, basta baixar como mostra a Figura 2. Alerta-se que essa etapa pode demorar um pouco. \r\n\r\n![download_f2](https://raw.githubusercontent.com/ArthurGS97/bdgd2dss/main/Prints_git/download_f2.png \"download_f2\")\r\n\r\n**Figura 2: Captura de tela de *download* dos dados da BDGD.**\r\n\r\n**Fonte:** Adaptado de ANEEL (2024) [1].\r\n\r\n## 2 - Tratamento dos arquivos no *QGIS*\r\n\r\n### 2.1 - Gerenciador de Fonte de Dados\r\n\r\nAp\u00f3s realizado o *download*, ser\u00e1 poss\u00edvel trabalhar com os arquivos. Para isso deve-se usar a ferramenta *QGIS* [6], um *software* livre com c\u00f3digo-fonte aberto, e multiplataforma. Basicamente \u00e9 um sistema de informa\u00e7\u00e3o geogr\u00e1fica (SIG) que permite a visualiza\u00e7\u00e3o, edi\u00e7\u00e3o e an\u00e1lise de dados georreferenciados. O *download* pode ser feito no *link*: https://qgis.org/download/. Abrindo o *QGIS*, deve-se ir em \"Gerenciador da Fonte de Dados\" (op\u00e7\u00e3o Vetor). Ao selecionar a op\u00e7\u00e3o \"Diret\u00f3rio\", coloca-se a codifica\u00e7\u00e3o em \"Autom\u00e1tico\", em Tipo escolhe-se a op\u00e7\u00e3o \"Arquivo aberto GDB\", e em Base de Vetores escolhe a pasta do arquivo BDGD baixado e extra\u00eddo. Finalmente em *LIST_ALL_TABLES* coloca-se em \"*YES*\" para ser poss\u00edvel uma pr\u00e9-visualiza\u00e7\u00e3o das camadas dispon\u00edveis e selecionar aquelas que desejar visualizar, todas as camadas devem ser selecionadas no campo \"Selecionar Todas\" e, em seguida, deve-se clicar em \"Adicionar Camadas\" para prosseguir com a visualiza\u00e7\u00e3o. Essas etapas s\u00e3o mostradas na Figura 3 e 4. \r\n\r\n![fontededados_f3](https://raw.githubusercontent.com/ArthurGS97/bdgd2dss/main/Prints_git/fontededados_f3.png \"fontededados_f3\")\r\n\r\n**Figura 3: Captura de tela do carregamento dos dados no *QGIS*.**\r\n\r\n**Fonte:** O autor (2024). \r\n\r\n![f4_todas_camadas](https://raw.githubusercontent.com/ArthurGS97/bdgd2dss/main/Prints_git/f4_todas_camadas.png \"f4_todas_camadas\")\r\n\r\n**Figura 4: Captura de tela do *QGIS* mostrando as camadas da BDGD**\r\n\r\n**Fonte:** O Autor (2024).\r\n\r\n### 2.2 - Escolha da Zona Espec\u00edfica a Ser Estudada\r\n\r\nPara otimizar as simula\u00e7\u00f5es e reduzir a quantidade de dados, \u00e9 recomend\u00e1vel focar em uma \u00e1rea / regi\u00e3o / zona espec\u00edfica, em vez de utilizar todos os dados da distribuidora. Por exemplo, pode-se escolher um munic\u00edpio, como Uberl\u00e2ndia - Minas Gerais (ou outro \u00e0 escolha do usu\u00e1rio), e trabalhar apenas com as informa\u00e7\u00f5es dessa cidade. Para isso, \u00e9 necess\u00e1rio filtrar as camadas, mantendo apenas os dados relevantes ao munic\u00edpio. Uma maneira eficaz de fazer isso \u00e9 identificar as subesta\u00e7\u00f5es correspondentes e realizar o filtro em todas as camadas, j\u00e1 que quase todas possuem o atributo referente a uma subesta\u00e7\u00e3o (SE). Para localizar as subesta\u00e7\u00f5es e obter o c\u00f3digo correspondente, clique com o bot\u00e3o direito na camada das SEs, e selecione a op\u00e7\u00e3o \"Abrir tabela de atributos\". A Figura 5 mostra essa etapa.\r\n\r\n![atributos_f5](https://raw.githubusercontent.com/ArthurGS97/bdgd2dss/main/Prints_git/atributos_f5.png \"atributos_f5\")\r\n\r\n**Figura 5: Captura de tela do *QGIS* para abrir a Tabela de Atributos.**\r\n\r\n**Fonte:** O Autor (2024).\r\n\r\nCom a Tabela de atributos aberta, deve-se localizar as subesta\u00e7\u00f5es de Uberl\u00e2ndia (munic\u00edpio escolhido para a realiza\u00e7\u00e3o dos testes), e salvar os COD_ID delas, como mostra a Figura 6 em sequ\u00eancia.\r\n\r\n![SEs_f6](https://raw.githubusercontent.com/ArthurGS97/bdgd2dss/main/Prints_git/SEs_f6.png \"SEs_f6\")\r\n\r\n**Figura 6: Captura de tela do *QGIS* pra identifica\u00e7\u00e3o das subesta\u00e7\u00f5es**\r\n\r\n**Fonte:** O Autor (2024).\r\n\r\n### 2.3 - Filtragem das Camadas e Exportando Planilhas\r\n\r\nCom essas informa\u00e7\u00f5es, ser\u00e1 poss\u00edvel acessar todas as camadas e aplicar a filtragem necess\u00e1ria. Para isso, utilizaremos um c\u00f3digo em *Python* no *QGIS* para realizar o filtro, gerar um arquivo com as coordenadas e exportar as camadas em arquivos *.csv*, que ser\u00e3o utilizados na modelagem. A Figura 7 ilustra o procedimento para abrir o terminal Python no QGIS. Ap\u00f3s abrir o terminal, deve-se selecionar a op\u00e7\u00e3o \"Abrir Editor\".\r\n\r\n![terminal_py](https://raw.githubusercontent.com/ArthurGS97/bdgd2dss/main/Prints_git/terminal_py.png \"terminal_py\")\r\n**Figura 7: Captura de tela do *QGIS* para abrir o terminal *python***\r\n\r\nE copiar e colar o c\u00f3digo no editor que foi aberto:\r\n\r\n```bash\r\nimport os\r\nimport time\r\nimport csv\r\n\r\ninicio = time.time()\r\n\r\noutput_dir = \"C:/BA/Inputs\"  # Ajuste conforme necess\u00e1rio\r\n\r\n# Valores v\u00e1lidos para o campo SUB\r\nsub_values = ('COD', 'BRE', 'BRN', '')\r\n\r\n# Definir os sufixos das camadas que ser\u00e3o exportadas\r\nlayers_to_export = [\r\n    'CRVCRG', 'CTMT', 'EQRE', 'EQTRMT', 'PIP', 'RAMLIG', 'SEGCON',\r\n    'SSDBT', 'SSDMT', 'UCBT_tab', 'UCMT_tab', 'UGBT_tab', 'UGMT_tab',\r\n    'UNCRMT', 'UNREMT', 'UNSEBT', 'UNSEMT', 'UNTRMT', 'SUB'\r\n]\r\n\r\n\r\n# Obter todas as camadas carregadas\r\nall_layers = list(QgsProject.instance().mapLayers().values())\r\n\r\nif not all_layers:\r\n    raise Exception(\"Nenhuma camada carregada no projeto.\")\r\n\r\n# Extrair prefixo do nome da primeira camada\r\nfirst_layer_name = all_layers[0].name()\r\npref = first_layer_name.split(' \u2014 ')[0]\r\nprint(f\"Prefixo extra\u00eddo: {pref}\")\r\n\r\n# Criar lista de camadas que n\u00e3o ser\u00e3o exportadas (a serem removidas)\r\nlayers_to_remove = [\r\n    layer for layer in all_layers\r\n    if not any(layer.name().endswith(f' \u2014 {suffix}') for suffix in layers_to_export)\r\n]\r\n\r\n# Remover essas camadas do projeto com seguran\u00e7a\r\nfor layer in layers_to_remove:\r\n    layer_name = layer.name()  # <- ESSA LINHA \u00c9 ESSENCIAL\r\n    QgsProject.instance().removeMapLayer(layer)\r\n    print(f\"Camada {layer_name} removida do projeto.\")\r\n\r\n# Re-obter as camadas restantes ap\u00f3s a remo\u00e7\u00e3o\r\nfiltered_layers = list(QgsProject.instance().mapLayers().values())\r\n\r\n# Aplicar filtros condicionais nas camadas\r\nfor layer in filtered_layers:\r\n    if layer.type() == QgsMapLayer.VectorLayer:\r\n        layer_fields = [field.name() for field in layer.fields()]\r\n        \r\n        if layer.name().endswith(\" \u2014 SUB\") and 'COD_ID' in layer_fields:\r\n            filter_expression = f\"COD_ID IN {sub_values}\"\r\n            layer.setSubsetString(filter_expression)\r\n            print(f\"Camada {layer.name()} filtrada com COD_ID em {sub_values}.\")\r\n        \r\n        elif 'SUB' in layer_fields:\r\n            filter_expression = f\"SUB IN {sub_values}\"\r\n            layer.setSubsetString(filter_expression)\r\n            print(f\"Camada {layer.name()} filtrada com SUB em {sub_values}.\")\r\n\r\n\r\n# Garantir que o diret\u00f3rio existe\r\nif not os.path.exists(output_dir):\r\n    os.makedirs(output_dir)\r\n\r\n# Exportar apenas as camadas especificadas\r\nfor layer in filtered_layers:\r\n    if any(layer.name().endswith(f' \u2014 {suffix}') for suffix in layers_to_export):\r\n        csv_filename = os.path.join(output_dir, f\"{layer.name()}.csv\")\r\n        error = QgsVectorFileWriter.writeAsVectorFormat(layer, csv_filename, \"utf-8\", layer.crs(), \"CSV\")\r\n        if error[0] == QgsVectorFileWriter.NoError:\r\n            print(f\"Camada {layer.name()} exportada com sucesso para {csv_filename}.\")\r\n        else:\r\n            print(f\"Erro ao exportar camada {layer.name()}.\")\r\n\r\n# Gerar o arquivo de coordenadas baseado na camada SSDMT\r\nssdmt_layer_name = f\"{pref} \u2014 SSDMT\"\r\nssdmt_layers = QgsProject.instance().mapLayersByName(ssdmt_layer_name)\r\n\r\nif not ssdmt_layers:\r\n    raise Exception(f\"Camada '{ssdmt_layer_name}' n\u00e3o encontrada.\")\r\n    \r\nssdmt = ssdmt_layers[0]\r\n\r\nfile_path = os.path.join(output_dir, f\"{pref} \u2014 Coordenadas.csv\")\r\n\r\nwith open(file_path, mode='w', newline='') as csvfile:\r\n    writer = csv.writer(csvfile)\r\n    writer.writerow([\"CTMT\", \"PAC1\", \"Coord1\", \"PAC2\", \"Coord2\"])\r\n\r\n    for feature in ssdmt.getFeatures():\r\n        ctmt = feature[\"CTMT\"]\r\n        pac_1 = feature[\"PAC_1\"]\r\n        pac_2 = feature[\"PAC_2\"]\r\n        geom = feature.geometry()\r\n\r\n        if geom.isMultipart():\r\n            line = geom.asMultiPolyline()[0]\r\n        else:\r\n            line = geom.asPolyline()\r\n\r\n        if len(line) >= 2:\r\n            coord_1_str = f\"{line[0].x()}, {line[0].y()}\"\r\n            coord_2_str = f\"{line[-1].x()}, {line[-1].y()}\"\r\n            writer.writerow([ctmt, pac_1, coord_1_str, pac_2, coord_2_str])\r\n\r\nfim = time.time()\r\nprint(\"Arquivo coordenadas.csv gerado com sucesso!\")\r\nprint(f\"Tempo de execu\u00e7\u00e3o: {fim - inicio:.2f} segundos.\")\r\n```\r\n\r\nCom o script aberto, podemos agora realizar a filtragem das subesta\u00e7\u00f5es e a exporta\u00e7\u00e3o dos dados. A Figura 8 apresenta o trecho de c\u00f3digo com dois campos configur\u00e1veis pelo usu\u00e1rio:\r\n\r\n1 - O primeiro define o diret\u00f3rio onde os arquivos exportados ser\u00e3o salvos. Para isso, o usu\u00e1rio deve criar uma pasta chamada Inputs na raiz do projeto e utiliz\u00e1-la como destino da exporta\u00e7\u00e3o.\r\n\r\n2 - O segundo campo, tamb\u00e9m destacado na figura, corresponde aos COD_ID das subesta\u00e7\u00f5es que se deseja exportar, e deve ser preenchido conforme a necessidade da an\u00e1lise.\r\n\r\n Ap\u00f3s preencher esses campos, basta executar o script. Vale notar que essa etapa pode demorar, durante a qual o QGIS poder\u00e1 ficar temporariamente travado; isso \u00e9 esperado, ent\u00e3o \u00e9 necess\u00e1rio aguardar at\u00e9 a finaliza\u00e7\u00e3o do processo. Por exemplo, nos testes com todas as subesta\u00e7\u00f5es de Uberl\u00e2ndia, esse procedimento levou cerca de 30 minutos em uma m\u00e1quina com as seguintes especifica\u00e7\u00f5es: *Intel Core i5-8500 de 8\u00aa gera\u00e7\u00e3o @ 3.00GHz, 8 GB de RAM, Windows 10 Pro e SSD NVMe*. Quanto maior a base de dados e o volume de dados a serem exportados, maior ser\u00e1 o tempo de execu\u00e7\u00e3o.\r\n\r\n![f9_exportaqgis_entrada](https://raw.githubusercontent.com/ArthurGS97/bdgd2dss/main/Prints_git/f9_exportaqgis_entrada.png \"f9_exportaqgis_entrada\")\r\n**Figura 8: Captura de tela do *QGIS* do script com o foco nas vari\u00e1veis de entrada do usu\u00e1rio**\r\n\r\nFinalizado o processo de exporta\u00e7\u00e3o das camadas, deve-se criar um arquivo na ra\u00edz do diret\u00f3rio para rodar as simula\u00e7\u00f5es, abaixo um exemplo do modelo de c\u00f3digo a ser utilizado, recomenda-se salvar como *main.py*.\r\n\r\n```bash\r\nimport bdgd2dss as b2d\r\nimport time\r\n\r\n################ DADOS DE ENTRADA #####################\r\nmvasc3 = 227.8  # pot\u00eancia de curto-circuito trif\u00e1sico\r\nmvasc1 = 234.9  # pot\u00eancia de curto-circuito monof\u00e1sico\r\n#######################################################\r\n\r\nif __name__ == \"__main__\":\r\n    start_total = time.time()\r\n\r\n    # Chamando a fun\u00e7\u00e3o para obter a lista de alimentadores dispon\u00edveis nessa BDGD\r\n    feeders_all = b2d.feeders_list()\r\n    print(f\"Alimentadores dispon\u00edveis: {feeders_all}\") # Exibe a lista de alimentadores dispon\u00edveis na BDGD\r\n    \r\n    # Escolhe os alimentadores que deseja simular, pode ser apenas um, v\u00e1rios ou todos, no formato especificado\r\n    feeders = ['ULAD202']\r\n\r\n    # Chamando a fun\u00e7\u00e3o para modelar os alimentadores escolhidos usando processamento paralelo\r\n    #b2d.feeders_modelling(feeders, mvasc3, mvasc1)\r\n\r\n    # Chamando a fun\u00e7\u00e3o para verificar a viabilidade dos alimentadores\r\n    #b2d.feeders_feasibility(feeders)\r\n\r\n    end_total = time.time()\r\n    print(f\"\\nTempo total: {end_total - start_total} s\") # Exibe o tempo total de execu\u00e7\u00e3o do script\r\n```\r\n\r\nSe todas as etapas anteriores forem executadas corretamente, a estrutura final do projeto ser\u00e1 a seguinte:\r\n\r\n```plaintext\r\npasta/                        #Pasta criada pelo usu\u00e1rio para utiliza\u00e7\u00e3o da biblioteca\r\n\u2502\r\n\u251c\u2500\u2500 .venv/                    # Ambiente virtual com os pacotes necess\u00e1rios (inclusive o bdgd2dss)\r\n\u251c\u2500\u2500 Inputs/                   # Pasta que ficar\u00e1 salvo os dados exportados a partir do QGIS\r\n\u251c\u2500\u2500 main.py                   # Script para rodar a biblioteca e fun\u00e7\u00f5es, dispon\u00edvel no texto\r\n```\r\n\r\n## 3 - Convertendo BDGD em *.dss* usando *Python*\r\n\r\nPara realizar a modelagem dos alimentadores utilizando a biblioteca **bdgd2dss**, utiliza-se o arquivo criado com o c\u00f3digo acima. A estrutura do c\u00f3digo \u00e9 mostrado na Figura 9.\r\n\r\n![novomain](https://raw.githubusercontent.com/ArthurGS97/bdgd2dss/main/Prints_git/novomain.png \"novomain\")\r\n\r\n**Figura 9: Captura de tela do Visual Code do c\u00f3difo *feeders_processing.py* sendo utilizado**\r\n\r\n**Fonte:** O Autor (2024).\r\n\r\nOs dados de entrada necess\u00e1rios s\u00e3o os n\u00edveis de curto-circuito trif\u00e1sico (*mvasc3*) e monof\u00e1sico (*mvasc1*), ambos em MVA.\r\n\r\nA execu\u00e7\u00e3o do script inicia-se no bloco *if __name__ == \"__main__\":*, onde as fun\u00e7\u00f5es principais s\u00e3o chamadas em sequ\u00eancia:\r\n\r\n1 - Listagem dos alimentadores dispon\u00edveis:\r\nA fun\u00e7\u00e3o *b2d.feeders_list()* retorna todos os alimentadores presentes na base de dados exportada. Essa lista \u00e9 exibida no terminal como refer\u00eancia.\r\nEm seguida, define-se a lista feeders, que cont\u00e9m os identificadores dos alimentadores a serem simulados. Essa lista deve ser informada no formato de strings.\r\n\r\n2 - Modelagem dos alimentadores:\r\nA fun\u00e7\u00e3o *b2d.feeders_modelling(feeders, mvasc3, mvasc1)* realiza a modelagem dos alimentadores selecionados, levando em considera\u00e7\u00e3o os dados de curto-circuito especificados. O processo de modelagem \u00e9 executado com paralelismo, garantindo maior desempenho.\r\n\r\n3 - Verifica\u00e7\u00e3o da viabilidade el\u00e9trica:\r\nAp\u00f3s a modelagem, pode-se utilizar a fun\u00e7\u00e3o *b2d.feeders_feasibility(feeders)* para verificar a viabilidade el\u00e9trica dos alimentadores simulados.\r\n\r\nImportante:\r\nA fun\u00e7\u00e3o *b2d.feeders_feasibility()* deve permanecer comentada (s\u00edmbolo # no in\u00edcio da linha) caso os alimentadores ainda n\u00e3o tenham sido modelados. Para evitar reprocessamento desnecess\u00e1rio, recomenda-se comentar temporariamente a fun\u00e7\u00e3o de modelagem ao executar apenas a verifica\u00e7\u00e3o de viabilidade.\r\n\r\n> No [v\u00eddeo](https://www.youtube.com/@LEAPSE), explicamos a utiliza\u00e7\u00e3o da biblioteca, o que facilita seu entendimento e aplica\u00e7\u00e3o. \r\n> Mais detalhes no link: https://github.com/ArthurGS97/bdgd2dss\r\n> Qualquer inconsist\u00eancia ou dificuldade na utiliza\u00e7\u00e3o da biblioteca pode contactar os autores.\r\n\r\n## [](#header-2)3 - Como citar esta biblioteca:\r\n\r\n```Bash\r\n@misc{bdgd2dss,\r\n  author       = {Arthur Gomes de Souza and Wellington Maycon Santos Bernardes},\r\n  title        = {bdgd2dss: Ferramenta para modelagem de alimentadores da BDGD para uso com OpenDSS},\r\n  year         = {2025},\r\n  howpublished = {\\url{https://pypi.org/project/bdgd2dss/}},\r\n  note         = {Vers\u00e3o 0.0.5, dispon\u00edvel no PyPI}\r\n}\r\n\r\n```\r\n\r\nUtilizando essa biblioteca, cite os seguintes trabalhos: \r\n\r\n>SOUZA, Arthur Gomes de; BERNARDES, Wellington M. Santos. Parametriza\u00e7\u00e3o de religadores com apoio da base de dados geogr\u00e1fica da distribuidora, OpenDSS e Python. In: CONGRESSO BRASILEIRO DE AUTOMA\u0301TICA (CBA), 25., 2024, Rio de Janeiro, Brasil. Anais. Rio de Janeiro: CBA, 2024. p. 1\u20137.\r\n\r\n>SOUZA, Arthur Gomes de; JUNIOR, Julio; GUEDES, Michele; BERNARDES, Wellington Maycon S. Coordinating distribution power system protection in a utility from Uberl\u00e2ndia - MG using a geographic database, QGIS and OpenDSS. *In*: THE XIV LATIN-AMERICAN CONGRESS ON ELECTRICITY GENERATION AND TRANSMISSION - CLAGTEE 2022, 14., 2022, Rio de Janeiro, Brazil. Anais... Rio de Janeiro, 2022. p. 1-9. \r\n\r\n>SOUZA, Arthur Gomes de; BERNARDES, Wellington Maycon S.; PASSATUTO, Luciana A. T. Aquisi\u00e7\u00e3o de dados topol\u00f3gicos e coordena\u00e7\u00e3o de religadores usando as ferramentas de apoio QGIS e OpenDSS. *In*: IEEE INTERNATIONAL CONFERENCE ON INDUSTRY APPLICATIONS (INDUSCON), 15., 2023, S\u00e3o Bernardo do Campo, Brazil. Anais... S\u00e3o Bernardo do Campo: IEEE, 2023. p. 607-608. doi: 10.1109/INDUSCON58041.2023.10374830.\r\n\r\n>SOUZA, Arthur Gomes de; BERNARDES, Wellington M. Santos. Topological data acquisition and recloser coordination using QGIS and OpenDSS Tools. In: CONGRESSO BRASILEIRO DE PLANEJAMENTO ENERG\u00c9TICO (CBPE), 14., 2024, Manaus, AM. Anais... Manaus: Sociedade Brasileira de Planejamento Energ\u00e9tico, 2024. p. 2605\u20132617.\r\n\r\n>PASSATUTO, Luiz Arthur. T.; SOUZA, Arthur Gomes de; BERNARDES, Wellington Maycon S.; FREITAS, L\u00facio C. G.; RESENDE, \u00canio C. Assignment of Responsibility for Short-Duration Voltage Variation via QGIS, OpenDSS and Python. *In*: INTERNATIONAL WORKSHOP ON ARTIFICIAL INTELLIGENCE AND MACHINE LEARNING FOR ENERGY TRANSFORMATION (AIE), 2024, Vaasa, Finland. Anais... Vaasa: IEEE, 2024. p. 1-6. doi: 10.1109/AIE61866.2024.10561325.\r\n\r\n## Refer\u00eancias\r\n\r\n\r\n[1]: AG\u00caNCIA NACIONAL DE ENERGIA EL\u00c9TRICA (ANEEL). Dados abertos do Banco de Dados Geogr\u00e1ficos de Distribui\u00e7\u00e3o - BDGD. Dispon\u00edvel em: [https://dadosabertos-aneel.opendata.arcgis.com/search](https://dadosabertos-aneel.opendata.arcgis.com/search). Acesso em: 29 jul. 2025.\r\n\r\n[2]: AG\u00caNCIA NACIONAL DE ENERGIA EL\u00c9TRICA (ANEEL). Manual de Instru\u00e7\u00f5es da BDGD. Dispon\u00edvel em: [https://www.gov.br/aneel/pt-br/centrais-de-conteudos/manuais-modelos-e-instrucoes/distribuicao](https://www.gov.br/aneel/pt-br/centrais-de-conteudos/manuais-modelos-e-instrucoes/distribuicao). Acesso em: 29 jul. 2025.\r\n\r\n[3]: AG\u00caNCIA NACIONAL DE ENERGIA EL\u00c9TRICA (ANEEL). Procedimentos de Distribui\u00e7\u00e3o de Energia El\u00e9trica no Sistema El\u00e9trico Nacional \u2013 PRODIST: M\u00f3dulo 10. Dispon\u00edvel em: [https://www.gov.br/aneel/pt-br/centrais-de-conteudos/procedimentos-regulatorios/prodist](https://www.gov.br/aneel/pt-br/centrais-de-conteudos/procedimentos-regulatorios/prodist). Acesso em: 29 jul. 2025.\r\n\r\n[4]: MICROSOFT. Visual Studio Code. Dispon\u00edvel em: [https://code.visualstudio.com/download](https://code.visualstudio.com/download). Acesso em: 29 jul. 2025.\r\n\r\n[5]: PYTHON SOFTWARE FOUNDATION. Python. Dispon\u00edvel em: [https://www.python.org/downloads/](https://www.python.org/downloads/). Acesso em: 29 jul. 2025.\r\n\r\n[6]: QGIS. QGIS Geographic Information System. Dispon\u00edvel em: [https://qgis.org/download/](https://qgis.org/download/). Acesso em: 29 jul. 2025.\r\n\r\n",
    "bugtrack_url": null,
    "license": "MIT License",
    "summary": "Ferramenta para modelagem de alimentadores da BDGD para uso com OpenDSS",
    "version": "0.0.5",
    "project_urls": null,
    "split_keywords": [
        "bdgd2dss",
        "bdgd"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e8907bbb561556d711cd83369851928d3169d9ac04d935e5cc4816859ca5c792",
                "md5": "f93447811dce8eecd2481d39e276ba71",
                "sha256": "cfdc1e49cfe804c39f7dca57d104989b9a8ccb9c052bec77df6c99b212849b63"
            },
            "downloads": -1,
            "filename": "bdgd2dss-0.0.5.tar.gz",
            "has_sig": false,
            "md5_digest": "f93447811dce8eecd2481d39e276ba71",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 31444,
            "upload_time": "2025-07-31T15:51:31",
            "upload_time_iso_8601": "2025-07-31T15:51:31.896376Z",
            "url": "https://files.pythonhosted.org/packages/e8/90/7bbb561556d711cd83369851928d3169d9ac04d935e5cc4816859ca5c792/bdgd2dss-0.0.5.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-31 15:51:31",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "bdgd2dss"
}
        
Elapsed time: 1.12086s