Provides information on official divisional administrative regions of Portugal

Overview

GEO PT API

Provides information on official divisional administrative regions of Portugal (based on "Carta Administrativa Oficial de Portugal, 2020", from here). It includes information on mainland Portugal, Azores and Madeira.

You can use freely the public API at geoptapi.org.

It uses nodeJS (much faster than Python) to create a HTTP server allowing several GET requests. It also pre-processes all the raw data for fast real-time delivery.

Paths and parameters

/gps

The /gps path has three parameters: lat, lon and detalhes (optional).

The GET request /gps?lat=40.153687&lon=-8.514602 returns a JSON

{
   "freguesia":"Anobra",
   "concelho":"Condeixa-A-Nova",
   "distrito":"Coimbra"
}

You may also request details for the returned municipality and parish with
/gps?lat=40.153687&lon=-8.514602&detalhes=1, which outputs:

{
   "freguesia":"Anobra",
   "concelho":"Condeixa-A-Nova",
   "distrito":"Coimbra",
   "detalhesFreguesia":{
      "codigo":"6946",
      "nome":"Anobra",
      "municipio": "CONDEIXA-A-NOVA",
      "nif":"501280049",
      "rua":"Beco da Junta",
      "localidade":"Anobra (CONDEIXA-A-NOVA)",
      "codigopostal":"3150-012",
      "descrpostal":"ANOBRA",
      "email":"[email protected]",
      "telefone":"239943911",
      "fax":"239943911",
      "sitio":"www.freguesiadeanobra.pt",
      "codigoine":"60401",
      "eleitores2011":"1023",
      "populacao2011":"1357",
      "areaha":"1638.29",
      "nomecompleto":"Anobra"
   },
   "detalhesMunicipio":{
      "codigo":"2630",
      "nome":"CONDEIXA-A-NOVA",
      "nif":"501275380",
      "rua":"Largo Artur Barreto",
      "localidade":"CONDEIXA-A-NOVA",
      "codigopostal":"3150-128",
      "descrpostal":"CONDEIXA-A-NOVA",
      "email":"[email protected]",
      "telefone":"239949120",
      "fax":"239942711",
      "sitio":"www.cm-condeixa.pt",
      "presidentecamara":"Nuno Moita da Costa",
      "areaha":"138.67",
      "populacao":"17078",
      "eleitores":"12658",
      "codigoine":"604"
   }
}

/municipio or /municipios

With no parameters, returns a JSON array with municipalities names, alphabetically sorted.

Accept parameters nome, codigo, nif, codigopostal, email, telefone, fax, sitio and codigoine.

For example the request /municipio?nome=Évora will return:

{
  "codigo":"2643",
  "nif":"504828576",
  "rua":"Praça do Sertório",
  "localidade":"EVORA",
  "codigopostal":"7004-506",
  "descrpostal":"EVORA",
  "email":"[email protected]",
  "telefone":"266777000",
  "fax":"266702950",
  "sitio":"www.cm-evora.pt",
  "presidentecamara":"Carlos Manuel Rodrigues Pinto de Sá",
  "areaha":"1307.03",
  "populacao":"56596",
  "eleitores":"47923",
  "codigoine":"705",
  "nome":"ÉVORA"
}

/freguesia or /freguesias

With no parameters, returns a JSON array with parishes (freguesias) names, alphabetically sorted.

Accept parameter nome, which makes reference to fields nome, nomecompleto and nomecompleto2. Also accepts parameters municipio, codigo, nif, codigopostal, email, telefone, fax, sitio and codigoine.

For example the request /freguesia?nome=serzedelo will return

[
   {
      "codigo":"6235",
      "nif":"506863115",
      "rua":"Rua do Grupo Desportivo, N.º 23",
      "localidade":"Serzedelo (GUIMARÃES)",
      "codigopostal":"4765-533",
      "descrpostal":"SERZEDELO",
      "email":"[email protected]",
      "telefone":"253532236",
      "fax":"253532236",
      "sitio":"",
      "codigoine":"30866",
      "eleitores2011":"3504",
      "populacao2011":"4073",
      "areaha":"514.44",
      "nomecompleto":"Serzedelo",
      "nome":"Serzedelo",
      "municipio":"GUIMARÃES",
      "nomecompleto2":"Serzedelo"
   },
   {
      "codigo":"6269",
      "nif":"507009460",
      "rua":"Rua da Igreja",
      "localidade":"Serzedelo (PÓVOA DE LANHOSO)",
      "codigopostal":"4830-698",
      "descrpostal":"SERZEDELO",
      "email":"[email protected]",
      "telefone":"253636601",
      "fax":"253636601",
      "sitio":"",
      "codigoine":"30924",
      "eleitores2011":"798",
      "populacao2011":"830",
      "areaha":"964.51",
      "nomecompleto":"Serzedelo",
      "nome":"Serzedelo",
      "municipio":"PÓVOA DE LANHOSO",
      "nomecompleto2":"Serzedelo"
   }
]

And the request /freguesia?nome=serzedelo&municipio=guimarães will return

[
  {
    "codigo":"6235",
    "nif":"506863115",
    "rua":"Rua do Grupo Desportivo, N.º 23",
    "localidade":"Serzedelo (GUIMARÃES)",
    "codigopostal":"4765-533",
    "descrpostal":"SERZEDELO",
    "email":"[email protected]",
    "telefone":"253532236",
    "fax":"253532236",
    "sitio":"",
    "codigoine":"30866",
    "eleitores2011":"3504",
    "populacao2011":"4073",
    "areaha":"514.44",
    "nomecompleto":"Serzedelo",
    "nome":"Serzedelo",
    "municipio":"GUIMARÃES",
    "nomecompleto2":"Serzedelo"
  }
]

/municipios/freguesias

Returns a JSON array of objects, each object corresponding to a municipality and an array of its parishes

[
   {
      "nome":"Abrantes",
      "freguesias":[
         "Bemposta",
         "Carvalhal",
         "Fontes",
         "Martinchel",
         "Mouriscas",
         "Pego",
         "Rio de Moinhos",
         "Tramagal",
         "União das freguesias de Abrantes (São Vicente e São João) e Alferrarede",
         "União das freguesias de Aldeia do Mato e Souto",
         "União das freguesias de Alvega e Concavada",
         "União das freguesias de São Facundo e Vale das Mós",
         "União das freguesias de São Miguel do Rio Torto e Rossio ao Sul do Tejo"
      ]
   },
   {
      "nome":"Aguiar da Beira",
      "freguesias":[
         "Carapito",
         "Cortiçada",
         "Dornelas",
         "Eirado",
         "Forninhos",
         "Pena Verde",
         "Pinheiro",
         "União das freguesias de Aguiar da Beira e Coruche",
         "União das freguesias de Sequeiros e Gradiz",
         "União das freguesias de Souto de Aguiar da Beira e Valverde"
      ]
   },
   "etc"
 ]

How to install this API on your machine

  1. Install nodeJS, npm and git
  2. Clone the project:
    git clone https://github.com/jfoclpf/geoptapi.git
  3. Enter the newly created directory and install dependencies
    cd geoptapi && npm install
  4. Start the server
    npm start --port=8080

Continuous operation

For permanent and continuous operation use for example pm2 or forever, using directly the node script located at the root directory

node server.js --port=8080.

With pm2

npm install pm2@latest -g
pm2 start server.js -- --port 8080

Debug

DEBUG=http npm start --port=8080
Comments
  • Dar latitude e longitude em função do Código Postal

    Dar latitude e longitude em função do Código Postal

    A par com os resultados do Código Postal, exemplo

    A) https://geoptapi.org/cp/1950-446

    B) https://geoptapi.org/cp/1950-449

    dar também dados latitude e longitude, tal pode ser obtido com o open street maps, mais precisamente com o argumento q, visto que os códigos postais do open street maps estão desatualizados

    A) https://nominatim.openstreetmap.org/search?country=portugal&q=rua+armandinho,lisboa&format=json&addressdetails=1

    B) https://nominatim.openstreetmap.org/search?country=portugal&q=Rua%20Fernando%20Maur%C3%ADcio%2030,lisboa&format=json&addressdetails=1

    enhancement 
    opened by jfoclpf 39
  • RESTful API

    RESTful API

    Mudar os caminhos para

    /municipios
    
    /municipios/{municipio}
    
    /municipios/{municipio}/freguesias
    
    /freguesias/{freguesia}
    

    https://restfulapi.net/resource-naming/

    enhancement 
    opened by jfoclpf 32
  • Muitos pontos fora do polígono na visualização de CP4

    Muitos pontos fora do polígono na visualização de CP4

    Em alguns casos o polígono à volta dos pontos de um código postal tem um ajuste bastante bom:

    | https://geoapi.pt/cp/1000 | https://geoapi.pt/cp/4000 | |-|-| | CP 1000 | CP 4000 |

    Há casos em que alguns pontos ficam fora do polígono, mas não de forma preocupante para uma aproximação:

    | https://geoapi.pt/cp/3000 | https://geoapi.pt/cp/6000 |-|-| | CP 3000 | CP 6000 |

    No entanto, há casos em que a proporção de pontos fora do polígono é considerável, gerando áreas claramente incorretas como indicação da cobertura geográfica do código postal:

    | https://geoapi.pt/cp/2000 | https://geoapi.pt/cp/5000 | |-|-| | CP 2000 | CP 5000 |

    Não sei se esta situação corresponde ao https://github.com/jfoclpf/outliers2d/issues/1, mas achei melhor reportar de qualquer forma.

    Já agora, será que ficaria melhor se o polígono não fosse suavizado? Ou isto é o resultado da remoção de outliers e não da suavização do polígono?

    opened by waldyrious 30
  • Obter as localidades em função das freguesias

    Obter as localidades em função das freguesias

    Viva,

    Após ter analisado a API não encontrei forma de o fazer, mas acho que seria interessante por exemplo nas localidadidas arranjar forma de obter as mesmas referenciando a freguesia.

    Por exemplo com este pedido:

    https://geoapi.pt/freguesia/Cuba?json=1

    Obtemos diversos dados, e seria interessante tendo em conta o código postal, ou até mesmo o codigoine referenciar as localidades, visto que as mesmas já têm a "Designação Postal", no entanto para algumas freguesias não é possivel pesquisar através deste campo pois trata-se de uniões.

    Não daria para fazer com que neste pedido https://geoapi.pt/cp/2495 as localidades estivessem associadas diretamente à freguesia con um código ou algo.

    opened by gbast0s 10
  • retornar JSON também com o host `json.geoapi.pt`

    retornar JSON também com o host `json.geoapi.pt`

    @waldyrious e @joao

    Neste momento a API retorna JSON quando

    • tem o parâmetro GET json=1, ex: /municipios/évora?json=1
    • o pedido tem no cabeçalho HTTP Accept: application/json

    Estava a pensar também adicionalmente um host json.geoapi.pt, ex: https://json.geoapi.pt/gps/40.153687,-8.514602

    Que vos parece a ideia?

    opened by jfoclpf 9
  • Aplicar limitador apenas para os endpoints da API, excetuando o index e static assets

    Aplicar limitador apenas para os endpoints da API, excetuando o index e static assets

    @jfoclpf, estive um bocado desligado no último mês e estava agora a acompanhar os issues em que sou mencionado.

    Está a dar-me um erro de Too many requests, please try again later., quando tendo aceder a qualquer página no geoapi.pt. Tenho consciencia que existe um limite de 100 pedidos por 15 minutos, mas no máximo terei visitado 10 páginas/endpoints.

    Será que o limite também está a ser aplicado a assets que sejam pedidos, ao retornar uma página e não somente a visitas de um determinado URL?

    Adicionalmente, talvez fosse melhor excluir a homepage dos limites, ou pelo menos aumentar para as páginas estáticas, de modo a que um utilizador que não esteja consciente do limite de 100 pedidos encontrar a documentação em que tal é mencionado:

    screenshot 2022-11-03 at 15 19 09

    enhancement 
    opened by joao 9
  • Criar openapi.json for OpenAPI

    Criar openapi.json for OpenAPI

    Devemos também apresentar um documento openapi.json para o OpenAPI https://oai.github.io/Documentation/

    The OpenAPI Specification (OAS) defines a standard, programming language-agnostic interface description for HTTP APIs, which allows both humans and computers to discover and understand the capabilities of a service without requiring access to source code, additional documentation, or inspection of network traffic. When properly defined via OpenAPI, a consumer can understand and interact with the remote service with a minimal amount of implementation logic. Similar to what interface descriptions have done for lower-level programming, the OpenAPI Specification removes guesswork in calling a service.

    Ou seja, o OpenApi é apenas um "mapa" da API, não colocar qualquer restrição

    enhancement 
    opened by jfoclpf 9
  • Adicionar informação sobre Lugar (rua, número, etc) ao caminho `/gps/{latitude},{longitude}`

    Adicionar informação sobre Lugar (rua, número, etc) ao caminho `/gps/{latitude},{longitude}`

    Externalizar essa tarefa para o Open Street Maps (nominatim) Esta repo usa o got para pedidos http

    got(`https://nominatim.openstreetmap.org/reverse?lat=${lat}&lon=${lon}&format=json`, 
      { headers: { Referer: `${req.get('origin') || defaultOrigin}/gps/${lat},${lon}` }})
      .json()
      .then(res => {
        console.log(res)
    })
    
    enhancement 
    opened by jfoclpf 6
  • Sugestão - Retornar dicofre

    Sugestão - Retornar dicofre

    Excelente webAPI e iniciativa! Sugeria apenas retornar também o código dicofre pois é o identificador único de uma Freguesia. Esta informação vem na CAOP e permite fazer a comparação com outros dados, de outras aplicações, não por uma string mas por um valor inteiro inequívoco. Obrigado pela geoptapi!

    opened by bento-martins 6
  • Agregar por distrito

    Agregar por distrito

    Criar um route /distrito

    • apenas /distrito lista os distritos
    • /distrito/municipios lista árvore de distritos com municípios
    • /distrito/municipios/freguesias lista árvore de distritos com municípios com freguesias
    enhancement 
    opened by jfoclpf 6
  • Geocodificação reversa

    Geocodificação reversa

    @pinanunes @joao

    depois de 39 horas a correr o script, finalmente consegui gerar os ficheiros que aglomeram todas as moradas (pontos) do ficheiro OpenAddresses por distrito/município/freguesia/secção/subsecção

    Está tudo aqui: https://github.com/jfoclpf/geoapi.pt/tree/main/res/admins-addresses

    Tal vai permitir fazer geocodificação reversa (coodenadas GPS => Código postal e morada) pois o distrito/município/freguesia/secção/subsecção já está a ser detectado rapidamente, e só temos que procurar o ponto/morada mais perto dentro desse ficheiro distrito/município/freguesia/secção/subsecção.json

    @pinanunes @joao @waldyrious devemos simplesmente apresentar o ponto mais próximo? Ou devemos dar uma margem máxima? Tipo 50 metros? Ou seja, se nenhum ponto estiver num raio de 50 metros, não devolvemos nada. Qual o valor para o limbo?

    Originally posted by @jfoclpf in https://github.com/jfoclpf/geoapi.pt/issues/44#issuecomment-1328029033

    enhancement 
    opened by jfoclpf 5
  • Códigos postais mostram popup vazio ou

    Códigos postais mostram popup vazio ou "undefined"

    Não se se é suposto poder-se ver alguma informação quando se clica nas bolinhas vermelhas que representam instâncias individuais de códigos postais, mas elas são de momento clicáveis e mostram um popup, só que o conteúdo é vazio ou "undefined". Por exemplo:

    https://geoapi.pt/cp/4960 👇️

    image

    https://geoapi.pt/cp/4960-110 👇️

    image

    opened by waldyrious 0
  • Respostas HAL+JSON

    Respostas HAL+JSON

    Para que esta API seja uma RESTful API, a resposta será HAL, neste caso HAL+JSON

    {
      "nome": "Porto",
      "descrição": "Lista de freguesias do município do Porto",
      "_links": {
        "self": { "href": "/municipios/porto/freguesias" },
        "up": { "href": "/municipios/porto" },
        "freguesias": [
          {
            "nome": "Bonfim",
            "href": "/municipios/porto/freguesias/bonfim",
            "_links": { "self": { "href": "/municipios/porto/freguesias/bonfim" } }
          },
          {
            "nome": "Campanhã",
            "href": "/municipios/porto/freguesias/campanhã",
            "_links": { "self": { "href": "/municipios/porto/freguesias/campanhã" } }
          }
        ]
      },
      "freguesias": [
        "Bonfim",
        "Campanhã",
        "Paranhos",
        "Ramalde",
        "União das freguesias de Aldoar, Foz do Douro e Nevogilde",
        "União das freguesias de Cedofeita, Santo Ildefonso, Sé, Miragaia, São Nicolau e Vitória",
        "União das freguesias de Lordelo do Ouro e Massarelos"
      ]
    }
    

    Também passa a validação e é mais fácil de ler.

    Originally posted by @jfoclpf in https://github.com/jfoclpf/geoapi.pt/issues/42#issuecomment-1282524514

    Mais info em : https://stateless.group/hal_specification.html

    Testar JSON Schema: https://jsonschema.dev/

    HAL+JSON schema: https://github.com/evently-cloud/hal-json-schema/blob/main/hal.json

    enhancement 
    opened by jfoclpf 0
  • Juntar dados do INE

    Juntar dados do INE

    Os dados dos census do INE: http://mapas.ine.pt/download/index2011.phtml (Assumindo que os podes redistribuir). O desafio pode ser a agregação das sub-secçōes estatísticas aos códigos postais (se quiseres integrar os dois, o que seria interessante).

    from: https://www.reddit.com/r/devpt/comments/xvgqdb/comment/ir1a86w/?utm_source=share&utm_medium=web2x&context=3

    enhancement 
    opened by jfoclpf 49
  • Realçar as ruas

    Realçar as ruas

    @waldyrious sugeriu

    Seria possível fazer highlight das ruas que condizem com o nome dos pontos? Por exemplo, em https://geoapi.pt/cp/4710-057 ver-se uma linha como esta: https://www.openstreetmap.org/way/317809018 talvez seja preciso fazer uma normalização + fuzzy match, porque os nomes não são equivalências exatas — neste caso os pontos têm a designação "R UNIVERSIDADE" e no OSM está "Rua da Universidade".

    enhancement 
    opened by jfoclpf 0
  • Zonas costeiras

    Zonas costeiras

    Por vezes, não é possível determinar distrito/concelho/freguesia porque a coordenada está sobre o mar, mas apenas a alguns metros da linha costeira. Não seria possível implementar uma opção que, quando a coordenada cai fora por uma pequena margem (algumas dezenas de metros, por exemplo) devolvesse a freguesia mais próxima?

    Obrigado

    enhancement 
    opened by pedrospinto 2
Owner
João Pimentel Ferreira
I was born in Lisbon. I have a degree in Electrical and Computer Engineering and I programme for free-time occupation, leisure and public service.
João Pimentel Ferreira
Show unlocked regions of your account

Komoot unlocked regions viewer A small utility to display all unlocked regions of your komoot account. Usage Sign into your kommot account and navigat

Carsten 74 Jan 3, 2023
New base script bot wa by Ramdani Official, don't forget to subscribe youtube Ramdani Official.

Requirements • Installation • Thanks to • Official Group Bot • Donate Information bahasa Indonesia Ramdani Botz V17 adalah bot yang di ciptakan oleh R

Ramdani Official 22 Nov 1, 2022
The Main Purpose The main purpose of creating an anaonline information system, as an effort responsive to the management of the data of the Members of the Persis Youth based on information technology systems

landing-page-pp landing-page-pp.vercel.app #The Main Purpose The main purpose of creating an anaonline information system, as an effort responsive to

Hilman Firdaus 6 Oct 21, 2022
A REST API which provides you the information of any discord account including their Spotify & VS-Code activity!

Friday A REST API which provides you the information of any discord account including their Spotify & VS-Code activity! This is an open sourced reposi

Ayan 5 Jan 4, 2023
official github mirror of gg-struggle

gg-struggle tl;dr gg-struggle is a program that reduces loading times by caching the Guilty Gear server responses, reducing slowdowns caused by latenc

cybermelon 28 Mar 12, 2022
official Alibaba Design system vue components snippets for visual studio code

Alibaba DLS Snippets for vscode Installation You can either install this extension by searching for Alibaba DLS Snippets in your vscode extensions sto

Alibaba Travels Co Open Source 2 Sep 25, 2021
This is a cloned website of the official tesla page built with react js

TESLA-CLONE This is a cloned website of the official tesla page built with react js. The page has simillar sections which made duplicating these secti

Kevv_in 25 Nov 7, 2022
A UI library by WeChat official design team, includes the most useful widgets/modules in mobile web applications.

WeUI - tailor-made for WeChat web service 中文版本 Introduction WeUI is an WeChat-like UI framework officially designed by the WeChat Design Team, tailor-

Tencent 26.6k Jan 2, 2023
Klecks is the official open-source release of the community-funded online painting app Kleki.

Klecks (German for "splash of color", pronounced "clex") is the official open-source release of the community-funded online painting app Kleki. Klecks

I paint, code and mess around. 74 Dec 27, 2022
Programmers House api official wrapper

programmershouse-wrapper Programmers House api official wrapper Install: npm install programmershouse-wrapper Example of using: With .then //importing

Raid 2 Mar 23, 2022
An non-official esx-legacy 1.5 version for quasar inventory purpose.

Hi there ! It's my first post on github, and I'm releasing a free edited base with esx-legacy 1.5 compatible and made for Quasar Inventory. How can I

ChernyyOrel 3 Mar 19, 2022
Official code for rashahacks.com

Getting Started with rashahacks.com Adding your writeup to rashahacks.com Clone this repository or edit remotely git clone https://github.com/encodedg

null 5 Dec 1, 2022
Official fork of XREngine for The Nexus by the creator of XREngine.

Nexus Engine Official fork of XREngine for The Nexus by the creator of XREngine. Web3-enabled, ethically run, interoperability focused, always free an

The Nexus 4 Feb 23, 2022
Official Node.js client library for Devzat plugin API

Devzat plugin API client for Node.js This NPM package allows you to build Devzat plugins/bots with JavaScript/TypeScript. See example/index.ts for a f

Benjamin Smith 2 Apr 26, 2022
Official website for "Centre For Innovation, JGEC"

CFI JGEC Official website for "Centre For Innovation, JGEC" View Demo · Report Bug · Request Feature Table of Contents About The Project Built With Ge

Niloy Sikdar 9 Feb 15, 2022
The official challenges and deployment source code files used in San Diego CTF 2022.

SDCTF 2022 Here is the challenge and infrastructure files of San Diego CTF 2022. Challenge files include source code that implement the challenge idea

Association for Computing Machinery (UCSD) 23 Dec 8, 2022
Go-zero official documentation

go-zero.dev English | 中文简体 This website is built using Docusaurus 2. Pages & components are written in TypeScript, the styles in vanilla CSS with vari

go-zero team 8 Dec 15, 2022
SoftForge official website.

LogTure A minimal designed, fully customizable, and extensible modern personal blogging framework, built with Nextjs. Demo: https://logture.vercel.app

Sam Zhang 3 May 6, 2022
Source of the (Un)official Moodle Developer Resources

Moodle Developer Resources Introduction This repository includes the source for the Moodle Developer Resources - a collection of resources aimed at ma

Moodle Development 19 Dec 16, 2022