From 082476fab850414a5aca26d2399fc13f3cf2b22f Mon Sep 17 00:00:00 2001 From: jim-sheldon <5619539+jim-sheldon@users.noreply.github.com> Date: Tue, 19 Mar 2024 10:58:38 -0400 Subject: [PATCH] Removing unused parsers --- .../workflows/ingestion-cleanup-deploy.yml | 42 - .../workflows/ingestion-functions-deploy.yml | 42 - .../workflows/ingestion-functions-python.yml | 37 - .github/workflows/monitoring-notify.yml | 32 - .github/workflows/monitoring-tests.yml | 32 - data-serving/samples/day0cases.json | 16 +- .../scripts/setup-db/import-sample-data.py | 149 +- dev/Dockerfile-batch | 10 - dev/Dockerfile-ingestion | 73 - dev/Dockerfile-mock-source-data | 73 - dev/README.md | 15 +- dev/docker-compose.dev.full.test.yml | 29 +- dev/docker-compose.dev.full.yml | 56 +- dev/mock_source_data.py | 177 - dev/parsing.py | 262 - dev/setup_ingestion.py | 240 - dev/setup_localstack.py | 85 +- geocoding/location-service/src/app/main.py | 99 +- .../Linelist_data_to_merge.ipynb | 1332 - ingestion/from_spreadsheet/README.md | 12 - .../from_spreadsheet/ghtransfer_15012020.R | 57 - .../linelist_data_to_merge.py | 57 - ingestion/from_spreadsheet/requirements.txt | 59 - ingestion/functions/.dockerignore | 412 - ingestion/functions/.env | 8 - ingestion/functions/Dockerfile | 72 - ingestion/functions/Dockerfile-clean | 72 - ingestion/functions/Dockerfile-test | 64 - ingestion/functions/README.md | 420 - .../functions/assets/new-automated-source.png | Bin 79821 -> 0 bytes ingestion/functions/assets/new-source-id.png | Bin 80296 -> 0 bytes ingestion/functions/assets/system.svg | 776 - ingestion/functions/aws.py | 498 - .../functions/aws_access/EventBridgeClient.py | 198 - ingestion/functions/aws_access/S3Client.py | 27 - .../functions/aws_access/ScheduleRuleTests.py | 125 - ingestion/functions/aws_access/__init__.py | 0 .../globaldothealth_configuration.py | 7 - .../clean_old_ingestion_source_files.py | 43 - ingestion/functions/common/__init__.py | 0 ingestion/functions/common/common_lib.py | 221 - ingestion/functions/common/common_lib_test.py | 150 - .../functions/common/geocoding_countries.json | 1242 - .../functions/common/ingestion_logging.py | 44 - .../common/ingestion_logging_test.py | 14 - ingestion/functions/common/input_event.json | 15 - ingestion/functions/common/parsing_lib.py | 535 - .../functions/common/parsing_lib_test.py | 702 - ingestion/functions/common/sample_data.json | 26 - ingestion/functions/define_rules.py | 120 - ingestion/functions/docker-compose-test.yml | 11 - ingestion/functions/docker-compose.yml | 14 - ingestion/functions/make_rules.py | 41 - .../parsing/GISAID/make_GISAID_df.py | 91 - ingestion/functions/parsing/USA/USA.py | 217 - ingestion/functions/parsing/USA/USA_test.py | 54 - ingestion/functions/parsing/USA/__init__.py | 0 .../functions/parsing/USA/input_event.json | 7 - .../functions/parsing/USA/sample_data.csv | 2 - .../functions/parsing/argentina/__init__.py | 0 .../functions/parsing/argentina/argentina.py | 337 - .../parsing/argentina/argentina_test.py | 157 - .../parsing/argentina/dictionaries.json | 3480 -- .../parsing/argentina/input_event.json | 7 - .../parsing/argentina/sample_data.csv | 17 - .../functions/parsing/brazil_acre/__init__.py | 0 .../functions/parsing/brazil_acre/acre.py | 270 - .../parsing/brazil_acre/acre_test.py | 68 - .../parsing/brazil_acre/input_event.json | 7 - .../parsing/brazil_acre/sample_data.csv | 3 - .../parsing/brazil_amapa/__init__.py | 0 .../functions/parsing/brazil_amapa/amapa.py | 217 - .../parsing/brazil_amapa/amapa_test.py | 70 - .../parsing/brazil_amapa/broken_date.csv | 2 - .../parsing/brazil_amapa/input_event.json | 7 - .../parsing/brazil_amapa/sample_data.csv | 3 - .../parsing/brazil_ceara/__init__.py | 0 .../functions/parsing/brazil_ceara/ceara.py | 239 - .../parsing/brazil_ceara/ceara_test.py | 68 - .../parsing/brazil_ceara/input_event.json | 7 - .../parsing/brazil_ceara/sample_data.csv | 2 - .../brazil_distrito_federal/__init__.py | 0 .../brazil_distrito_federal/dictionaries.json | 143 - .../distrito_federal.py | 224 - .../distrito_federal_test.py | 52 - .../brazil_distrito_federal/input_event.json | 7 - .../brazil_distrito_federal/sample_data.csv | 3 - .../parsing/brazil_espirito_santo/__init__.py | 0 .../brazil_espirito_santo/espirito_santo.py | 326 - .../espirito_santo_test.py | 90 - .../brazil_espirito_santo/input_event.json | 7 - .../brazil_espirito_santo/sample_data.csv | 3 - .../parsing/brazil_goias/__init__.py | 0 .../functions/parsing/brazil_goias/goias.py | 196 - .../parsing/brazil_goias/goias_test.py | 46 - .../parsing/brazil_goias/input_event.json | 7 - .../parsing/brazil_goias/sample_data.csv | 2 - .../functions/parsing/brazil_para/__init__.py | 0 .../parsing/brazil_para/input_event.json | 7 - .../functions/parsing/brazil_para/para.py | 248 - .../parsing/brazil_para/para_test.py | 95 - .../parsing/brazil_para/sample_data.csv | 3 - .../parsing/brazil_paraiba/__init__.py | 0 .../parsing/brazil_paraiba/input_event.json | 7 - .../parsing/brazil_paraiba/paraiba.py | 237 - .../parsing/brazil_paraiba/paraiba_test.py | 66 - .../parsing/brazil_paraiba/sample_data.csv | 3 - .../parsing/brazil_rio_de_janeiro/__init__.py | 0 .../brazil_rio_de_janeiro/input_event.json | 7 - .../brazil_rio_de_janeiro/rio_de_janeiro.py | 156 - .../rio_de_janeiro_test.py | 120 - .../brazil_rio_de_janeiro/sample_data.csv | 11 - .../parsing/brazil_santa_catarina/__init__.py | 0 .../brazil_santa_catarina/input_event.json | 7 - .../brazil_santa_catarina/sample_data.csv | 4 - .../brazil_santa_catarina/santa_catarina.py | 294 - .../santa_catarina_test.py | 126 - .../functions/parsing/brazil_srag/__init__.py | 0 .../parsing/brazil_srag/dictionaries.json | 28222 ---------------- .../parsing/brazil_srag/input_event.json | 7 - .../parsing/brazil_srag/sample_data.csv | 5 - .../functions/parsing/brazil_srag/srag.py | 489 - .../parsing/brazil_srag/srag_test.py | 203 - .../functions/parsing/canada/__init__.py | 0 ingestion/functions/parsing/canada/canada.py | 125 - .../functions/parsing/canada/canada_test.py | 77 - .../functions/parsing/canada/input_event.json | 7 - .../functions/parsing/canada/sample_data.csv | 2 - .../functions/parsing/ch_zurich/__init__.py | 0 .../parsing/ch_zurich/input_event.json | 7 - .../parsing/ch_zurich/sample_data.csv | 6 - .../functions/parsing/ch_zurich/zurich.py | 126 - .../parsing/ch_zurich/zurich_test.py | 63 - .../functions/parsing/colombia/__init__.py | 0 .../functions/parsing/colombia/colombia.py | 319 - .../parsing/colombia/colombia_test.py | 513 - .../colombia/geocoding_dictionaries.json | 10431 ------ .../parsing/colombia/input_event.json | 7 - .../parsing/colombia/sample_data.csv | 21 - ingestion/functions/parsing/cuba/__init__.py | 0 ingestion/functions/parsing/cuba/cuba.py | 276 - ingestion/functions/parsing/cuba/cuba_test.py | 80 - ingestion/functions/parsing/cuba/geocodes.csv | 169 - .../functions/parsing/cuba/input_event.json | 7 - .../functions/parsing/cuba/sample_data.json | 244 - .../functions/parsing/czechia/__init__.py | 0 .../functions/parsing/czechia/czechia.py | 124 - .../functions/parsing/czechia/czechia_test.py | 100 - .../functions/parsing/czechia/geocodes.json | 1220 - .../functions/parsing/czechia/get_geocodes.py | 84 - .../parsing/czechia/input_event.json | 7 - .../functions/parsing/czechia/sample_data.csv | 5 - ingestion/functions/parsing/england/README.md | 3 - .../functions/parsing/england/england.py | 195 - .../functions/parsing/england/england_test.py | 202 - .../england/geocoding_dictionaries.json | 1 - .../parsing/england/input_event.json | 8 - .../functions/parsing/england/sample_data.csv | 11 - .../functions/parsing/estonia/__init__.py | 0 .../functions/parsing/estonia/estonia.py | 116 - .../functions/parsing/estonia/estonia_test.py | 45 - .../parsing/estonia/input_event.json | 7 - .../functions/parsing/estonia/sample_data.csv | 3 - ingestion/functions/parsing/example/README.md | 3 - .../functions/parsing/example/__init__.py | 0 .../functions/parsing/example/example.py | 52 - .../functions/parsing/example/example_test.py | 36 - .../parsing/example/input_event.json | 7 - .../functions/parsing/example/sample_data.csv | 2 - .../parsing/germany/.vscode/settings.json | 3 - .../functions/parsing/germany/__init__.py | 0 .../parsing/germany/dictionaries.json | 2011 -- .../functions/parsing/germany/germany.py | 172 - .../functions/parsing/germany/germany_test.py | 89 - .../parsing/germany/input_event.json | 7 - .../functions/parsing/germany/sample_data.csv | 3 - .../functions/parsing/hongkong/__init__.py | 0 .../functions/parsing/hongkong/hongkong.py | 184 - .../parsing/hongkong/hongkong_test.py | 156 - .../parsing/hongkong/input_event.json | 7 - .../parsing/hongkong/sample_data.csv | 6 - ingestion/functions/parsing/india/__init__.py | 0 ingestion/functions/parsing/india/india.py | 168 - .../functions/parsing/india/india_test.py | 86 - .../functions/parsing/india/input_event.json | 7 - .../functions/parsing/india/sample_data.csv | 4 - .../functions/parsing/india/sample_data.json | 26 - ingestion/functions/parsing/japan/__init__.py | 0 .../functions/parsing/japan/input_event.json | 7 - ingestion/functions/parsing/japan/japan.py | 145 - .../functions/parsing/japan/japan_test.py | 152 - .../functions/parsing/japan/sample_data.json | 50 - .../functions/parsing/mexico/__init__.py | 0 .../parsing/mexico/dictionaries.json | 12367 ------- .../functions/parsing/mexico/input_event.json | 7 - ingestion/functions/parsing/mexico/mexico.py | 259 - .../functions/parsing/mexico/mexico_test.py | 56 - .../functions/parsing/mexico/sample_data.csv | 3 - .../functions/parsing/new_zealand/__init__.py | 0 .../parsing/new_zealand/geocodes.json | 22 - .../parsing/new_zealand/input_event.json | 8 - .../parsing/new_zealand/new_zealand.py | 147 - .../parsing/new_zealand/new_zealand_test.py | 103 - .../parsing/new_zealand/sample_data.csv | 13 - .../functions/parsing/paraguay/__init__.py | 0 .../parsing/paraguay/input_event.json | 7 - .../functions/parsing/paraguay/paraguay.py | 123 - .../parsing/paraguay/paraguay_test.py | 39 - .../parsing/paraguay/sample_data.csv | 3 - ingestion/functions/parsing/peru/__init__.py | 0 .../parsing/peru/geocoding_dictionaries.json | 15136 --------- .../functions/parsing/peru/input_event.json | 8 - ingestion/functions/parsing/peru/peru.py | 152 - ingestion/functions/parsing/peru/peru_test.py | 198 - .../functions/parsing/peru/sample_data.csv | 13 - .../parsing/republic_of_korea/__init__.py | 0 .../republic_of_korea/input_event.json | 8 - .../republic_of_korea/republic_of_korea.py | 194 - .../republic_of_korea_test.py | 142 - .../parsing/republic_of_korea/sample_data.csv | 11 - .../parsing/riograndedosul/__init__.py | 0 .../parsing/riograndedosul/input_event.json | 7 - .../parsing/riograndedosul/riograndedosul.py | 286 - .../riograndedosul/riograndedosul_test.py | 64 - .../parsing/riograndedosul/sample_data.csv | 2 - .../functions/parsing/saopaolo/__init__.py | 0 .../parsing/saopaolo/input_event.json | 7 - .../parsing/saopaolo/sample_data.csv | 2 - .../functions/parsing/saopaolo/saopaolo.py | 73 - .../parsing/saopaolo/saopaolo_test.py | 76 - .../functions/parsing/scotland/__init__.py | 0 .../parsing/scotland/input_event.json | 7 - .../parsing/scotland/sample_data.csv | 21 - .../functions/parsing/scotland/scotland.py | 123 - .../parsing/scotland/scotland_test.py | 54 - .../parsing/south_africa/__init__.py | 0 .../parsing/south_africa/input_event.json | 7 - .../parsing/south_africa/sample_data.csv | 5 - .../parsing/south_africa/south_africa.py | 165 - .../parsing/south_africa/south_africa_test.py | 160 - .../functions/parsing/taiwan/__init__.py | 0 .../functions/parsing/taiwan/geocodes.json | 232 - .../functions/parsing/taiwan/get_geocodes.py | 73 - .../functions/parsing/taiwan/input_event.json | 7 - .../functions/parsing/taiwan/sample_data.csv | 4 - ingestion/functions/parsing/taiwan/taiwan.py | 145 - .../functions/parsing/taiwan/taiwan_test.py | 106 - .../functions/parsing/thailand/__init__.py | 0 .../parsing/thailand/input_event.json | 7 - .../parsing/thailand/nationalities.json | 60 - .../parsing/thailand/sample_data.json | 49 - .../functions/parsing/thailand/thailand.py | 131 - .../parsing/thailand/thailand_test.py | 100 - .../functions/parsing/variants/__init__.py | 0 .../parsing/variants/input_event.json | 8 - .../parsing/variants/sample_data.csv | 11 - .../functions/parsing/variants/variants.py | 174 - .../parsing/variants/variants_test.py | 228 - ingestion/functions/poetry.lock | 538 - ingestion/functions/pyproject.toml | 21 - ingestion/functions/pytest.ini | 2 - ingestion/functions/retrieval/__init__.py | 0 ingestion/functions/retrieval/retrieval.py | 358 - .../functions/retrieval/retrieval_test.py | 450 - .../retrieval/valid_scheduled_event.json | 8 - ingestion/functions/run.sh | 5 - ingestion/functions/run_docker.sh | 15 - ingestion/functions/setup_s3_test.sh | 16 - ingestion/functions/test.sh | 10 - .../test_clean_old_ingestion_source_files.py | 74 - ingestion/functions/test_docker.sh | 12 - ingestion/functions/tox.ini | 6 - ingestion/monitoring/README.md | 14 - ingestion/monitoring/completeness.py | 121 - ingestion/monitoring/daily_metrics.py | 122 - ingestion/monitoring/freshness.py | 98 - ingestion/monitoring/poetry.lock | 181 - ingestion/monitoring/pyproject.toml | 17 - .../monitoring/requirements-completeness.txt | 2 - ingestion/monitoring/requirements.txt | 2 - ingestion/monitoring/test_daily_metrics.py | 98 - ingestion/monitoring/test_freshness.py | 129 - 282 files changed, 201 insertions(+), 97103 deletions(-) delete mode 100644 .github/workflows/ingestion-cleanup-deploy.yml delete mode 100644 .github/workflows/ingestion-functions-deploy.yml delete mode 100644 .github/workflows/ingestion-functions-python.yml delete mode 100644 .github/workflows/monitoring-notify.yml delete mode 100644 .github/workflows/monitoring-tests.yml delete mode 100644 dev/Dockerfile-batch delete mode 100644 dev/Dockerfile-ingestion delete mode 100644 dev/Dockerfile-mock-source-data delete mode 100644 dev/mock_source_data.py delete mode 100755 dev/parsing.py delete mode 100644 dev/setup_ingestion.py delete mode 100644 ingestion/from_spreadsheet/Linelist_data_to_merge.ipynb delete mode 100644 ingestion/from_spreadsheet/README.md delete mode 100644 ingestion/from_spreadsheet/ghtransfer_15012020.R delete mode 100755 ingestion/from_spreadsheet/linelist_data_to_merge.py delete mode 100644 ingestion/from_spreadsheet/requirements.txt delete mode 100644 ingestion/functions/.dockerignore delete mode 100644 ingestion/functions/.env delete mode 100644 ingestion/functions/Dockerfile delete mode 100644 ingestion/functions/Dockerfile-clean delete mode 100644 ingestion/functions/Dockerfile-test delete mode 100644 ingestion/functions/README.md delete mode 100644 ingestion/functions/assets/new-automated-source.png delete mode 100644 ingestion/functions/assets/new-source-id.png delete mode 100644 ingestion/functions/assets/system.svg delete mode 100755 ingestion/functions/aws.py delete mode 100644 ingestion/functions/aws_access/EventBridgeClient.py delete mode 100644 ingestion/functions/aws_access/S3Client.py delete mode 100644 ingestion/functions/aws_access/ScheduleRuleTests.py delete mode 100644 ingestion/functions/aws_access/__init__.py delete mode 100644 ingestion/functions/aws_access/globaldothealth_configuration.py delete mode 100644 ingestion/functions/clean_old_ingestion_source_files.py delete mode 100644 ingestion/functions/common/__init__.py delete mode 100644 ingestion/functions/common/common_lib.py delete mode 100644 ingestion/functions/common/common_lib_test.py delete mode 100644 ingestion/functions/common/geocoding_countries.json delete mode 100644 ingestion/functions/common/ingestion_logging.py delete mode 100644 ingestion/functions/common/ingestion_logging_test.py delete mode 100644 ingestion/functions/common/input_event.json delete mode 100644 ingestion/functions/common/parsing_lib.py delete mode 100644 ingestion/functions/common/parsing_lib_test.py delete mode 100644 ingestion/functions/common/sample_data.json delete mode 100755 ingestion/functions/define_rules.py delete mode 100644 ingestion/functions/docker-compose-test.yml delete mode 100644 ingestion/functions/docker-compose.yml delete mode 100755 ingestion/functions/make_rules.py delete mode 100644 ingestion/functions/parsing/GISAID/make_GISAID_df.py delete mode 100644 ingestion/functions/parsing/USA/USA.py delete mode 100644 ingestion/functions/parsing/USA/USA_test.py delete mode 100644 ingestion/functions/parsing/USA/__init__.py delete mode 100644 ingestion/functions/parsing/USA/input_event.json delete mode 100644 ingestion/functions/parsing/USA/sample_data.csv delete mode 100644 ingestion/functions/parsing/argentina/__init__.py delete mode 100644 ingestion/functions/parsing/argentina/argentina.py delete mode 100644 ingestion/functions/parsing/argentina/argentina_test.py delete mode 100644 ingestion/functions/parsing/argentina/dictionaries.json delete mode 100644 ingestion/functions/parsing/argentina/input_event.json delete mode 100644 ingestion/functions/parsing/argentina/sample_data.csv delete mode 100644 ingestion/functions/parsing/brazil_acre/__init__.py delete mode 100644 ingestion/functions/parsing/brazil_acre/acre.py delete mode 100644 ingestion/functions/parsing/brazil_acre/acre_test.py delete mode 100644 ingestion/functions/parsing/brazil_acre/input_event.json delete mode 100644 ingestion/functions/parsing/brazil_acre/sample_data.csv delete mode 100644 ingestion/functions/parsing/brazil_amapa/__init__.py delete mode 100644 ingestion/functions/parsing/brazil_amapa/amapa.py delete mode 100644 ingestion/functions/parsing/brazil_amapa/amapa_test.py delete mode 100644 ingestion/functions/parsing/brazil_amapa/broken_date.csv delete mode 100644 ingestion/functions/parsing/brazil_amapa/input_event.json delete mode 100644 ingestion/functions/parsing/brazil_amapa/sample_data.csv delete mode 100644 ingestion/functions/parsing/brazil_ceara/__init__.py delete mode 100644 ingestion/functions/parsing/brazil_ceara/ceara.py delete mode 100644 ingestion/functions/parsing/brazil_ceara/ceara_test.py delete mode 100644 ingestion/functions/parsing/brazil_ceara/input_event.json delete mode 100644 ingestion/functions/parsing/brazil_ceara/sample_data.csv delete mode 100644 ingestion/functions/parsing/brazil_distrito_federal/__init__.py delete mode 100644 ingestion/functions/parsing/brazil_distrito_federal/dictionaries.json delete mode 100644 ingestion/functions/parsing/brazil_distrito_federal/distrito_federal.py delete mode 100644 ingestion/functions/parsing/brazil_distrito_federal/distrito_federal_test.py delete mode 100644 ingestion/functions/parsing/brazil_distrito_federal/input_event.json delete mode 100644 ingestion/functions/parsing/brazil_distrito_federal/sample_data.csv delete mode 100644 ingestion/functions/parsing/brazil_espirito_santo/__init__.py delete mode 100644 ingestion/functions/parsing/brazil_espirito_santo/espirito_santo.py delete mode 100644 ingestion/functions/parsing/brazil_espirito_santo/espirito_santo_test.py delete mode 100644 ingestion/functions/parsing/brazil_espirito_santo/input_event.json delete mode 100644 ingestion/functions/parsing/brazil_espirito_santo/sample_data.csv delete mode 100644 ingestion/functions/parsing/brazil_goias/__init__.py delete mode 100644 ingestion/functions/parsing/brazil_goias/goias.py delete mode 100644 ingestion/functions/parsing/brazil_goias/goias_test.py delete mode 100644 ingestion/functions/parsing/brazil_goias/input_event.json delete mode 100644 ingestion/functions/parsing/brazil_goias/sample_data.csv delete mode 100644 ingestion/functions/parsing/brazil_para/__init__.py delete mode 100644 ingestion/functions/parsing/brazil_para/input_event.json delete mode 100644 ingestion/functions/parsing/brazil_para/para.py delete mode 100644 ingestion/functions/parsing/brazil_para/para_test.py delete mode 100644 ingestion/functions/parsing/brazil_para/sample_data.csv delete mode 100644 ingestion/functions/parsing/brazil_paraiba/__init__.py delete mode 100644 ingestion/functions/parsing/brazil_paraiba/input_event.json delete mode 100644 ingestion/functions/parsing/brazil_paraiba/paraiba.py delete mode 100644 ingestion/functions/parsing/brazil_paraiba/paraiba_test.py delete mode 100644 ingestion/functions/parsing/brazil_paraiba/sample_data.csv delete mode 100644 ingestion/functions/parsing/brazil_rio_de_janeiro/__init__.py delete mode 100644 ingestion/functions/parsing/brazil_rio_de_janeiro/input_event.json delete mode 100644 ingestion/functions/parsing/brazil_rio_de_janeiro/rio_de_janeiro.py delete mode 100644 ingestion/functions/parsing/brazil_rio_de_janeiro/rio_de_janeiro_test.py delete mode 100644 ingestion/functions/parsing/brazil_rio_de_janeiro/sample_data.csv delete mode 100644 ingestion/functions/parsing/brazil_santa_catarina/__init__.py delete mode 100644 ingestion/functions/parsing/brazil_santa_catarina/input_event.json delete mode 100644 ingestion/functions/parsing/brazil_santa_catarina/sample_data.csv delete mode 100644 ingestion/functions/parsing/brazil_santa_catarina/santa_catarina.py delete mode 100644 ingestion/functions/parsing/brazil_santa_catarina/santa_catarina_test.py delete mode 100644 ingestion/functions/parsing/brazil_srag/__init__.py delete mode 100644 ingestion/functions/parsing/brazil_srag/dictionaries.json delete mode 100644 ingestion/functions/parsing/brazil_srag/input_event.json delete mode 100644 ingestion/functions/parsing/brazil_srag/sample_data.csv delete mode 100644 ingestion/functions/parsing/brazil_srag/srag.py delete mode 100644 ingestion/functions/parsing/brazil_srag/srag_test.py delete mode 100644 ingestion/functions/parsing/canada/__init__.py delete mode 100644 ingestion/functions/parsing/canada/canada.py delete mode 100644 ingestion/functions/parsing/canada/canada_test.py delete mode 100644 ingestion/functions/parsing/canada/input_event.json delete mode 100644 ingestion/functions/parsing/canada/sample_data.csv delete mode 100644 ingestion/functions/parsing/ch_zurich/__init__.py delete mode 100644 ingestion/functions/parsing/ch_zurich/input_event.json delete mode 100644 ingestion/functions/parsing/ch_zurich/sample_data.csv delete mode 100644 ingestion/functions/parsing/ch_zurich/zurich.py delete mode 100644 ingestion/functions/parsing/ch_zurich/zurich_test.py delete mode 100644 ingestion/functions/parsing/colombia/__init__.py delete mode 100644 ingestion/functions/parsing/colombia/colombia.py delete mode 100644 ingestion/functions/parsing/colombia/colombia_test.py delete mode 100644 ingestion/functions/parsing/colombia/geocoding_dictionaries.json delete mode 100644 ingestion/functions/parsing/colombia/input_event.json delete mode 100644 ingestion/functions/parsing/colombia/sample_data.csv delete mode 100644 ingestion/functions/parsing/cuba/__init__.py delete mode 100644 ingestion/functions/parsing/cuba/cuba.py delete mode 100644 ingestion/functions/parsing/cuba/cuba_test.py delete mode 100644 ingestion/functions/parsing/cuba/geocodes.csv delete mode 100644 ingestion/functions/parsing/cuba/input_event.json delete mode 100644 ingestion/functions/parsing/cuba/sample_data.json delete mode 100644 ingestion/functions/parsing/czechia/__init__.py delete mode 100644 ingestion/functions/parsing/czechia/czechia.py delete mode 100644 ingestion/functions/parsing/czechia/czechia_test.py delete mode 100644 ingestion/functions/parsing/czechia/geocodes.json delete mode 100644 ingestion/functions/parsing/czechia/get_geocodes.py delete mode 100644 ingestion/functions/parsing/czechia/input_event.json delete mode 100644 ingestion/functions/parsing/czechia/sample_data.csv delete mode 100644 ingestion/functions/parsing/england/README.md delete mode 100644 ingestion/functions/parsing/england/england.py delete mode 100644 ingestion/functions/parsing/england/england_test.py delete mode 100644 ingestion/functions/parsing/england/geocoding_dictionaries.json delete mode 100644 ingestion/functions/parsing/england/input_event.json delete mode 100644 ingestion/functions/parsing/england/sample_data.csv delete mode 100644 ingestion/functions/parsing/estonia/__init__.py delete mode 100644 ingestion/functions/parsing/estonia/estonia.py delete mode 100644 ingestion/functions/parsing/estonia/estonia_test.py delete mode 100644 ingestion/functions/parsing/estonia/input_event.json delete mode 100644 ingestion/functions/parsing/estonia/sample_data.csv delete mode 100644 ingestion/functions/parsing/example/README.md delete mode 100644 ingestion/functions/parsing/example/__init__.py delete mode 100644 ingestion/functions/parsing/example/example.py delete mode 100644 ingestion/functions/parsing/example/example_test.py delete mode 100644 ingestion/functions/parsing/example/input_event.json delete mode 100644 ingestion/functions/parsing/example/sample_data.csv delete mode 100644 ingestion/functions/parsing/germany/.vscode/settings.json delete mode 100644 ingestion/functions/parsing/germany/__init__.py delete mode 100644 ingestion/functions/parsing/germany/dictionaries.json delete mode 100644 ingestion/functions/parsing/germany/germany.py delete mode 100644 ingestion/functions/parsing/germany/germany_test.py delete mode 100644 ingestion/functions/parsing/germany/input_event.json delete mode 100644 ingestion/functions/parsing/germany/sample_data.csv delete mode 100644 ingestion/functions/parsing/hongkong/__init__.py delete mode 100644 ingestion/functions/parsing/hongkong/hongkong.py delete mode 100644 ingestion/functions/parsing/hongkong/hongkong_test.py delete mode 100644 ingestion/functions/parsing/hongkong/input_event.json delete mode 100644 ingestion/functions/parsing/hongkong/sample_data.csv delete mode 100644 ingestion/functions/parsing/india/__init__.py delete mode 100644 ingestion/functions/parsing/india/india.py delete mode 100644 ingestion/functions/parsing/india/india_test.py delete mode 100644 ingestion/functions/parsing/india/input_event.json delete mode 100644 ingestion/functions/parsing/india/sample_data.csv delete mode 100644 ingestion/functions/parsing/india/sample_data.json delete mode 100644 ingestion/functions/parsing/japan/__init__.py delete mode 100644 ingestion/functions/parsing/japan/input_event.json delete mode 100644 ingestion/functions/parsing/japan/japan.py delete mode 100644 ingestion/functions/parsing/japan/japan_test.py delete mode 100644 ingestion/functions/parsing/japan/sample_data.json delete mode 100644 ingestion/functions/parsing/mexico/__init__.py delete mode 100644 ingestion/functions/parsing/mexico/dictionaries.json delete mode 100644 ingestion/functions/parsing/mexico/input_event.json delete mode 100644 ingestion/functions/parsing/mexico/mexico.py delete mode 100644 ingestion/functions/parsing/mexico/mexico_test.py delete mode 100644 ingestion/functions/parsing/mexico/sample_data.csv delete mode 100644 ingestion/functions/parsing/new_zealand/__init__.py delete mode 100644 ingestion/functions/parsing/new_zealand/geocodes.json delete mode 100644 ingestion/functions/parsing/new_zealand/input_event.json delete mode 100644 ingestion/functions/parsing/new_zealand/new_zealand.py delete mode 100644 ingestion/functions/parsing/new_zealand/new_zealand_test.py delete mode 100644 ingestion/functions/parsing/new_zealand/sample_data.csv delete mode 100644 ingestion/functions/parsing/paraguay/__init__.py delete mode 100644 ingestion/functions/parsing/paraguay/input_event.json delete mode 100644 ingestion/functions/parsing/paraguay/paraguay.py delete mode 100644 ingestion/functions/parsing/paraguay/paraguay_test.py delete mode 100644 ingestion/functions/parsing/paraguay/sample_data.csv delete mode 100644 ingestion/functions/parsing/peru/__init__.py delete mode 100644 ingestion/functions/parsing/peru/geocoding_dictionaries.json delete mode 100644 ingestion/functions/parsing/peru/input_event.json delete mode 100644 ingestion/functions/parsing/peru/peru.py delete mode 100644 ingestion/functions/parsing/peru/peru_test.py delete mode 100644 ingestion/functions/parsing/peru/sample_data.csv delete mode 100644 ingestion/functions/parsing/republic_of_korea/__init__.py delete mode 100644 ingestion/functions/parsing/republic_of_korea/input_event.json delete mode 100644 ingestion/functions/parsing/republic_of_korea/republic_of_korea.py delete mode 100644 ingestion/functions/parsing/republic_of_korea/republic_of_korea_test.py delete mode 100644 ingestion/functions/parsing/republic_of_korea/sample_data.csv delete mode 100644 ingestion/functions/parsing/riograndedosul/__init__.py delete mode 100644 ingestion/functions/parsing/riograndedosul/input_event.json delete mode 100644 ingestion/functions/parsing/riograndedosul/riograndedosul.py delete mode 100644 ingestion/functions/parsing/riograndedosul/riograndedosul_test.py delete mode 100644 ingestion/functions/parsing/riograndedosul/sample_data.csv delete mode 100644 ingestion/functions/parsing/saopaolo/__init__.py delete mode 100644 ingestion/functions/parsing/saopaolo/input_event.json delete mode 100644 ingestion/functions/parsing/saopaolo/sample_data.csv delete mode 100644 ingestion/functions/parsing/saopaolo/saopaolo.py delete mode 100644 ingestion/functions/parsing/saopaolo/saopaolo_test.py delete mode 100644 ingestion/functions/parsing/scotland/__init__.py delete mode 100644 ingestion/functions/parsing/scotland/input_event.json delete mode 100644 ingestion/functions/parsing/scotland/sample_data.csv delete mode 100644 ingestion/functions/parsing/scotland/scotland.py delete mode 100644 ingestion/functions/parsing/scotland/scotland_test.py delete mode 100644 ingestion/functions/parsing/south_africa/__init__.py delete mode 100644 ingestion/functions/parsing/south_africa/input_event.json delete mode 100644 ingestion/functions/parsing/south_africa/sample_data.csv delete mode 100644 ingestion/functions/parsing/south_africa/south_africa.py delete mode 100644 ingestion/functions/parsing/south_africa/south_africa_test.py delete mode 100644 ingestion/functions/parsing/taiwan/__init__.py delete mode 100644 ingestion/functions/parsing/taiwan/geocodes.json delete mode 100644 ingestion/functions/parsing/taiwan/get_geocodes.py delete mode 100644 ingestion/functions/parsing/taiwan/input_event.json delete mode 100644 ingestion/functions/parsing/taiwan/sample_data.csv delete mode 100644 ingestion/functions/parsing/taiwan/taiwan.py delete mode 100644 ingestion/functions/parsing/taiwan/taiwan_test.py delete mode 100644 ingestion/functions/parsing/thailand/__init__.py delete mode 100644 ingestion/functions/parsing/thailand/input_event.json delete mode 100644 ingestion/functions/parsing/thailand/nationalities.json delete mode 100644 ingestion/functions/parsing/thailand/sample_data.json delete mode 100644 ingestion/functions/parsing/thailand/thailand.py delete mode 100644 ingestion/functions/parsing/thailand/thailand_test.py delete mode 100644 ingestion/functions/parsing/variants/__init__.py delete mode 100644 ingestion/functions/parsing/variants/input_event.json delete mode 100644 ingestion/functions/parsing/variants/sample_data.csv delete mode 100644 ingestion/functions/parsing/variants/variants.py delete mode 100644 ingestion/functions/parsing/variants/variants_test.py delete mode 100644 ingestion/functions/poetry.lock delete mode 100644 ingestion/functions/pyproject.toml delete mode 100644 ingestion/functions/pytest.ini delete mode 100644 ingestion/functions/retrieval/__init__.py delete mode 100644 ingestion/functions/retrieval/retrieval.py delete mode 100644 ingestion/functions/retrieval/retrieval_test.py delete mode 100644 ingestion/functions/retrieval/valid_scheduled_event.json delete mode 100755 ingestion/functions/run.sh delete mode 100755 ingestion/functions/run_docker.sh delete mode 100755 ingestion/functions/setup_s3_test.sh delete mode 100755 ingestion/functions/test.sh delete mode 100644 ingestion/functions/test_clean_old_ingestion_source_files.py delete mode 100755 ingestion/functions/test_docker.sh delete mode 100644 ingestion/functions/tox.ini delete mode 100644 ingestion/monitoring/README.md delete mode 100644 ingestion/monitoring/completeness.py delete mode 100644 ingestion/monitoring/daily_metrics.py delete mode 100644 ingestion/monitoring/freshness.py delete mode 100644 ingestion/monitoring/poetry.lock delete mode 100644 ingestion/monitoring/pyproject.toml delete mode 100644 ingestion/monitoring/requirements-completeness.txt delete mode 100644 ingestion/monitoring/requirements.txt delete mode 100644 ingestion/monitoring/test_daily_metrics.py delete mode 100644 ingestion/monitoring/test_freshness.py diff --git a/.github/workflows/ingestion-cleanup-deploy.yml b/.github/workflows/ingestion-cleanup-deploy.yml deleted file mode 100644 index 50c8cb513..000000000 --- a/.github/workflows/ingestion-cleanup-deploy.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: Ingestion cleanup deploy - -on: - push: - branches: [main] - paths: - - '.github/workflows/ingestion-cleanup-deploy.yml' - - 'ingestion/functions/**' - - '!ingestion/functions/README.md' - - '!ingestion/functions/parsing/**' - - '!ingestion/functions/retrieval/**' - # Build whenever a new tag is created. - tags: - - "*" - workflow_dispatch: - -jobs: - deploy: - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v3 - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v1 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: eu-central-1 - - - name: Login to Amazon ECR - id: login-ecr - uses: aws-actions/amazon-ecr-login@v1 - - - name: Build, tag, and push image to Amazon ECR (latest) - working-directory: ingestion/functions - env: - ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} - ECR_REPOSITORY: gdh-ingestor-cleanup - IMAGE_TAG: ${{ github.sha }} - run: | - docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG -t $ECR_REGISTRY/$ECR_REPOSITORY -f Dockerfile-clean . - docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG - docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest diff --git a/.github/workflows/ingestion-functions-deploy.yml b/.github/workflows/ingestion-functions-deploy.yml deleted file mode 100644 index cc4966ab8..000000000 --- a/.github/workflows/ingestion-functions-deploy.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: Ingestion functions deploy - -on: - push: - branches: [main] - paths: - - '.github/workflows/ingestion-functions-deploy.yml' - - 'ingestion/functions/**' - - '!ingestion/functions/README.md' - # Build whenever a new tag is created. - tags: - - "*" - workflow_dispatch: - -jobs: - deploy: - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v3 - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v1 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: eu-central-1 - - - name: Login to Amazon ECR - id: login-ecr - uses: aws-actions/amazon-ecr-login@v1 - - - name: Build, tag, and push image to Amazon ECR (latest) - working-directory: ingestion/functions - env: - NOTIFY_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_METRICS_URL }} - ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} - ECR_REPOSITORY: gdh-ingestor - IMAGE_TAG: ${{ github.sha }} - SLACK_LOGS_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_INGESTION_LOGS }} - run: | - docker build --build-arg NOTIFY_WEBHOOK_URL -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG -t $ECR_REGISTRY/$ECR_REPOSITORY . - docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG - docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest diff --git a/.github/workflows/ingestion-functions-python.yml b/.github/workflows/ingestion-functions-python.yml deleted file mode 100644 index af22178c9..000000000 --- a/.github/workflows/ingestion-functions-python.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: Ingestion functions Python CI - -on: - push: - branches: [main] - paths: - - '.github/workflows/ingestion-functions-python.yml' - - 'ingestion/functions/**' - - '!ingestion/functions/README.md' - pull_request: - paths: - - '.github/workflows/ingestion-functions-python.yml' - - 'ingestion/functions/**' - - '!ingestion/functions/README.md' - workflow_dispatch: - -jobs: - ci: - runs-on: ubuntu-20.04 - defaults: - run: - working-directory: ingestion/functions - steps: - - uses: actions/checkout@v3 - - name: Set up Python 3.10 - uses: actions/setup-python@v4 - with: - python-version: '3.10' - - name: Lint with flake8 - run: | - pip install flake8 - # stop the build if there are Python syntax errors or undefined names - flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics - # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide - flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - - name: Test with docker - run: ./test_docker.sh diff --git a/.github/workflows/monitoring-notify.yml b/.github/workflows/monitoring-notify.yml deleted file mode 100644 index 1d1c64f58..000000000 --- a/.github/workflows/monitoring-notify.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Data monitoring notifications - -on: - schedule: - # Every day at 11:30 PM UTC - - cron: "30 23 * * *" - -jobs: - monitoring-notify: - runs-on: ubuntu-20.04 - defaults: - run: - working-directory: ingestion/monitoring - steps: - - uses: actions/checkout@v3 - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v1 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: eu-central-1 - - - name: Set up Python 3.10 - uses: actions/setup-python@v4 - with: - python-version: '3.10' - - name: Install dependencies - run: pip install -r requirements.txt - - name: Run metrics script - env: - SLACK_WEBHOOK_METRICS_URL: ${{ secrets.SLACK_WEBHOOK_METRICS_URL }} - run: python daily_metrics.py diff --git a/.github/workflows/monitoring-tests.yml b/.github/workflows/monitoring-tests.yml deleted file mode 100644 index a775485bb..000000000 --- a/.github/workflows/monitoring-tests.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Data monitoring tests - -on: - push: - branches: [main] - paths: - - '.github/workflows/monitoring-tests.yml' - - 'ingestion/monitoring/**' - pull_request: - paths: - - '.github/workflows/monitoring-tests.yml' - - 'ingestion/monitoring/**' - workflow_dispatch: - -jobs: - monitoring-tests: - runs-on: ubuntu-20.04 - defaults: - run: - working-directory: ingestion/monitoring - steps: - - uses: actions/checkout@v3 - - name: Set up Python 3.10 - uses: actions/setup-python@v4 - with: - python-version: '3.10' - - name: Install dependencies - run: | - pip install -r requirements.txt - pip install pytest - - name: Run tests - run: pytest diff --git a/data-serving/samples/day0cases.json b/data-serving/samples/day0cases.json index 4a6956baf..c9bbacbc8 100644 --- a/data-serving/samples/day0cases.json +++ b/data-serving/samples/day0cases.json @@ -4,7 +4,8 @@ "pathogen": "COVID-19", "caseReference": { "sourceId": "5ea86423bae6982635d2e1f8", - "sourceUrl": "https://test.com" + "sourceUrl": "https://test.com", + "isGovernmentSource": false }, "location": { "country": "Poland", @@ -20,6 +21,11 @@ "$numberLong": "1578891600000" } }, + "dateReported": { + "$date": { + "$numberLong": "1578891600000" + } + }, "dateLastModified": { "$date": { "$numberLong": "1578891600000" @@ -38,7 +44,8 @@ "pathogen": "COVID-19", "caseReference": { "sourceId": "5ea86423bae6982635d2e1f8", - "sourceUrl": "https://test.com" + "sourceUrl": "https://test.com", + "isGovernmentSource": false }, "location": { "country": "Poland", @@ -54,6 +61,11 @@ "$numberLong": "1578891600000" } }, + "dateReported": { + "$date": { + "$numberLong": "1578891600000" + } + }, "dateLastModified": { "$date": { "$numberLong": "1578891600000" diff --git a/data-serving/scripts/setup-db/import-sample-data.py b/data-serving/scripts/setup-db/import-sample-data.py index f526eaace..7c92110f2 100644 --- a/data-serving/scripts/setup-db/import-sample-data.py +++ b/data-serving/scripts/setup-db/import-sample-data.py @@ -9,18 +9,19 @@ def convert_dict_to_float(aDict): - return float(aDict['$numberDouble']) + return float(aDict["$numberDouble"]) def convert_dict_to_date(aDict): date_to_use = None if isinstance(aDict, dict): - if date_value := aDict.get('$date'): + if date_value := aDict.get("$date"): maybe_date = date_value if isinstance(maybe_date, dict): - date_value = maybe_date.get('$numberLong') + date_value = maybe_date.get("$numberLong") date_to_use = datetime.utcfromtimestamp( - int(date_value)/1000.0).strftime('%Y-%m-%dT%H:%M:%S.%f') + int(date_value) / 1000.0 + ).strftime("%Y-%m-%dT%H:%M:%S.%f") else: date_to_use = maybe_date return date_to_use @@ -30,80 +31,66 @@ def convert_case(case): """Some cases in the sample file are in some mongoexport format that defines types of numbers. Decomplect that information so they're compatible with the API's expectation.""" converted = dict(case) - if vaccination := case.get('vaccination'): - date = vaccination['vaccineDate'] - converted['vaccination']['vaccineDate'] = convert_dict_to_date(date) - if travelHistory := case.get('travelHistory'): - date = travelHistory['travelHistoryEntry'] - converted['travelHistory']['travelHistoryEntry'] = convert_dict_to_date( - date) - events = case.get('events') - if events.get('dateEntry'): - dateEntry = events['dateEntry'] - converted['events']['dateEntry'] = convert_dict_to_date(dateEntry) - if events.get('dateOnset'): - dateOnset = events['dateOnset'] - converted['events']['dateOnset'] = convert_dict_to_date(dateOnset) - if events.get('dateLastModified'): - dateLastModified = events['dateLastModified'] - converted['events']['dateLastModified'] = convert_dict_to_date( - dateLastModified) - if events.get('dateConfirmation'): - dateConfirmation = events['dateConfirmation'] - converted['events']['dateConfirmation'] = convert_dict_to_date( - dateConfirmation) - if events.get('dateOfFirstConsult'): - dateOfFirstConsult = events['dateOfFirstConsult'] - converted['events']['dateOfFirstConsult'] = convert_dict_to_date( - dateOfFirstConsult) - if events.get('dateHospitalization'): - dateHospitalization = events['dateHospitalization'] - converted['events']['dateHospitalization'] = convert_dict_to_date( - dateHospitalization) - if events.get('dateDischargeHospital'): - dateDischargeHospital = events['dateDischargeHospital'] - converted['events']['dateDischargeHospital'] = convert_dict_to_date( - dateDischargeHospital) - if events.get('dateAdmissionICU'): - dateAdmissionICU = events['dateAdmissionICU'] - converted['events']['dateAdmissionICU'] = convert_dict_to_date( - dateAdmissionICU) - if events.get('dateDischargeICU'): - dateDischargeICU = events['dateDischargeICU'] - converted['events']['dateDischargeICU'] = convert_dict_to_date( - dateDischargeICU) - if events.get('dateIsolation'): - dateIsolation = events['dateIsolation'] - converted['events']['dateIsolation'] = convert_dict_to_date( - dateIsolation) - if events.get('dateDeath'): - dateDeath = events['dateDeath'] - converted['events']['dateDeath'] = convert_dict_to_date(dateDeath) - if events.get('dateRecovered'): - dateRecovered = events['dateRecovered'] - converted['events']['dateRecovered'] = convert_dict_to_date( - dateRecovered) + if vaccination := case.get("vaccination"): + date = vaccination["vaccineDate"] + converted["vaccination"]["vaccineDate"] = convert_dict_to_date(date) + if travelHistory := case.get("travelHistory"): + date = travelHistory["travelHistoryEntry"] + converted["travelHistory"]["travelHistoryEntry"] = convert_dict_to_date(date) + events = case.get("events", {}) + if date := events.get("dateEntry"): + converted["events"]["dateEntry"] = convert_dict_to_date(date) + if date := events.get("dateOnset"): + converted["events"]["dateOnset"] = convert_dict_to_date(date) + if date := events.get("dateReported"): + converted["events"]["dateReported"] = convert_dict_to_date(date) + if date := events.get("dateLastModified"): + converted["events"]["dateLastModified"] = convert_dict_to_date(date) + if date := events.get("dateConfirmation"): + converted["events"]["dateConfirmation"] = convert_dict_to_date(date) + if date := events.get("dateOfFirstConsult"): + converted["events"]["dateOfFirstConsult"] = convert_dict_to_date(date) + if date := events.get("dateHospitalization"): + converted["events"]["dateHospitalization"] = convert_dict_to_date(date) + if date := events.get("dateDischargeHospital"): + converted["events"]["dateDischargeHospital"] = convert_dict_to_date(date) + if date := events.get("dateAdmissionICU"): + converted["events"]["dateAdmissionICU"] = convert_dict_to_date(date) + if date := events.get("dateDischargeICU"): + converted["events"]["dateDischargeICU"] = convert_dict_to_date(date) + if date := events.get("dateIsolation"): + converted["events"]["dateIsolation"] = convert_dict_to_date(date) + if date := events.get("dateDeath"): + converted["events"]["dateDeath"] = convert_dict_to_date(date) + if date := events.get("dateRecovered"): + converted["events"]["dateRecovered"] = convert_dict_to_date(date) return converted def api_key_for_generated_curator(base_url: str) -> str: """Create a user and retrieve their API key.""" - register_user_endpoint = f'{base_url}/auth/register' + register_user_endpoint = f"{base_url}/auth/register" user = { - 'name': 'G.h test data importer', - 'email': f'robot_{time.time()}@global.health', - 'roles': ['curator'], + "name": "G.h test data importer", + "email": f"robot_{time.time()}@global.health", + "roles": ["curator"], } try: response = requests.post(register_user_endpoint, json=user) if response.ok: - return response.json()['apiKey'] + return response.json()["apiKey"] else: - print(f'Failure registering test user: {response.text}') + print(f"Failure registering test user: {response.text}") sys.exit(1) - except (requests.ConnectionError, requests.ConnectTimeout, requests.HTTPError, requests.ReadTimeout, requests.Timeout) as e: - print(f'Error {e} registering a curator at {base_url}') + except ( + requests.ConnectionError, + requests.ConnectTimeout, + requests.HTTPError, + requests.ReadTimeout, + requests.Timeout, + ) as e: + print(f"Error {e} registering a curator at {base_url}") sys.exit(1) @@ -117,37 +104,41 @@ def main(): You can set an API key using the environment variable $GH_API_KEY. If you do not, then this script will register a new curator user and use their API key; this only works in local testing.""" - base_url = os.getenv('GH_BASE_URL', 'http://localhost:3001') - if not (api_key := os.getenv('GH_API_KEY')): + base_url = os.getenv("GH_BASE_URL", "http://localhost:3001") + if not (api_key := os.getenv("GH_API_KEY")): api_key = api_key_for_generated_curator(base_url) batch_upsert_endpoint = f"{base_url}/api/cases/batchUpsert" with open("../../samples/day0cases.json") as f: sample_cases = json.load(f) converted_cases = [convert_case(c) for c in sample_cases] - request_body = { - "cases": converted_cases - } - request_headers = { - 'X-Api-Key': api_key - } + request_body = {"cases": converted_cases} + request_headers = {"X-Api-Key": api_key} try: response = requests.post( - batch_upsert_endpoint, json=request_body, headers=request_headers) + batch_upsert_endpoint, json=request_body, headers=request_headers + ) if response.ok: report = response.json() print( - f"Success response from API. {report['numCreated']} cases created, {report['numUpdated']} updated.") - if errors := report.get('errors'): + f"Success response from API. {report['numCreated']} cases created, {report['numUpdated']} updated." + ) + if errors := report.get("errors"): print(f"Errors: {errors}") sys.exit(0) else: print("Unsuccessful in importing sample cases") print(response.text) sys.exit(1) - except (requests.ConnectionError, requests.ConnectTimeout, requests.HTTPError, requests.ReadTimeout, requests.Timeout) as e: - print(f'Error {e} upserting sample cases to {base_url}') + except ( + requests.ConnectionError, + requests.ConnectTimeout, + requests.HTTPError, + requests.ReadTimeout, + requests.Timeout, + ) as e: + print(f"Error {e} upserting sample cases to {base_url}") sys.exit(1) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/dev/Dockerfile-batch b/dev/Dockerfile-batch deleted file mode 100644 index 537cc3d1d..000000000 --- a/dev/Dockerfile-batch +++ /dev/null @@ -1,10 +0,0 @@ -FROM python:3.10-slim - -# download https://github.com/docker/docker-credential-helpers/releases/download/v0.6.4/docker-credential-pass-v0.6.4-amd64.tar.gz -# extract it - -# install pass? - -COPY ./batch.py ./ - -RUN [ "python", "./batch.py" ] diff --git a/dev/Dockerfile-ingestion b/dev/Dockerfile-ingestion deleted file mode 100644 index 689e0a8a6..000000000 --- a/dev/Dockerfile-ingestion +++ /dev/null @@ -1,73 +0,0 @@ -# `python-base` sets up all our shared environment variables -FROM python:3.10-slim as python-base - -ENV PYTHONUNBUFFERED=1 \ - # prevents python creating .pyc files - PYTHONDONTWRITEBYTECODE=1 \ - \ - PIP_NO_CACHE_DIR=off \ - PIP_DISABLE_PIP_VERSION_CHECK=on \ - PIP_DEFAULT_TIMEOUT=100 \ - \ - # https://python-poetry.org/docs/configuration/#using-environment-variables - POETRY_VERSION=1.2.2 \ - # make poetry install to this location - POETRY_HOME="/opt/poetry" \ - # make poetry create the virtual environment in the project's root - # it gets named `.venv` - POETRY_VIRTUALENVS_IN_PROJECT=true \ - # do not ask any interactive question - POETRY_NO_INTERACTION=1 \ - \ - # this is where our requirements + virtual environment will live - PYSETUP_PATH="/opt/pysetup" \ - VENV_PATH="/opt/pysetup/.venv" - -# prepend poetry and venv to path -ENV PATH="$POETRY_HOME/bin:$VENV_PATH/bin:$PATH" - -# `builder-base` stage is used to build deps + create our virtual environment -FROM python-base as builder-base -RUN apt-get update \ - && apt-get install --no-install-recommends -y curl - -# install poetry - respects $POETRY_VERSION & $POETRY_HOME -RUN curl -sSL https://install.python-poetry.org | python3 - - -# copy project requirement files here to ensure they will be cached. -WORKDIR $PYSETUP_PATH -COPY poetry.lock pyproject.toml ./ - -ENV PATH="${PATH}:/root/.poetry/bin" - -# install runtime deps - uses $POETRY_VIRTUALENVS_IN_PROJECT internally -RUN poetry install --no-dev - -# `development` image is used during development / testing -FROM python-base as development - -RUN apt-get update && apt-get upgrade -y curl \ - awscli - -WORKDIR $PYSETUP_PATH - -# copy in our built poetry + venv -COPY --from=builder-base $POETRY_HOME $POETRY_HOME -COPY --from=builder-base $PYSETUP_PATH $PYSETUP_PATH -ENV PATH="${PATH}:/root/.poetry/bin" - -ARG NOTIFY_WEBHOOK_URL -ENV NOTIFY_WEBHOOK_URL=${NOTIFY_WEBHOOK_URL} -ENV EPID_INGESTION_ENV "XXXXXXXXXXX" -ENV EPID_INGESTION_SOURCE_ID "XXXXXXXXXXX" - -# will become mountpoint of our code -WORKDIR /app - -COPY ./setup_ingestion.py ./ -COPY poetry.lock pyproject.toml ./ - -# quicker install as runtime deps are already installed -RUN poetry install --no-dev - -CMD [ "python", "./setup_ingestion.py" ] diff --git a/dev/Dockerfile-mock-source-data b/dev/Dockerfile-mock-source-data deleted file mode 100644 index 2720f2258..000000000 --- a/dev/Dockerfile-mock-source-data +++ /dev/null @@ -1,73 +0,0 @@ -# `python-base` sets up all our shared environment variables -FROM python:3.10-slim as python-base - -ENV PYTHONUNBUFFERED=1 \ - # prevents python creating .pyc files - PYTHONDONTWRITEBYTECODE=1 \ - \ - PIP_NO_CACHE_DIR=off \ - PIP_DISABLE_PIP_VERSION_CHECK=on \ - PIP_DEFAULT_TIMEOUT=100 \ - \ - # https://python-poetry.org/docs/configuration/#using-environment-variables - POETRY_VERSION=1.2.2 \ - # make poetry install to this location - POETRY_HOME="/opt/poetry" \ - # make poetry create the virtual environment in the project's root - # it gets named `.venv` - POETRY_VIRTUALENVS_IN_PROJECT=true \ - # do not ask any interactive question - POETRY_NO_INTERACTION=1 \ - \ - # this is where our requirements + virtual environment will live - PYSETUP_PATH="/opt/pysetup" \ - VENV_PATH="/opt/pysetup/.venv" - -# prepend poetry and venv to path -ENV PATH="$POETRY_HOME/bin:$VENV_PATH/bin:$PATH" - -# `builder-base` stage is used to build deps + create our virtual environment -FROM python-base as builder-base -RUN apt-get update \ - && apt-get install --no-install-recommends -y curl - -# install poetry - respects $POETRY_VERSION & $POETRY_HOME -RUN curl -sSL https://install.python-poetry.org | python3 - - -# copy project requirement files here to ensure they will be cached. -WORKDIR $PYSETUP_PATH -COPY poetry.lock pyproject.toml ./ - -ENV PATH="${PATH}:/root/.poetry/bin" - -# install runtime deps - uses $POETRY_VIRTUALENVS_IN_PROJECT internally -RUN poetry install --no-dev - -# `development` image is used during development / testing -FROM python-base as development - -RUN apt-get update && apt-get upgrade -y curl \ - awscli - -WORKDIR $PYSETUP_PATH - -# copy in our built poetry + venv -COPY --from=builder-base $POETRY_HOME $POETRY_HOME -COPY --from=builder-base $PYSETUP_PATH $PYSETUP_PATH -ENV PATH="${PATH}:/root/.poetry/bin" - -ARG NOTIFY_WEBHOOK_URL -ENV NOTIFY_WEBHOOK_URL=${NOTIFY_WEBHOOK_URL} -ENV EPID_INGESTION_ENV "XXXXXXXXXXX" -ENV EPID_INGESTION_SOURCE_ID "XXXXXXXXXXX" - -# will become mountpoint of our code -WORKDIR /app - -COPY ./mock_source_data.py ./ -COPY poetry.lock pyproject.toml ./ - -# quicker install as runtime deps are already installed -RUN poetry install --no-dev - -CMD [ "python", "./mock_source_data.py" ] diff --git a/dev/README.md b/dev/README.md index fbdefd7ba..e5c2bf224 100644 --- a/dev/README.md +++ b/dev/README.md @@ -8,8 +8,6 @@ This directory contains scripts to set up, run, and test the full stack during d - `setup-db.sh`: A script to that connects to your locally-running MongoDB instance (and ONLY that instance!) and (re-)creates the database and collection, applies the schema, creates indexes, and inserts some sample data. - `test_all.sh`: A script to run all of the tests from the sub-packages. Uses `run_full_stack.sh`. -- `run_session.py`: Creates a new user, logs in, requests downloads from the curator service, and checks each download for formatting and contents. -- `parsing.py`: Lists, describes, and runs local end-to-end parsers What, exactly, is this stack that we're running and/or testing? All of the components of this repo working together: a curator UI server that talks to a curator API server that talks to a data server. More concretely, a user can log into @@ -50,14 +48,7 @@ LOCALSTACK_API_KEY= **Note:** Local end-to-end testing, which uses `parsing.py` with either `run_full_stack.sh` or `test_full_stack.sh`, requires `LOCALSTACK_API_KEY` in order to use the paid features of Localstack. -These values are stored in a dedicated secret manager. To request AWS credentials, or for access to -other secret values, contact one of: - -- Christopher.Remmel@childrens.harvard.edu -- Gaurav.Tuli@childrens.harvard.edu -- Spencer.Marks@childrens.harvard.edu - -Note that for local development, it's fine to use your own values for these +For local development, it's fine to use your own values for these secrets if you have them. For instance, if you have a developer Mapbox API token, or if you'd like to use a different GMail account for mailing notifications, or different OAuth client values. @@ -217,10 +208,6 @@ use covid19 db.cases.remove({}) ``` -## IDE setup - -If you're using VSCode, `.vscode/settings.json` contains useful default settings for working with Typescript and NodeJS. - ## Update of dependencies You can update all node dependencies for the services to their latest minor version by running the `dev/update_deps.sh` script. diff --git a/dev/docker-compose.dev.full.test.yml b/dev/docker-compose.dev.full.test.yml index 123663b98..0259de5d7 100644 --- a/dev/docker-compose.dev.full.test.yml +++ b/dev/docker-compose.dev.full.test.yml @@ -19,6 +19,10 @@ services: STATIC_DIR: "" ENABLE_LOCAL_AUTH: "true" DISEASE_NAME: "${DISEASE_NAME}" + BASE_URL: "${BASE_URL}" + COMPLETE_DATA_BUCKET: "${COMPLETE_DATA_BUCKET}" + COUNTRY_DATA_BUCKET: "${COUNTRY_DATA_BUCKET}" + REACT_APP_RECAPTCHA_SITE_KEY: "${REACT_APP_RECAPTCHA_SITE_KEY}" data: command: "npm run dev" volumes: @@ -42,7 +46,7 @@ services: REACT_APP_COOKIE_CONSENT_PUBLIC_ID: "${REACT_APP_COOKIE_CONSENT_PUBLIC_ID}" ENABLE_LOCAL_AUTH: "true" localstack: - image: localstack/localstack-full + image: localstack/localstack-pro ports: - "53:53" - "443:443" @@ -64,29 +68,6 @@ services: timeout: 10s retries: 3 start_period: 10s - mock-source-data: - build: - context: ./ - dockerfile: Dockerfile-mock-source-data - ports: - - "5001:5001" - volumes: - - "../ingestion/functions:/ingestion/functions" - environment: - MOCK_SOURCE_DATA_HOST: "0.0.0.0" - MOCK_SOURCE_DATA_PORT: 5001 - MOCK_SOURCE_DATA_SERVICE: "http://mock-source-data" - AWS_ACCESS_KEY_ID: "fake" - AWS_SECRET_ACCESS_KEY: "fake" - AWS_DEFAULT_REGION: "eu-central-1" - AWS_ENDPOINT: "http://localstack:4566" - RETRIEVAL_BUCKET_NAME: "gdh-sources" - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:5001/health"] - interval: 30s - timeout: 10s - retries: 3 - start_period: 10s test: build: context: ./ diff --git a/dev/docker-compose.dev.full.yml b/dev/docker-compose.dev.full.yml index 71ae24513..fa669b6ce 100644 --- a/dev/docker-compose.dev.full.yml +++ b/dev/docker-compose.dev.full.yml @@ -4,6 +4,7 @@ services: environment: DEBUG: "True" ENABLE_FAKE_GEOCODER: "True" + DB: "${DISEASE_NAME}" mongo: volumes: - "../verification/scripts:/verification/scripts" @@ -22,6 +23,11 @@ services: STATIC_DIR: "" ENABLE_LOCAL_AUTH: "true" DISEASE_NAME: "${DISEASE_NAME}" + BASE_URL: "${BASE_URL}" + COMPLETE_DATA_BUCKET: "${COMPLETE_DATA_BUCKET}" + COUNTRY_DATA_BUCKET: "${COUNTRY_DATA_BUCKET}" + REACT_APP_RECAPTCHA_SITE_KEY: "${REACT_APP_RECAPTCHA_SITE_KEY}" + NODE_ENV: "dev" data: command: "npm run dev" volumes: @@ -31,6 +37,7 @@ services: - mongo environment: SERVICE_ENV: "local" + NODE_ENV: "dev" curatorui: command: "npm run start-noenv" volumes: @@ -47,7 +54,7 @@ services: ENABLE_LOCAL_AUTH: "true" DISEASE_NAME: "${DISEASE_NAME}" localstack: - image: localstack/localstack-full + image: localstack/localstack-pro ports: - "53:53" - "443:443" @@ -61,7 +68,7 @@ services: AWS_ACCESS_KEY_ID: "fake" AWS_SECRET_ACCESS_KEY: "fake" LOCALSTACK_API_KEY: "${LOCALSTACK_API_KEY}" - SERVICES: s3,ec2,ses,batch,events,iam,lambda,ecr + SERVICES: s3,ec2,ses,batch,events,iam,ecr DEBUG: 1 healthcheck: test: ["CMD", "curl", "-f", "http://localhost:4566/health"] @@ -82,49 +89,4 @@ services: DATA_BUCKET_NAME: "covid-19-data-export" CACHE_BUCKET_NAME: "covid-19-country-export" RETRIEVAL_BUCKET_NAME: "gdh-sources" - BATCH_QUEUE_NAME: "ingestion-queue" SES_EMAIL_ADDRESS: "info@global.health" - ECR_REPOSITORY_NAME: "gdh-ingestor" - setup-ingestion: - build: - context: ./ - dockerfile: Dockerfile-ingestion - depends_on: - - setup-localstack - volumes: - - "../ingestion/functions:/ingestion/functions" - - "/var/run/docker.sock:/var/run/docker.sock" - environment: - AWS_ACCESS_KEY_ID: "fake" - AWS_SECRET_ACCESS_KEY: "fake" - AWS_DEFAULT_REGION: "eu-central-1" - AWS_ENDPOINT: "http://localstack:4566" - RETRIEVAL_BUCKET_NAME: "gdh-sources" - BATCH_QUEUE_NAME: "ingestion-queue" - ECR_REPOSITORY_NAME: "gdh-ingestor" - MOCK_SOURCE_DATA_SERVICE: "http://mock-source-data" - MOCK_SOURCE_DATA_PORT: 5001 - CLIENT_EMAIL: "fake@fake.fake" - mock-source-data: - build: - context: ./ - dockerfile: Dockerfile-mock-source-data - ports: - - "5001:5001" - volumes: - - "../ingestion/functions:/ingestion/functions" - environment: - MOCK_SOURCE_DATA_HOST: "0.0.0.0" - MOCK_SOURCE_DATA_PORT: 5001 - MOCK_SOURCE_DATA_SERVICE: "http://mock-source-data" - AWS_ACCESS_KEY_ID: "fake" - AWS_SECRET_ACCESS_KEY: "fake" - AWS_DEFAULT_REGION: "eu-central-1" - AWS_ENDPOINT: "http://localstack:4566" - RETRIEVAL_BUCKET_NAME: "gdh-sources" - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:5001/health"] - interval: 30s - timeout: 10s - retries: 3 - start_period: 10s diff --git a/dev/mock_source_data.py b/dev/mock_source_data.py deleted file mode 100644 index 934f92a13..000000000 --- a/dev/mock_source_data.py +++ /dev/null @@ -1,177 +0,0 @@ -from copy import deepcopy -from os import environ, path -from pathlib import Path - -import boto3 -from flask import Flask, request -from flask_api import status - - -FLASK_HOST = environ.get("FLASK_HOST", "0.0.0.0") -FLASK_PORT = environ.get("FLASK_PORT", 5001) - -LOCALSTACK_URL = environ.get("AWS_ENDPOINT", "http://localstack:4566") -BUCKET_NAME = environ.get("RETRIEVAL_BUCKET_NAME", "gdh-sources") -S3_BUCKET_URL = f"s3://{BUCKET_NAME}" - -SOURCE_DETAILS = { - "origin": { - "url": "" - }, - "format": "", - "automation": { - "parser": { - "awsLambdaArn": "", - }, - }, - "dateFilter": "", - "hasStableIdentifiers": False -} - -SOURCE_NAMES_TO_PARSERS = {} - -SOURCE_IDS_TO_NAMES = {} - -UPLOAD_RESPONSE = { - "_id": "".join("0" for i in range(24)) -} - -PARSERS_PATH = "/ingestion/functions/parsing" - -app = Flask(__name__) - - -def set_names_to_parsers(): - for path in Path(PARSERS_PATH).iterdir(): - print(f"Checking path {path}") - if path.is_dir(): - print(f"Path {path} is a directory") - sample_data_files = list(path.glob("sample_data.*")) - if len(sample_data_files) == 1: - name = path.stem.lower() - # if there are .py files, get the non "test"/"___init__" .py file and remove the extension - parser_files = [f.stem for f in list(path.glob("*.py")) if "test" not in str(f) and "__init__" not in str(f)] - print(f"Parser file candidates: {parser_files}") - if len(parser_files) == 1: - file_name = parser_files[0] - parser = f"{path.stem}-{file_name}-ingestor-locale2e" - SOURCE_NAMES_TO_PARSERS[name] = parser - elif name in parser_files: - parser = f"{path.stem}-{name}-ingestor-locale2e" - SOURCE_NAMES_TO_PARSERS[name] = parser - else: - print(f"No single identifiable parser file for source {name}") - else: - print(f"No single sample_data file in directory {path}") - print("Got parsers from file system") - print(f"Source names to parsers: {SOURCE_NAMES_TO_PARSERS}") - - -class MockSourceData(object): - def __init__(self): - self.s3_client = boto3.client("s3", endpoint_url=LOCALSTACK_URL) - self.source_details = {} - - def get_sample_data_file(self, source_id): - source_name = SOURCE_IDS_TO_NAMES.get(source_id) - if not source_name: - raise Exception(f"Missing source name for source id {source_id}") - - response = self.s3_client.list_objects( - Bucket=BUCKET_NAME, - Prefix=source_name - ) - objects = response.get("Contents", []) - if not objects: - raise Exception(f"No sample data files present for {source_name}") - obj = objects[0] - obj_key = obj.get("Key") - if not obj_key: - raise Exception(f"No object key present for {source_name}") - return obj_key - - def make_source_details(self, source_id, file_name): - source_details = deepcopy(SOURCE_DETAILS) - ext = path.splitext(file_name)[1] - source_details["origin"]["url"] = f"s3://{BUCKET_NAME}/{file_name}" - source_details["format"] = ext.replace(".", "").upper() - - source_name = SOURCE_IDS_TO_NAMES.get(source_id) - print(f"Source name for id {source_id}: {source_name}") - if not source_name: - raise Exception(f"Missing source name for source id {source_id}") - - source_details["automation"]["parser"]["awsLambdaArn"] = SOURCE_NAMES_TO_PARSERS.get(source_name) - - self.source_details[source_id] = source_details - print(f"Source details in object now {self.source_details}") - return source_details - - -msd = MockSourceData() - - -@app.route("/health") -def healthcheck(): - return "OK", status.HTTP_200_OK - - -@app.route("/names") -def get_all_source_ids(): - return SOURCE_IDS_TO_NAMES, status.HTTP_200_OK - - -@app.route("/names/") -def get_source_id(source_name): - vals = list(SOURCE_IDS_TO_NAMES.values()) - if source_name in vals: - return list(SOURCE_IDS_TO_NAMES.keys())[vals.index(source_name)], status.HTTP_200_OK - return f"Source ID for {source_name} not found", status.HTTP_404_NOT_FOUND - - -@app.route("/sources") -def get_all_source_details(): - return msd.source_details, status.HTTP_200_OK - - -@app.route("/sources/") -def get_source_details(source_id): - source_details = msd.source_details.get(source_id) - if source_details: - return source_details, status.HTTP_200_OK - - file_name = msd.get_sample_data_file(source_id) - source_details = msd.make_source_details(source_id, file_name) - - return source_details, status.HTTP_200_OK - - -@app.route("/sources//uploads", methods=["POST"]) -def post_upload(source_id): - print(f"NOOP on posting upload for source {source_id}") - return UPLOAD_RESPONSE, status.HTTP_201_CREATED - - -@app.route("/sources//uploads/", methods=["PUT"]) -def put_upload(source_id, upload_id): - print(f"NOOP on putting upload for source {source_id} and upload {upload_id}") - return "OK", status.HTTP_200_OK - - -@app.route("/sources", methods=["POST"]) -def map_id_to_name(): - payload = request.get_json() - source_id = payload.get("source_id") - source_name = payload.get("source_name") - if not source_id or not source_name: - return f"Invalid request. Source ID: {source_id}, source name: {source_name}", status.HTTP_400_BAD_REQUEST - if SOURCE_IDS_TO_NAMES.get(source_id): - return "OK", status.HTTP_200_OK - print(f"Mapping source id {source_id} to source name {source_name}") - SOURCE_IDS_TO_NAMES[source_id] = source_name - return "OK", status.HTTP_201_CREATED - - -if __name__ == "__main__": - set_names_to_parsers() - app.run(FLASK_HOST, FLASK_PORT, debug=True) diff --git a/dev/parsing.py b/dev/parsing.py deleted file mode 100755 index ffc9a88b4..000000000 --- a/dev/parsing.py +++ /dev/null @@ -1,262 +0,0 @@ -#!/usr/bin/env python3 -import argparse -import base64 -from os import environ, listdir -from pathlib import Path -import re -import subprocess -import sys - -import boto3 -import docker - - -LOCALSTACK_URL = environ.get("AWS_ENDPOINT", "http://localhost:4566") - -AWS_ACCESS_KEY_ID = environ.get("AWS_ACCESS_KEY_ID", "fake") -AWS_SECRET_ACCESS_KEY = environ.get("AWS_SECRET_ACCESS_KEY", "fake") -AWS_DEFAULT_REGION = environ.get("AWS_DEFAULT_REGION","eu-central-1") - -RETRIEVAL_BUCKET_NAME = environ.get("RETRIEVAL_BUCKET_NAME", "gdh-sources") -ECR_REPOSITORY_NAME = environ.get("ECR_REPOSITORY_NAME", "gdh-ingestor") - -CONTAINER_VCPUS = 1 -CONTAINER_MEMORY = 2048 - -DOCKERFILE_PATH = "../ingestion/functions" -PARSERS_PATH = "../ingestion/functions/parsing" - - -class JobRunner(object): - - def __init__(self): - self.batch_client = boto3.client( - service_name="batch", - endpoint_url=LOCALSTACK_URL, - aws_access_key_id=AWS_ACCESS_KEY_ID, - aws_secret_access_key=AWS_SECRET_ACCESS_KEY, - verify=False - ) - self.ecr_client = boto3.client( - service_name="ecr", - endpoint_url=LOCALSTACK_URL, - aws_access_key_id=AWS_ACCESS_KEY_ID, - aws_secret_access_key=AWS_SECRET_ACCESS_KEY, - verify=False - ) - self.s3_client = boto3.client(service_name="s3") - self.docker_client = docker.from_env() - self.ecr_repository = "" - self.set_ecr_config() - - parser = argparse.ArgumentParser( - description="Get information about AWS Batch job defition(s) or run AWS Batch jobs using job definitions", - usage=""" - python batch.py [] - - run Run Batch job with given job definition name(s) - list List Batch job definition(s) - describe Get detailed information about Batch job definition(s) - upload Upload a sample data file for a parser - build Build a Docker image for a parser - """ - ) - parser.add_argument("command", help="Command to run") - args = parser.parse_args(sys.argv[1:2]) - getattr(self, args.command)() - - def run(self): - parser = argparse.ArgumentParser( - prog="run_batch_jobs.py run", - description="Run Batch job definitions", - ) - parser.add_argument( - "job_definition_names", help="Name(s) of job definition(s) to run", nargs="*", default=None - ) - args = parser.parse_args(sys.argv[2:]) - if args.job_definition_names: - for name in args.job_definition_names: - self.run_job(name) - else: - self.run_all_jobs() - - def run_all_jobs(self): - job_definition_names = self.get_job_definition_names() - print(f"All job definition names") - errors = [] - for name in job_definition_names: - try: - self.run_job(name) - except Exception as exc: - print(f"An error occurred while running the {name} job definition: {exc}") - errors.append(exc) - print(f"Errors running all jobs: {errors}") - - def get_job_definition_names(self): - response = self.batch_client.describe_job_definitions() - job_definitions = response.get("jobDefinitions") - return [jd.get("jobDefinitionName") for jd in job_definitions] - - def run_job(self, name): - - print(f"Running container for job definition name: {name}") - - # TODO: use self.client.submit_job() - # blocked by https://github.com/localstack/localstack/issues/4643 - - # Get environment variables from Batch for docker-py - env_vars = self.get_container_env_vars(name) - - # jank but functional since other images get built by local Docker and not removed - - # TODO: port forwarding for HTTP, HTTPS - logs = self.docker_client.containers.run( - image=name, - environment=env_vars, - network_mode="host" - ) - - print(f"Running job for job definition {name}") - - def get_container_env_vars(self, name): - response = self.batch_client.describe_job_definitions( - jobDefinitionName=name - ) - print(f"Response from Batch {response}") - job_definitions = response.get("jobDefinitions") - container_props = job_definitions[0].get("containerProperties", {}) - environment = container_props.get("environment", [{}]) - env_vars = {} - for kv_pair in environment: - key = kv_pair.get("name") - value = kv_pair.get("value") - env_vars[key] = value - return env_vars - - def list(self): - parser = argparse.ArgumentParser( - prog="run_batch_jobs.py list", - description="List Batch job definitions", - ) - parser.add_argument( - "job_definition_names", help="Name(s) of job definition to check existence of", nargs="*", default=None - ) - args = parser.parse_args(sys.argv[2:]) - if args.job_definition_names: - names = [] - for name in args.job_definition_names: - job_definitions = self.get_job_definitions(name) - names.append([j.get("jobDefinitionName", "") for j in job_definitions][0]) - print(f"Job definitions: {names}") - else: - job_definitions = self.get_job_definitions() - names = [j.get("jobDefinitionName", "") for j in job_definitions] - print(f"Job definitions: {names}") - - def get_job_definitions(self, name=None): - if name: - jobs = self.batch_client.describe_job_definitions( - jobDefinitionName=name - ) - else: - jobs = self.batch_client.describe_job_definitions() - if jobs["ResponseMetadata"]["HTTPStatusCode"] != 200: - raise Exception(f"Could not get Batch job definitions from {LOCALSTACK_URL}") - return jobs.get("jobDefinitions", []) - - def describe(self): - parser = argparse.ArgumentParser( - prog="run_batch_jobs.py describe", - description="Describe Batch job definitions", - ) - parser.add_argument( - "job_definition_names", help="Name(s) of job definition to describe", nargs="*", default=None - ) - args = parser.parse_args(sys.argv[2:]) - if args.job_definition_names: - for name in args.job_definition_names: - response = self.batch_client.describe_job_definitions( - jobDefinitionName=name - ) - print(f"Job definition for parser {name}: {response}") - else: - response = self.batch_client.describe_job_definitions() - print(f"Job definitions: {response}") - - def upload(self): - parser = argparse.ArgumentParser( - prog="run_batch_jobs.py upload", - description="Upload sample_data file for parser", - ) - parser.add_argument( - "job_definition_name", help="Name of job definition to upload a sample_data file for", nargs="?", default=None - ) - args = parser.parse_args(sys.argv[2:]) - if not args.job_definition_name: - raise Exception("A job definition name is required to upload a sample_data file") - for path in Path(PARSERS_PATH).iterdir(): - print(f"Checking path {path}") - if path.is_dir() and path.parts[-1].lower() == args.job_definition_name: - sample_data_files = list(path.glob("sample_data.*")) - if len(sample_data_files) == 1: - data_file = sample_data_files[0] - file_path = str(data_file) - file_name = data_file.name.lower() - data_set = path.stem.lower() - print(f"Uploading sample data file from {file_path}") - try: - self.s3_client.upload_file(file_path, RETRIEVAL_BUCKET_NAME, f"{data_set}_{file_name}") - print(f"Uploaded sample data file for parser {args.job_definition_name}") - return - except ClientError as err: - raise Exception(f"ClientError uploading S3 file: {err}") - else: - raise Exception(f"Could not find exactly one sample_data file for parser {args.job_definition_name}") - - raise Exception(f"Could locate parser {args.job_definition_name}") - - def build(self): - parser = argparse.ArgumentParser( - prog="run_batch_jobs.py build", - description="Build a Docker image for a parser", - ) - parser.add_argument( - "job_definition_name", help="Name of job definition build a Docker image for", nargs="?", default=None - ) - args = parser.parse_args(sys.argv[2:]) - if not args.job_definition_name: - raise Exception("A job definition name is required to build a Docker image") - - image_name = f"{self.ecr_repository}:{args.job_definition_name}" - image = self.docker_client.images.get(image_name) - if not image: - raise Exception(f"Could not find an existing image for parser {args.job_definition_name}") - - print(f"Creating image with tag {args.job_definition_name}") - - image, _ = self.docker_client.images.build( - path=DOCKERFILE_PATH, - tag=args.job_definition_name - ) - - print("Built image") - - try: - success = image.tag(repository=self.ecr_repository, tag=args.job_definition_name) - if not success: - print("Could not tag image") - exit(1) - except docker.errors.APIError as exc: - print(f"An error occurred trying to tag the image: {exc}") - - print(f"Tagged image as {args.job_definition_name}") - - def set_ecr_config(self): - token = self.ecr_client.get_authorization_token() - registry = token["authorizationData"][0]["proxyEndpoint"] - host = re.sub(r'^https?:\/\/', '', registry) - self.ecr_repository = f"{host}/{ECR_REPOSITORY_NAME}" - - -if __name__ == "__main__": - jr = JobRunner() diff --git a/dev/setup_ingestion.py b/dev/setup_ingestion.py deleted file mode 100644 index 2a3edb651..000000000 --- a/dev/setup_ingestion.py +++ /dev/null @@ -1,240 +0,0 @@ -import base64 -from os import environ, listdir -from pathlib import Path -from random import choice -import re -from string import digits -from sys import exit -from time import sleep - -import boto3 -from botocore.exceptions import ClientError -import docker -import requests - - -LOCALSTACK_URL = environ.get("AWS_ENDPOINT", "http://localstack:4566") -AWS_REGION = environ.get("AWS_DEFAULT_REGION", "eu-central-1") -AWS_ACCOUNT_ID = environ.get("AWS_ACCOUNT_ID", "000000000000") -AWS_ACCESS_KEY_ID = environ.get("AWS_ACCESS_KEY_ID", "fake") -AWS_SECRET_ACCESS_KEY = environ.get("AWS_SECRET_ACCESS_KEY", "fake") - -BATCH_QUEUE_NAME = environ.get("BATCH_QUEUE_NAME", "ingestion-queue") -ECR_REPOSITORY_NAME = environ.get("ECR_REPOSITORY_NAME", "gdh-ingestor") -RETRIEVAL_BUCKET_NAME = environ.get("RETRIEVAL_BUCKET_NAME", "gdh-sources") - -MOCK_SOURCE_DATA_URL = environ.get("MOCK_SOURCE_DATA_SERVICE", "http://mock-source-data") -MOCK_SOURCE_DATA_PORT = environ.get("MOCK_SOURCE_DATA_PORT", 5001) -MOCK_SOURCE_DATA_ADDRESS = f"{MOCK_SOURCE_DATA_URL}:{MOCK_SOURCE_DATA_PORT}" - -REGISTRATION_ENDPOINT = environ.get("REGISTRATION_ENDPOINT", "http://localhost:3001/auth/register") - -TESTING = environ.get("TESTING", False) - -DOCKERFILE_PATH = "/ingestion/functions" -PARSERS_PATH = "/ingestion/functions/parsing" - -CONTAINER_VCPUS = 1 -CONTAINER_MEMORY = 2048 - -CLIENT_EMAIL = environ.get("CLIENT_EMAIL", "fake@fake.fake") - -WAIT_TIME = 5 -WAIT_RETRIES = 42 - - -def make_source_id(): - return "".join(choice(digits) for i in range(24)) - - -def map_id_to_name(source_id, source_name): - payload = {"source_id": source_id, "source_name": source_name} - requests.post(f"{MOCK_SOURCE_DATA_ADDRESS}/sources", json=payload) - - -class IngestionWrangler(object): - - def __init__(self): - self.batch_client = boto3.client("batch", endpoint_url=LOCALSTACK_URL) - self.ecr_client = boto3.client("ecr", endpoint_url=LOCALSTACK_URL) - self.s3_client = boto3.client("s3", endpoint_url=LOCALSTACK_URL) - self.docker_client = docker.from_env() - self.parser_names = [] - self.ecr_username = "" - self.ecr_password = "" - self.ecr_repository = "" - - def wait_for_localstack_setup(self): - print("Waiting for localstack setup to finish") - counter = 0 - while counter < WAIT_RETRIES: - containers = self.docker_client.containers.list( - all = True, - filters = { - "exited": 0, - "name": "dev-setup-localstack-1" - } - ) - if containers: - print("Localstack setup finished") - return - counter += 1 - print("Waiting for localstack setup to finish") - sleep(WAIT_TIME) - raise Exception(f"Localstack setup did not finish in {WAIT_TIME * WAIT_RETRIES} seconds") - - def set_parser_names(self): - for path in Path(PARSERS_PATH).iterdir(): - print(f"Checking path {path}") - if path.is_dir(): - print(f"Path {path} is a directory") - sample_data_files = list(path.glob("sample_data.*")) - if len(sample_data_files) == 1: - # It needs to be lowercased to work with image.build?! - self.parser_names.append(path.stem.lower()) - print("Got parsers from file system") - print(f"Parsers: {self.parser_names}") - - def create_parser_images(self): - for name in self.parser_names: - self.create_parser_image(name) - - def create_parser_image(self, tag): - print(f"Creating image with tag {tag}") - - image, _ = self.docker_client.images.build( - path=DOCKERFILE_PATH, - tag=tag - ) - - print("Created image") - - try: - success = image.tag(repository=self.ecr_repository, tag=tag) - if not success: - print("Could not tag image") - exit(1) - except docker.errors.APIError as exc: - print(f"An error occurred trying to tag the image: {exc}") - - print("Tagged image") - - def set_ecr_config(self): - token = self.ecr_client.get_authorization_token() - username, password = base64.b64decode(token["authorizationData"][0]["authorizationToken"]).decode().split(":") - print(f"ECR username and password: {username} {password}") - self.ecr_username = username - self.ecr_password = password - registry = token["authorizationData"][0]["proxyEndpoint"] - print(f"Registry: {registry}") - host = re.sub(r'^https?:\/\/', '', registry) - self.ecr_repository = f"{host}/{ECR_REPOSITORY_NAME}" - - def login_to_ecr(self): - print("Logging in to Docker repository") - - response = self.docker_client.login( - username=self.ecr_username, - password=self.ecr_password, - registry=self.ecr_repository - ) - - print(f"Response from login: {response}") - - print("Logged in to Docker repository") - - def upload_parser_images(self): - for name in self.parser_names: - self.upload_parser_image(name) - # TODO: remove images from Docker, let Batch pull from ECR - - def upload_parser_image(self, tag): - print(f"Uploading Docker image with tag {tag} to ECR") - response = [line for line in self.docker_client.images.push(repository=self.ecr_repository, stream=True)] - print(f"Response from push: {response}") - print("Uploaded Docker images") - - print("Checking for images") - images = self.ecr_client.list_images( - repositoryName=ECR_REPOSITORY_NAME - ) - print(f"Images in ECR: {images}") - - image_ids = images.get("imageIds", []) - image_tags = [image.get("imageTag") for image in image_ids] - - print(f"Image tags in ECR: {image_tags}") - - if tag not in image_tags: - print(f"Image tagged with {tag} not in ECR") - exit(1) - - print(f"Image tagged with {tag} in ECR") - - def create_batch_jobs(self): - for name in self.parser_names: - source_id = make_source_id() - map_id_to_name(source_id, name) - self.create_batch_job(name, source_id) - - def create_batch_job(self, tag, source_id): - print(f"Creating batch job for {tag}") - self.batch_client.register_job_definition( - jobDefinitionName=tag, - type="container", - containerProperties={ - "image": f"{AWS_ACCOUNT_ID}.dkr.ecr.{AWS_REGION}.amazonaws.com/{ECR_REPOSITORY_NAME}:{tag}", # tag? - "vcpus": CONTAINER_VCPUS, - "memory": CONTAINER_MEMORY, - "environment": [ - {"name": "DOCKERIZED", "value": "True"}, - {"name": "EPID_INGESTION_ENV", "value": "locale2e"}, - {"name": "EPID_INGESTION_SOURCE_ID", "value": source_id}, - {"name": "EPID_INGESTION_EMAIL", "value": CLIENT_EMAIL}, - {"name": "AWS_ENDPOINT", "value": "http://localhost:4566"}, - {"name": "AWS_ACCESS_KEY_ID", "value": AWS_ACCESS_KEY_ID}, - {"name": "AWS_SECRET_ACCESS_KEY", "value": AWS_SECRET_ACCESS_KEY}, - {"name": "AWS_REGION", "value": AWS_REGION}, - {"name": "MOCK_SOURCE_DATA_ADDRESS", "value": f"http://localhost:{MOCK_SOURCE_DATA_PORT}"}, - {"name": "REGISTRATION_ENDPOINT", "value": REGISTRATION_ENDPOINT} - ] - } - ) - - def upload_sample_data(self): - for path in Path(PARSERS_PATH).iterdir(): - print(f"Checking path {path}") - if path.is_dir(): - sample_data_files = list(path.glob("sample_data.*")) - if len(sample_data_files) == 1: - data_file = sample_data_files[0] - file_path = str(data_file) - file_name = data_file.name.lower() - data_set = path.stem.lower() - print(f"Uploading sample data file from {file_path}") - try: - self.s3_client.upload_file(file_path, RETRIEVAL_BUCKET_NAME, f"{data_set}_{file_name}") - except ClientError as err: - print(f"ClientError uploading S3 file: {err}") - exit(1) - print("Uploaded sample data file") - print("Uploaded all sample data files") - - -if __name__ == "__main__": - print("Setting up ingestion jobs") - iw = IngestionWrangler() - if not TESTING: - iw.wait_for_localstack_setup() - - iw.set_parser_names() - - iw.set_ecr_config() - iw.login_to_ecr() - - iw.create_parser_images() - iw.upload_parser_images() - - iw.upload_sample_data() - iw.create_batch_jobs() - print("Done setting up ingestion jobs") diff --git a/dev/setup_localstack.py b/dev/setup_localstack.py index 05a246890..33c40f47c 100644 --- a/dev/setup_localstack.py +++ b/dev/setup_localstack.py @@ -1,3 +1,4 @@ +import json from os import environ from time import sleep @@ -6,17 +7,31 @@ LOCALSTACK_URL = environ.get("AWS_ENDPOINT", "http://localstack:4566") -BATCH_READY = '"batch": "running"' +AWS_REGION = environ.get("AWS_DEFAULT_REGION", "eu-central-1") IAM_PROFILE_NAME = "ecsInstanceRole" -IAM_PROFILE_ARN = "".join(["arn:aws:iam::000000000000:instance-profile/", "ecsInstanceRole"]) +IAM_PROFILE_ARN = "".join( + ["arn:aws:iam::000000000000:instance-profile/", "ecsInstanceRole"] +) BATCH_SERVICE_ROLE_NAME = "foo" ECS_INSTANCE_ROLE_NAME = "ecsInstanceRole" -IAM_ROLE_POLICY_DOCUMENT = "file://./iam_role.json" +# IAM_ROLE_POLICY_DOCUMENT = "file://./iam_role.json" +IAM_ROLE_POLICY_DOCUMENT = json.dumps( + { + "Effect": "Allow", + "Action": ["iam:AttachRolePolicy", "iam:CreateRole", "iam:PutRolePolicy"], + "Resource": "*", + } +) EC2_SECURITY_GROUP_DESCRIPTION = "bar" EC2_SECURITY_GROUP_NAME = "sg-1234abcd" BATCH_COMPUTE_ENVIRONMENT_NAME = "M4Spot" -BATCH_COMPUTE_ENVIRONMENT_ARN = "".join(["arn:aws:batch:eu-central-1:000000000000:compute-environment/", BATCH_COMPUTE_ENVIRONMENT_NAME]) +BATCH_COMPUTE_ENVIRONMENT_ARN = "".join( + [ + "arn:aws:batch:eu-central-1:000000000000:compute-environment/", + BATCH_COMPUTE_ENVIRONMENT_NAME, + ] +) BATCH_COMPUTE_ENVIRONMENT_TYPE = "MANAGED" BATCH_COMPUTE_RESOURCES = { @@ -31,18 +46,14 @@ "securityGroupIds": [], "instanceRole": IAM_PROFILE_ARN, "ec2Configuration": [ - { - "imageType": "string", - "imageIdOverride": "string" - }, - ] + {"imageType": "string", "imageIdOverride": "string"}, + ], } BATCH_JOB_QUEUE_NAME = environ.get("BATCH_QUEUE_NAME", "ingestion-queue") -BATCH_COMPUTE_ENVIRONMENT_ORDER = [{ - "order": 1, - "computeEnvironment": BATCH_COMPUTE_ENVIRONMENT_ARN -}] +BATCH_COMPUTE_ENVIRONMENT_ORDER = [ + {"order": 1, "computeEnvironment": BATCH_COMPUTE_ENVIRONMENT_ARN} +] DATA_BUCKET_NAME = environ.get("DATA_BUCKET_NAME", "covid-19-data-export") CACHE_BUCKET_NAME = environ.get("CACHE_BUCKET_NAME", "covid-19-country-export") @@ -52,7 +63,6 @@ class LocalstackWrangler(object): - def __init__(self): self.iam_client = boto3.client("iam", endpoint_url=LOCALSTACK_URL) self.ec2_client = boto3.client("ec2", endpoint_url=LOCALSTACK_URL) @@ -64,23 +74,18 @@ def __init__(self): def create_iam_role(self, role_name): print(f"Creating IAM role {role_name} for Batch") self.iam_client.create_role( - RoleName=role_name, - AssumeRolePolicyDocument=IAM_ROLE_POLICY_DOCUMENT + RoleName=role_name, AssumeRolePolicyDocument=IAM_ROLE_POLICY_DOCUMENT ) print("Done creating role") def create_iam_profile(self, profile_name): print(f"Creating IAM profile {profile_name} for ECS instance") - self.iam_client.create_instance_profile( - InstanceProfileName=profile_name - ) + self.iam_client.create_instance_profile(InstanceProfileName=profile_name) print("Done creating profile") def get_iam_role_arn(self, role_name): print(f"Getting ARN for IAM role {role_name}") - response = self.iam_client.get_role( - RoleName=role_name - ) + response = self.iam_client.get_role(RoleName=role_name) role_info = response.get("Role", {}) arn = role_info.get("Arn", "") print(f"Got ARN {arn}") @@ -89,8 +94,7 @@ def get_iam_role_arn(self, role_name): def create_security_group(self, group_name): print(f"Creating security group {group_name}") self.ec2_client.create_security_group( - Description=EC2_SECURITY_GROUP_DESCRIPTION, - GroupName=group_name + Description=EC2_SECURITY_GROUP_DESCRIPTION, GroupName=group_name ) print("Created security group") @@ -104,15 +108,10 @@ def get_security_group_id(self): def create_subnet(self): print("Creating VPC and subnet") - response = self.ec2_client.create_vpc( - CidrBlock="10.0.0.0/16" - ) + response = self.ec2_client.create_vpc(CidrBlock="10.0.0.0/16") vpc_info = response.get("Vpc", {}) vpc_id = vpc_info.get("VpcId", {}) - self.ec2_client.create_subnet( - CidrBlock="10.0.2.0/24", - VpcId=vpc_id - ) + self.ec2_client.create_subnet(CidrBlock="10.0.2.0/24", VpcId=vpc_id) print("Created VPC and subnet") def get_subnet_id(self): @@ -123,7 +122,9 @@ def get_subnet_id(self): print(f"Got subnet ID {subnet_id}") return subnet_id - def create_compute_environment(self, security_group_id, batch_service_role_arn, subnet_id): + def create_compute_environment( + self, security_group_id, batch_service_role_arn, subnet_id + ): print(f"Creating compute environment for security group {security_group_id}") BATCH_COMPUTE_RESOURCES["securityGroupIds"].append(security_group_id) BATCH_COMPUTE_RESOURCES["subnets"].append(subnet_id) @@ -131,7 +132,7 @@ def create_compute_environment(self, security_group_id, batch_service_role_arn, computeEnvironmentName=BATCH_COMPUTE_ENVIRONMENT_NAME, type=BATCH_COMPUTE_ENVIRONMENT_TYPE, computeResources=BATCH_COMPUTE_RESOURCES, - serviceRole=batch_service_role_arn + serviceRole=batch_service_role_arn, ) print("Created security group") @@ -141,39 +142,37 @@ def create_batch_job_queue(self, queue_name): jobQueueName=queue_name, priority=1, state="ENABLED", - computeEnvironmentOrder=BATCH_COMPUTE_ENVIRONMENT_ORDER + computeEnvironmentOrder=BATCH_COMPUTE_ENVIRONMENT_ORDER, ) print("Created job queue") def create_s3_bucket(self, bucket_name): print(f"Creating bucket {bucket_name}") self.s3_client.create_bucket( - Bucket=bucket_name + Bucket=bucket_name, + CreateBucketConfiguration={"LocationConstraint": AWS_REGION}, ) print("Created bucket") def setup_ses(self, email_address): print(f"Verifying email address {email_address}") - self.ses_client.verify_email_identity( - EmailAddress=email_address - ) + self.ses_client.verify_email_identity(EmailAddress=email_address) print("Verified email address") def create_container_repository(self, repo_name): print(f"Creating container repository {repo_name}") - self.ecr_client.create_repository( - repositoryName=repo_name - ) + self.ecr_client.create_repository(repositoryName=repo_name) print("Created container repository") def wait_for_localstack(): - healthcheck_url = "".join([LOCALSTACK_URL, "/health"]) + healthcheck_url = "".join([LOCALSTACK_URL, "/_localstack/health"]) counter = 0 while counter < 42: try: response = requests.get(healthcheck_url) - if BATCH_READY in response.text: + batch_status = response.json().get("services", {}).get("batch") + if batch_status == "available": return except requests.exceptions.ConnectionError: pass diff --git a/geocoding/location-service/src/app/main.py b/geocoding/location-service/src/app/main.py index 3ec072248..44e11f32a 100644 --- a/geocoding/location-service/src/app/main.py +++ b/geocoding/location-service/src/app/main.py @@ -11,7 +11,7 @@ from src.app.geocoder import Geocoder from src.app.geocoder_suggester import GeocodeSuggester from src.app.utm_to_latlong import utmToLatLong -from src.integration.mapbox_client import mapbox_geocode + app = Flask(__name__) @@ -22,64 +22,72 @@ logger.addHandler(h) logger.setLevel(logging.INFO) -if 'ENABLE_FAKE_GEOCODER' in environ: - faking_it = Blueprint('fake_geocoder', __name__) +if "ENABLE_FAKE_GEOCODER" in environ: + faking_it = Blueprint("fake_geocoder", __name__) fake_geocoder = FakeGeocoder() - @faking_it.route("/geocode/seed", methods=['POST']) + + @faking_it.route("/geocode/seed", methods=["POST"]) def seed_fake_geocoder(): obj = request.json - fake_geocoder.seed(obj['name'], obj) - return '' + fake_geocoder.seed(obj["name"], obj) + return "" - @faking_it.route("/geocode/clear", methods=['POST']) + @faking_it.route("/geocode/clear", methods=["POST"]) def clear_fake_geocoder(): fake_geocoder.clear() - return '' + return "" geocoders.append(fake_geocoder) app.register_blueprint(faking_it) -if 'MAPBOX_TOKEN' in environ: - access_token = environ['MAPBOX_TOKEN'] +if "MAPBOX_TOKEN" in environ: + access_token = environ["MAPBOX_TOKEN"] mongo_client = None - if 'DB_CONNECTION_STRING' in environ: + if "DB_CONNECTION_STRING" in environ: # searching for 'pymongo can auth on command line but not in container' leads to suggestions # to add the 'authSource' parameter on connection ¯\_(ツ)_/¯ # e.g. https://www.reddit.com/r/learnpython/comments/m8ieht/am_trying_to_use_python_with_mongodb_and_am/ - mongo_client = pymongo.MongoClient(environ['DB_CONNECTION_STRING'], authSource='admin') - rate_limit = int(environ.get('MAPBOX_GEOCODE_RATE_LIMIT_PER_MIN', 600)) - admins_fetcher = AdminsFetcher(access_token, mongo_client.get_database(environ['DB']), rate_limit=rate_limit) + mongo_client = pymongo.MongoClient( + environ["DB_CONNECTION_STRING"], authSource="admin" + ) + rate_limit = int(environ.get("MAPBOX_GEOCODE_RATE_LIMIT_PER_MIN", 600)) + admins_fetcher = AdminsFetcher( + access_token, mongo_client.get_database(environ["DB"]), rate_limit=rate_limit + ) mapbox_geocoder = Geocoder(access_token, admins_fetcher, rate_limit=rate_limit) geocoders.append(mapbox_geocoder) suggester = GeocodeSuggester(geocoders) + @app.route("/health") def index() -> str: - if 'MAPBOX_TOKEN' not in environ: - return jsonify({ - "status": "Unhealthy", - "reason": "Mapbox API token is not present" - }), 500 + if "MAPBOX_TOKEN" not in environ: + return ( + jsonify( + {"status": "Unhealthy", "reason": "Mapbox API token is not present"} + ), + 500, + ) return jsonify({"status": "Healthy"}) @app.route("/geocode") def geocode(): - query = request.args.get('q', type=str) + query = request.args.get("q", type=str) if not query: logger.warning(f"No query supplied in request {request}") return "No query supplied", 400 logger.info(f"geocoding query {query}") options = {} - resolution = request.args.get('limitToResolution', '[]', type=str) + resolution = request.args.get("limitToResolution", "[]", type=str) listOfResolutions = json.loads(resolution) if len(listOfResolutions) > 0: - options['limitToResolution'] = listOfResolutions - countries = request.args.get('limitToCountry', '[]', type=str) + options["limitToResolution"] = listOfResolutions + countries = request.args.get("limitToCountry", "[]", type=str) listOfCountries = json.loads(countries) if len(listOfCountries) > 0: - options['limitToCountry'] = listOfCountries + options["limitToCountry"] = listOfCountries logger.debug(f"options {options}") for g in geocoders: locations = g.geocode(query, options) @@ -98,20 +106,23 @@ def suggest_geocode(): logger.info(f"suggestions: {r.get_data()}") return r except ValueError: - return f"Bad limitToResolution value {request.args.get('limitToResolution', str)}", 422 + return ( + f"Bad limitToResolution value {request.args.get('limitToResolution', str)}", + 422, + ) @app.route("/geocode/convertUTM") def convert_geocode(): - northing = request.args.get('n', type=float) + northing = request.args.get("n", type=float) if not northing: logger.warning(f"No northing supplied in request {request}") return "No northing supplied", 400 - easting = request.args.get('e', type=float) + easting = request.args.get("e", type=float) if not easting: logger.warning(f"No easting supplied in request {request}") return "No easting supplied", 400 - zone = request.args.get('z', type=int) + zone = request.args.get("z", type=int) if not zone: logger.warning(f"No zone specified in request {request}") return "No zone supplied", 400 @@ -121,43 +132,52 @@ def convert_geocode(): logger.error(f"Conversion failed for request {request}") return "Conversion failed", 500 position = { - 'latitude': latitude, - 'longitude': longitude, + "latitude": latitude, + "longitude": longitude, } return jsonify(position) + @app.route("/geocode/countryName") def country_name(): - code = request.args.get('c', type=str) + code = request.args.get("c", type=str) if not code: logger.warning(f"No country code in request {request}") return "No country code", 400 if len(code) != 2: - logger.warning(f"Country code {code} is not two characters long in request {request}") + logger.warning( + f"Country code {code} is not two characters long in request {request}" + ) return "Bad ISO-3166-1 country code", 400 country = iso3166.countries_by_alpha2.get(code) if country is None: return "Unknown country code", 404 return country.name, 200 + @app.route("/geocode/admin1") def suggest_admin1(): - admin0 = request.args.get('admin0', type=str) + admin0 = request.args.get("admin0", type=str) if not admin0: logger.warning(f"No country code in request args {request.args}") return "No country code", 400 if len(admin0) != 3: - logger.warning(f"Country code {admin0} is not three characters long in request {request}") + logger.warning( + f"Country code {admin0} is not three characters long in request {request}" + ) return "Bad ISO-3166-1 alpha-3 country code", 400 admin1Suggestions = suggester.suggest_admin1(admin0) if admin1Suggestions is None: - logger.warning(f"Unknown ISO-3166-1 alpha-3 country code {admin0} from request {request}") + logger.warning( + f"Unknown ISO-3166-1 alpha-3 country code {admin0} from request {request}" + ) return f"Unknown ISO-3166-1 alpha-3 country code {admin0}", 404 return jsonify(admin1Suggestions), 200 + @app.route("/geocode/admin2") def suggest_admin2(): - admin1WikiId = request.args.get('admin1WikiId', type=str) + admin1WikiId = request.args.get("admin1WikiId", type=str) if not admin1WikiId: logger.warning(f"No admin1WikiId in request {request}") return "No admin1WikiId in request", 400 @@ -167,9 +187,10 @@ def suggest_admin2(): return f"Unknown admin1WikiId {admin1WikiId}", 404 return jsonify(admin2Suggestions), 200 + @app.route("/geocode/admin3") def suggest_admin3(): - admin2WikiId = request.args.get('admin2WikiId', type=str) + admin2WikiId = request.args.get("admin2WikiId", type=str) if not admin2WikiId: logger.warning(f"No admin2WikiId in request {request}") return "No admin2WikiId in request", 400 @@ -180,5 +201,5 @@ def suggest_admin3(): return jsonify(admin3Suggestions), 200 -if __name__ == '__main__': - app.run(host='0.0.0.0', port=8080) +if __name__ == "__main__": + app.run(host="0.0.0.0", port=8080) diff --git a/ingestion/from_spreadsheet/Linelist_data_to_merge.ipynb b/ingestion/from_spreadsheet/Linelist_data_to_merge.ipynb deleted file mode 100644 index 36f3947ea..000000000 --- a/ingestion/from_spreadsheet/Linelist_data_to_merge.ipynb +++ /dev/null @@ -1,1332 +0,0 @@ -{ - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "name": "Linelist data to merge", - "provenance": [], - "collapsed_sections": [] - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - } - }, - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "1EVtxs8G0aVa" - }, - "source": [ - "Get data" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "3h6-qpEj0KYT", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "eba0581c-3302-4975-bc3c-b4aaedfe5477" - }, - "source": [ - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import pandas as pd\n", - "import requests\n", - "import tarfile\n", - "import io\n", - "\n", - "url = \"https://github.com/beoutbreakprepared/nCoV2019/raw/master/latest_data/latestdata.tar.gz\"\n", - "r = requests.get(url)\n", - "tar = tarfile.open(fileobj=io.BytesIO(r.content), mode=\"r:*\")\n", - "csv_path = tar.getnames()[0]\n", - "allData = pd.read_csv(tar.extractfile(csv_path), header=0, sep=\",\", )\n", - "allData.columns" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "/usr/local/lib/python3.6/dist-packages/IPython/core/interactiveshell.py:2718: DtypeWarning: Columns (1,2,9,10,12,13,14,15,16,17,19,20,21,22,23,24,25,26,27,31,32) have mixed types.Specify dtype option on import or set low_memory=False.\n", - " interactivity=interactivity, compiler=compiler, result=result)\n" - ], - "name": "stderr" - }, - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "Index(['ID', 'age', 'sex', 'city', 'province', 'country', 'latitude',\n", - " 'longitude', 'geo_resolution', 'date_onset_symptoms',\n", - " 'date_admission_hospital', 'date_confirmation', 'symptoms',\n", - " 'lives_in_Wuhan', 'travel_history_dates', 'travel_history_location',\n", - " 'reported_market_exposure', 'additional_information',\n", - " 'chronic_disease_binary', 'chronic_disease', 'source',\n", - " 'sequence_available', 'outcome', 'date_death_or_discharge',\n", - " 'notes_for_discussion', 'location', 'admin3', 'admin2', 'admin1',\n", - " 'country_new', 'admin_id', 'data_moderator_initials',\n", - " 'travel_history_binary'],\n", - " dtype='object')" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 90 - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "usq3Yu2x2HKo" - }, - "source": [ - "Get cases that have at least one detailed field" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "pqnE9Wtp2Kkg", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "0a79bd4e-a148-40b9-a970-745d8a16e766" - }, - "source": [ - "from google.colab import files\n", - "\n", - "print(\"allData total cases: \" + str(allData.shape[0] - 1))\n", - "detailedData = allData.replace('', np.nan)\n", - "detailedData.dropna(how=\"all\", subset=['age', 'sex','date_onset_symptoms','date_admission_hospital', 'symptoms', \n", - " 'travel_history_dates', 'travel_history_location', 'chronic_disease',\n", - " 'sequence_available', 'outcome', 'date_death_or_discharge',], inplace=True)\n", - "print(\"detailedData total cases: \" + str(detailedData.shape[0]))\n" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "allData total cases: 2676310\n", - "detailedData total cases: 960390\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "oSnB7KAoCg9V" - }, - "source": [ - "Check how many detailed data cases don't have sources" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "WDPpF6fM_ezu", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "58ca2c09-bbbc-4bb6-8ca7-738c1cf45e2a" - }, - "source": [ - "detailedDataWithoutSources = detailedData.dropna(how=\"any\", subset=['source', 'date_confirmation']).copy()\n", - "print(\"detailedDataWithoutSources total cases: \" + str(detailedDataWithoutSources.shape[0]))" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "detailedDataWithoutSources total cases: 406000\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "OqEN0gboGt4u" - }, - "source": [ - "Convert date_confirmation to date type" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "GuOrcscGGssA", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "e4ab351b-69d9-45d2-8050-86f88dbe0696" - }, - "source": [ - "detailedDataWithoutSources['date_confirmation'] = pd.to_datetime(detailedDataWithoutSources['date_confirmation'],\\\n", - " format='%d.%m.%Y',\\\n", - " errors='coerce')\n", - "detailedDataWithoutSources.date_confirmation.describe()" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:2: FutureWarning: Treating datetime data as categorical rather than numeric in `.describe` is deprecated and will be removed in a future version of pandas. Specify `datetime_is_numeric=True` to silence this warning and adopt the future behavior now.\n", - " \n" - ], - "name": "stderr" - }, - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "count 405982\n", - "unique 148\n", - "top 2020-05-29 00:00:00\n", - "freq 21234\n", - "first 2020-01-06 00:00:00\n", - "last 2020-06-08 00:00:00\n", - "Name: date_confirmation, dtype: object" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 93 - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "3kR9vEEJDRHK" - }, - "source": [ - "Restrict data as outlined in https://docs.google.com/spreadsheets/d/1zsqkmTL39HeF9mb8bfSQgC2yFuWA6strGnlr0pBCfQc/edit#gid=860764172" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "lyZsQ8CGDWiK", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "d7377d09-2d2e-4a4b-bd84-6ab87f824526" - }, - "source": [ - "canada = detailedDataWithoutSources.loc[detailedDataWithoutSources['country_new'] == 'Canada']\n", - "print(canada.sort_values(by='date_confirmation')['date_confirmation'].head)\n", - "print(\"canada total cases: \" + str(canada.shape[0]))" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "\n", - "canada total cases: 560\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "t6gtQiZENBBJ", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "3dd8d71f-d0d5-465c-d51e-fe8a5a54b97e" - }, - "source": [ - "china = detailedDataWithoutSources.loc[detailedDataWithoutSources['country_new'] == 'China']\n", - "print(\"china total cases: \" + str(china.shape[0]))" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "china total cases: 1888\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "_dJGTojENMiQ", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "38603bce-8a0d-40dc-c0d8-c06feb332aed" - }, - "source": [ - "colombia = detailedDataWithoutSources.loc[detailedDataWithoutSources['country_new'] == 'Colombia']\n", - "print(colombia.sort_values(by='date_confirmation')['date_confirmation'].head)\n", - "print(\"colombia total cases: \" + str(colombia.shape[0]))" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "\n", - "colombia total cases: 4\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "lfL-tM4ZNs9O", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "25bb7b17-4e60-4d58-e872-e473fa0d5ae2" - }, - "source": [ - "cuba = detailedDataWithoutSources.loc[detailedDataWithoutSources['country_new'] == 'Cuba']\n", - "print(cuba.sort_values(by='date_confirmation')['date_confirmation'].head)\n", - "print(\"cuba total cases: \" + str(cuba.shape[0]))" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "\n", - "cuba total cases: 1746\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "TDmlds-fOZo7", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "02d94f16-a608-4c14-fca2-631430d95f37" - }, - "source": [ - "czech = detailedDataWithoutSources.loc[detailedDataWithoutSources['country_new'] == 'Czech Republic']\n", - "print(czech.sort_values(by='date_confirmation')['date_confirmation'].head)\n", - "print(\"czech total cases: \" + str(czech.shape[0]))" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "\n", - "czech total cases: 8895\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "lxQyPpzzOq4c", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "dc0d5126-8e66-4d74-c076-b20d1fb6cbc0" - }, - "source": [ - "estonia = detailedDataWithoutSources.loc[detailedDataWithoutSources['country_new'] == 'Estonia']\n", - "print(estonia.sort_values(by='date_confirmation')['date_confirmation'].head)\n", - "print(\"estonia total cases: \" + str(estonia.shape[0]))\n", - "estoniaByDate = estonia.loc[estonia['date_confirmation'] <= pd.Timestamp(2020,3,9)]\n", - "print(\"estoniaByDate cases before 2020-03-09: \" + str(estoniaByDate.shape[0]))" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "\n", - "estonia total cases: 1865\n", - "estoniaByDate cases before 2020-03-09: 14\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "roEoY4bCPljz", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "4ea54bc8-9936-4532-ef60-ab9d995dd5b6" - }, - "source": [ - "germany = detailedDataWithoutSources.loc[detailedDataWithoutSources['country_new'] == 'Germany']\n", - "print(germany.sort_values(by='date_confirmation')['date_confirmation'].head)\n", - "print(\"germany total cases: \" + str(germany.shape[0]))\n", - "germanyByDate = germany.loc[germany['date_confirmation'] <= pd.Timestamp(2020,1,27)]\n", - "print(\"germanyByDate cases before 2020-01-27: \" + str(germanyByDate.shape[0]))" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "\n", - "germany total cases: 24479\n", - "germanyByDate cases before 2020-01-27: 1\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "3mR4uks_P1Oa", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "21e9856f-dff3-4a37-e656-4b7695dee516" - }, - "source": [ - "india = detailedDataWithoutSources.loc[detailedDataWithoutSources['country_new'] == 'India']\n", - "print(india.sort_values(by='date_confirmation')['date_confirmation'].head)\n", - "print(\"india total cases: \" + str(india.shape[0]))" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "\n", - "india total cases: 273639\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "yUBKVe7rQDhW", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "8df2e549-82e8-4efb-ce26-9a2a64ae1c8a" - }, - "source": [ - "japan = detailedDataWithoutSources.loc[detailedDataWithoutSources['country_new'] == 'Japan']\n", - "print(japan.sort_values(by='date_confirmation')['date_confirmation'].head)\n", - "print(\"japan total cases: \" + str(japan.shape[0]))\n", - "japanByDate = japan.loc[japan['date_confirmation'] <= pd.Timestamp(2020,1,23)]\n", - "print(\"japanByDate cases before 2020-01-23: \" + str(japanByDate.shape[0]))" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "\n", - "japan total cases: 636\n", - "japanByDate cases before 2020-01-23: 3\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "Xu6kOmunRU-_", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "ad05ecd3-25d5-4cf1-be13-8ec7b635c244" - }, - "source": [ - "malaysia = detailedDataWithoutSources.loc[detailedDataWithoutSources['country_new'] == 'Malaysia']\n", - "print(malaysia.sort_values(by='date_confirmation')['date_confirmation'].head)\n", - "print(\"malaysia total cases: \" + str(malaysia.shape[0]))" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "\n", - "malaysia total cases: 28\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "UlqzvJMcRiAj", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "655d86b9-1147-4a05-c0e7-d28456a0e285" - }, - "source": [ - "mexico = detailedDataWithoutSources.loc[detailedDataWithoutSources['country_new'] == 'Mexico']\n", - "print(mexico.sort_values(by='date_confirmation')['date_confirmation'].head)\n", - "print(\"mexico total cases: \" + str(mexico.shape[0]))\n", - "mexicoByDate = mexico.loc[mexico['date_confirmation'] <= pd.Timestamp(2020,3,25)]\n", - "print(\"mexicoByDate cases before 2020-03-25: \" + str(mexicoByDate.shape[0]))" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "\n", - "mexico total cases: 2103\n", - "mexicoByDate cases before 2020-03-25: 161\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "kkeywS7LR3ER", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "2fee34db-9a48-43e4-e25c-7f38d6df90f9" - }, - "source": [ - "newzealand = detailedDataWithoutSources.loc[detailedDataWithoutSources['country_new'] == 'New Zealand']\n", - "print(newzealand.sort_values(by='date_confirmation')['date_confirmation'].head)\n", - "print(\"newzealand total cases: \" + str(newzealand.shape[0]))" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "\n", - "newzealand total cases: 10\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "yJeb4F-NSAOu", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "dec9040d-3400-4a2a-ce89-f7f69d28813b" - }, - "source": [ - "paraguay = detailedDataWithoutSources.loc[detailedDataWithoutSources['country_new'] == 'Paraguay']\n", - "print(paraguay.sort_values(by='date_confirmation')['date_confirmation'].head)\n", - "print(\"paraguay total cases: \" + str(paraguay.shape[0]))" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "\n", - "paraguay total cases: 9\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "zR5g_b59SMX4", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "385f2efd-e685-47b3-87d1-a6a9a48ed456" - }, - "source": [ - "peru = detailedDataWithoutSources.loc[detailedDataWithoutSources['country_new'] == 'Peru']\n", - "print(peru.sort_values(by='date_confirmation')['date_confirmation'].head)\n", - "print(\"peru total cases: \" + str(peru.shape[0]))" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "\n", - "peru total cases: 4\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "G-50jCuiSUPc", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "6d1d8eec-f4fc-44fe-983d-e3b40dc2144e" - }, - "source": [ - "philippines = detailedDataWithoutSources.loc[detailedDataWithoutSources['country_new'] == 'Philippines']\n", - "print(philippines.sort_values(by='date_confirmation')['date_confirmation'].head)\n", - "print(\"philippines total cases: \" + str(philippines.shape[0]))" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "\n", - "philippines total cases: 11400\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "sPy44u2MSdno", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "01c7ec9f-e916-4220-a677-8f7c7da850fb" - }, - "source": [ - "romania = detailedDataWithoutSources.loc[detailedDataWithoutSources['country_new'] == 'Romania']\n", - "print(romania.sort_values(by='date_confirmation')['date_confirmation'].head)\n", - "print(\"romania total cases: \" + str(romania.shape[0]))" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "\n", - "romania total cases: 25\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "5jRt_DB4SsbF", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "fe08e02d-414e-43b9-f3ff-062b7fa83a0f" - }, - "source": [ - "southAfrica = detailedDataWithoutSources.loc[detailedDataWithoutSources['country_new'] == 'South Africa']\n", - "print(southAfrica.sort_values(by='date_confirmation')['date_confirmation'].head)\n", - "print(\"southAfrica total cases: \" + str(southAfrica.shape[0]))" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "\n", - "southAfrica total cases: 275\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "irT0-JdJS1R5", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "c0f5316d-a926-45b5-aceb-51a6a138a044" - }, - "source": [ - "southKorea = detailedDataWithoutSources.loc[detailedDataWithoutSources['country_new'] == 'South Korea']\n", - "print(southKorea.sort_values(by='date_confirmation')['date_confirmation'].head)\n", - "print(\"southKorea total cases: \" + str(southKorea.shape[0]))\n", - "southKoreaByDate = southKorea.loc[southKorea['date_confirmation'] <= pd.Timestamp(2020,1,19)]\n", - "print(\"southKoreaByDate cases before 2020-01-19: \" + str(southKoreaByDate.shape[0]))" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "\n", - "southKorea total cases: 288\n", - "southKoreaByDate cases before 2020-01-19: 2\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "fymLP7jhTMEN", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "fa366465-e78c-40c7-bfe3-1747182e9d48" - }, - "source": [ - "sriLanka = detailedDataWithoutSources.loc[detailedDataWithoutSources['country_new'] == 'Sri Lanka']\n", - "print(sriLanka.sort_values(by='date_confirmation')['date_confirmation'].head)\n", - "print(\"sriLanka total cases: \" + str(sriLanka.shape[0]))" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "\n", - "sriLanka total cases: 2\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "ybjAmKNeTWOd", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "5da821ff-ca27-4c22-d8ac-8f97f4d7a2d5" - }, - "source": [ - "switzerland = detailedDataWithoutSources.loc[detailedDataWithoutSources['country_new'] == 'Switzerland']\n", - "print(switzerland.sort_values(by='date_confirmation')['date_confirmation'].head)\n", - "print(\"switzerland total cases: \" + str(switzerland.shape[0]))\n", - "switzerlandByDate = switzerland.loc[switzerland['date_confirmation'] <= pd.Timestamp(2020,2,26)]\n", - "print(\"switzerlandByDate cases before 2020-02-26: \" + str(switzerlandByDate.shape[0]))" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "\n", - "switzerland total cases: 131\n", - "switzerlandByDate cases before 2020-02-26: 4\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "CvPu23h8TpHl", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "8c345786-a312-440b-882d-7c78427930cc" - }, - "source": [ - "thailand = detailedDataWithoutSources.loc[detailedDataWithoutSources['country_new'] == 'Thailand']\n", - "print(thailand.sort_values(by='date_confirmation')['date_confirmation'].head)\n", - "print(\"thailand total cases: \" + str(thailand.shape[0]))" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "\n", - "thailand total cases: 41\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "qHvR_w6lvstg", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "1194afe3-7c5c-4e64-d5dc-01344b856bab" - }, - "source": [ - "validDataWithoutADI = detailedDataWithoutSources.loc[~detailedDataWithoutSources['country_new'].isin(['Argentina', 'Brazil', 'Canada', 'Colombia', 'Cuba', 'Czech Republic', 'Estonia', 'Germany', 'Honduras', 'India', 'Japan', 'Malaysia', 'Mexico', 'New Zealand', 'Paraguay', 'Peru', 'Philippines', 'Romania', 'Singapore', 'South Africa', 'South Korea', 'Sri Lanka', 'Switzerland', 'Thailand', 'Togo', 'Uganda', 'United States', 'United States of America', 'USA'])].copy()\n", - "print(\"validDataWithoutADI total cases: \" + str(validDataWithoutADI.shape[0]))" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "validDataWithoutADI total cases: 73456\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "lmaj5eeNaaLE", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "1918c2b4-13d3-4bc1-eb85-8fd00ed89a55" - }, - "source": [ - "validDataWithCountryNew = validDataWithoutADI.dropna(subset=['country_new']).copy()\n", - "validDataWithoutCountryNew = validDataWithoutADI[~validDataWithoutADI.country_new.notnull()].copy()\n", - "print(validDataWithoutCountryNew[\"country\"].value_counts())\n", - "print(\"validDataWithCountryNew total cases: \" + str(validDataWithCountryNew.shape[0]))\n", - "print(\"validDataWithoutCountryNew total cases: \" + str(validDataWithoutCountryNew.shape[0]))" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Philippines 9981\n", - "Brazil 448\n", - "Colombia 376\n", - "Niger 85\n", - "Bolivia 55\n", - "Guatemala 40\n", - "Algeria 27\n", - "Ghana 15\n", - "Kazakhstan 14\n", - "Chile 12\n", - "Ethiopia 10\n", - "Zimbabwe 7\n", - "Namibia 5\n", - "Gambia 5\n", - "Guyana 4\n", - "Nigeria 3\n", - "Ecuador 2\n", - "Venezuela 2\n", - "Argentina 1\n", - "Ukraine 1\n", - "Kenya 1\n", - "Name: country, dtype: int64\n", - "validDataWithCountryNew total cases: 62317\n", - "validDataWithoutCountryNew total cases: 11139\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "sFNfxgRnqQac" - }, - "source": [ - "\n", - "validDataWithCountryNew['date_confirmation'] = validDataWithCountryNew['date_confirmation'].dt.strftime(\"%d.%m.%Y\").copy()\n", - "validDataWithConfirmationDate = validDataWithCountryNew.dropna(subset=['date_confirmation']).copy()" - ], - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "d5rEQmaDlHc6" - }, - "source": [ - "finalData = validDataWithCountryNew.copy()" - ], - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "YccMQ6EXD3vb", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "cd5c01f5-01fc-40ef-a885-182af179112a" - }, - "source": [ - "sourceCounts = finalData[\"source\"].value_counts()\n", - "print(\"number of unique sources: \" + str(sourceCounts.shape[0]))" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "number of unique sources: 877\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "I7PJNdJ9yEDp", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 17 - }, - "outputId": "f0e79940-81bc-4b03-8c82-2125b34246c7" - }, - "source": [ - "countryCounts = finalData[\"country_new\"].value_counts()\n", - "countryCounts.to_csv('countryCounts.csv')\n", - "files.download('countryCounts.csv')" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "display_data", - "data": { - "application/javascript": [ - "\n", - " async function download(id, filename, size) {\n", - " if (!google.colab.kernel.accessAllowed) {\n", - " return;\n", - " }\n", - " const div = document.createElement('div');\n", - " const label = document.createElement('label');\n", - " label.textContent = `Downloading \"${filename}\": `;\n", - " div.appendChild(label);\n", - " const progress = document.createElement('progress');\n", - " progress.max = size;\n", - " div.appendChild(progress);\n", - " document.body.appendChild(div);\n", - "\n", - " const buffers = [];\n", - " let downloaded = 0;\n", - "\n", - " const channel = await google.colab.kernel.comms.open(id);\n", - " // Send a message to notify the kernel that we're ready.\n", - " channel.send({})\n", - "\n", - " for await (const message of channel.messages) {\n", - " // Send a message to notify the kernel that we're ready.\n", - " channel.send({})\n", - " if (message.buffers) {\n", - " for (const buffer of message.buffers) {\n", - " buffers.push(buffer);\n", - " downloaded += buffer.byteLength;\n", - " progress.value = downloaded;\n", - " }\n", - " }\n", - " }\n", - " const blob = new Blob(buffers, {type: 'application/binary'});\n", - " const a = document.createElement('a');\n", - " a.href = window.URL.createObjectURL(blob);\n", - " a.download = filename;\n", - " div.appendChild(a);\n", - " a.click();\n", - " div.remove();\n", - " }\n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - } - }, - { - "output_type": "display_data", - "data": { - "application/javascript": [ - "download(\"download_a4446fcd-6b68-44c8-97bf-07860ac5b85f\", \"countryCounts.csv\", 1292)" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "jOnyzLM2ypZr", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 17 - }, - "outputId": "acc1aaee-bfc5-4eb5-bbfc-5fa85dba0627" - }, - "source": [ - "finalData.to_csv('finalData.csv', index=False)\n", - "files.download('finalData.csv')" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "display_data", - "data": { - "application/javascript": [ - "\n", - " async function download(id, filename, size) {\n", - " if (!google.colab.kernel.accessAllowed) {\n", - " return;\n", - " }\n", - " const div = document.createElement('div');\n", - " const label = document.createElement('label');\n", - " label.textContent = `Downloading \"${filename}\": `;\n", - " div.appendChild(label);\n", - " const progress = document.createElement('progress');\n", - " progress.max = size;\n", - " div.appendChild(progress);\n", - " document.body.appendChild(div);\n", - "\n", - " const buffers = [];\n", - " let downloaded = 0;\n", - "\n", - " const channel = await google.colab.kernel.comms.open(id);\n", - " // Send a message to notify the kernel that we're ready.\n", - " channel.send({})\n", - "\n", - " for await (const message of channel.messages) {\n", - " // Send a message to notify the kernel that we're ready.\n", - " channel.send({})\n", - " if (message.buffers) {\n", - " for (const buffer of message.buffers) {\n", - " buffers.push(buffer);\n", - " downloaded += buffer.byteLength;\n", - " progress.value = downloaded;\n", - " }\n", - " }\n", - " }\n", - " const blob = new Blob(buffers, {type: 'application/binary'});\n", - " const a = document.createElement('a');\n", - " a.href = window.URL.createObjectURL(blob);\n", - " a.download = filename;\n", - " div.appendChild(a);\n", - " a.click();\n", - " div.remove();\n", - " }\n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - } - }, - { - "output_type": "display_data", - "data": { - "application/javascript": [ - "download(\"download_27ba64b7-93cb-4eaa-a719-9bec707df9d5\", \"finalData.csv\", 11980249)" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - } - } - ] - } - ] -} \ No newline at end of file diff --git a/ingestion/from_spreadsheet/README.md b/ingestion/from_spreadsheet/README.md deleted file mode 100644 index b75131b93..000000000 --- a/ingestion/from_spreadsheet/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# Spreadsheet importing - -These scripts were used to load the data from the manually-curated line list to Global.health. - -## Legacy Contents - - - `Linelist_data_to_merge.ipynb`: script developed by Allyson Pemberton to initially import line list data. - - `ghtransfer_15012020.R`: code from Moritz Krämer to explore the dataset and find more candidates for import. - -## New Hotness - -`linelist_data_to_merge.py` is the best of both worlds: using Allyson's script to manipulate the data, and Moritz's methodology to filter good candidates. It needs the packages listed in `requirements.txt`. \ No newline at end of file diff --git a/ingestion/from_spreadsheet/ghtransfer_15012020.R b/ingestion/from_spreadsheet/ghtransfer_15012020.R deleted file mode 100644 index cb195dbcf..000000000 --- a/ingestion/from_spreadsheet/ghtransfer_15012020.R +++ /dev/null @@ -1,57 +0,0 @@ - -rm(list = ls()) - -library(plyr) -library(ggplot2) -library(scales) -library(ggmuller) - -setwd('/Users/mkraemer/downloads/') - -#data <- read.csv('2021-01-13_globaldothealth_all.csv') - -#head(data) -#unique(data$location.country) - -data_previous <- read.csv('latestdata.csv') - -head(data_previous) - -unique(data_previous$country_new) - -data_previous_1 <- subset(data_previous, age != '' | sex != '' | date_onset_symptoms != '' | date_admission_hospital != '' | - travel_history_dates != '' | travel_history_location != '' | additional_information != '' | - travel_history_dates != '' | date_admission_hospital != '' | chronic_disease != '' | symptoms != '' | sequence_available != '' | outcome != ''| - date_death_or_discharge != '') - -data_previous_1 <- subset(data_previous_1, source != '') - -head(data_previous_1) - -length(unique(data_previous_1$country_new)) - -# exclude countries where we have line list data - -france <- subset(data_previous_1, country_new == 'France') - -france <- subset(france, age != '' | sex != '' | date_onset_symptoms != '' | - travel_history_dates != '' | travel_history_location != '' | additional_information != '' | - travel_history_dates != '' | chronic_disease != '' | symptoms != '' | sequence_available != '' | outcome != ''| - date_death_or_discharge != '') - - -data_previous_1 <- subset(data_previous_1, country_new != 'Argentina' & country_new != 'India' & - country_new != 'Estonia' & country_new != 'Peru' & country_new != 'Latvia' - & country_new != 'Puerto Rico' & country_new != 'El Salvador' &country_new != 'Bolivia' & - country_new != 'Philippines' & country_new != 'Italy' & country_new != 'China' & country_new != 'Japan' & - country_new != 'Thailand' & country_new != 'Switzerland' & country_new != 'Spain' & country_new != 'Taiwan' - & country_new != 'Brazil' & country_new != 'South Africa' & country_new != 'Cuba' & country_new != 'Germany' & country_new != '' & country_new != 'France') - -head(data_previous_1) - -unique(data_previous_1$country_new) - -all <- rbind(data_previous_1, france) - -write.csv(all, 'filtered.csv') - diff --git a/ingestion/from_spreadsheet/linelist_data_to_merge.py b/ingestion/from_spreadsheet/linelist_data_to_merge.py deleted file mode 100755 index a048411c9..000000000 --- a/ingestion/from_spreadsheet/linelist_data_to_merge.py +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env python3 - -import numpy as np -import pandas as pd -import requests -import tarfile -import io - -url = "https://github.com/beoutbreakprepared/nCoV2019/raw/master/latest_data/latestdata.tar.gz" -r = requests.get(url) -tar = tarfile.open(fileobj=io.BytesIO(r.content), mode="r:*") -csv_path = tar.getnames()[0] -allData = pd.read_csv(tar.extractfile(csv_path), header=0, sep=",", ) -allData.columns - -print("allData total cases: " + str(allData.shape[0] - 1)) -detailedData = allData.replace('', np.nan) -detailedData.dropna(how="all", subset=['age', 'sex','date_onset_symptoms','date_admission_hospital', 'symptoms', - 'travel_history_dates', 'travel_history_location', 'additional_information', - 'chronic_disease', 'sequence_available', 'outcome', 'source', - 'date_death_or_discharge',], inplace=True) -print("detailedData total cases: " + str(detailedData.shape[0])) - - -detailedDataWithoutSources = detailedData.dropna(how="any", subset=['source', 'date_confirmation']).copy() -print("detailedDataWithoutSources total cases: " + str(detailedDataWithoutSources.shape[0])) - -detailedDataWithoutSources['date_confirmation'] = pd.to_datetime(detailedDataWithoutSources['date_confirmation'],\ - format='%d.%m.%Y',\ - errors='coerce') -detailedDataWithoutSources.date_confirmation.describe() - -validDataWithoutADI = detailedDataWithoutSources.loc[~detailedDataWithoutSources['country_new'].isin( - ['Argentina', 'Bolivia', 'Brazil', 'China', 'Colombia', 'Cuba', 'Czech Republic', 'El Salvador', 'Estonia', 'France', - 'Germany', 'India', 'Italy', 'Japan', 'Latvia', 'Peru', 'Philippines', 'Puerto Rico', 'South Africa', - 'Spain', 'Switzerland', 'Taiwan', 'Thailand', ''])].copy() -print("validDataWithoutADI total cases: " + str(validDataWithoutADI.shape[0])) - -validDataWithCountryNew = validDataWithoutADI.dropna(subset=['country_new']).copy() -validDataWithoutCountryNew = validDataWithoutADI[~validDataWithoutADI.country_new.notnull()].copy() -print(validDataWithoutCountryNew["country"].value_counts()) -print("validDataWithCountryNew total cases: " + str(validDataWithCountryNew.shape[0])) -print("validDataWithoutCountryNew total cases: " + str(validDataWithoutCountryNew.shape[0])) - - -validDataWithCountryNew['date_confirmation'] = validDataWithCountryNew['date_confirmation'].dt.strftime("%d.%m.%Y").copy() -validDataWithConfirmationDate = validDataWithCountryNew.dropna(subset=['date_confirmation']).copy() - -finalData = validDataWithCountryNew.copy() - -sourceCounts = finalData["source"].value_counts() -print("number of unique sources: " + str(sourceCounts.shape[0])) - -countryCounts = finalData["country_new"].value_counts() -countryCounts.to_csv('countryCounts.csv') - -finalData.to_csv('finalData.csv', index=False) diff --git a/ingestion/from_spreadsheet/requirements.txt b/ingestion/from_spreadsheet/requirements.txt deleted file mode 100644 index 53696fbab..000000000 --- a/ingestion/from_spreadsheet/requirements.txt +++ /dev/null @@ -1,59 +0,0 @@ -appnope==0.1.2 -async-generator==1.10 -attrs==20.3.0 -backcall==0.2.0 -bleach==3.3.0 -cachetools==4.2.0 -certifi==2020.12.5 -chardet==3.0.4 -cycler==0.10.0 -decorator==4.4.2 -defusedxml==0.6.0 -entrypoints==0.3 -idna==2.8 -ipykernel==4.6.1 -ipython==7.16.3 -ipython-genutils==0.2.0 -jedi==0.17.2 -Jinja2==2.11.3 -jsonschema==3.2.0 -jupyter-client==6.1.11 -jupyter-core==4.7.0 -jupyterlab-pygments==0.1.2 -kiwisolver==1.3.1 -MarkupSafe==1.1.1 -mistune==0.8.4 -nbclient==0.5.1 -nbconvert==6.0.7 -nbformat==5.1.3 -nest-asyncio==1.4.3 -numpy==1.22.0 -packaging==20.8 -pandas==1.2.1 -pandocfilters==1.4.3 -parso==0.7.1 -pexpect==4.8.0 -pickleshare==0.7.5 -Pillow==9.0.1 -portpicker==1.2.0 -prompt-toolkit==3.0.24 -ptyprocess==0.7.0 -pyasn1==0.4.8 -pyasn1-modules==0.2.8 -Pygments==2.7.4 -pyparsing==2.4.7 -pyrsistent==0.17.3 -python-dateutil==2.8.1 -pytz==2020.5 -pyzmq==21.0.1 -requests==2.27.1 -rsa==4.7 -simplegeneric==0.8.1 -six==1.12.0 -terminado==0.9.2 -testpath==0.4.4 -tornado==4.5.3 -traitlets==5.0.5 -urllib3==1.26.8 -wcwidth==0.2.5 -webencodings==0.5.1 diff --git a/ingestion/functions/.dockerignore b/ingestion/functions/.dockerignore deleted file mode 100644 index 4f65b5b9f..000000000 --- a/ingestion/functions/.dockerignore +++ /dev/null @@ -1,412 +0,0 @@ -# Python virtual environments -venv -.venv - -# Local AWS testing and deployment artifacts. -.aws -.aws-sam -# Log file for conversion warnings -conversion_errors.tsv - -# local vscode settings -.vscode/ - -# Plausible GCP project service account credentials. -# (Out of an abundance of caution.) -covid-19-map-*.json - -# Secrets for kubernetes. -kustomization.yaml - -# MongoDB global configs -globalConfig.json - -# Mapbox secrets. -boundaries.json - -# export script output. -cases.csv -cases.json - -# Created by https://www.gitignore.io/api/osx,linux,python,pycharm,windows,visualstudiocode,node -# Edit at https://www.gitignore.io/?templates=osx,linux,python,pycharm,windows,visualstudiocode,node - -### Linux ### -*~ - -# temporary files which can be created if a process still has a handle open of a deleted file -.fuse_hidden* - -# KDE directory preferences -.directory - -# Linux trash folder which might appear on any partition or disk -.Trash-* - -# .nfs files are created when an open file is removed but is still being accessed -.nfs* - -### Node ### -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env -.env.test - -# parcel-bundler cache (https://parceljs.org/) -.cache - -# next.js build output -.next - -# nuxt.js build output -.nuxt - -# rollup.js default build output -dist/ - -# Uncomment the public line if your project uses Gatsby -# https://nextjs.org/blog/next-9-1#public-directory-support -# https://create-react-app.dev/docs/using-the-public-folder/#docsNav -# public - -# Storybook build outputs -.out -.storybook-out - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# Temporary folders -tmp/ -temp/ - -### OSX ### -# General -.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - -### PyCharm ### -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm -# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 - -# User-specific stuff -.idea/**/workspace.xml -.idea/**/tasks.xml -.idea/**/usage.statistics.xml -.idea/**/dictionaries -.idea/**/shelf - -# Generated files -.idea/**/contentModel.xml - -# Sensitive or high-churn files -.idea/**/dataSources/ -.idea/**/dataSources.ids -.idea/**/dataSources.local.xml -.idea/**/sqlDataSources.xml -.idea/**/dynamic.xml -.idea/**/uiDesigner.xml -.idea/**/dbnavigator.xml - -# Gradle -.idea/**/gradle.xml -.idea/**/libraries - -# Gradle and Maven with auto-import -# When using Gradle or Maven with auto-import, you should exclude module files, -# since they will be recreated, and may cause churn. Uncomment if using -# auto-import. -# .idea/modules.xml -# .idea/*.iml -# .idea/modules -# *.iml -# *.ipr - -# CMake -cmake-build-*/ - -# Mongo Explorer plugin -.idea/**/mongoSettings.xml - -# File-based project format -*.iws - -# IntelliJ -out/ - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Cursive Clojure plugin -.idea/replstate.xml - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties -fabric.properties - -# Editor-based Rest Client -.idea/httpRequests - -# Android studio 3.1+ serialized cache file -.idea/caches/build_file_checksums.ser - -### PyCharm Patch ### -# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 - -# *.iml -# modules.xml -# .idea/misc.xml -# *.ipr - -# Sonarlint plugin -.idea/**/sonarlint/ - -# SonarQube Plugin -.idea/**/sonarIssues.xml - -# Markdown Navigator plugin -.idea/**/markdown-navigator.xml -.idea/**/markdown-navigator/ - -### Python ### -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -pip-wheel-metadata/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -nosetests.xml -coverage.xml -*.cover -.hypothesis/ -.pytest_cache/ - -# Translations -*.mo -*.pot - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# pyenv -.python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# celery beat schedule file -celerybeat-schedule - -# SageMath parsed files -*.sage.py - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# Mr Developer -.mr.developer.cfg -.project -.pydevproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -### VisualStudioCode ### -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -*.vscode - -### VisualStudioCode Patch ### -# Ignore all local history of files -.history - -### Windows ### -# Windows thumbnail cache files -Thumbs.db -Thumbs.db:encryptable -ehthumbs.db -ehthumbs_vista.db - -# Dump file -*.stackdump - -# Folder config file -[Dd]esktop.ini - -# Recycle Bin used on file shares -$RECYCLE.BIN/ - -# Windows Installer files -*.cab -*.msi -*.msix -*.msm -*.msp - -# Windows shortcuts -*.lnk - -# End of https://www.gitignore.io/api/osx,linux,python,pycharm,windows,visualstudiocode,node diff --git a/ingestion/functions/.env b/ingestion/functions/.env deleted file mode 100644 index a53b0657d..000000000 --- a/ingestion/functions/.env +++ /dev/null @@ -1,8 +0,0 @@ -AWS_ACCESS_KEY_ID=test -AWS_SECRET_ACCESS_KEY=test -AWS_ENDPOINT=http://localstack:4566 -BUCKET_NAME=gdh-sources -DOCKERIZED=True -SERVICES="s3,events" -DEBUG=1 -AWS_REGION=eu-central-1 diff --git a/ingestion/functions/Dockerfile b/ingestion/functions/Dockerfile deleted file mode 100644 index 34543d348..000000000 --- a/ingestion/functions/Dockerfile +++ /dev/null @@ -1,72 +0,0 @@ -# `python-base` sets up all our shared environment variables -FROM python:3.10-slim as python-base - -ENV PYTHONUNBUFFERED=1 \ - # prevents python creating .pyc files - PYTHONDONTWRITEBYTECODE=1 \ - \ - PIP_NO_CACHE_DIR=off \ - PIP_DISABLE_PIP_VERSION_CHECK=on \ - PIP_DEFAULT_TIMEOUT=100 \ - \ - # https://python-poetry.org/docs/configuration/#using-environment-variables - POETRY_VERSION=1.2.2 \ - # make poetry install to this location - POETRY_HOME="/opt/poetry" \ - # make poetry create the virtual environment in the project's root - # it gets named `.venv` - POETRY_VIRTUALENVS_IN_PROJECT=true \ - # do not ask any interactive question - POETRY_NO_INTERACTION=1 \ - \ - # this is where our requirements + virtual environment will live - PYSETUP_PATH="/opt/pysetup" \ - VENV_PATH="/opt/pysetup/.venv" - -# prepend poetry and venv to path -ENV PATH="$POETRY_HOME/bin:$VENV_PATH/bin:$PATH" - -# `builder-base` stage is used to build deps + create our virtual environment -FROM python-base as builder-base -RUN apt-get update \ - && apt-get install --no-install-recommends -y curl - -# install poetry - respects $POETRY_VERSION & $POETRY_HOME -RUN curl -sSL https://install.python-poetry.org | python3 - - -# copy project requirement files here to ensure they will be cached. -WORKDIR $PYSETUP_PATH -COPY poetry.lock pyproject.toml ./ - -ENV PATH="${PATH}:/root/.poetry/bin" - -# install runtime deps - uses $POETRY_VIRTUALENVS_IN_PROJECT internally -RUN poetry install --no-dev - -# `development` image is used during development / testing -FROM python-base as development - -RUN apt-get update && apt-get upgrade -y curl \ - awscli unzip - -WORKDIR $PYSETUP_PATH - -# copy in our built poetry + venv -COPY --from=builder-base $POETRY_HOME $POETRY_HOME -COPY --from=builder-base $PYSETUP_PATH $PYSETUP_PATH -ENV PATH="${PATH}:/root/.poetry/bin" - -ARG NOTIFY_WEBHOOK_URL -ENV NOTIFY_WEBHOOK_URL=${NOTIFY_WEBHOOK_URL} -ENV EPID_INGESTION_ENV "XXXXXXXXXXX" -ENV EPID_INGESTION_SOURCE_ID "XXXXXXXXXXX" - -# will become mountpoint of our code -WORKDIR /app - -COPY ./ ./ - -# quicker install as runtime deps are already installed -RUN poetry install - -CMD ["./run.sh"] diff --git a/ingestion/functions/Dockerfile-clean b/ingestion/functions/Dockerfile-clean deleted file mode 100644 index b88b8d96b..000000000 --- a/ingestion/functions/Dockerfile-clean +++ /dev/null @@ -1,72 +0,0 @@ -# `python-base` sets up all our shared environment variables -FROM python:3.10-slim as python-base - -ENV PYTHONUNBUFFERED=1 \ - # prevents python creating .pyc files - PYTHONDONTWRITEBYTECODE=1 \ - \ - PIP_NO_CACHE_DIR=off \ - PIP_DISABLE_PIP_VERSION_CHECK=on \ - PIP_DEFAULT_TIMEOUT=100 \ - \ - # https://python-poetry.org/docs/configuration/#using-environment-variables - POETRY_VERSION=1.2.2 \ - # make poetry install to this location - POETRY_HOME="/opt/poetry" \ - # make poetry create the virtual environment in the project's root - # it gets named `.venv` - POETRY_VIRTUALENVS_IN_PROJECT=true \ - # do not ask any interactive question - POETRY_NO_INTERACTION=1 \ - \ - # this is where our requirements + virtual environment will live - PYSETUP_PATH="/opt/pysetup" \ - VENV_PATH="/opt/pysetup/.venv" - -# prepend poetry and venv to path -ENV PATH="$POETRY_HOME/bin:$VENV_PATH/bin:$PATH" - -# `builder-base` stage is used to build deps + create our virtual environment -FROM python-base as builder-base -RUN apt-get update \ - && apt-get install --no-install-recommends -y curl - -# install poetry - respects $POETRY_VERSION & $POETRY_HOME -RUN curl -sSL https://install.python-poetry.org | python3 - - -# copy project requirement files here to ensure they will be cached. -WORKDIR $PYSETUP_PATH -COPY poetry.lock pyproject.toml ./ - -ENV PATH="${PATH}:/root/.poetry/bin" - -# install runtime deps - uses $POETRY_VIRTUALENVS_IN_PROJECT internally -RUN poetry install --no-dev - -# `development` image is used during development / testing -FROM python-base as development - -RUN apt-get update && apt-get upgrade -y curl \ - awscli - -WORKDIR $PYSETUP_PATH - -# copy in our built poetry + venv -COPY --from=builder-base $POETRY_HOME $POETRY_HOME -COPY --from=builder-base $PYSETUP_PATH $PYSETUP_PATH -ENV PATH="${PATH}:/root/.poetry/bin" - -ENV AWS_REGION='eu-central-1' -ENV INGESTION_SOURCES_BUCKET='gdh-sources' -ENV GRACE_PERIOD_IN_DAYS='10' - -# will become mountpoint of our code -WORKDIR /app - -COPY clean_old_ingestion_source_files.py poetry.lock pyproject.toml ./ -COPY ./aws_access/ ./aws_access/ - -# quicker install as runtime deps are already installed -RUN poetry install - -CMD ["poetry", "run", "python3", "./clean_old_ingestion_source_files.py"] diff --git a/ingestion/functions/Dockerfile-test b/ingestion/functions/Dockerfile-test deleted file mode 100644 index d1ee5794a..000000000 --- a/ingestion/functions/Dockerfile-test +++ /dev/null @@ -1,64 +0,0 @@ -# `python-base` sets up all our shared environment variables -FROM python:3.10-slim as python-base - -ENV PYTHONUNBUFFERED=1 \ - # prevents python creating .pyc files - PYTHONDONTWRITEBYTECODE=1 \ - \ - PIP_NO_CACHE_DIR=off \ - PIP_DISABLE_PIP_VERSION_CHECK=on \ - PIP_DEFAULT_TIMEOUT=100 \ - \ - # https://python-poetry.org/docs/configuration/#using-environment-variables - POETRY_VERSION=1.2.2 \ - # make poetry install to this location - POETRY_HOME="/opt/poetry" \ - # make poetry create the virtual environment in the project's root - # it gets named `.venv` - POETRY_VIRTUALENVS_IN_PROJECT=true \ - # do not ask any interactive question - POETRY_NO_INTERACTION=1 \ - \ - # this is where our requirements + virtual environment will live - PYSETUP_PATH="/opt/pysetup" \ - VENV_PATH="/opt/pysetup/.venv" - -# prepend poetry and venv to path -ENV PATH="$POETRY_HOME/bin:$VENV_PATH/bin:$PATH" - -# `builder-base` stage is used to build deps + create our virtual environment -FROM python-base as builder-base -RUN apt-get update \ - && apt-get install --no-install-recommends -y curl - -# install poetry - respects $POETRY_VERSION & $POETRY_HOME -RUN curl -sSL https://install.python-poetry.org | python3 - - -# copy project requirement files here to ensure they will be cached. -WORKDIR $PYSETUP_PATH -COPY poetry.lock pyproject.toml ./ - -# install runtime deps - uses $POETRY_VIRTUALENVS_IN_PROJECT internally -RUN poetry install --no-dev - -# `development` image is used during development / testing -FROM python-base as development - -RUN apt-get update && apt-get upgrade -y curl \ - awscli unzip - -WORKDIR $PYSETUP_PATH - -# copy in our built poetry + venv -COPY --from=builder-base $POETRY_HOME $POETRY_HOME -COPY --from=builder-base $PYSETUP_PATH $PYSETUP_PATH - -# quicker install as runtime deps are already installed -RUN poetry install - -# will become mountpoint of our code -WORKDIR /app - -COPY ./ ./ - -CMD ["./test.sh"] diff --git a/ingestion/functions/README.md b/ingestion/functions/README.md deleted file mode 100644 index 172ba1b7f..000000000 --- a/ingestion/functions/README.md +++ /dev/null @@ -1,420 +0,0 @@ -# Ingestion functions - -## Overview - -This directory contains the parsing functions -used in the Global.health ingestion system. - -The objective of the ingestion system is to facilitate a semi-automated -workflow accomplishing the retrieval of epidemiological source data, the -parsing thereof to the standard Global.health data format, and the persisting -of both raw content and parsed case records for use by the Global.health -community. For more information on Global.health, refer to the -[top-level README](https://github.com/globaldothealth/list/blob/main/README.md). - -The structure of ingestion is roughly as shown below: - -![System diagram](./assets/system.svg) - -At a high-level: - -1. **Actuation** is done by an AWS EventBridge Events Scheduled Rule (one for -each source). The scheduled rule is defined, alongside the remainder of source -configuration, via the Global.health -[curator UI](../../verification/curator-service/ui/) -sources page. -2. **Retrieval** is performed by a combined - [retrieval and parsing function](./retrieval/retrieval.py), -which downloads (b) and persists (c) data in accordance with the source -configuration, retrieved from the -[curator API](../../verification/curator-service/api/) -(a). The retrieval function uses the curator API to fetch which parser submodule to call. - - **Parsing** is performed by custom, per-source -[parsing functions](./parsing/) that are called from the retrieval function, and convert of raw source -content stored in S3 to the Global.health format. Converted data is written to the -central [data service](../../data-serving/data-service/) (for now, proxied via -the curator API, which offers an exposed, authenticated endpoint). - -**Note**: In the previous architecture using AWS Lambda, parsing and retrieval ran in different process, now they have been combined into one. - -## Development - -### tl;dr - -Ingestion functions are managed, developed, and deployed using AWS -Batch. See set up instructions and -common commands, below. - -If you are using Visual Studio Code (VSCode) you can find [common settings](https://github.com/globaldothealth/list/blob/main/dev/.vscode/settings.json) around linting/style. The [CI pipeline](https://github.com/globaldothealth/list/blob/main/.github/workflows/ingestion-functions-python.yml) runs flake8 so make sure you at least have this running in your editor. - -You can find more information on linting in VSCode [here](https://code.visualstudio.com/docs/python/linting). - -### Setup for folks without AWS access - -Local end-to-end (e2e) testing without AWS access is currently a work-in-progress. You should still be able to write parsers and test locally the components that don't require access to the curator API. - -### One-time setup for people with AWS access - -#### Prerequisites - -1. Install the [AWS CLI](https://aws.amazon.com/cli/). You can also install it using your favourite package manager: - -|OS |Command| -|-----------------|----------------------------------------------| -|Windows |`winget install -e --id Amazon.AWSCLI` | -|macOS |`brew install awscli` | -|Debian, Ubuntu |`sudo apt install awscli` | -|Fedora, RHEL |`sudo dnf install awscli` | - -Note that some of these repositories may be carrying v1 of AWS CLI, compared to the current stable v2. Our workflows are currently compatible with both v1 and v2, so this shouldn't be an issue. -1. Run `aws configure` to set AWS credentials -1. Have Python 3.8 installed on your machine. To check what versions you have -installed, and to see which versions correspond to the `python` and `python3` -commands, run the following: - -```shell -ls -l /usr/bin/python* -``` - -#### Setup -Setup a virtual environment in `ingestion/functions`: `poetry install`. - -We're using Python 3.8, if you have a different version of Python, use -`poetry env use 3.8` to switch to 3.8 for the environment. - -#### Manual ingestion - -You should be able to run ingestion using the curator UI. This exists as -a fallback if the UI triggers for ingestion are not working. - -1. You'll need AWS access, follow the steps in the previous section. -2. Once you've got AWS setup, run the following in `ingestion/functions` after setting up the virtual env: - - poetry run python aws.py jobdefs - - This should show existing **job definitions**. Job definitions are templates that - tell AWS Batch which parser to run and in which environment (dev, qa, or prod). If this - command doesn't work, contact the engineering team to setup access. - -3. Check if the ingestion you want to run already has an associated job definition - corresponding to the environment you want to run in: - `poetry run python aws.py jobdefs | grep colombia.*prod` to search for Colombia ingestion - in prod, which gives - - ACTIVE colombia-colombia-ingestor-prod - -4. If step 3 shows that a job definition is available, you can **submit** a job: - - poetry run python aws.py submit colombia-colombia-ingestor-prod - - Check the submit help options `poetry run python aws.py submit --help`. The most common - options to use are `-t` (or `--timeout)` to specify the maximum number of *minutes* - the ingestion is allowed to run. The default is 60 minutes, which is fine for - daily ingestion, but might not be enough time to run a backfill. - - To run a **backfill**, use the `-s` (`--start-date`) and `-e` (`--end-date`) - flags to delimit the backfill duration. You can now skip to step 6. Backfills are - allowed only for **UUID** sources, for non-UUID sources, the entire dataset - is always ingested. - -5. If there's no existing job definition for a source, you'll need to **register** one. - Registration creates a new job definition which can be used to submit jobs. - - First, add the parser to the source in the curator UI. The parser must be named - as follows: `--ingestor-`. So for example, if you wanted - to add a job definition corresponding to the parser `parsing/peru/peru.py` in - the *dev* instance, you would put this as the parser `peru-peru-ingestor-dev`. - Then, run the following: - - poetry run python aws.py register -e prod|dev - - Here `` has to be of the form `subfolder.parser` such as `peru.peru` under - the parsing folder. This will check that the parser corresponds to that in the - curator UI, and create the job definition. You can then submit a job. - - Some ingestions can require more **memory, CPU or time**. The default settings - for ingestions are: 1 CPU (set using *-c, --cpu*), 2048 MiB RAM (set using *-m, --memory*), with a timeout of 60 minutes (set using *-t, --timeout*). The defaults - are fine for UUID sources and for small non-UUID sources. For larger sources (>100k cases), you should set at least the timeout (in minutes). A good rule of thumb - for timeout *t* is *t* = 2 *C* / (60 *r*), where *C* is the number of cases - (doubling it to ensure that we don't have to change the timeouts too often), and - *r* is the average ingestion speed in cases/second; we divide by 60 to get the - timeout in minutes. As a typical *r* = 100, this gives us *t* = *C* / 3000. - - If you need to update the settings, re-register using the same command; this - will create a newer version of the job definition which will be used. - -6. Once your job has been submitted, you can **view its logs** through the Cloudwatch - AWS portal. The logs are stored in the */aws/batch/job* log group. Once the job - is finished, the status of the upload will also be updated in the curator UI. - -7. An EventBridge rule needs to be created for automatic ingestion. To do this, - first make a list of the EventBridge rules according to the environment - (substitute *dev* for *prod* for the dev environment): - - poetry run python define_rules.py prod - - This will create a *rules.json* file in the current directory. Edit the file - to keep only the rules you want to create. Then: - - poetry run python make_rules.py - - will make the rules. The rules can be viewed from the - [EventBridge console](https://console.aws.amazon.com/events). Initially, the - created rules are **disabled** and set to run **once daily**. The schedule - can be edited from the console to use the - [`rate()`](https://docs.aws.amazon.com/lambda/latest/dg/services-cloudwatchevents-expressions.html) syntax or a - [`cron()`](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-create-rule-schedule.html) syntax. If you're using the cron syntax, the console will tell - you the schedule of the next few events when the event will be triggered. Rules - can be enabled or disabled from the index page of the EventBridge console. - -### Writing and editing functions - -For the most part, writing functions is writing standard Python business logic. Each parsing function has a boilerplate code at the end which allows it to be invoked from retrieval with an JSON object describing the parameters for the parsing function: - -```python -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) -``` - -You are free to write the parsers however you like. Use the existing functions as a template to get started. If you find you need a dependency that isn't supplied in the virtual environment, you can add it like this: - -```shell -poetry add packagename -``` - -### Writing a parser - -You can find an example minimal parser in the [parsing/example](/ingestion/functions/parsing/example/README.md) directory, let's look at its structure: - -```shell -$ tree parsing/example -parsing/example -├── README.md # You can document your parser if you want. -├── __init__.py # Required to make this a proper python package, usually empty. -├── example.py # Write your parsing code here. -├── example_test.py # Always add unit tests. -├── input_event.json # AWS EventBridge event used when testing locally, will be described below. -├── requirements.txt # Any special third-party dependency that your parser requires, this file is required even if it's empty. -└── sample_data.csv # Some sample data used in unit tests, usually copied verbatim from a real source. -``` - -At a minimum, a parser must generate a list of cases that conform to the openAPI -specifications. If you have a local stack running, go to the [OpenAPI UI](http://localhost:3001/api-docs) to check the structure of a `Case` object. Otherwise you can always [check it online](https://data.covid-19.global.health/api-docs/) as well. - -A minimal case looks like this: - -```text -{ - "caseReference": { - "sourceId": "5ea86423bae6982635d2e1f8", - "sourceUrl": "cdc.gov" - }, - "events": [ - { - "name": "confirmed", - "dateRange": { - "start": "04/27/2020Z", - "end": "04/27/2020Z" - } - } - ], - "location": { - "query": "Canada", - }, -} -``` - -Its main function (usually called `parse_cases`) must yield cases one by one using [python generators](https://wiki.python.org/moin/Generators). A common library will take care of sending those cases to the server for you in batches. - -For geocoding, the parser can either hardcode a location with a `name`, `geoResolution` and `geometry.latitude`, `geometry.longitude` included, in which case no geocoding will be attempted on the server. -If it doesn't have that information it can simply output a `location.query` which will get geocoded by the server. If geocodes are to be restricted to a certain administrative area level, one can pass the `location.limitToResolution`. Details about those parameters are in the OpenAPI spec for the `NewCase` schema definition. - -Example of a location which will not trigger geocoding on the server: - -```json -{ - "country": "Switzerland", - "administrativeAreaLevel1": "Zurich", - "geoResolution": "Admin1", - "name": "Zurich canton", - "geometry": { - "longitude": 8.651071, - "latitude": 47.42568, - } -} -``` - -Example if a minimal location which will trigger geocoding: - -```json -{ - "query": "Quebec, Canada" -} -``` - -Example of a location which will trigger geocoding with restricted results: - -```json -{ - "query": "Quebec, Canada", - "limitToResolution": "Admin1,Country" -} -``` - -Travel history locations can be geocoded in the same way, travel history should only contain travels prior to the case's location. - -Prefer sending queries that go from smallest to biggest regions as mapbox can get confused by the former and geocode to a totally different country that the one you were expecting. - -Fields and nested structs should be preferably not set (or set to `None`) rather than set to an empty value (for example unknown age shouldn't be set to `''` and unknown demographics altogether shouldn't be set to `{}`). - -#### Unit tests - -Unit testing is mostly standard `pytest`, with a caveat to be sure that tests -are run inside the poetry environment. E.g., - -```shell -poetry run pytest test/my_test.py -``` - -#### Integration and End-to-end tests - -Testing beyond unit level happens inside of a docker-compose stack. - -To run, [install Docker](https://docs.docker.com/get-docker/), and then run - -```shell -./test_docker.sh -``` - -#### Manual local run - -Local e2e testing is currently not available. - -You can test in the live dev environment. To do this, first switch to the virtual environment in `ingestion/functions`, and then run the following to start a retrieval. - - EPID_INGESTION_ENV=dev EPID_INGESTION_SOURCE_ID=source_id python retrieval/retrieval.py - -where you use the source ID corresponding to your parser that has been configured in [dev-data](https://dev-data.covid-19.global.health). - -#### Debugging of parsers - -When a parser is running locally via `sam local invoke`, you can access its container by listing the current docker containers with `docker container ps` and then you can inspect the container you want using its ID. This allows you to see which environment variables are set and is useful to debug potential memory exceeded errors or dangling parsers that are waiting to timeout for some obscure reason. Some useful debugging commands include `docker logs `, `docker container inspect ` and `docker container stats `. - -For live parsers, you can look in the [AWS console](https://console.aws.amazon.com/lambda/home?region=us-east-1#/functions) directly, all `print()` calls are logged to CloudWatch which is useful for debugging. - -Example live debugging workflow: - -1. [Check the Curator portal for errors](https://data.covid-19.global.health/uploads). In this example, I'll use the error in the Mexico parser from 2020-10-20. -2. Use the AWS console to find the logs. I'm doing this in the command line, so `aws logs describe-log-groups` shows the log groups. Only one of them has "Mexico" in the name, so that's the one I want. -3. `aws logs describe-log-streams --log-group-name {GROUP_NAME}` shows me the log stream names, conveniently ordered by date as it's the latest (the last in the list) that I want. They also are named after the date, if you're searching for a particular run. -4. `aws logs get-log-events --log-group-name {GROUP_NAME} --log-stream-name '{STREAM_NAME}'` shows the log events. Notice that the stream name is in single quotes to avoid shell expansion of its name. -5. Read the logs, identify the error. -6. Fix the error. -7. Submit pull request. - -Steps 5-6 may take longer than indicated. - -#### Debugging of retrieval function - -If the ingestion process is not running as intended, but the previous steps reveal no clear issues with the parsing logic, or there are no logs present at all, the issue might be located upstream in the retrieval function. - -The best place to start in this case is with the CloudWatch logs, which should provide some hints in the case that the retrieval function was invoked but did not complete as intended. - -However, there is the possibility that a misconfiguration might prevent retrieval from even initiating, and that on top of that it might fail silently. In this more frustrating case, the only clue that something is wrong might be the sudden lack of invocations/logs. - -To debug these cases, you can try replicating the retrieval run on dev (or even prod, if the problem can't be replicated in dev, and you wouldn't mind running the parser on production). To do so follow the steps above in the section on running locally. - -Another cause of errors could be that code changes are not being pushed to the Amazon ECR registry, which is used to run retrieval. - -### Deployment - -Deployment is accomplished automatically via a dedicated -[GitHub action](../../.github/workflows/ingestion-python-deploy.yml). - -Setup of new parsers and the associated job definitions and EventBridge rules are still manual. - -### Writing a parser where deduplication of patients cannot be done - -Some sources do not provide a unique ID for each case allowing us to update existing cases in subsequent parsing runs. - -To accomodate for that, here is the procedure to write a parser that only imports data that is three days old (a reasonable threshold chosen arbitrarily, feel free to tune it according to your source's freshness): - -1. Write the parser, it must produces all cases for its input source, the `parsing/common/parsing_lib.py` library will ensure no duplicates are entered if you follow the next steps -2. To set up your parser for ingestion, edit your source in the curator portal UI: set the date filter to only fetch data up to 3 days ago -3. Run the parser once to import all the data up to 3 days before today -4. Edit the source again to only fetch data from exactly 3 days ago -5. Set the AWS Schedule Expression for your source and have the parser run every day - -That parser will now import a day worth of data with a lag of 3 days, this delay is deemed is acceptable given the inability to dedupe cases. - -### Handling sources with unstable URLs - -If a source has a time-based URL scheme you can use the following date formatting directives in the source URL and those will be automatically applied when retrieving the source content: - -- `$FULLYEAR` is replaced with the 4 digits current year. -- `$FULLMONTH` is replaced with the 2 digits current month. -- `$FULLDAY` is replaced with the 2 digits current day of the month. -- `$MONTH` is replaced with the 1 or 2 digits current month. -- `$DAY` is replaced with the 1 or 2 digits current day of the month. - -For example if a source publishes its data every day at a URL like `https://source.com/data/year-month-day.json` you can set the source URL to `https://source.com/data/$FULLYEAR-$FULLMONTH-$FULLDAY.json` and it will fetch the URL `https://source.com/data/2020-04-20.json` on the 4th of April 2020. - -### Compressed sources - -Some sources are provided as [zip files](https://en.wikipedia.org/wiki/Zip_(file_format)). Those are supported by the retrieval function assuming it contains a single file in the archive containing the line list data, it will extract that single file and the parsing functions will have access to it so you can write a parser without caring about the zip file at all. - -If you need other archive or compression formats supported please [file an issue in this repository](https://github.com/globaldothealth/list/issues/new?assignees=&labels=Importer&template=feature_request.md&title=Additional%20compression%20support) indicating the type of support needed, thank you. - -### Encoding of sources - -When the retrieval function stores the contents of a source in S3, the data is automatically encoded in utf-8 so that parsers do not have to care about which -encoding to use when reading the files. - -## Parsers - -You can find a list of issues/FR for parsers using the [importer tag](https://github.com/globaldothealth/list/issues?q=is%3Aopen+is%3Aissue+label%3AImporter). - -Here is an overview of parsers written so far and some details about the data they collect. - -_Please update this table with new parsers, or pertinent changes._ - -| Parser | Code | UUID/Deduping | Remarks | FR | -|-----------------------------|------------------------------------------------------------------------------------------------------|---------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------| -| India | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/india) | Y | Only processes line list style data from this source. There's bulk "state of the world" data published with current values (e.g. number currently hospitalized on a given date), but it's purely aggregate/can't be disaggregated to our format.. | #563 | -| Switzerland (Zurich canton) | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/ch_zurich) | N | Only imports confirmed cases, not confirmed deaths as we can't link one to the other (no unique patient ID provided). Granularity for cases is weekly, not daily so we use the first day of the given week arbitrarily. | #483 | -| Thailand | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/thailand) | Y | | #516 | -| Hong Kong | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/hongkong) | Y | | #518 | -| Japan | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/japan) | Y | | #481 | -| Estonia | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/estonia) | Y | | #502 | -| Amapa, Brazil | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/brazil_amapa) | N | There are two files in the source for Amapa, one for confirmed cases and one for confirmed deaths; some of these cases may also be deaths but without patient IDs we are unable to confirm. | #495 | -| Paraiba, Brazil | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/brazil_paraiba) | Y | | #499 | -| Peru | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/peru) | Y | Assuming PR = prueba rapida (rapid serological test) and PCR = PCR test | #484 | -| Taiwan | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/taiwan) | N | | #517 | -| Colombia | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/colombia) | Y | Assuming the date confirmed is the date of diagnosis (Fecha diagnostico) rather than Fecha de notificación (generally several days earlier). When date of diagnosis, using date reported online as proxy. Tipo recuperación refers to how they decided the patient had recovered: either by 21 days elapsing since symptoms, or a negative PCR/antigen test. No dates for travel history, only distinction is between cases of type: 'Importado' vs. 'Relacionado'. | #504 | -| Germany | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/germany) | N | | #482 | -| Distrito Federal, Brazil | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/brazil_distrito_federal) | N | | #498 | -| Argentina | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/argentina) | Y | We are currently only incorporating cases classified ('clasificacion_resumen') as 'Confirmed'. However, 970k out of 1.5M cases are listed as 'Discarded', even though many have data values resembling confirmed Covid-19 patients, eg date_of_diagnosis, ICU_admission, mechanical breathing assistance. Future versions may want to modify this behaviour. For cases classified as Confirmed but lacking a Date of Diagnosis, we use Date of Symptom onset where present, and Date of Case Opening where neither Date of Diagnosis or Date of Symptom Onset are present. For case location, we use the residential address of the patient, as this gives more detailed location information (to department level) than 'carga_provincia_nombre' (== location where test was carried out, given to province level).| #508 | -| Goias, Brazil | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/brazil_goias) | N | | #489 | -| Cuba | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/cuba) | Y | Nationality of case is provided in two letter country codes, so using pycountry package to parse these. The field 'posible_procedencia_contagio' is generally populated by two letter country codes. Case is assumed to have travelled from one of these countries in last 30 days if populated. Diagnostic centre and treatment hospital are both included in notes for now, could be geocoded in future. Currently no parsing of symptoms, as field is always left empty - worth rechecking this in future in case this field becomes populated. No disease outcome data is provided either.| #513 | -| Mexico | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/mexico) | N | | #480 | -| Rio Grande do Sul, Brazil | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/riograndedosul) | N | | #490 | -| Sao Paolo, Brazil | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/saopaolo) | N |Some caveats: 1. There are no patient ID/case ID in the raw API so we aren't able to dedupe. 2. We can't link confirmed cases and confirmed deaths because of (1) so we're only importing confirmed cases and ignoring deaths. | #497 | -| USA | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/USA) | N | | #1349 | -| Acre, Brazil | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/brazil_acre) | N || #494 | -| Ceara, Brazil | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/brazil_ceara) | Y || #491 | -| Espirito Santo, Brazil | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/brazil_espirito_santo) | N || #492 | -| Para, Brazil | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/brazil_para) | Y || #500 | -| Rio de Janeiro, Brazil | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/brazil_rio_de_janeiro) | N |Only include cases which include a 'dt_evento' as confirmed date field. This loses ~400 cases out of 350k. Using residential municipality ('municipio_res') as case location, as its the only location field other than 'bairro' (neighborhood), which is missing in ~2/5 cases and cannot be easily geocoded with mapbox.| #501 | -| Canada | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/canada) | Y || #485 | -| Czechia | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/czechia) | N || #507 | -| Paraguay | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/paraguay) | Y || #514 | -| South Africa | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/south_africa) | Y |Please note that this data was last updated in May 2020. This parser only deals with the columns where there was any data at the time of writing. Several columns with potentially useful information (e.g. date_onset_symptoms) are unpopulated for all cases. Would be worth keeping an eye on the data to see whether (a) it starts getting updated again and (b) whether this will lead to any new information provided at which point the parser will need to be expanded to deal with this.| #487 | -| United States | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/USA) | N || #1349 | -| Scotland | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/scotland) | N |Scotland has datasets all presented in aggregated form. This parser currently uses the Age + Sex Daily positives: for each date, they provide the total number of Males or Females infected, within a particular age group. We want individual cases, so we want to do the following transformation:: Age: 15-19 | Sex: Female | TotalPositives: 5 --> 5 individual cases with Sex=Female and Age Range. This aggregation massively limits data we can use, so until we can find a way to complement with other datasets, we have no location data, no UUIDs, and no other fields of interest. We'll loop through each date, only selecting rows referring specifically to Males or Females and a particular age group (some rows show total across all ages/sexes). If age is 85plus then give age range 85-120, otherwise extract lower bound and upper bound of age. No need for convert_gender function, as string is provided in correct format| #1184 | -| Republic of Korea | [code](https://github.com/globaldothealth/list/tree/main/ingestion/functions/parsing/republic_of_korea) | Y |Contains following columns: ID, dates of confirmation/release/death/exposure, birth year, sex, province, and in a subset of cases the infection number, contact number, and group of outbreak (e.g. a particular Church). Province field is not always a place name, sometimes just a note, eg 'filtered at airport'. We are only provided patient's birth_year, so we create a global variable current_year, and get age by: age = current_year - birth_year. This gives patients age by end of this year, so we provide a 1 year range for a patient's current age. A subset of cases contain information on which case IDs infected others, contact number and infection number. These are included, but seem inconsistent so should not be fully relied upon.| #512 | diff --git a/ingestion/functions/assets/new-automated-source.png b/ingestion/functions/assets/new-automated-source.png deleted file mode 100644 index 29d38f08663fb4388aeea307fa8945f56c48c820..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79821 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

Lvyr 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 z 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 z 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

g5H(T?nR=$-EUl4}n6Iu-yPJ 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 Ta@$YRfj=XCQ@wIs$MF9Ffr&v* diff --git a/ingestion/functions/assets/system.svg b/ingestion/functions/assets/system.svg deleted file mode 100644 index 5387c8cb1..000000000 --- a/ingestion/functions/assets/system.svg +++ /dev/null @@ -1,776 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Batch - Curatorservice - Sources - EventBridge - Retrieval+Parsing - S3 rawsources - Data service - - - - - diff --git a/ingestion/functions/aws.py b/ingestion/functions/aws.py deleted file mode 100755 index d473e8a55..000000000 --- a/ingestion/functions/aws.py +++ /dev/null @@ -1,498 +0,0 @@ -#!/usr/bin/env python3 -import argparse -from datetime import datetime -from pprint import pprint -import re -import sys -import os - -import boto3 - -import common.common_lib as common_lib -from aws_access.EventBridgeClient import EventBridgeClient -import aws_access.globaldothealth_configuration as gdoth - -AWS_REGION = gdoth.AWS_REGION -AWS_IMAGE = { - "dev": "612888738066.dkr.ecr.us-east-1.amazonaws.com/gdh-ingestor:latest", - "qa": "612888738066.dkr.ecr.us-east-1.amazonaws.com/gdh-ingestor:latest", - "prod": "612888738066.dkr.ecr.us-east-1.amazonaws.com/gdh-ingestor:stable" -} -AWS_JOB_ROLE_ARN = os.getenv("AWS_JOB_ROLE_ARN", "arn:aws:iam::612888738066:role/gdh-ingestion-job-role") -AWS_EVENT_ROLE_ARN = os.getenv( - "AWS_EVENT_ROLE_ARN", - "arn:aws:iam::612888738066:role/service-role/AWS_Events_Invoke_Batch_Job_Queue_1312384119" -) -AWS_JOB_QUEUE_ARN = f"arn:aws:batch:{AWS_REGION}:612888738066:job-queue/ingestion-queue" -DEFAULT_VCPU = 1 -DEFAULT_MEMORY_MIB = 2048 -DEFAULT_JOB_QUEUE = "ingestion-queue" -DEFAULT_TIMEOUT_MIN = 60 - - -def get_parser_name_source(source_id, env): - s3_client = boto3.client("s3", AWS_REGION) - from retrieval import retrieval - - auth_headers = common_lib.obtain_api_credentials(s3_client) - try: - url, source_format, parser, date_filter, _ = retrieval.get_source_details( - env, source_id, "", auth_headers, None - ) - except RuntimeError: - return (False, None) - parser_module = common_lib.get_parser_module(parser) # parsing.folder.subfolder - return (True, parser_module) if parser_module.count(".") == 2 else (True, None) - - -def job_definition( - source_name: str, source_id: str, env: str, vcpu: int = DEFAULT_VCPU, - memory: int = DEFAULT_MEMORY_MIB, timeout: int = DEFAULT_TIMEOUT_MIN -): - return { - "jobDefinitionName": f"{source_name}-ingestor-{env}", - "type": "container", - "parameters": {}, - "timeout": { - "attemptDurationSeconds": timeout * 60 - }, - "containerProperties": { - "image": AWS_IMAGE[env], - "vcpus": vcpu, - "jobRoleArn": AWS_JOB_ROLE_ARN, - "memory": memory, - "environment": [ - {"name": "EPID_INGESTION_ENV", "value": env}, - {"name": "EPID_INGESTION_SOURCE_ID", "value": source_id}, - ], - "ulimits": [], - "resourceRequirements": [], - }, - } - - -class AWSParserManager: - def __init__(self): - - parser = argparse.ArgumentParser( - description="Manage AWS Batch and EventBridge rules for ingestion", - usage="""python aws.py [] - -submit Submit a job using a job definition -compute List compute environments -jobdefs List job definitions on Batch -rules List EventBridge rules -enable Enable an EventBridge rule -disable Disable an EventBridge rule -target Set a Batch job definition as a target for an EventBridge rule -untarget Remove a Batch job definition as a target for an EventBridge rule -schedule Create an EventBridge schedule rule -unschedule Delete an EventBridge schedule rule -parsers List parsers for which job definitions can be registered -register Register or update a Batch job definition -deregister Deregister a Batch job definition -""", - ) - - parser.add_argument("command", help="Subcommand to run") - args = parser.parse_args(sys.argv[1:2]) # only parse command - self.batch_client = boto3.client("batch", AWS_REGION) - self.event_bridge_client = EventBridgeClient(AWS_REGION) - - getattr( - self, - {"list-compute": "list_compute", "list": "list_jobs"}.get( - args.command, args.command - ), - )() - - def register(self): - parser = argparse.ArgumentParser( - prog="aws.py register", - description="Register a job definition for a source ID and corresponding parsing file", - ) - parser.add_argument("source_id") - parser.add_argument("parser", help="Parsing module for the source ID; e.g. example.example") - parser.add_argument( - "-e", - "--env", - help="Which environment to deploy to", - choices=["local", "dev", 'qa', "prod"], - default="local", - ) - parser.add_argument( - "-c", - "--cpu", - help="Number of virtual CPUs (default=1)", - type=int, - default=DEFAULT_VCPU, - ) - parser.add_argument( - "-m", - "--memory", - help="Memory allocated to job in MiB (default=2048)", - type=int, - default=DEFAULT_MEMORY_MIB, - ) - parser.add_argument( - "-t", - "--timeout", - help="Maximum time allocated to job in minutes (default=60)", - type=int, - default=DEFAULT_TIMEOUT_MIN, - ) - - args = parser.parse_args(sys.argv[2:]) - if args.env == "local": - print("Can't test local AWS Batch job definition registration") - return - print(f"Register {args.source_id} (environment {args.env})") - success, parser_name = get_parser_name_source(args.source_id, args.env) - if not success: - print( - f"Failed to register {args.source_id} due to error in fetching from curator API" - ) - sys.exit(1) - if parser_name: - print(f"Source {args.source_id} will be parsed by {parser_name}") - source_name = parser_name.replace(".", "-").replace("parsing-", "") - print(f"Registering job definition for source {source_name}") - pprint( - self.batch_client.register_job_definition( - **job_definition( - source_name, - args.source_id, - args.env, - args.cpu, - args.memory, - args.timeout, - ) - ) - ) - if "parsing." + args.parser == parser_name: - print(f"Source {args.source_id} will be parsed by {parser_name}") - else: - print(f"Parser {parser_name} for source {args.source_id} in environment {args.env} does not match input {args.parser}") - sys.exit(1) - else: - print( - f"Missing parser for source {args.source_id} in environment {args.env}\n" - "Set the parser function in the curator portal, the value\n" - "should be 'folder.parser' if the parser is at parsing/folder/parser.py" - ) - sys.exit(1) - - def _job_definitions(self): - jobs = self.batch_client.describe_job_definitions() - if jobs["ResponseMetadata"]["HTTPStatusCode"] != 200: - return (False, jobs["ResponseMetadata"]) - return (True, jobs["jobDefinitions"]) - - def _job_definition_names(self): - success, data = self._job_definitions() - return [j["jobDefinitionName"] for j in data] if success else None - - def deregister(self): - parser = argparse.ArgumentParser( - prog="aws.py deregister", description="Deregister job definition" - ) - parser.add_argument("job_definition") - args = parser.parse_args(sys.argv[2:]) - - job_definition_names = self._job_definition_names() - if args.job_definition in job_definition_names: - r = self.batch_client.deregister_job_definition(jobDefinition=args.job_definition) - print( - f"Job definition deregistered: {args.job_definition}" - if r["ResponseMetadata"]["HTTPStatusCode"] == 200 - else f"Failed to deregister job definition: {args.job_definition}" - ) - else: - print( - f"Job definition not registered: {args.job_definition}\n" - f"\nCurrent job definitions:\n\n" + "\n".join(job_definition_names) - ) - - def parsers(self): - "List available parsers locally" - for source_id in (m := common_lib.get_source_id_parser_map()): - for key, val in m[source_id].items(): - print(f"{source_id} {key}: {val}") - print() - - def jobdefs(self): - parser = argparse.ArgumentParser( - prog="aws.py jobdefs", - description="List available job definitions which can be used for job submission", - ) - _ = parser.parse_args(sys.argv[2:]) - success, data = self._job_definitions() - if not success: - pprint(data["ResponseMetadata"]) - return - print("\n".join(f"{j['status']:>8s} {j['jobDefinitionName']}" for j in data)) - - def rules(self): - parser = argparse.ArgumentParser( - prog="aws.py rules", description="List rules defined in AWS EventBridge" - ) - parser.add_argument( - "-d", "--disabled", help="List disabled rules", action="store_true", required=False - ) - parser.add_argument( - "-e", "--enabled", help="List enabled rules", action="store_true", required=False - ) - parser.add_argument( - "-f", "--filter", help="Filter rule names", type=str, required=False - ) - parser.add_argument( - "-t", "--targets", help="Show rule Batch targets", action="store_true", required=False - ) - parser.add_argument( - "-v", "--verbose", help="Show all rule information", action="store_true", required=False - ) - - args = parser.parse_args(sys.argv[2:]) - if args.enabled and args.disabled: - print("Enabled and disabled are mutually exclusive options") - sys.exit(2) - - rules = self.event_bridge_client.get_rule_descriptions() - if not rules: - print("Could not get EventBridge rules") - return - if args.filter: - rules = [rule for rule in rules if re.match(args.filter, rule.get("Name", ""))] - if args.enabled: - rules = [rule for rule in rules if rule.get("State") == "ENABLED"] - if args.disabled: - rules = [rule for rule in rules if rule.get("State") == "DISABLED"] - if args.targets: - for rule in rules: - rule_name = rule.get("Name") - rule["Targets"] = self.get_rule_targets(rule_name) - if args.verbose: - pprint(rules) - else: - if args.targets: - rules = [{"Name": rule.get("Name"), "Targets": rule.get("Targets")} for rule in rules] - pprint(rules) - else: - rule_names = [rule.get("Name") for rule in rules] - print(rule_names) - - def get_rule_targets(self, rule_name): - return self.event_bridge_client.get_rule_targets(rule_name) - - def enable(self): - parser = argparse.ArgumentParser( - prog="aws.py enable", description="Enable AWS EventBridge rule" - ) - parser.add_argument( - "rule_name", help="Name of rule to enable" - ) - args = parser.parse_args(sys.argv[2:]) - try: - self.event_bridge_client.enable_schedule(args.rule_name) - except Exception as exc: - print(f"An exception occurred while enabling rule {args.rule_name}: {exc}") - raise - print("Enabled rule {args.rule_name}") - - def disable(self): - parser = argparse.ArgumentParser( - prog="aws.py disable", description="Disable AWS EventBridge rule" - ) - parser.add_argument( - "rule_name", help="Name of rule to disable" - ) - args = parser.parse_args(sys.argv[2:]) - try: - self.event_bridge_client.disable_schedule(args.rule_name) - except Exception as exc: - print(f"An exception occurred while disabling rule {args.rule_name}: {exc}") - raise - print("Disabled rule {args.rule_name}") - - def schedule(self): - parser = argparse.ArgumentParser( - prog="aws.py schedule", description="Create a new AWS EventBridge schedule rule" - ) - parser.add_argument( - "rule_name", help="Name of rule to create" - ) - parser.add_argument( - "-t", "--target_name", help="Name of target AWS Batch job description for rule", type=str, required=False - ) - parser.add_argument( - "-s", "--source_name", help="Name of data source", type=str, required=False - ) - parser.add_argument( - "-j", "--job_name", help="Name of scheduled job", type=str, required=False - ) - parser.add_argument( - "-e", "--enabled", help="Enable rule", action="store_true", required=False - ) - parser.add_argument( - "-d", "--description", help="Rule description", type=str, required=False - ) - args = parser.parse_args(sys.argv[2:]) - state = True if args.enabled else False - description = args.description if args.description else "" - if args.target_name: - if not args.source_name: - print("Data source name required for target creation") - sys.exit(2) - if not args.job_name: - print("Job name required for target creation") - sys.exit(2) - - try: - self.event_bridge_client.add_schedule( - args.rule_name, - description, - state - ) - except Exception as exc: - print(f"An exception occurred while creating rule {args.rule_name}: {exc}") - raise - print(f"Created rule {args.rule_name}") - - if args.target_name: - try: - self.event_bridge_client.add_target_to_rule( - args.rule_name, - args.target_name, - args.job_name, - AWS_JOB_QUEUE_ARN, - AWS_EVENT_ROLE_ARN - ) - except Exception as exc: - print(f"An exception occurred while targeting {args.target_name} for rule {args.rule_name}: {exc}") - raise - print(f"Targeted rule {args.rule_name} to {args.target_name}") - - def unschedule(self): - parser = argparse.ArgumentParser( - prog="aws.py unschedule", description="Delete rule defined in AWS EventBridge" - ) - parser.add_argument( - "rule_name", help="Name of rule to delete" - ) - args = parser.parse_args(sys.argv[2:]) - try: - self.event_bridge_client.unschedule(args.rule_name) - except Exception as exc: - print(f"An exception occurred while deleting rule {args.rule_name}: {exc}") - raise - print(f"Deleted rule {args.rule_name}") - - def target(self): - parser = argparse.ArgumentParser( - prog="aws.py target", description="Create or modify target for rule defined in AWS EventBridge" - ) - parser.add_argument( - "rule_name", help="Name of rule" - ) - parser.add_argument( - "-t", "--target_name", help="Name of target AWS Batch job description for rule" - ) - parser.add_argument( - "-j", "--job_name", help="Name of scheduled job" - ) - args = parser.parse_args(sys.argv[2:]) - try: - self.event_bridge_client.add_target_to_rule( - args.rule_name, - args.target_name, - args.job_name, - AWS_JOB_QUEUE_ARN, - AWS_EVENT_ROLE_ARN - ) - - except Exception as exc: - print(f"An exception occurred while setting target for rule {args.rule_name}: {exc}") - raise - print(f"Set target {args.target_name} for rule {args.rule_name}") - - def untarget(self): - parser = argparse.ArgumentParser( - prog="aws.py untarget", description="Delete targets for rule defined in AWS EventBridge" - ) - parser.add_argument( - "rule_name", help="Name of rule with targets to delete" - ) - args = parser.parse_args(sys.argv[2:]) - try: - self.event_bridge_client.remove_targets_from_rule(args.rule_name) - except Exception as exc: - print(f"An exception occurred while deleting targets for rule {args.rule_name}: {exc}") - raise - print(f"Deleted targets for rule {args.rule_name}") - - def submit(self): - parser = argparse.ArgumentParser( - prog="aws.py submit", description="Submit a job to AWS Batch" - ) - parser.add_argument( - "job_definition", help="Job definition to use for submission" - ) - parser.add_argument( - "-q", "--queue", help="Which job queue to use", default=DEFAULT_JOB_QUEUE - ) - parser.add_argument( - "-t", "--timeout", help="Override job maximum time from job definition", type=int - ) - parser.add_argument("-s", "--start-date", help="Start date for backfill") - parser.add_argument("-e", "--end-date", help="End date for backfill") - args = parser.parse_args(sys.argv[2:]) - - if bool(args.start_date) ^ bool(args.end_date): - print("Specify both start and end date in YYYY-MM-DD format") - sys.exit(1) - - job_name = args.job_definition + ("-backfill" if args.start_date else "") - job_submission = { - "jobName": job_name, - "jobQueue": args.queue, - "jobDefinition": args.job_definition - } - if args.timeout: - job_submission["timeout"] = {"attemptDurationSeconds": args.timeout * 60} - if args.start_date: - try: - start = datetime.strptime(args.start_date, "%Y-%m-%d") - end = datetime.strptime(args.end_date, "%Y-%m-%d") - except ValueError: - print("Start and end dates should be in YYYY-MM-DD format") - sys.exit(1) - if start > end: - print(f"Start date {args.start_date} should be before end date {args.end_date}") - sys.exit(1) - job_submission["containerOverrides"] = { - "environment": [ - { - "name": "EPID_INGESTION_PARSING_DATE_RANGE", - "value": f"{args.start_date},{args.end_date}" - } - ] - } - - r = self.batch_client.submit_job(**job_submission) - - if r["ResponseMetadata"]["HTTPStatusCode"] == 200: - print(f"Submitted job for {args.job_definition} in queue {args.queue}") - if args.start_date: - print(f"Backfilling from {args.start_date} to {args.end_date}") - else: - print( - f"Failed submission for {args.job_definition} in queue {args.queue}" - ) - pprint(r["ResponseMetadata"]) - - def list_compute(self): - print("This functionality is not implemented yet.") - - -if __name__ == "__main__": - AWSParserManager() diff --git a/ingestion/functions/aws_access/EventBridgeClient.py b/ingestion/functions/aws_access/EventBridgeClient.py deleted file mode 100644 index 6420174dd..000000000 --- a/ingestion/functions/aws_access/EventBridgeClient.py +++ /dev/null @@ -1,198 +0,0 @@ -import logging -import re -from uuid import uuid4 -from datetime import datetime, timedelta - -import boto3 -from monthdelta import monthdelta - -from . import globaldothealth_configuration as gdoth - -# Amazon weeks start on Sunday -WEEKDAYS = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'] - -logger = logging.getLogger(__name__) - -def date_of_requested_weekday_in_month(weekday, week_of_month, year, month): - # find the isoweekday of the first of the month - first_of_month = datetime(year, month, 1) - weekday_of_first = first_of_month.isoweekday() - # subtract that from our weekday - weekday_difference = weekday - weekday_of_first - # add 7 if negative - normalised_difference = weekday_difference if weekday_difference >= 0 else weekday_difference + 7 - # add one, as days of month are counted from 1 - first_requested_weekday = normalised_difference + 1 - # add 7*(week_of_month - 1) days - return first_requested_weekday + (7 * (week_of_month - 1)) - - -class ScheduleRule: - """ - Representation of a global.health EventBridge schedule rule - with specific logic for our ingestion rules (and checks to ensure that the rule is for ingestion). - """ - def __init__(self, rule_description: dict): - self.rule_description = rule_description - - def schedule(self): - return self.rule_description.get("ScheduleExpression") - - def is_ingestion_rule(self): - return False - - def description(self): - return self.rule_description.get("Description", "") - -class IngestionScheduleRule (ScheduleRule): - def is_ingestion_rule(self): - return True - - def ingestion_source_id(self): - return re.search("[a-f0-9]{24}", self.description()).group(0) - - def date_of_requested_weekday_in_month(self, weekday, week_of_month, year, month): - return date_of_requested_weekday_in_month(weekday, week_of_month, year, month) - - def difference_between_weekdays(self, our_day, their_day): - return our_day - their_day if our_day > their_day else our_day - their_day + 7 - - def oldest_file_age(self, now): - """ - What is the age in days of the oldest source file for an ingestion rule that we can keep? - now: reference time from which to compute file age - """ - schedule = self.schedule() - if schedule.startswith('rate'): - if components := re.match(r'rate\(([0-9]+) ([a-z]+)\)', schedule): - if not components.group(2).startswith('day'): # I'm assuming the unit is day or days - logger.error(f"schedule {schedule} is not in units of days, we can't handle it") - return None - number_of_days = int(components.group(1)) - if not number_of_days > 0: # I'm assuming a positive schedule - logger.error(f"schedule {schedule} isn't positive, which is surprising") - return None - age = timedelta(days = -2 * number_of_days - gdoth.GRACE_PERIOD_IN_DAYS) - else: - logger.error(f"schedule {schedule} didn't match expected format rate(x days)") - return None - else: - if not schedule.startswith('cron'): # I'm assuming that if it isn't a rate, it's a cron - logger.error(f"schedule {schedule} isn't a rate or a cron, which we can't handle") - return None - if components := re.match(r'cron\(([0-9]+) ([0-9]+) (\?|\*) (\*) ([0-6]#[1-4]|[A-Z]{3}|[0-6]|\?) (\*)\)', schedule): - # Assuming a restricted subset of https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-create-rule-schedule.html rules - # I also assume that you never ask for the fifth weekday of the month, because that's a very odd schedule - (minute, hour, day_of_month, month, day_of_week, year) = components.groups() - # calculate from midnight as we don't want odd seconds etc - today = datetime(now.year, now.month, now.day) - our_day = today.isoweekday() % 7 # ISO runs 1-7 Mon-Sun, we want 0-6 Sun-Sat - # Because of my assumptions above in the regex, I only need the day of the week here - # When we are using Python 3.10+, this should be a match - if day_of_week == '?': - # will run on _a_ day of the week but don't know which, assume worst case - age = timedelta(days = -14 - gdoth.GRACE_PERIOD_IN_DAYS) - elif day_of_week in WEEKDAYS: - # what is the time between the last of these weekdays and today? - their_day = WEEKDAYS.index(day_of_week) - delta_days = self.difference_between_weekdays(our_day, their_day) - age = timedelta(days = -delta_days - 7 - gdoth.GRACE_PERIOD_IN_DAYS) - elif len(day_of_week) == 1 and int(day_of_week) in range(7): - delta_days = self.difference_between_weekdays(our_day, int(day_of_week)) - age = timedelta(days = -delta_days - 7 - gdoth.GRACE_PERIOD_IN_DAYS) - else: - # format is weekday#week of month - their_weekday = int(day_of_week[0]) - week_of_month = int(day_of_week[2]) - # find the requested day this month - actual_requested_day = self.date_of_requested_weekday_in_month(their_weekday, week_of_month, today.year, today.month) - # get the timedelta between that date and today - days_until_requested_day_this_month = actual_requested_day - today.day - # if the other date is today or in the future, get the equivalent date two months ago - if days_until_requested_day_this_month >= 0: - date_in_target_month = today - monthdelta(2) - # else get the equivalent date last month - else: - date_in_target_month = today - monthdelta(1) - # find the timedelta from today - target_day = self.date_of_requested_weekday_in_month(their_weekday, week_of_month, date_in_target_month.year, date_in_target_month.month) - target_date = datetime(date_in_target_month.year, date_in_target_month.month, target_day) - difference = target_date - today - # subtract the gdoth.GRACE period - age = difference - timedelta(days = gdoth.GRACE_PERIOD_IN_DAYS) - else: - logger.error(f"cron schedule {schedule} could not be parsed") - return None - # we should have a result - if age is None: - logger.error(f"surprisingly got None from parsing schedule {schedule}") - return None - return age - -""" -Discover AWS EventBridge rules -""" -class EventBridgeClient: - def __init__(self, region: str, endpoint_url=None): - """ - region: work with EventBridge events in the specified AWS region. - endpoint_url: optionally specify an AWS URL (e.g. for testing with localstack) - """ - self.aws_client = boto3.client("events", region, endpoint_url=endpoint_url) - - @staticmethod - def rule_for_description(rule_description): - if rule_description.get("Description", "").startswith("Scheduled Batch ingestion rule"): - return IngestionScheduleRule(rule_description) - else: - return ScheduleRule(rule_description) - - def get_rule_descriptions(self): - return self.aws_client.list_rules().get("Rules") - - def get_schedule_rules(self): - return [EventBridgeClient.rule_for_description(d) for d in self.get_rule_descriptions()] - - def get_rule_targets(self, rule_name: str): - batch_targets = {} - targets = self.aws_client.list_targets_by_rule(Rule=rule_name) - for target in targets.get("Targets"): - if (target_id := target.get("Id")) is None: - raise KeyError(f"Could not get target ID for {rule_name}") - batch_targets[target_id] = target.get("BatchParameters") - return batch_targets - - def enable_schedule(self, rule_name: str): - self.aws_client.enable_rule(Rule=rule_name) - - def disable_schedule(self, rule_name: str): - self.aws_client.disable_rule(Rule=rule_name) - - def add_schedule(self, rule_name: str, description: str, is_enabled: bool): - state = "ENABLED" if is_enabled else "DISABLED" - self.aws_client.put_rule( - Name=rule_name, - ScheduleExpression=gdoth.DEFAULT_SCHEDULE_EXPRESSION, - State=state, - Description=description - ) - - def remove_schedule(self, rule_name: str): - self.event_bridge_client.delete_rule(rule_name) - - def add_target_to_rule(self, rule_name: str, target_name: str, job_name: str, job_queue: str, role: str): - target_id = str(uuid4()) - target = [{ - "Id": target_id, - "Arn": job_queue, - "RoleArn": role, - "BatchParameters": { - "JobDefinition": target_name, - "JobName": job_name - } - }] - self.aws_client.put_targets(Rule=rule_name, Targets=target) - - def remove_targets_from_rule(self, rule_name: str): - target_ids = list(self.get_rule_targets(rule_name).keys()) - self.aws_client.remove_targets(Rule=rule_name, Ids=target_ids) diff --git a/ingestion/functions/aws_access/S3Client.py b/ingestion/functions/aws_access/S3Client.py deleted file mode 100644 index 5cee392ff..000000000 --- a/ingestion/functions/aws_access/S3Client.py +++ /dev/null @@ -1,27 +0,0 @@ -import boto3 - -class S3Client: - def __init__(self, region, endpoint_url=None): - """ - Create an S3 client for the specified AWS region. - Optionally pass the AWS endpoint URL, e.g. to test with localstack. - """ - self.s3_adapter = boto3.resource('s3', endpoint_url=endpoint_url, region_name=region) - - def objects_in_bucket_for_ingestion_source(self, bucket_name, source_id): - """ - Lists all of the ingestion source objects for a given source in the sources bucket. - Relies on the convention that files are named source_id/date/filename.ext - Returns an iterator containing all of the matching objects - """ - bucket = self.s3_adapter.Bucket(bucket_name) - objects = bucket.objects.filter(Prefix = source_id) - return objects - - def delete_object_in_bucket(self, bucket_name, file_name): - """ - Deletes the given object from the bucket. - Note that S3 is not hierarchical, so file_name is the "full path" to the object. - """ - self.s3_adapter.Bucket(bucket_name).delete_objects(Delete={'Objects':[{'Key': file_name}]}) - diff --git a/ingestion/functions/aws_access/ScheduleRuleTests.py b/ingestion/functions/aws_access/ScheduleRuleTests.py deleted file mode 100644 index f77188f9f..000000000 --- a/ingestion/functions/aws_access/ScheduleRuleTests.py +++ /dev/null @@ -1,125 +0,0 @@ -import unittest -from datetime import datetime, timedelta -from .EventBridgeClient import EventBridgeClient, date_of_requested_weekday_in_month - - -class ScheduleRuleTests(unittest.TestCase): - real_ingestion_rule = { - 'Arn': 'arn:aws:events:eu-central-1:612888738066:rule/taiwan-taiwan-ingestor-prod', - 'Description': 'Scheduled Batch ingestion rule for source: Taiwan with ID: ' - '5f7796ece78c6866f6f676e0 for environment: prod', - 'EventBusName': 'default', - 'Name': 'taiwan-taiwan-ingestor-prod', - 'ScheduleExpression': 'rate(1 day)', - 'State': 'ENABLED' - } - - real_non_ingestion_rule = { - 'Arn': 'arn:aws:events:eu-central-1:612888738066:rule/testy', - 'Description': 'Delete me', - 'EventBusName': 'default', - 'Name': 'testy', - 'ScheduleExpression': 'cron(1 0 * * ? *)', - 'State': 'DISABLED' - } - - first_of_january_2022 = datetime(2022, 1, 1) # was a Saturday - - def test_description(self): - rule_definition = { - "Description": "A test rule." - } - rule = EventBridgeClient.rule_for_description(rule_definition) - assert rule.description() == "A test rule." - - def test_schedule(self): - rule_definition = { - "ScheduleExpression": "rate(1 day)" - } - rule = EventBridgeClient.rule_for_description(rule_definition) - assert rule.schedule() == "rate(1 day)" - - def test_ingestion_rule_positive(self): - rule = EventBridgeClient.rule_for_description(ScheduleRuleTests.real_ingestion_rule) - assert rule.is_ingestion_rule() - - def test_ingestion_rule_negative(self): - rule = EventBridgeClient.rule_for_description(ScheduleRuleTests.real_non_ingestion_rule) - assert not rule.is_ingestion_rule() - - def test_retrieve_ingestion_source_id(self): - rule = EventBridgeClient.rule_for_description(ScheduleRuleTests.real_ingestion_rule) - assert rule.ingestion_source_id() == '5f7796ece78c6866f6f676e0' - - def test_oldest_file_age_for_rate_schedule(self): - rule = EventBridgeClient.rule_for_description(ScheduleRuleTests.real_ingestion_rule) - assert rule.oldest_file_age(ScheduleRuleTests.first_of_january_2022) == timedelta(days = -12) - - def test_oldest_file_age_for_any_weekday(self): - rule_definition = dict(ScheduleRuleTests.real_ingestion_rule) - rule_definition['ScheduleExpression'] = 'cron(17 17 * * ? *)' - rule = EventBridgeClient.rule_for_description(rule_definition) - assert rule.oldest_file_age(ScheduleRuleTests.first_of_january_2022) == timedelta(days = -24) - - def test_oldest_file_age_for_named_weekday_same_as_today(self): - rule_definition = dict(ScheduleRuleTests.real_ingestion_rule) - rule_definition['ScheduleExpression'] = 'cron(17 17 * * SAT *)' - rule = EventBridgeClient.rule_for_description(rule_definition) - assert rule.oldest_file_age(ScheduleRuleTests.first_of_january_2022) == timedelta(days = -24) - - def test_oldest_file_age_for_named_weekday_other_today(self): - rule_definition = dict(ScheduleRuleTests.real_ingestion_rule) - rule_definition['ScheduleExpression'] = 'cron(17 17 * * THU *)' - rule = EventBridgeClient.rule_for_description(rule_definition) - assert rule.oldest_file_age(ScheduleRuleTests.first_of_january_2022) == timedelta(days = -19) - - def test_oldest_file_age_for_named_weekday_other_today_on_sunday(self): - # this is a boundary test: sunday is day 0 on AWS, day 7 in Python - rule_definition = dict(ScheduleRuleTests.real_ingestion_rule) - rule_definition['ScheduleExpression'] = 'cron(17 17 * * THU *)' - rule = EventBridgeClient.rule_for_description(rule_definition) - assert rule.oldest_file_age(datetime(2022, 1, 2)) == timedelta(days = -20) - - def test_oldest_file_age_for_numbered_weekday(self): - rule_definition = dict(ScheduleRuleTests.real_ingestion_rule) - rule_definition['ScheduleExpression'] = 'cron(17 17 * * 6 *)' - rule = EventBridgeClient.rule_for_description(rule_definition) - assert rule.oldest_file_age(ScheduleRuleTests.first_of_january_2022) == timedelta(days = -24) - - def test_oldest_file_age_for_first_numbered_weekday_in_month_same_as_today(self): - rule_definition = dict(ScheduleRuleTests.real_ingestion_rule) - rule_definition['ScheduleExpression'] = 'cron(17 17 * * 6#1 *)' - rule = EventBridgeClient.rule_for_description(rule_definition) - age = rule.oldest_file_age(ScheduleRuleTests.first_of_january_2022) - oldest_date = ScheduleRuleTests.first_of_january_2022 + age - assert oldest_date == (datetime(2021, 11, 6) + timedelta(days = -10)) #first Sat two months earlier plus grace period - - def test_oldest_file_age_for_second_numbered_weekday_that_has_yet_to_occur(self): - rule_definition = dict(ScheduleRuleTests.real_ingestion_rule) - rule_definition['ScheduleExpression'] = 'cron(17 17 * * 6#2 *)' - rule = EventBridgeClient.rule_for_description(rule_definition) - age = rule.oldest_file_age(ScheduleRuleTests.first_of_january_2022) - oldest_date = ScheduleRuleTests.first_of_january_2022 + age - assert oldest_date == (datetime(2021, 11, 13) + timedelta(days = -10)) #second Sat two months earlier plus grace period - - def test_oldest_file_age_for_first_numbered_weekday_in_month_that_already_passed(self): - rule_definition = dict(ScheduleRuleTests.real_ingestion_rule) - rule_definition['ScheduleExpression'] = 'cron(17 17 * * 6#1 *)' - rule = EventBridgeClient.rule_for_description(rule_definition) - second_jan_2022 = datetime(2022, 1, 2) # sunday - age = rule.oldest_file_age(second_jan_2022) - oldest_date = second_jan_2022 + age - assert oldest_date == (datetime(2021, 12, 4) + timedelta(days = -10)) #first Sat one month earlier plus grace period - - def test_target_weekday_calculation(self): - # first saturday of the month in January 2022 is Saturday Jan 1 2022 - target_day = date_of_requested_weekday_in_month(6, 1, ScheduleRuleTests.first_of_january_2022.year, ScheduleRuleTests.first_of_january_2022.month) - assert target_day == 1 - - def test_more_complex_target_weekday_calculation(self): - # first saturday of the month in November 2021 is Saturday Nov 6 2021 - target_day = date_of_requested_weekday_in_month(6, 1, 2021, 11) - assert target_day == 6 - -if __name__ == '__main__': - unittest.main() \ No newline at end of file diff --git a/ingestion/functions/aws_access/__init__.py b/ingestion/functions/aws_access/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/aws_access/globaldothealth_configuration.py b/ingestion/functions/aws_access/globaldothealth_configuration.py deleted file mode 100644 index cf72b4311..000000000 --- a/ingestion/functions/aws_access/globaldothealth_configuration.py +++ /dev/null @@ -1,7 +0,0 @@ -import os - -AWS_REGION = os.environ.get("AWS_REGION", "eu-central-1") -INGESTION_SOURCES_BUCKET = os.environ.get("INGESTION_SOURCES_BUCKET", "gdh-sources") -DEFAULT_SCHEDULE_EXPRESSION = os.environ.get("DEFAULT_SCHEDULE_EXPRESSION", "rate(1 day)") -# Our file retention policy is twice the schedule period plus 10 days -GRACE_PERIOD_IN_DAYS = int(os.environ.get("GRACE_PERIOD_IN_DAYS", "10")) diff --git a/ingestion/functions/clean_old_ingestion_source_files.py b/ingestion/functions/clean_old_ingestion_source_files.py deleted file mode 100644 index 95e9f4649..000000000 --- a/ingestion/functions/clean_old_ingestion_source_files.py +++ /dev/null @@ -1,43 +0,0 @@ -from datetime import datetime -import logging -import os - -from aws_access.EventBridgeClient import EventBridgeClient, ScheduleRule -from aws_access.S3Client import S3Client -import aws_access.globaldothealth_configuration as gdoth - -logger = logging.getLogger("clean_old_ingestion_source_files") - -def get_schedule_rules(endpoint_url=None): - """Find a list of the schedule rules related to ingestion in G.h""" - event_bridge = EventBridgeClient(gdoth.AWS_REGION, endpoint_url) - return event_bridge.get_schedule_rules() - -def main(endpoint_url=None): - logger.info("Let's do this!") - sources_and_ages = {r.ingestion_source_id(): r.oldest_file_age(datetime.today()) for r in get_schedule_rules(endpoint_url) if r.is_ingestion_rule()} - s3 = S3Client(gdoth.AWS_REGION, endpoint_url) - for source_id, oldest_age in sources_and_ages.items(): - logger.info(f"Working on {source_id}") - earliest_date = datetime.now() + oldest_age - logger.info(f"Threshold date is {earliest_date}") - for file in s3.objects_in_bucket_for_ingestion_source(gdoth.INGESTION_SOURCES_BUCKET, source_id): - file_name = file.key - # expected convention: source_id/year/month/day/hhmm/filename.ext - components = file_name.split('/') - if len(components) != 6: - logger.warning(f"file name {file_name} does not meet expectations, skipping") - continue - _, their_year, their_month, their_day, _, _ = components - their_date = datetime(int(their_year), int(their_month), int(their_day)) - if their_date < earliest_date: - logger.info(f"deleting {file_name}") - s3.delete_object_in_bucket(gdoth.INGESTION_SOURCES_BUCKET, file_name) - else: - logger.info(f"keeping {file_name}") - logger.info("done!") - - -if __name__ == "__main__": - endpoint_url = os.environ.get('AWS_ENDPOINT_URL') - main(endpoint_url) \ No newline at end of file diff --git a/ingestion/functions/common/__init__.py b/ingestion/functions/common/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/common/common_lib.py b/ingestion/functions/common/common_lib.py deleted file mode 100644 index d7e205bbc..000000000 --- a/ingestion/functions/common/common_lib.py +++ /dev/null @@ -1,221 +0,0 @@ -""" -Common utilities between parsing and retrieval lambdas. - -TODO: Considering structuring this as a class (if that's workable with AWS -Lambda layers). Many methods accept similar parameters, in order to accomplish -API calls, and it's information that could be easily encoded as state in an -object. -""" - -import os -import re -import sys -import json -import tempfile -import requests -import functools -from enum import Enum -from pathlib import Path -from typing import Any -from functools import reduce -from typing import Dict - -import google -import google.auth.transport.requests -from google.oauth2 import service_account - -try: - import ingestion_logging as logging -except Exception: - sys.path.append(Path(__file__).parent) - import common.ingestion_logging as logging - -E2E_MOCK_SOURCE_URL = os.environ.get("MOCK_SOURCE_DATA_ADDRESS", "") -REGISTRATION_ENDPOINT = os.environ.get("REGISTRATION_ENDPOINT", "http://localhost:3001/auth/register") - -_ENV_TO_SOURCE_API_URL = { - "locale2e": E2E_MOCK_SOURCE_URL, - "local": "http://localhost:3001/api", - "dev": "https://dev-data.covid-19.global.health/api", - "qa": "https://qa-data.covid-19.global.health/api", - "prod": "https://data.covid-19.global.health/api" -} -_SERVICE_ACCOUNT_CRED_FILE = "covid-19-map-277002-0943eeb6776b.json" -_METADATA_BUCKET = "gdh-credentials" -MIN_SOURCE_ID_LENGTH, MAX_SOURCE_ID_LENGTH = 24, 24 - -logger = logging.getLogger(__name__) -logger.setLevel("INFO") - -class UploadError(Enum): - """Upload error categories corresponding to the G.h Source API.""" - INTERNAL_ERROR = 1 - SOURCE_CONFIGURATION_ERROR = 2 - SOURCE_CONFIGURATION_NOT_FOUND = 3 - SOURCE_CONTENT_NOT_FOUND = 4 - SOURCE_CONTENT_DOWNLOAD_ERROR = 5 - PARSING_ERROR = 6 - DATA_UPLOAD_ERROR = 7 - VALIDATION_ERROR = 8 - - -def create_upload_record(env, source_id, headers, cookies): - """Creates an upload resource via the G.h Source API.""" - post_api_url = f"{get_source_api_url(env)}/sources/{source_id}/uploads" - logger.info(f"Creating upload via {post_api_url}") - res = requests.post(post_api_url, - json={"status": "IN_PROGRESS", "summary": {}}, - cookies=cookies, - headers=headers) - if res and res.status_code == 201: - res_json = res.json() - return res_json["_id"] - e = RuntimeError( - f"Error creating upload record, status={res.status_code}, response={res.text}") - complete_with_error(e) - - -def finalize_upload( - env, source_id, upload_id, headers, cookies, count_created=None, - count_updated=None, count_error=None, error=None): - """Records the results of an upload via the G.h Source API.""" - put_api_url = f"{get_source_api_url(env)}/sources/{source_id}/uploads/{upload_id}" - logger.info(f"Updating upload via {put_api_url}") - update = {"summary": {}} - if error: - update["status"] = "ERROR" - update["summary"]["error"] = error.name - else: - update["status"] = "SUCCESS" - if count_created: - update["summary"]["numCreated"] = count_created - if count_updated: - update["summary"]["numUpdated"] = count_updated - if count_error: - update["summary"]["numError"] = count_error - - res = requests.put(put_api_url, - json=update, - headers=headers, - cookies=cookies) - return res.status_code, res.text - - -def complete_with_error( - exception, env=None, upload_error=None, - source_id=None, upload_id=None, - headers=None, cookies=None, - count_created=0, count_updated=0, count_error=0): - """ - Logs and raises the provided exception. - - If upload details are provided, updates the indicated upload with the - provided data. - """ - logger.error(exception) - if env and upload_error and source_id and upload_id: - finalize_upload(env, source_id, upload_id, headers, cookies, - error=upload_error, - count_created=count_created, - count_updated=count_updated, - count_error=count_error) - raise exception - - -def login(email: str): - """Logs-in a local curator server instance for testing. - - Returns the cookie of the now logged-in user. - """ - logger.info(f"Logging-in user {email}") - endpoint = REGISTRATION_ENDPOINT - res = requests.post(endpoint, json={ - "email": email, - "roles": ["curator"], - }) - if not res or res.status_code != 200: - raise RuntimeError( - f"Error registering local user, status={res.status_code}, response={res.text}") - return res.cookies - - -def obtain_api_credentials(s3_client): - """ - Creates HTTP headers credentialed for access to the Global.health Source API. - """ - try: - fd, local_creds_file_name = tempfile.mkstemp() - with os.fdopen(fd) as _: - logger.info( - "Retrieving service account credentials from " - f"s3://{_METADATA_BUCKET}/{_SERVICE_ACCOUNT_CRED_FILE}") - s3_client.download_file(_METADATA_BUCKET, - _SERVICE_ACCOUNT_CRED_FILE, - local_creds_file_name) - credentials = service_account.Credentials.from_service_account_file( - local_creds_file_name, scopes=["email"]) - headers = {} - request = google.auth.transport.requests.Request() - credentials.refresh(request) - credentials.apply(headers) - return headers - except Exception as e: - logger.error(e) - raise e - - -def get_source_api_url(env): - """ - Returns the URL at which to reach the Source API for the provided environment. - """ - if env not in _ENV_TO_SOURCE_API_URL: - raise ValueError(f"No source API URL found for provided env: {env}") - return _ENV_TO_SOURCE_API_URL[env] - - -def python_module(folder: Path, root: Path): - """Returns the unique python module in folder relative to root""" - modules = [f for f in Path(folder).glob("*.py") - if "test" not in str(f) and "__init__.py" not in str(f)] - if len(modules) == 1: # Ensure there is a unique python module - return str(modules[0].relative_to(root)).replace('/', '.')[:-3] - else: - return None - - -def deep_get(dictionary: Dict[str, Any], keys: str, default=None) -> Any: - """ - Retrieve values from nested dictionaries - """ - return reduce( - lambda d, key: d.get(key, default) if isinstance(d, dict) else default, - keys.split("."), - dictionary, - ) - - -def get_parser_module(parser): - parser_name = re.sub(r"-ingestor-\w+", r"", parser) - parser_name = re.sub(r"-", r".", parser_name) - return f"parsing.{parser_name}" - - -@functools.lru_cache -def get_source_id_parser_map(parser_root: Path = None): - """Returns a mapping of source IDs to parser information""" - parser_root = parser_root or Path(__file__).parent.parent - input_event_files = [ - f for f in parser_root.rglob("input_event.json") - if all(not str(f).startswith(prefix) - for prefix in [".aws-sam", "common", "parsing/example"]) - ] - m = {} # map from source id -> parser information - for input_event_file in input_event_files: - input_event = json.loads(input_event_file.read_text()) - sourceId = input_event["sourceId"] - if not MIN_SOURCE_ID_LENGTH <= len(sourceId) <= MAX_SOURCE_ID_LENGTH: - continue - del input_event["sourceId"] - m[sourceId] = input_event - m[sourceId]["python_module"] = python_module(input_event_file.parent, parser_root) - return m diff --git a/ingestion/functions/common/common_lib_test.py b/ingestion/functions/common/common_lib_test.py deleted file mode 100644 index fb720e8e5..000000000 --- a/ingestion/functions/common/common_lib_test.py +++ /dev/null @@ -1,150 +0,0 @@ -import pytest -import requests - -from common import common_lib -from unittest.mock import patch - -_SOURCE_API_URL = "https://foo.bar" -_SOURCE_ID = "abc123" -_UPLOAD_ID = "123456789012345678901234" - - -@pytest.fixture() -def mock_source_api_url_fixture(): - """ - Supplies a predetermined endpoint for G.h HTTP requests. - - Because we're testing this function in this file as well, this fixture - can't be set to autouse. - """ - with patch('common.common_lib.get_source_api_url') as mock: - mock.return_value = _SOURCE_API_URL - yield mock - - -def test_register_local_user( - requests_mock, mock_source_api_url_fixture): - requests_mock.post( - "http://localhost:3001/auth/register", - json={"email": "foo@bar.baz"}, - status_code=200, - cookies={"foo": "bar"}) - - cookies = common_lib.login("foo@bar.baz") - - assert cookies == {"foo": "bar"} - - -def test_create_upload_record_returns_upload_id( - requests_mock, mock_source_api_url_fixture): - create_upload_url = f"{_SOURCE_API_URL}/sources/{_SOURCE_ID}/uploads" - requests_mock.post( - create_upload_url, - json={"_id": _UPLOAD_ID, "status": "IN_PROGRESS", "summary": {}}, - status_code=201) - - response = common_lib.create_upload_record("env", _SOURCE_ID, {}, {}) - - assert requests_mock.request_history[0].url == create_upload_url - assert response == _UPLOAD_ID - - -def test_create_upload_record_raises_error_for_failed_request( - requests_mock, mock_source_api_url_fixture): - create_upload_url = f"{_SOURCE_API_URL}/sources/{_SOURCE_ID}/uploads" - requests_mock.register_uri( - "POST", - create_upload_url, - exc=requests.exceptions.ConnectTimeout) - - try: - common_lib.create_upload_record("env", _SOURCE_ID, {}, {}) - except requests.exceptions.ConnectTimeout: - return - - # We got the wrong exception or no exception, fail the test. - assert False - - -def test_finalize_upload_invokes_update_api( - requests_mock, mock_source_api_url_fixture): - update_upload_url = f"{_SOURCE_API_URL}/sources/{_SOURCE_ID}/uploads/{_UPLOAD_ID}" - num_created = 42 - num_updated = 0 - requests_mock.put( - update_upload_url, - json={"_id": _UPLOAD_ID, "status": "SUCCESS", - "summary": {"numCreated": num_created, "numUpdated": num_updated}}) - - common_lib.finalize_upload( - "env", _SOURCE_ID, _UPLOAD_ID, {}, {}, num_created, num_updated) - - assert requests_mock.request_history[0].url == update_upload_url - - -def test_finalize_upload_raises_error_for_failed_request( - requests_mock, mock_source_api_url_fixture): - update_upload_url = f"{_SOURCE_API_URL}/sources/{_SOURCE_ID}/uploads/{_UPLOAD_ID}" - requests_mock.register_uri( - "PUT", - update_upload_url, - [{"status_code": 500}]) - - status, _ = common_lib.finalize_upload("env", _SOURCE_ID, _UPLOAD_ID, {}, {}, 42, 0) - if status == 500: - assert len(requests_mock.request_history) == 1 - assert requests_mock.request_history[0].url == update_upload_url - return - - # We got the wrong exception or no exception, fail the test. - assert False - - -def test_complete_with_error_raises_exception(): - e = ValueError("Oops!") - try: - common_lib.complete_with_error(e) - except ValueError: - return - - # We got the wrong exception or no exception, fail the test. - assert False - - -def test_complete_with_error_updates_upload_if_provided_data( - requests_mock, mock_source_api_url_fixture): - update_upload_url = f"{_SOURCE_API_URL}/sources/{_SOURCE_ID}/uploads/{_UPLOAD_ID}" - requests_mock.put(update_upload_url, json={}) - e = ValueError("Oops!") - - try: - upload_error = common_lib.UploadError.SOURCE_CONFIGURATION_ERROR - common_lib.complete_with_error( - e, "env", upload_error, _SOURCE_ID, _UPLOAD_ID, {}, {}) - except ValueError: - assert requests_mock.request_history[0].url == update_upload_url - assert requests_mock.request_history[-1].json( - ) == {"status": "ERROR", "summary": {"error": upload_error.name}} - return - # We got the wrong exception or no exception, fail the test. - assert not "Should have raised a ValueError exception" - - -def test_get_source_api_url_returns_mapped_value(): - for key, value in common_lib._ENV_TO_SOURCE_API_URL.items(): - assert common_lib.get_source_api_url(key) == value - - -def test_get_source_api_url_raises_error_for_unmapped_env(): - try: - common_lib.get_source_api_url('not-an-env') - except ValueError: - return - assert not "Should have raised a ValueError exception" - - -def test_get_parser_module(): - parser = "japan-japan-ingestor-test" - exp = "parsing.japan.japan" - act = common_lib.get_parser_module(parser) - assert exp == act diff --git a/ingestion/functions/common/geocoding_countries.json b/ingestion/functions/common/geocoding_countries.json deleted file mode 100644 index ef43bc234..000000000 --- a/ingestion/functions/common/geocoding_countries.json +++ /dev/null @@ -1,1242 +0,0 @@ -{ - "AD": [ - 42.546245, - 1.601554, - "Andorra" - ], - "AE": [ - 23.424076, - 53.847818, - "United Arab Emirates" - ], - "AF": [ - 33.93911, - 67.709953, - "Afghanistan" - ], - "AG": [ - 17.060816, - -61.796428, - "Antigua and Barbuda" - ], - "AI": [ - 18.220554, - -63.068615, - "Anguilla" - ], - "AL": [ - 41.153332, - 20.168331, - "Albania" - ], - "AM": [ - 40.069099, - 45.038189, - "Armenia" - ], - "AN": [ - 12.226079, - -69.060087, - "Netherlands Antilles" - ], - "AO": [ - -11.202692, - 17.873887, - "Angola" - ], - "AQ": [ - -75.250973, - -0.071389, - "Antarctica" - ], - "AR": [ - -38.416097, - -63.616672, - "Argentina" - ], - "AS": [ - -14.270972, - -170.132217, - "American Samoa" - ], - "AT": [ - 47.516231, - 14.550072, - "Austria" - ], - "AU": [ - -25.274398, - 133.775136, - "Australia" - ], - "AW": [ - 12.52111, - -69.968338, - "Aruba" - ], - "AZ": [ - 40.143105, - 47.576927, - "Azerbaijan" - ], - "BA": [ - 43.915886, - 17.679076, - "Bosnia and Herzegovina" - ], - "BB": [ - 13.193887, - -59.543198, - "Barbados" - ], - "BD": [ - 23.684994, - 90.356331, - "Bangladesh" - ], - "BE": [ - 50.503887, - 4.469936, - "Belgium" - ], - "BF": [ - 12.238333, - -1.561593, - "Burkina Faso" - ], - "BG": [ - 42.733883, - 25.48583, - "Bulgaria" - ], - "BH": [ - 25.930414, - 50.637772, - "Bahrain" - ], - "BI": [ - -3.373056, - 29.918886, - "Burundi" - ], - "BJ": [ - 9.30769, - 2.315834, - "Benin" - ], - "BM": [ - 32.321384, - -64.75737, - "Bermuda" - ], - "BN": [ - 4.535277, - 114.727669, - "Brunei" - ], - "BO": [ - -16.290154, - -63.588653, - "Bolivia" - ], - "BR": [ - -14.235004, - -51.92528, - "Brazil" - ], - "BS": [ - 25.03428, - -77.39628, - "Bahamas" - ], - "BT": [ - 27.514162, - 90.433601, - "Bhutan" - ], - "BV": [ - -54.423199, - 3.413194, - "Bouvet Island" - ], - "BW": [ - -22.328474, - 24.684866, - "Botswana" - ], - "BY": [ - 53.709807, - 27.953389, - "Belarus" - ], - "BZ": [ - 17.189877, - -88.49765, - "Belize" - ], - "CA": [ - 56.130366, - -106.346771, - "Canada" - ], - "CC": [ - -12.164165, - 96.870956, - "Cocos [Keeling] Islands" - ], - "CD": [ - -4.038333, - 21.758664, - "Congo [DRC]" - ], - "CF": [ - 6.611111, - 20.939444, - "Central African Republic" - ], - "CG": [ - -0.228021, - 15.827659, - "Congo [Republic]" - ], - "CH": [ - 46.818188, - 8.227512, - "Switzerland" - ], - "CI": [ - 7.539989, - -5.54708, - "Côte d'Ivoire" - ], - "CK": [ - -21.236736, - -159.777671, - "Cook Islands" - ], - "CL": [ - -35.675147, - -71.542969, - "Chile" - ], - "CM": [ - 7.369722, - 12.354722, - "Cameroon" - ], - "CN": [ - 35.86166, - 104.195397, - "China" - ], - "CO": [ - 4.570868, - -74.297333, - "Colombia" - ], - "CR": [ - 9.748917, - -83.753428, - "Costa Rica" - ], - "CU": [ - 21.521757, - -77.781167, - "Cuba" - ], - "CV": [ - 16.002082, - -24.013197, - "Cape Verde" - ], - "CX": [ - -10.447525, - 105.690449, - "Christmas Island" - ], - "CY": [ - 35.126413, - 33.429859, - "Cyprus" - ], - "CZ": [ - 49.817492, - 15.472962, - "Czech Republic" - ], - "DE": [ - 51.165691, - 10.451526, - "Germany" - ], - "DJ": [ - 11.825138, - 42.590275, - "Djibouti" - ], - "DK": [ - 56.26392, - 9.501785, - "Denmark" - ], - "DM": [ - 15.414999, - -61.370976, - "Dominica" - ], - "DO": [ - 18.735693, - -70.162651, - "Dominican Republic" - ], - "DZ": [ - 28.033886, - 1.659626, - "Algeria" - ], - "EC": [ - -1.831239, - -78.183406, - "Ecuador" - ], - "EE": [ - 58.595272, - 25.013607, - "Estonia" - ], - "EG": [ - 26.820553, - 30.802498, - "Egypt" - ], - "EH": [ - 24.215527, - -12.885834, - "Western Sahara" - ], - "ER": [ - 15.179384, - 39.782334, - "Eritrea" - ], - "ES": [ - 40.463667, - -3.74922, - "Spain" - ], - "ET": [ - 9.145, - 40.489673, - "Ethiopia" - ], - "FI": [ - 61.92411, - 25.748151, - "Finland" - ], - "FJ": [ - -16.578193, - 179.414413, - "Fiji" - ], - "FK": [ - -51.796253, - -59.523613, - "Falkland Islands [Islas Malvinas]" - ], - "FM": [ - 7.425554, - 150.550812, - "Micronesia" - ], - "FO": [ - 61.892635, - -6.911806, - "Faroe Islands" - ], - "FR": [ - 46.227638, - 2.213749, - "France" - ], - "GA": [ - -0.803689, - 11.609444, - "Gabon" - ], - "GB": [ - 55.378051, - -3.435973, - "United Kingdom" - ], - "GD": [ - 12.262776, - -61.604171, - "Grenada" - ], - "GE": [ - 42.315407, - 43.356892, - "Georgia" - ], - "GF": [ - 3.933889, - -53.125782, - "French Guiana" - ], - "GG": [ - 49.465691, - -2.585278, - "Guernsey" - ], - "GH": [ - 7.946527, - -1.023194, - "Ghana" - ], - "GI": [ - 36.137741, - -5.345374, - "Gibraltar" - ], - "GL": [ - 71.706936, - -42.604303, - "Greenland" - ], - "GM": [ - 13.443182, - -15.310139, - "Gambia" - ], - "GN": [ - 9.945587, - -9.696645, - "Guinea" - ], - "GP": [ - 16.995971, - -62.067641, - "Guadeloupe" - ], - "GQ": [ - 1.650801, - 10.267895, - "Equatorial Guinea" - ], - "GR": [ - 39.074208, - 21.824312, - "Greece" - ], - "GS": [ - -54.429579, - -36.587909, - "South Georgia and the South Sandwich Islands" - ], - "GT": [ - 15.783471, - -90.230759, - "Guatemala" - ], - "GU": [ - 13.444304, - 144.793731, - "Guam" - ], - "GW": [ - 11.803749, - -15.180413, - "Guinea-Bissau" - ], - "GY": [ - 4.860416, - -58.93018, - "Guyana" - ], - "GZ": [ - 31.354676, - 34.308825, - "Gaza Strip" - ], - "HK": [ - 22.396428, - 114.109497, - "Hong Kong" - ], - "HM": [ - -53.08181, - 73.504158, - "Heard Island and McDonald Islands" - ], - "HN": [ - 15.199999, - -86.241905, - "Honduras" - ], - "HR": [ - 45.1, - 15.2, - "Croatia" - ], - "HT": [ - 18.971187, - -72.285215, - "Haiti" - ], - "HU": [ - 47.162494, - 19.503304, - "Hungary" - ], - "ID": [ - -0.789275, - 113.921327, - "Indonesia" - ], - "IE": [ - 53.41291, - -8.24389, - "Ireland" - ], - "IL": [ - 31.046051, - 34.851612, - "Israel" - ], - "IM": [ - 54.236107, - -4.548056, - "Isle of Man" - ], - "IN": [ - 20.593684, - 78.96288, - "India" - ], - "IO": [ - -6.343194, - 71.876519, - "British Indian Ocean Territory" - ], - "IQ": [ - 33.223191, - 43.679291, - "Iraq" - ], - "IR": [ - 32.427908, - 53.688046, - "Iran" - ], - "IS": [ - 64.963051, - -19.020835, - "Iceland" - ], - "IT": [ - 41.87194, - 12.56738, - "Italy" - ], - "JE": [ - 49.214439, - -2.13125, - "Jersey" - ], - "JM": [ - 18.109581, - -77.297508, - "Jamaica" - ], - "JO": [ - 30.585164, - 36.238414, - "Jordan" - ], - "JP": [ - 36.204824, - 138.252924, - "Japan" - ], - "KE": [ - -0.023559, - 37.906193, - "Kenya" - ], - "KG": [ - 41.20438, - 74.766098, - "Kyrgyzstan" - ], - "KH": [ - 12.565679, - 104.990963, - "Cambodia" - ], - "KI": [ - -3.370417, - -168.734039, - "Kiribati" - ], - "KM": [ - -11.875001, - 43.872219, - "Comoros" - ], - "KN": [ - 17.357822, - -62.782998, - "Saint Kitts and Nevis" - ], - "KP": [ - 40.339852, - 127.510093, - "North Korea" - ], - "KR": [ - 35.907757, - 127.766922, - "South Korea" - ], - "KW": [ - 29.31166, - 47.481766, - "Kuwait" - ], - "KY": [ - 19.513469, - -80.566956, - "Cayman Islands" - ], - "KZ": [ - 48.019573, - 66.923684, - "Kazakhstan" - ], - "LA": [ - 19.85627, - 102.495496, - "Laos" - ], - "LB": [ - 33.854721, - 35.862285, - "Lebanon" - ], - "LC": [ - 13.909444, - -60.978893, - "Saint Lucia" - ], - "LI": [ - 47.166, - 9.555373, - "Liechtenstein" - ], - "LK": [ - 7.873054, - 80.771797, - "Sri Lanka" - ], - "LR": [ - 6.428055, - -9.429499, - "Liberia" - ], - "LS": [ - -29.609988, - 28.233608, - "Lesotho" - ], - "LT": [ - 55.169438, - 23.881275, - "Lithuania" - ], - "LU": [ - 49.815273, - 6.129583, - "Luxembourg" - ], - "LV": [ - 56.879635, - 24.603189, - "Latvia" - ], - "LY": [ - 26.3351, - 17.228331, - "Libya" - ], - "MA": [ - 31.791702, - -7.09262, - "Morocco" - ], - "MC": [ - 43.750298, - 7.412841, - "Monaco" - ], - "MD": [ - 47.411631, - 28.369885, - "Moldova" - ], - "ME": [ - 42.708678, - 19.37439, - "Montenegro" - ], - "MG": [ - -18.766947, - 46.869107, - "Madagascar" - ], - "MH": [ - 7.131474, - 171.184478, - "Marshall Islands" - ], - "MK": [ - 41.608635, - 21.745275, - "Macedonia [FYROM]" - ], - "ML": [ - 17.570692, - -3.996166, - "Mali" - ], - "MM": [ - 21.913965, - 95.956223, - "Myanmar [Burma]" - ], - "MN": [ - 46.862496, - 103.846656, - "Mongolia" - ], - "MO": [ - 22.198745, - 113.543873, - "Macau" - ], - "MP": [ - 17.33083, - 145.38469, - "Northern Mariana Islands" - ], - "MQ": [ - 14.641528, - -61.024174, - "Martinique" - ], - "MR": [ - 21.00789, - -10.940835, - "Mauritania" - ], - "MS": [ - 16.742498, - -62.187366, - "Montserrat" - ], - "MT": [ - 35.937496, - 14.375416, - "Malta" - ], - "MU": [ - -20.348404, - 57.552152, - "Mauritius" - ], - "MV": [ - 3.202778, - 73.22068, - "Maldives" - ], - "MW": [ - -13.254308, - 34.301525, - "Malawi" - ], - "MX": [ - 23.634501, - -102.552784, - "Mexico" - ], - "MY": [ - 4.210484, - 101.975766, - "Malaysia" - ], - "MZ": [ - -18.665695, - 35.529562, - "Mozambique" - ], - "NaN": [ - -22.95764, - 18.49041, - "Namibia" - ], - "NC": [ - -20.904305, - 165.618042, - "New Caledonia" - ], - "NE": [ - 17.607789, - 8.081666, - "Niger" - ], - "NF": [ - -29.040835, - 167.954712, - "Norfolk Island" - ], - "NG": [ - 9.081999, - 8.675277, - "Nigeria" - ], - "NI": [ - 12.865416, - -85.207229, - "Nicaragua" - ], - "NL": [ - 52.132633, - 5.291266, - "Netherlands" - ], - "NO": [ - 60.472024, - 8.468946, - "Norway" - ], - "NP": [ - 28.394857, - 84.124008, - "Nepal" - ], - "NR": [ - -0.522778, - 166.931503, - "Nauru" - ], - "NU": [ - -19.054445, - -169.867233, - "Niue" - ], - "NZ": [ - -40.900557, - 174.885971, - "New Zealand" - ], - "OM": [ - 21.512583, - 55.923255, - "Oman" - ], - "PA": [ - 8.537981, - -80.782127, - "Panama" - ], - "PE": [ - -9.189967, - -75.015152, - "Peru" - ], - "PF": [ - -17.679742, - -149.406843, - "French Polynesia" - ], - "PG": [ - -6.314993, - 143.95555, - "Papua New Guinea" - ], - "PH": [ - 12.879721, - 121.774017, - "Philippines" - ], - "PK": [ - 30.375321, - 69.345116, - "Pakistan" - ], - "PL": [ - 51.919438, - 19.145136, - "Poland" - ], - "PM": [ - 46.941936, - -56.27111, - "Saint Pierre and Miquelon" - ], - "PN": [ - -24.703615, - -127.439308, - "Pitcairn Islands" - ], - "PR": [ - 18.220833, - -66.590149, - "Puerto Rico" - ], - "PS": [ - 31.952162, - 35.233154, - "Palestinian Territories" - ], - "PT": [ - 39.399872, - -8.224454, - "Portugal" - ], - "PW": [ - 7.51498, - 134.58252, - "Palau" - ], - "PY": [ - -23.442503, - -58.443832, - "Paraguay" - ], - "QA": [ - 25.354826, - 51.183884, - "Qatar" - ], - "RE": [ - -21.115141, - 55.536384, - "Réunion" - ], - "RO": [ - 45.943161, - 24.96676, - "Romania" - ], - "RS": [ - 44.016521, - 21.005859, - "Serbia" - ], - "RU": [ - 61.52401, - 105.318756, - "Russia" - ], - "RW": [ - -1.940278, - 29.873888, - "Rwanda" - ], - "SA": [ - 23.885942, - 45.079162, - "Saudi Arabia" - ], - "SB": [ - -9.64571, - 160.156194, - "Solomon Islands" - ], - "SC": [ - -4.679574, - 55.491977, - "Seychelles" - ], - "SD": [ - 12.862807, - 30.217636, - "Sudan" - ], - "SE": [ - 60.128161, - 18.643501, - "Sweden" - ], - "SG": [ - 1.352083, - 103.819836, - "Singapore" - ], - "SH": [ - -24.143474, - -10.030696, - "Saint Helena" - ], - "SI": [ - 46.151241, - 14.995463, - "Slovenia" - ], - "SJ": [ - 77.553604, - 23.670272, - "Svalbard and Jan Mayen" - ], - "SK": [ - 48.669026, - 19.699024, - "Slovakia" - ], - "SL": [ - 8.460555, - -11.779889, - "Sierra Leone" - ], - "SM": [ - 43.94236, - 12.457777, - "San Marino" - ], - "SN": [ - 14.497401, - -14.452362, - "Senegal" - ], - "SO": [ - 5.152149, - 46.199616, - "Somalia" - ], - "SR": [ - 3.919305, - -56.027783, - "Suriname" - ], - "ST": [ - 0.18636, - 6.613081, - "São Tomé and Príncipe" - ], - "SV": [ - 13.794185, - -88.89653, - "El Salvador" - ], - "SY": [ - 34.802075, - 38.996815, - "Syria" - ], - "SZ": [ - -26.522503, - 31.465866, - "Swaziland" - ], - "TC": [ - 21.694025, - -71.797928, - "Turks and Caicos Islands" - ], - "TD": [ - 15.454166, - 18.732207, - "Chad" - ], - "TF": [ - -49.280366, - 69.348557, - "French Southern Territories" - ], - "TG": [ - 8.619543, - 0.824782, - "Togo" - ], - "TH": [ - 15.870032, - 100.992541, - "Thailand" - ], - "TJ": [ - 38.861034, - 71.276093, - "Tajikistan" - ], - "TK": [ - -8.967363, - -171.855881, - "Tokelau" - ], - "TL": [ - -8.874217, - 125.727539, - "Timor-Leste" - ], - "TM": [ - 38.969719, - 59.556278, - "Turkmenistan" - ], - "TN": [ - 33.886917, - 9.537499, - "Tunisia" - ], - "TO": [ - -21.178986, - -175.198242, - "Tonga" - ], - "TR": [ - 38.963745, - 35.243322, - "Turkey" - ], - "TT": [ - 10.691803, - -61.222503, - "Trinidad and Tobago" - ], - "TV": [ - -7.109535, - 177.64933, - "Tuvalu" - ], - "TW": [ - 23.69781, - 120.960515, - "Taiwan" - ], - "TZ": [ - -6.369028, - 34.888822, - "Tanzania" - ], - "UA": [ - 48.379433, - 31.16558, - "Ukraine" - ], - "UG": [ - 1.373333, - 32.290275, - "Uganda" - ], - "UM": [ - null, - null, - "U.S. Minor Outlying Islands" - ], - "US": [ - 37.09024, - -95.712891, - "United States" - ], - "UY": [ - -32.522779, - -55.765835, - "Uruguay" - ], - "UZ": [ - 41.377491, - 64.585262, - "Uzbekistan" - ], - "VA": [ - 41.902916, - 12.453389, - "Vatican City" - ], - "VC": [ - 12.984305, - -61.287228, - "Saint Vincent and the Grenadines" - ], - "VE": [ - 6.42375, - -66.58973, - "Venezuela" - ], - "VG": [ - 18.420695, - -64.639968, - "British Virgin Islands" - ], - "VI": [ - 18.335765, - -64.896335, - "U.S. Virgin Islands" - ], - "VN": [ - 14.058324, - 108.277199, - "Vietnam" - ], - "VU": [ - -15.376706, - 166.959158, - "Vanuatu" - ], - "WF": [ - -13.768752, - -177.156097, - "Wallis and Futuna" - ], - "WS": [ - -13.759029, - -172.104629, - "Samoa" - ], - "XK": [ - 42.602636, - 20.902977, - "Kosovo" - ], - "YE": [ - 15.552727, - 48.516388, - "Yemen" - ], - "YT": [ - -12.8275, - 45.166244, - "Mayotte" - ], - "ZA": [ - -30.559482, - 22.937506, - "South Africa" - ], - "ZM": [ - -13.133897, - 27.849332, - "Zambia" - ], - "ZW": [ - -19.015438, - 29.154857, - "Zimbabwe" - ], - "BL": [ - 17.89777778, - -62.83416667, - "Saint Barthélemy" - ], - "CW": [ - 12.116667, - -68.933333, - "Curaçao" - ], - "BQ": [ - 12.226079, - -69.060087, - "Netherlands Antilles" - ] -} diff --git a/ingestion/functions/common/ingestion_logging.py b/ingestion/functions/common/ingestion_logging.py deleted file mode 100644 index ec83ae08f..000000000 --- a/ingestion/functions/common/ingestion_logging.py +++ /dev/null @@ -1,44 +0,0 @@ -import json -import logging -import os -import requests -import sys - -from time import sleep - - -handlers = set() - -class SlackHandler(logging.Handler): - def __init__(self, webhook_url, level=logging.NOTSET): - super().__init__(level) - self.slack_url = webhook_url - - def emit(self, record): - message_header = {'Content-Type': 'application/json'} - message = {'text': f"[{record.levelname}] {record.message}"} - response = requests.post(url=self.slack_url, data=json.dumps(message), headers=message_header) - if response.status_code == 429 and response['error'] == 'rate_limited': - sleep(response['retry_after']) - elif response.status_code != 200: - raise ValueError( - f"Request to slack returned an error {response.status_code}, the response is:\n{response.text}" - ) - -def getLogger(module_name): - logger = logging.getLogger(module_name) - logger.setLevel(logging.DEBUG) - if not logger.hasHandlers(): - handler = logging.StreamHandler(stream=sys.stdout) - handler.setLevel(logging.DEBUG) - logger.addHandler(handler) - handlers.add(handler) - if slack_webhook := os.getenv('SLACK_LOGS_WEBHOOK'): - slackHandler = SlackHandler(slack_webhook, logging.WARNING) - logger.addHandler(slackHandler) - handlers.add(slackHandler) - return logger - -def flushAll(): - for handler in handlers: - handler.flush() diff --git a/ingestion/functions/common/ingestion_logging_test.py b/ingestion/functions/common/ingestion_logging_test.py deleted file mode 100644 index e458adbdb..000000000 --- a/ingestion/functions/common/ingestion_logging_test.py +++ /dev/null @@ -1,14 +0,0 @@ -import logging -import unittest - -from . import ingestion_logging - - -class LoggingTests(unittest.TestCase): - def testCanLogInfoMessages(self): - logger = ingestion_logging.getLogger(__name__) - assert(logger.isEnabledFor(logging.INFO) is True) - - def testCanLogDebugMessages(self): - logger = ingestion_logging.getLogger(__name__) - assert(logger.isEnabledFor(logging.DEBUG) is True) diff --git a/ingestion/functions/common/input_event.json b/ingestion/functions/common/input_event.json deleted file mode 100644 index 940ae7758..000000000 --- a/ingestion/functions/common/input_event.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "5f0b9a7ead3a2b003edc0e7f/2020/07/12/2320/content.json", - "sourceUrl": "https://foo.bar", - "sourceId": "5f0b9a7ead3a2b003edc0e7f", - "uploadId": "123456789012345678901234", - "dateRange": { - "start": "2020-01-01", - "end": "2020-09-21" - }, - "auth": { - "email": "test@fixture.com" - } -} diff --git a/ingestion/functions/common/parsing_lib.py b/ingestion/functions/common/parsing_lib.py deleted file mode 100644 index 936674faa..000000000 --- a/ingestion/functions/common/parsing_lib.py +++ /dev/null @@ -1,535 +0,0 @@ -import datetime -import json -import os -import sys -import tempfile -import collections -import contextlib -import time -from pathlib import Path -from typing import Callable, Dict, Generator, List - -import boto3 -import requests -import requests.exceptions -import iso3166 - -import common_lib - -try: - import common.ingestion_logging as logging -except ModuleNotFoundError: - import ingestion_logging as logging - -ENV_FIELD = "env" -SOURCE_URL_FIELD = "sourceUrl" -S3_BUCKET_FIELD = "s3Bucket" -S3_KEY_FIELD = "s3Key" -SOURCE_ID_FIELD = "sourceId" -UPLOAD_ID_FIELD = "uploadId" -DATE_FILTER_FIELD = "dateFilter" -DATE_RANGE_FIELD = "dateRange" -AUTH_FIELD = "auth" - -# Maximum exponential backoff times -MAX_WAIT_TIME = 600 # 5xx errors from data service -MAX_CONN_WAIT_TIME = 900 # connection errors from data service - -# Expected date fields format. -DATE_FORMATS = ["%m/%d/%YZ", "%m/%d/%Y"] - -# Number of cases to upload in batch. -# Increasing that number will speed-up the ingestion but will increase memory -# usage on the server-side and is known to cause OOMs so increase with caution. -CASES_BATCH_SIZE = 250 - -logger = logging.getLogger(__name__) -logger.setLevel("INFO") - -try: - with (Path(__file__).parent / "geocoding_countries.json").open() as g: - GEOCODING_COUNTRIES = json.load(g) - COUNTRY_ISO2 = sorted(GEOCODING_COUNTRIES.keys()) -except json.decoder.JSONDecodeError as e: - logger.exception(f"geocoding_countries.json JSONDecodeError: {e}") - logging.flushAll() - sys.exit(1) - -s3_client = boto3.client("s3") - -if os.environ.get("DOCKERIZED"): - s3_client = boto3.client("s3", - endpoint_url=os.environ.get("AWS_ENDPOINT", "http://localhost:4566"), - aws_access_key_id=os.environ.get("AWS_ACCESS_KEY_ID", "test"), - aws_secret_access_key=os.environ.get("AWS_SECRET_ACCESS_KEY", "test"), - region_name=os.environ.get("AWS_REGION", "eu-central-1") - ) - - -def safe_int(x): - try: - return int(x) - except (ValueError, TypeError): - return None - - -def geocode_country(two_letter_iso_code): - two_letter_iso_code = two_letter_iso_code.upper() - try: - lat, lon, country = GEOCODING_COUNTRIES[two_letter_iso_code] - return { - "country": two_letter_iso_code, - "geoResolution": "Country", - "name": country, - "geometry": {"latitude": lat, "longitude": lon} - } - except KeyError: - logger.error(f"Code not found in country geocoding DB: {two_letter_iso_code}") - return None - - -def extract_event_fields(event: Dict): - logger.info(f"Extracting fields from event {event}") - if any( - field not in event - for field - in - [ENV_FIELD, SOURCE_URL_FIELD, SOURCE_ID_FIELD, S3_BUCKET_FIELD, - S3_KEY_FIELD]): - error_message = ( - f"Required fields {ENV_FIELD}; {SOURCE_URL_FIELD}; {S3_BUCKET_FIELD}; " - f"{SOURCE_ID_FIELD}; {S3_KEY_FIELD} not found in input event json.") - e = ValueError(error_message) - common_lib.complete_with_error(e) - return event[ENV_FIELD], event[SOURCE_URL_FIELD], event[SOURCE_ID_FIELD], event.get(UPLOAD_ID_FIELD), event[ - S3_BUCKET_FIELD], event[S3_KEY_FIELD], event.get(DATE_FILTER_FIELD, None), event.get(DATE_RANGE_FIELD, None), event.get(AUTH_FIELD, None) - - -def retrieve_raw_data_file(s3_bucket: str, s3_key: str, out_file): - try: - logger.info(f"Retrieving raw data from s3://{s3_bucket}/{s3_key}") - s3_client.download_fileobj(s3_bucket, s3_key, out_file) - except Exception as e: - common_lib.complete_with_error(e) - -def retrieve_excluded_case_ids(source_id: str, date_filter: Dict, date_range: Dict, env: str, - headers=None, cookies=None): - if env == "locale2e": - return None - - if date_range: - start_date = date_range["start"] - end_date = date_range["end"] - date_limits = f"&dateFrom={start_date}&dateTo={end_date}" - - elif date_filter: - now = get_today() - delta = datetime.timedelta(days=date_filter["numDaysBeforeToday"]) - cutoff_date = now - delta - start_date = datetime.datetime.strftime(cutoff_date, "%Y-%m-%d") - end_date = datetime.datetime.strftime(now, "%Y-%m-%d") - date_limits = f"&dateFrom={start_date}&dateTo={end_date}" - - else: - now = get_today() - start_date = "2019-12-01" - end_date = datetime.datetime.strftime(now, "%Y-%m-%d") - date_limits = f"&dateFrom={start_date}&dateTo={end_date}" - - excluded_case_ids_endpoint_url = f"{common_lib.get_source_api_url(env)}/excludedCaseIds?sourceId={source_id}{date_limits}" - res = requests.get(excluded_case_ids_endpoint_url, headers=headers, cookies=cookies) - if res and res.status_code == 200: - res_json = res.json() - return res_json["cases"] - return None - -# This structure is needed for the partial name matching below. -countries_index = {c.name.upper(): c.alpha2 for c in iso3166.countries} - -country_to_iso_fixes = { - "CZECH REPUBLIC": "CZ", - "UNITED STATES": "US", - "REUNION": "RE", - "DEMOCRATIC REPUBLIC OF THE CONGO": "CD", - "VIETNAM": "VN", - "SOUTH KOREA": "KR", - "REPUBLIC OF CONGO": "CG", - "COTE D'IVOIRE": "CI", -} - -def iso3166_country_code(country_name: str) -> str: - """ - Given the name of a country, find the alpha2 code. Hopefully we find that the country name - is an exact match for the actual name of a country. If it is not, we try partial matches. - If there is neither an exact match nor EXACTLY ONE partial match, raise KeyError: it is a - bug in the parser if it generates locations with bad country names. - - This is only used in cases where the parser supplies the location info: typically we would - expect the parser to give a location query which is later geocoded anyway. - """ - if len(country_name) == 2 and country_name.isalpha(): - return country_name.upper() - if (ucase_name := country_name.upper()) in country_to_iso_fixes: - return country_to_iso_fixes[ucase_name] - - country = iso3166.countries.get(ucase_name, None) - if country is not None: - return country.alpha2 - # Didn't find an exact match, so try a partial match - matched_countries = [countries_index[k] for k in countries_index.keys() if ucase_name in k] - if len(matched_countries) == 1: - return matched_countries[0] - # Found 0 or many partial matches - raise KeyError - - -def prepare_cases(cases: Generator[Dict, None, None], upload_id: str, excluded_case_ids: list): - """ - Populates standard required fields for the G.h Case API. - - TODO: Migrate source_id/source_url to this method. - """ - for case in cases: - case["caseReference"]["uploadIds"] = [upload_id] - if country := common_lib.deep_get(case, "location.country"): - case["location"]["country"] = iso3166_country_code(country) - for travel in common_lib.deep_get(case, "travelHistory.travel", default=[]): - if travel_country := common_lib.deep_get(travel, "location.country"): - travel["location"]["country"] = iso3166_country_code(travel_country) - if (excluded_case_ids is None) or ("sourceEntryId" not in case["caseReference"]) or (not case["caseReference"]["sourceEntryId"] in excluded_case_ids): - yield remove_nested_none_and_empty(case) - - -def remove_nested_none_and_empty(d): - if not isinstance(d, (dict, list)): - return d - if isinstance(d, list): - return [v for v in (remove_nested_none_and_empty(v) for v in d) if v is not None and v != ""] - return {k: v for k, v in ((k, remove_nested_none_and_empty(v)) for k, v in d.items()) if v is not None and v != ""} - - -def batch_of(cases: Generator[Dict, None, None], max_items: int) -> List[Dict]: - n = 0 - batch = [] - try: - while n < max_items: - batch.append(next(cases)) - n += 1 - return batch - except StopIteration: - return batch - - -def write_to_server( - cases: Generator[Dict, None, None], - env: str, source_id: str, upload_id: str, headers, cookies, - cases_batch_size: int): - """Upserts the provided cases via the G.h Case API.""" - source_api_url = common_lib.get_source_api_url(env) - if env == "locale2e": - source_api_url = common_lib.get_source_api_url("local") - put_api_url = f"{source_api_url}/cases/batchUpsert" - upload_status_url = f"{source_api_url}/sources/{source_id}/uploads/{upload_id}" - logger.info(f"Prod URL: {put_api_url}") - counter = collections.defaultdict(int) - counter["batch_num"] = 0 - start_time = time.time() - while True: - batch_num = counter["batch_num"] - counter["batch_num"] += 1 - batch = batch_of(cases, cases_batch_size) - # End of batch. - if not batch: - break - # There are two exponential backoffs: - # * wait, total_wait keeps track of the backoff from 5xx errors - # * conn_wait, total_conn_wait tracks backoff for connection errors - total_wait = 0 - total_conn_wait = 0 - wait = 10 # initial wait time in seconds - conn_wait = 30 - logger.info(f"Sending {len(batch)} cases, total so far: {counter['total']}") - # Exponential backoff in dev and prod, but not for local testing - while ( - total_wait <= (MAX_WAIT_TIME if env in ["dev", "qa", "prod"] else 0) - and total_conn_wait < MAX_CONN_WAIT_TIME - ): - try: - res = requests.post(put_api_url, json={"cases": batch}, - headers=headers, cookies=cookies) - except requests.exceptions.ConnectionError: - logger.warning(f"Failed to connect to data service, waiting {conn_wait}s") - time.sleep(conn_wait) - total_conn_wait += conn_wait - conn_wait *= 2 - continue - if res.status_code in [200, 207]: # 207 is used for validation error - break - if res.status_code == 500 and "401" in res.text: - logger.warning(f"Request failed, status={res.status_code}, response={res.text}, reauthenticating...") - headers = common_lib.obtain_api_credentials(s3_client) - continue - logger.warning(f"Request failed, status={res.status_code}, response={res.text}, retrying in {wait} seconds...") - time.sleep(wait) - total_wait += wait - wait *= 2 - - if total_conn_wait >= MAX_CONN_WAIT_TIME: - # data service has failed, raise alert - notifymsg = f"[!] *Failed to connect to data-{env}* during {source_id} ingestion" - if webhook_url := os.getenv("NOTIFY_WEBHOOK_URL"): - with contextlib.suppress(requests.exceptions.RequestException): - requests.post(webhook_url, json={"text": notifymsg}) - common_lib.complete_with_error( - ConnectionError("Could not connect to data service"), - env, - common_lib.UploadError.INTERNAL_ERROR, - source_id, upload_id, headers, cookies, - count_created=counter["numCreated"], - count_updated=counter["numUpdated"], - count_error=counter["numError"] - ) - return - - if res and res.status_code in [200, 207]: - counter["total"] += len(batch) - now = time.time() - cps = int(counter["total"] / (now - start_time)) - logger.info(f"\tCurrent speed: {cps} cases/sec") - res_json = res.json() - counter["numCreated"] += res_json["numCreated"] - counter["numUpdated"] += res_json["numUpdated"] - if res.status_code == 207: - # 207 encompasses both geocoding and case schema validation errors. - # We can consider separating geocoding issues, but for now classifying it - # as a validation problem is pretty reasonable. - # The motivation for continuing past 207 errors is https://github.com/globaldothealth/list/issues/1849 - - # The errors from the backend tell us which cases failed and for what reason. Make it - # easier to diagnose by extracting the failing case and attaching it to the error message. - res_json = res.json() - if "errors" in res_json: - def add_input_to_error(error): - res = dict(error) - res['input'] = batch[error['index']] - return res - augmented_errors = [add_input_to_error(e) for e in res_json['errors']] - reported_error = dict(res_json) - reported_error["errors"] = augmented_errors - logger.warning(f"Validation error in batch {batch_num}: {json.dumps(reported_error)}") - counter["numError"] += len(res_json["errors"]) - else: - logger.warning(f"Validation error in batch {batch_num}: {res.text}") - update_status = { - "status": "IN_PROGRESS", - "summary": { - "numCreated": counter["numCreated"], - "numUpdated": counter["numUpdated"], - "numError": counter["numError"] - } - } - with contextlib.suppress(requests.exceptions.RequestException): - requests.put(upload_status_url, json=update_status, headers=headers, cookies=cookies) - continue - - # Response can contain an 'error' field which describe each error that - # occurred, it will be contained in the res.text here below. - e = RuntimeError( - f"Error sending cases to server, status={res.status_code}, response={res.text}") - upload_error = common_lib.UploadError.DATA_UPLOAD_ERROR - common_lib.complete_with_error( - e, env, upload_error, - source_id, upload_id, headers, cookies, - count_created=counter["numCreated"], - count_updated=counter["numUpdated"], - count_error=counter["numError"] - ) - return - logger.info(f"sent {counter['total']} cases in {time.time() - start_time} seconds") - return counter["numCreated"], counter["numUpdated"], counter["numError"] - - -def get_today() -> datetime.datetime: - """Return today's datetime, just here for easier mocking.""" - return datetime.datetime.today() - - -def get_case_date(date_string) -> datetime.datetime: - """Return a datetime parsed from a case.""" - case_date = "" - for fmt in (DATE_FORMATS): - try: - return datetime.datetime.strptime( - date_string, - fmt) - except ValueError: - pass - if not case_date: - raise ValueError(f"Date {date_string} from case could not be parsed.") - - return case_date - - -def filter_cases_by_date( - case_data: Generator[Dict, None, None], - date_filter: Dict, date_range: Dict, env: str, - source_id: str, upload_id: str, api_creds, cookies): - """ - Filter cases according to the date_range or date_filter provided. - - If a date_range is provided, returns only cases within the specified start - and end bounds (inclusive). Else if date_filter is provided, returns the - cases within that specification. Else, returns all cases. - - Notice that if _both_ date_range and date_filter are provided, then date_range is used - and date_filter is ignored. - """ - if date_range: - logger.info(f"Filtering cases using date range {date_range}") - - def case_is_within_range(case, start, end): - confirmed_event = [e for e in case["events"] - if e["name"] == "confirmed"][0] - case_date = get_case_date(confirmed_event["dateRange"]["start"]) - return start <= case_date <= end - - start = datetime.datetime.strptime(date_range["start"], "%Y-%m-%d") - end = datetime.datetime.strptime(date_range["end"], "%Y-%m-%d") - return (case for case in case_data if case_is_within_range(case, start, end)) - - elif date_filter: - logger.info(f"Filtering cases using date filter {date_filter}") - now = get_today() - delta = datetime.timedelta(days=date_filter["numDaysBeforeToday"]) - cutoff_date = now - delta - op = date_filter["op"] - - def case_is_within_range(case, cutoff_date, op): - confirmed_event = [e for e in case["events"] - if e["name"] == "confirmed"][0] - case_date = get_case_date(confirmed_event["dateRange"]["start"]) - delta_days = (case_date - cutoff_date).days - if op == "EQ": - return delta_days == 0 - elif op == "LT": - return delta_days < 0 - elif op == "GT": - return delta_days > 0 - else: - e = ValueError(f"Unsupported date filter operand: {op}") - common_lib.complete_with_error( - e, env, common_lib.UploadError.SOURCE_CONFIGURATION_ERROR, - source_id, upload_id, api_creds, cookies) - - return (case for case in case_data if case_is_within_range(case, cutoff_date, op)) - - else: - return case_data - - -class ParserError(Exception): - pass - - -def run( - event: Dict, - parsing_function: Callable[[str, str, str], Generator[Dict, None, None]]): - """ - Encapsulates all of the work performed by a parsing Lambda. - - Parameters - ---------- - event: dict, required - Input event JSON-as-dict. - This must contain `s3Bucket`, `s3Key`, and `sourceUrl` fields specifying - the details of the stored source content. - - parsing_function: function, required - Python function that parses raw source data into G.h case data. - This function must accept (in order): a file containing raw source - data, a string representing the source UUID, and a string representing - the source URL. It must yield each case conforming to the G.h - case format as per https://data.covid-19.global.health/api-docs/. - For an example, see: - https://github.com/globaldothealth/list/blob/main/ingestion/functions/parsing/india/india.py#L57 - - Returns - ------ - JSON object containing the count of line list cases successfully written to - G.h servers in the format: - {"count_created": count_created, "count_updated": count_updated} - For more information on return types, see: - https://docs.aws.amazon.com/lambda/latest/dg/python-handler.html - """ - - env, source_url, source_id, upload_id, s3_bucket, s3_key, date_filter, date_range, local_auth = extract_event_fields( - event) - logger.info(f"Event fields extracted in parsing_lib.run...env: {env}, source_url: {source_url}, source_id: {source_id}, \ - upload_id: {upload_id}, s3_bucket: {s3_bucket}, s3_key: {s3_key}, date_filter: {date_filter}, date_range: {date_range}, local_auth: {local_auth}") - api_creds = None - cookies = None - if local_auth and env in ["local", "locale2e"]: - cookies = common_lib.login(local_auth["email"]) - else: - api_creds = common_lib.obtain_api_credentials(s3_client) - if not upload_id: - upload_id = common_lib.create_upload_record( - env, source_id, api_creds, cookies) - # grab the source object - base_url = common_lib.get_source_api_url(env) - source_info_url = f"{base_url}/sources/{source_id}" - source_info_request = requests.get(source_info_url, headers=api_creds, cookies=cookies) - # if that failed then just bail, we can't ingest the cases - if source_info_request.status_code > 299: # yes I'm ignoring redirects - common_lib.complete_with_error( - ParserError(f"Retrieving source info for source {source_id} yielded HTTP status {source_info_request.status_code}"), - env, common_lib.UploadError.INTERNAL_ERROR, source_id, upload_id, - api_creds, cookies) - try: - fd, local_data_file_name = tempfile.mkstemp() - local_data_file = os.fdopen(fd, "wb") - retrieve_raw_data_file(s3_bucket, s3_key, local_data_file) - logger.info(f"Raw file retrieved at {local_data_file_name}") - - case_data = parsing_function( - local_data_file_name, source_id, - source_url) - excluded_case_ids = retrieve_excluded_case_ids(source_id, date_filter, date_range, env, - headers=api_creds, cookies=cookies) - final_cases = prepare_cases(case_data, upload_id, excluded_case_ids) - - count_created, count_updated, count_error = write_to_server( - filter_cases_by_date( - final_cases, - date_filter, - date_range, - env, source_id, upload_id, - api_creds, cookies), - env, source_id, upload_id, - api_creds, cookies, - CASES_BATCH_SIZE) - - for _ in range(5): # Maximum number of attempts to finalize upload - status, text = common_lib.finalize_upload( - env, source_id, upload_id, api_creds, cookies, count_created, - count_updated, count_error - ) - if status == 200: - break - elif status == 500 and "401" in text: - logger.warning("Finalizing upload failed with 401, reauthenticating...") - api_creds = common_lib.obtain_api_credentials(s3_client) - continue - else: - raise RuntimeError(f"Error updating upload record, status={status}, response={text}") - - return {"count_created": count_created, "count_updated": count_updated} - except Exception as e: - common_lib.complete_with_error( - e, env, common_lib.UploadError.INTERNAL_ERROR, source_id, upload_id, - api_creds, cookies) - finally: - local_data_file.close() - if os.path.exists(local_data_file_name): - os.remove(local_data_file_name) - logging.flushAll() diff --git a/ingestion/functions/common/parsing_lib_test.py b/ingestion/functions/common/parsing_lib_test.py deleted file mode 100644 index 4936cafa1..000000000 --- a/ingestion/functions/common/parsing_lib_test.py +++ /dev/null @@ -1,702 +0,0 @@ -# Tests for the parsing library common logic. -# If you come from a unittest background and wonder at how requests_mock -# arrives by magic here, check out -# https://requests-mock.readthedocs.io/en/latest/pytest.html?highlight=pytest#pytest -import io -import copy -import json -import os -import pytest -import sys -import tempfile -import datetime -import logging - -from contextlib import redirect_stdout - -from unittest.mock import MagicMock, patch - -try: - from parsing_lib import s3_client -except ImportError: - sys.path.append(os.path.dirname(os.path.abspath(__file__))) - from parsing_lib import s3_client - -try: - import common_lib -except ImportError: - sys.path.append(os.path.dirname(os.path.abspath(__file__))) - import common_lib - - -_SOURCE_API_URL = "http://bar.baz" -_SOURCE_ID = "5f0b9a7ead3a2b003edc0e7f" -_SOURCE_URL = "https://foo.bar" -_UPLOAD_ID = "123456789012345678901234" -_PARSED_CASE = ( - { - "caseReference": { - "sourceId": _SOURCE_ID, - "sourceEntryId": "48765", - "sourceUrl": _SOURCE_URL - }, - "location": { - "country": "India", - "administrativeAreaLevel1": "Bihar", - "administrativeAreaLevel2": "Darbhanga", - "administrativeAreaLevel3": "Hanuman Nagar", - "query": "Hanuman Nagar, Darbhanga, Bihar, India" - }, - "events": [ - { - "name": "confirmed", - "dateRange": - { - "start": "06/05/2020Z", - "end": "06/05/2020Z" - } - } - ], - "demographics": { - "ageRange": { - "start": 65, - "end": 65 - }, - "sex": "Male" - }, - "notes": None - }) - -# Minimum case to check for date filtering. -CASE_JUNE_FIFTH = { - "events": [ - { - "name": "confirmed", - "dateRange": - { - "start": "06/05/2020Z", - "end": "06/05/2020Z" - } - } - ], -} - -MOCK_SOURCE_DETAILS = { - "origin": { - "url": "" - }, - "format": "", - "automation": { - "parser": { - "awsLambdaArn": "", - }, - }, - "dateFilter": "", - "hasStableIdentifiers": False -} - - -def fake_parsing_fn(raw_data_file, source_id, source_url): - """For use in testing parsing_lib.run_lambda().""" - return iter([_PARSED_CASE]) - - -@pytest.fixture() -def mock_source_api_url_fixture(): - """ - Supplies a predetermined endpoint for G.h HTTP requests. - - Return the common_lib module, for any case-specific mocks. - - Because the parsing library is imported locally, this fixture can't - be set to autouse. - """ - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir, - os.pardir, - os.pardir, - os.pardir, - "common")) - import common_lib # pylint: disable=import-error - with patch("common_lib.get_source_api_url") as mock: - mock.return_value = _SOURCE_API_URL - yield common_lib - - -@pytest.fixture() -def input_event(): - """Loads valid Event input from file.""" - current_dir = os.path.dirname(__file__) - file_path = os.path.join(current_dir, "input_event.json") - with open(file_path) as event_file: - return json.load(event_file) - - -@pytest.fixture() -def sample_data(): - """Loads sample source data from file.""" - current_dir = os.path.dirname(__file__) - file_path = os.path.join(current_dir, "sample_data.json") - with open(file_path) as event_file: - return json.load(event_file) - - -class FakeContext: - def get_remaining_time_in_millis(self): - return 42 - - -@pytest.mark.skipif(not os.environ.get("DOCKERIZED", False), - reason="Running integration tests outside of mock environment disabled") -def test_e2e( - input_event, sample_data, requests_mock, - mock_source_api_url_fixture): - import parsing_lib # Import locally to avoid superseding mock - common_lib = mock_source_api_url_fixture - common_lib.login = MagicMock(name="login") - - s3_client.put_object( - Bucket=input_event[parsing_lib.S3_BUCKET_FIELD], - Key=input_event[parsing_lib.S3_KEY_FIELD], - Body=json.dumps(sample_data)) - - # Mock the batch upsert call. - # TODO: Complete removal of URL env var. - os.environ["SOURCE_API_URL"] = _SOURCE_API_URL - full_source_url = f"{_SOURCE_API_URL}/cases/batchUpsert" - num_created = 10 - num_updated = 5 - requests_mock.post( - full_source_url, - json={"numCreated": num_created, - "numUpdated": num_updated}) - source_info_url = f"{_SOURCE_API_URL}/sources/{input_event['sourceId']}" - source_details = MOCK_SOURCE_DETAILS.copy() - source_details["hasStableIdentifiers"] = True - requests_mock.get( - source_info_url, - json=source_details - ) - - # Delete the provided upload ID to force parsing_lib to create a new upload. - # Mock the create and update upload calls. - del input_event[parsing_lib.UPLOAD_ID_FIELD] - base_upload_url = f"{_SOURCE_API_URL}/sources/{input_event['sourceId']}/uploads" - create_upload_url = base_upload_url - requests_mock.post( - create_upload_url, - json={"_id": _UPLOAD_ID, "status": "IN_PROGRESS", - "summary": {}}, - status_code=201) - update_upload_url = f"{base_upload_url}/{_UPLOAD_ID}" - requests_mock.put( - update_upload_url, - json={"_id": _UPLOAD_ID, "status": "SUCCESS", - "summary": {"numCreated": num_created, "numUpdated": num_updated}}) - - # Mock the excluded case IDs endpoint call. - start_date = input_event[parsing_lib.DATE_RANGE_FIELD]["start"] - end_date = input_event[parsing_lib.DATE_RANGE_FIELD]["end"] - excluded_case_ids_url = f"{_SOURCE_API_URL}/excludedCaseIds?sourceId={_SOURCE_ID}&dateFrom={start_date}&dateTo={end_date}" - requests_mock.register_uri( - "GET", excluded_case_ids_url, - [{"json": {"cases": []}, - "status_code": 200}]) - - response = parsing_lib.run(input_event, fake_parsing_fn) - - assert requests_mock.request_history[0].url == create_upload_url - assert requests_mock.request_history[1].url == source_info_url - assert requests_mock.request_history[2].url == excluded_case_ids_url - assert requests_mock.request_history[3].url == full_source_url - assert requests_mock.request_history[4].url == update_upload_url - assert response["count_created"] == num_created - assert response["count_updated"] == num_updated - - -@pytest.mark.skipif(not os.environ.get("DOCKERIZED", False), - reason="Running integration tests outside of mock environment disabled") -def test_e2e_with_unstable_case_ids( - input_event, sample_data, requests_mock, - mock_source_api_url_fixture): - import parsing_lib # Import locally to avoid superseding mock - common_lib = mock_source_api_url_fixture - common_lib.login = MagicMock(name="login") - - s3_client.put_object( - Bucket=input_event[parsing_lib.S3_BUCKET_FIELD], - Key=input_event[parsing_lib.S3_KEY_FIELD], - Body=json.dumps(sample_data)) - - # Mock the batch upsert call. - # TODO: Complete removal of URL env var. - os.environ["SOURCE_API_URL"] = _SOURCE_API_URL - full_source_url = f"{_SOURCE_API_URL}/cases/batchUpsert" - num_created = 10 - num_updated = 5 - requests_mock.post( - full_source_url, - json={"numCreated": num_created, - "numUpdated": num_updated}) - source_info_url = f"{_SOURCE_API_URL}/sources/{input_event['sourceId']}" - source_details = MOCK_SOURCE_DETAILS.copy() - requests_mock.get( - source_info_url, - json=source_details - ) - - # Delete the provided upload ID to force parsing_lib to create a new upload. - # Mock the create and update upload calls. - del input_event[parsing_lib.UPLOAD_ID_FIELD] - base_upload_url = f"{_SOURCE_API_URL}/sources/{input_event['sourceId']}/uploads" - create_upload_url = base_upload_url - upload_id = "123456789012345678901234" - requests_mock.post( - create_upload_url, - json={"_id": _UPLOAD_ID, "status": "IN_PROGRESS", - "summary": {}}, - status_code=201) - update_upload_url = f"{base_upload_url}/{_UPLOAD_ID}" - requests_mock.put( - update_upload_url, - json={"_id": upload_id, "status": "SUCCESS", - "summary": {"numCreated": num_created, "numUpdated": num_updated}}) - - # Mock the excluded case IDs endpoint call. - start_date = input_event[parsing_lib.DATE_RANGE_FIELD]["start"] - end_date = input_event[parsing_lib.DATE_RANGE_FIELD]["end"] - excluded_case_ids_url = f"{_SOURCE_API_URL}/excludedCaseIds?sourceId={_SOURCE_ID}&dateFrom={start_date}&dateTo={end_date}" - requests_mock.register_uri( - "GET", excluded_case_ids_url, - [{"json": {"cases": []}, - "status_code": 200}]) - - response = parsing_lib.run(input_event, fake_parsing_fn) - - assert requests_mock.request_history[0].url == create_upload_url - assert requests_mock.request_history[1].url == source_info_url - assert requests_mock.request_history[2].url == excluded_case_ids_url - assert requests_mock.request_history[3].url == full_source_url - assert requests_mock.request_history[4].url == update_upload_url - assert response["count_created"] == num_created - assert response["count_updated"] == num_updated - - -def test_batch_of(): - import parsing_lib # Import locally to avoid superseding mock - items = iter([1, 2, 3, 4, 5]) - assert parsing_lib.batch_of(items, 3) == [1, 2, 3] - assert parsing_lib.batch_of(items, 3) == [4, 5] - assert parsing_lib.batch_of(items, 3) == [] - - -@pytest.mark.skipif(not os.environ.get("DOCKERIZED", False), - reason="Running integration tests outside of mock environment disabled") -def test_retrieve_raw_data_file_stores_s3_in_local_file(input_event, sample_data): - import parsing_lib # Import locally to avoid superseding mock - s3_client.put_object( - Bucket=input_event[parsing_lib.S3_BUCKET_FIELD], - Key=input_event[parsing_lib.S3_KEY_FIELD], - Body=json.dumps(sample_data)) - - fd, fname = tempfile.mkstemp() - with os.fdopen(fd, "wb") as f: - parsing_lib.retrieve_raw_data_file( - input_event[parsing_lib.S3_BUCKET_FIELD], - input_event[parsing_lib.S3_KEY_FIELD], - f) - f.flush() - with open(fname, "r") as f: - assert json.load(f) == sample_data - if os.path.exists(fname): - os.remove(fname) - - -def test_extract_event_fields_returns_all_present_fields(input_event): - import parsing_lib # Import locally to avoid superseding mock - assert parsing_lib.extract_event_fields(input_event) == ( - input_event[parsing_lib.ENV_FIELD], - input_event[parsing_lib.SOURCE_URL_FIELD], - input_event[parsing_lib.SOURCE_ID_FIELD], - input_event[parsing_lib.UPLOAD_ID_FIELD], - input_event[parsing_lib.S3_BUCKET_FIELD], - input_event[parsing_lib.S3_KEY_FIELD], - None, - input_event[parsing_lib.DATE_RANGE_FIELD], - input_event[parsing_lib.AUTH_FIELD]) - - -def test_extract_event_fields_errors_if_missing_bucket_field(input_event): - import parsing_lib # Import locally to avoid superseding mock - with pytest.raises(ValueError, match=parsing_lib.S3_BUCKET_FIELD): - del input_event[parsing_lib.S3_BUCKET_FIELD] - parsing_lib.extract_event_fields(input_event) - - -def test_extract_event_fields_errors_if_missing_key_field(input_event): - import parsing_lib # Import locally to avoid superseding mock - with pytest.raises(ValueError, match=parsing_lib.S3_KEY_FIELD): - del input_event[parsing_lib.S3_KEY_FIELD] - parsing_lib.extract_event_fields(input_event) - - -def test_extract_event_fields_errors_if_missing_env_field(input_event): - import parsing_lib # Import locally to avoid superseding mock - with pytest.raises(ValueError, match=parsing_lib.ENV_FIELD): - del input_event[parsing_lib.ENV_FIELD] - parsing_lib.extract_event_fields(input_event) - - -def test_prepare_cases_adds_upload_id(): - import parsing_lib # Import locally to avoid superseding mock - case = copy.deepcopy(_PARSED_CASE) - result = parsing_lib.prepare_cases( - [case], - _UPLOAD_ID, - []) - assert next(result)["caseReference"]["uploadIds"] == [_UPLOAD_ID] - - -def test_prepare_cases_removes_nones(): - import parsing_lib # Import locally to avoid superseding mock - case = copy.deepcopy(_PARSED_CASE) - case["demographics"] = None - result = parsing_lib.prepare_cases([case], _UPLOAD_ID, []) - assert "demographics" not in next(result).keys() - - -def test_prepare_cases_removes_empty_strings(): - import parsing_lib # Import locally to avoid superseding mock - case = copy.deepcopy(_PARSED_CASE) - case["notes"] = "" - result = parsing_lib.prepare_cases([case], _UPLOAD_ID, []) - assert "notes" not in next(result).keys() - - -def test_write_to_server_returns_created_updated_error_count( - requests_mock, mock_source_api_url_fixture): - import parsing_lib # Import locally to avoid superseding mock - full_source_url = f"{_SOURCE_API_URL}/cases/batchUpsert" - base_upload_url = f"{_SOURCE_API_URL}/sources/{_SOURCE_ID}/uploads" - update_upload_url = f"{base_upload_url}/{_UPLOAD_ID}" - num_created = 10 - num_updated = 5 - requests_mock.post( - base_upload_url, - json={"_id": _UPLOAD_ID, "status": "IN_PROGRESS", - "summary": {}}, - status_code=201) - requests_mock.post( - full_source_url, - json={"numCreated": num_created, - "numUpdated": num_updated, - }) - requests_mock.put( - update_upload_url, - json={"numCreated": num_created, - "numUpdated": num_updated, - }) - - count_created, count_updated, count_error = parsing_lib.write_to_server( - iter([_PARSED_CASE]), - "env", _SOURCE_ID, _UPLOAD_ID, {}, - {}, - parsing_lib.CASES_BATCH_SIZE) - assert requests_mock.request_history[0].url == full_source_url - assert requests_mock.request_history[1].url == update_upload_url - assert count_created == num_created - assert count_updated == num_updated - assert count_error == 0 - - -def test_write_to_server_raises_error_for_failed_batch_upsert( - requests_mock, mock_source_api_url_fixture): - import parsing_lib # Import locally to avoid superseding mock - # TODO: Complete removal of URL env var. - os.environ["SOURCE_API_URL"] = _SOURCE_API_URL - full_source_url = f"{_SOURCE_API_URL}/cases/batchUpsert" - requests_mock.register_uri( - "POST", full_source_url, - [{"json": {"numCreated": 1, "numUpdated": 0}, - "status_code": 200}, - {"json": {}, - "status_code": 500}]) - update_upload_url = f"{_SOURCE_API_URL}/sources/{_SOURCE_ID}/uploads/{_UPLOAD_ID}" - requests_mock.register_uri("PUT", update_upload_url, json={}) - - try: - parsing_lib.write_to_server( - iter([_PARSED_CASE, _PARSED_CASE]), - "env", _SOURCE_ID, _UPLOAD_ID, {}, {}, 1) - except RuntimeError: - assert requests_mock.request_history[0].url == full_source_url - assert requests_mock.request_history[-1].url == update_upload_url - assert requests_mock.request_history[-1].json( - ) == {"status": "ERROR", "summary": {"error": common_lib.UploadError.DATA_UPLOAD_ERROR.name, 'numCreated': 1}} - return - # We got the wrong exception or no exception, fail the test. - assert False - - -def test_write_to_server_success_for_batch_upsert_with_validation_errors( - requests_mock, mock_source_api_url_fixture): - import parsing_lib # Import locally to avoid superseding mock - # TODO: Complete removal of URL env var. - os.environ["SOURCE_API_URL"] = _SOURCE_API_URL - full_source_url = f"{_SOURCE_API_URL}/cases/batchUpsert" - requests_mock.register_uri( - "POST", full_source_url, json={ - 'numCreated': 0, - 'numUpdated': 0, - }, status_code=207), - update_upload_url = f"{_SOURCE_API_URL}/sources/{_SOURCE_ID}/uploads/{_UPLOAD_ID}" - requests_mock.register_uri("PUT", update_upload_url, json={}) - - numCreated, numUpdated, numError = parsing_lib.write_to_server( - iter([_PARSED_CASE]), - "env", _SOURCE_ID, _UPLOAD_ID, {}, - {}, - parsing_lib.CASES_BATCH_SIZE) - assert numCreated == 0 - assert numUpdated == 0 - assert numError == 0 - assert requests_mock.request_history[0].url == full_source_url - - -def test_write_to_server_records_input_for_failed_batch_upsert_with_validation_errors( - requests_mock, mock_source_api_url_fixture): - import parsing_lib # Import locally to avoid superseding mock - # TODO: Complete removal of URL env var. - os.environ["SOURCE_API_URL"] = _SOURCE_API_URL - full_source_url = f"{_SOURCE_API_URL}/cases/batchUpsert" - update_upload_url = f"{_SOURCE_API_URL}/sources/{_SOURCE_ID}/uploads/{_UPLOAD_ID}" - requests_mock.register_uri( - "POST", full_source_url, json={ - 'errors': [ - { - 'index': 0, - 'message': 'You done goofed.', - }, - ], - 'numCreated': 0, - 'numUpdated': 0, - }, status_code=207), - requests_mock.put( - update_upload_url, - json={"_id": _UPLOAD_ID, "status": "SUCCESS", - "summary": {"numCreated": 0, "numUpdated": 0}}) - - - with redirect_stdout(io.StringIO()) as f: - # this handler must be set in here for logger to see the redirected stdout - handler = logging.StreamHandler(stream=sys.stdout) - handler.setLevel(logging.DEBUG) - parsing_lib.logger.addHandler(handler) - - numCreated, numUpdated, numError = parsing_lib.write_to_server( - iter([_PARSED_CASE]), - "env", _SOURCE_ID, _UPLOAD_ID, {}, - {}, - parsing_lib.CASES_BATCH_SIZE) - parsing_output = f.getvalue() - assert numCreated == 0 - assert numUpdated == 0 - assert numError == 1 - assert requests_mock.request_history[0].url == full_source_url - assert parsing_output.find('Hanuman Nagar, Darbhanga, Bihar, India') != -1 - - -@patch('parsing_lib.get_today') -def test_filter_cases_by_date_keeps_exact_with_EQ(mock_today): - import parsing_lib # Import locally to avoid superseding mock - mock_today.return_value = datetime.datetime(2020, 6, 8) - cases = parsing_lib.filter_cases_by_date( - [CASE_JUNE_FIFTH], - {"numDaysBeforeToday": 3, "op": "EQ"}, - None, - "env", "source_id", "upload_id", {}, {}) # api_creds - assert list(cases) == [CASE_JUNE_FIFTH] - - -@patch('parsing_lib.get_today') -def test_filter_cases_by_date_removes_nonexact_with_EQ(mock_today): - import parsing_lib # Import locally to avoid superseding mock - mock_today.return_value = datetime.datetime(2020, 10, 10) - cases = parsing_lib.filter_cases_by_date( - [CASE_JUNE_FIFTH], - {"numDaysBeforeToday": 3, "op": "EQ"}, - None, - "env", "source_id", "upload_id", {}, {}) # api_creds - assert not next(cases, None) - - -@patch('parsing_lib.get_today') -def test_filter_cases_by_date_removes_exact_with_LT(mock_today): - import parsing_lib # Import locally to avoid superseding mock - mock_today.return_value = datetime.datetime(2020, 6, 8) - cases = parsing_lib.filter_cases_by_date( - [CASE_JUNE_FIFTH], - {"numDaysBeforeToday": 3, "op": "LT"}, - None, - "env", "source_id", "upload_id", {}, {}) # api_creds - assert not next(cases, None) - - -@patch('parsing_lib.get_today') -def test_filter_cases_by_date_keeps_before_LT(mock_today): - import parsing_lib # Import locally to avoid superseding mock - mock_today.return_value = datetime.datetime(2020, 6, 10) - cases = parsing_lib.filter_cases_by_date( - (CASE_JUNE_FIFTH,), - {"numDaysBeforeToday": 3, "op": "LT"}, - None, - "env", "source_id", "upload_id", {}, {}) # api_creds - assert next(cases) == CASE_JUNE_FIFTH - - -@patch('parsing_lib.get_today') -def test_filter_cases_by_date_removes_exact_with_GT(mock_today): - import parsing_lib # Import locally to avoid superseding mock - mock_today.return_value = datetime.datetime(2020, 6, 8) - cases = parsing_lib.filter_cases_by_date( - [CASE_JUNE_FIFTH], - {"numDaysBeforeToday": 3, "op": "GT"}, - None, - "env", "source_id", "upload_id", {}, {}) # api_creds - assert not next(cases, None) - - -@patch('parsing_lib.get_today') -def test_filter_cases_by_date_keeps_after_GT(mock_today): - import parsing_lib # Import locally to avoid superseding mock - mock_today.return_value = datetime.datetime(2020, 6, 7) - cases = parsing_lib.filter_cases_by_date( - (CASE_JUNE_FIFTH,), - {"numDaysBeforeToday": 3, "op": "GT"}, - None, - "env", "source_id", "upload_id", {}, {}) # api_creds - assert next(cases) == CASE_JUNE_FIFTH - - -def test_filter_cases_by_date_unsupported_op( - requests_mock, mock_source_api_url_fixture): - import parsing_lib # Import locally to avoid superseding mock - update_upload_url = f"{_SOURCE_API_URL}/sources/{_SOURCE_ID}/uploads/{_UPLOAD_ID}" - requests_mock.put( - update_upload_url, - json={"_id": _UPLOAD_ID, "status": "ERROR", - "summary": {"error": "SOURCE_CONFIGURATION_ERROR"}}) - - try: - next(parsing_lib.filter_cases_by_date( - [CASE_JUNE_FIFTH], - {"numDaysBeforeToday": 3, "op": "NOPE"}, - None, - "env", _SOURCE_ID, _UPLOAD_ID, {}, {})) # api_creds - except ValueError as ve: - assert "NOPE" in str(ve) - assert requests_mock.request_history[0].url == update_upload_url - assert requests_mock.request_history[-1].json() == {"status": "ERROR", "summary": { - "error": "SOURCE_CONFIGURATION_ERROR"}} - return - assert not "Should have raised a ValueError exception" - - -def test_filter_cases_by_date_within_range(): - import parsing_lib # Import locally to avoid superseding mock - cases = parsing_lib.filter_cases_by_date( - (CASE_JUNE_FIFTH,), - None, - {"start": "2020-06-04", "end": "2020-06-06"}, - "env", "source_id", "upload_id", {}, {}) # api_creds - assert next(cases) == CASE_JUNE_FIFTH - - -def test_filter_cases_by_date_equals_range(): - import parsing_lib # Import locally to avoid superseding mock - cases = parsing_lib.filter_cases_by_date( - (CASE_JUNE_FIFTH,), - None, - {"start": "2020-06-05", "end": "2020-06-05"}, - "env", "source_id", "upload_id", {}, {}) # api_creds - assert next(cases) == CASE_JUNE_FIFTH - - -def test_filter_cases_by_date_outside_range(): - import parsing_lib # Import locally to avoid superseding mock - cases = parsing_lib.filter_cases_by_date( - (CASE_JUNE_FIFTH,), - None, - {"start": "2020-06-03", "end": "2020-06-04"}, - "env", "source_id", "upload_id", {}, {}) # api_creds - assert not next(cases, None) - - -def test_filter_cases_by_date_handles_two_date_formats(): - import parsing_lib # Import locally to avoid superseding mock - - # Date format is %m/%d/%YZ in CASE_JUNE_FIFTH. - # Date parsing also handles strings without the 'Z'. - other_date_format_case = copy.deepcopy( - CASE_JUNE_FIFTH) - other_date_format_case["events"][0]["dateRange"]["start"] = "06/05/2020" - other_date_format_case["events"][0]["dateRange"]["end"] = "06/05/2020" - - cases = parsing_lib.filter_cases_by_date( - (CASE_JUNE_FIFTH, other_date_format_case), - None, - {"start": "2020-06-05", "end": "2020-06-05"}, - "env", "source_id", "upload_id", {}, {}) # api_creds - - assert next(cases) == CASE_JUNE_FIFTH - assert next(cases) == other_date_format_case - - -def test_remove_nested_none_and_empty_removes_only_nones_and_empty_str(): - import parsing_lib # Import locally to avoid superseding mock - data = {"keep1": 0, "keep2": False, "keep3": [], "drop1": None, - "multi": {"multikeep": "ok", "multidrop": None}, - "emptyobject": {"dropped": None}, - "emptystr": ""} - expected = {"keep1": 0, "keep2": False, "keep3": [], - "multi": {"multikeep": "ok"}, - "emptyobject": {}} - assert parsing_lib.remove_nested_none_and_empty(data) == expected - -def test_excluded_case_are_removed_from_cases(): - import parsing_lib # Import locally to avoid superseding mock - - valid_case = copy.deepcopy(_PARSED_CASE) - excluded_case = copy.deepcopy(_PARSED_CASE) - excluded_case["caseReference"]["sourceEntryId"] = "999" - - cases = parsing_lib.prepare_cases([excluded_case, valid_case], "0", ["999"]) - cases_list = list(cases) - assert len(cases_list) == 1 - assert cases_list[0]["caseReference"]["sourceEntryId"] == valid_case["caseReference"]["sourceEntryId"] - -def test_country_code_lookup_by_exact_name(): - import parsing_lib # Import locally to avoid superseding mock - - code = parsing_lib.iso3166_country_code('Germany') - assert(code == 'DE') - -def test_country_code_lookup_by_partial_name(): - import parsing_lib # Import locally to avoid superseding mock - - code = parsing_lib.iso3166_country_code('Netherland') - assert(code == 'NL') - -def test_country_code_lookup_by_code_returns_code(): - import parsing_lib # Import locally to avoid superseding mock - - code = parsing_lib.iso3166_country_code('GB') - assert(code == 'GB') - -def test_country_code_lookup_raises_on_ambiguous_name(): - import parsing_lib # Import locally to avoid superseding mock - - with pytest.raises(KeyError): - code = parsing_lib.iso3166_country_code('United') diff --git a/ingestion/functions/common/sample_data.json b/ingestion/functions/common/sample_data.json deleted file mode 100644 index c5b91edb8..000000000 --- a/ingestion/functions/common/sample_data.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "raw_data": [ - { - "agebracket": "65", - "contractedfromwhichpatientsuspected": "", - "currentstatus": "Hospitalized", - "dateannounced": "05/06/2020", - "detectedcity": "Hanuman Nagar", - "detecteddistrict": "Darbhanga", - "detectedstate": "Bihar", - "entryid": "48765", - "gender": "M", - "nationality": "", - "notes": "", - "numcases": "1", - "patientnumber": "78135", - "source1": "https://twitter.com/BiharHealthDept/status/1268824968953057281", - "source2": "", - "source3": "", - "statecode": "BR", - "statepatientnumber": "", - "statuschangedate": "", - "typeoftransmission": "" - } - ] -} \ No newline at end of file diff --git a/ingestion/functions/define_rules.py b/ingestion/functions/define_rules.py deleted file mode 100755 index 0310805b6..000000000 --- a/ingestion/functions/define_rules.py +++ /dev/null @@ -1,120 +0,0 @@ -#!/usr/bin/env python3 - -# Need to run this from the directory containing this script and make_rules.py -# Run this script, then check output in the generated file, then run make_rules.py - -import argparse -import json -import requests -import sys -import os - -import boto3 -from slugify import slugify - -import common.common_lib as common_lib - - -DEV = "dev" -QA = "qa" -PROD = "prod" - -DEV_CURATOR_URL = "https://dev-data.covid-19.global.health/api/sources" -QA_CURATOR_URL = "https://qa-data.covid-19.global.health/api/sources" -PROD_CURATOR_URL = "https://data.covid-19.global.health/api/sources" - -ENV_TO_URL = { - DEV: DEV_CURATOR_URL, - QA: QA_CURATOR_URL, - PROD:PROD_CURATOR_URL -} - -AWS_REGION = os.getenv("AWS_REGION", "eu-central-1") - -LIMIT = 100 # when we go over 100 sources we will need to update the maximum limit in the curator API - -SOURCE_RULE = { - "rule_name": "", - "target_name": "", - "source_name": "", - "job_name": "", - "description": "" -} - -FILE_NAME = "rules.json" - -JOB_DEF_ENV = "EPID_INGESTION_ENV" -JOB_DEF_SOURCE_ID = "EPID_INGESTION_SOURCE_ID" - - -parser = argparse.ArgumentParser( - description="Define rules for AWS EventBridge by curator sources", - usage="python define_rules.py []" -) -parser.add_argument( - "environment", help="Which environment to list sources from", choices=[DEV, PROD] -) - -args = parser.parse_args(sys.argv[1:2]) - -s3_client = boto3.client("s3", AWS_REGION) - -auth_headers = common_lib.obtain_api_credentials(s3_client) - -env = args.environment -url = f"{ENV_TO_URL.get(env, '')}?limit={LIMIT}" - -print(f"Getting source information from {env} curator API") - -response = requests.get(url, headers=auth_headers) - -if response.status_code != 200: - print(f"Non-200 response from curator API: {response.status_code}") - sys.exit(1) - -sources = response.json().get("sources") - -batch_client = boto3.client("batch", AWS_REGION) -resp = batch_client.describe_job_definitions() -job_definitions = resp.get("jobDefinitions") - -if not job_definitions: - print(f"No job definitions found in response from Batch: {resp}") - sys.exit(1) - -source_id_to_job_def_name = {} - -for job_def in job_definitions: - props = job_def.get("containerProperties", {}) - job_def_env = props.get("environment", {}) - for kv in job_def_env: - print(f"key-val: {kv}") - if kv.get("name", "") == JOB_DEF_SOURCE_ID: - val = kv.get("value") - if not val: - continue - source_id_to_job_def_name[val] = job_def.get("jobDefinitionName") - break -rules = [] - -for source in sources: - source_name = source.get("name") - source_id = source.get("_id") - source_rule = SOURCE_RULE.copy() - job_def_name = source_id_to_job_def_name.get(source_id) - if not job_def_name: - print(f"No job definition found using source ID {source_id}") - continue - source_rule["rule_name"] = f"{job_def_name}" - source_rule["target_name"] = job_def_name - source_rule["source_name"] = source_name - source_rule["job_name"] = job_def_name - source_rule["description"] = f"Scheduled Batch ingestion rule for source: {source_name} with ID: {source_id} for environment: {env}" - rules.append(source_rule) - -print(f"Writing source information to {FILE_NAME}") - -with open(FILE_NAME, "w") as f: - json.dump(rules, f, indent=4) - -print("Done") diff --git a/ingestion/functions/docker-compose-test.yml b/ingestion/functions/docker-compose-test.yml deleted file mode 100644 index 392a1e728..000000000 --- a/ingestion/functions/docker-compose-test.yml +++ /dev/null @@ -1,11 +0,0 @@ -version: "3.7" - -services: - test: - build: - context: . - dockerfile: Dockerfile-test - env_file: ./.env - localstack: - image: localstack/localstack:0.12.17.5 - env_file: ./.env diff --git a/ingestion/functions/docker-compose.yml b/ingestion/functions/docker-compose.yml deleted file mode 100644 index bdec7e1e1..000000000 --- a/ingestion/functions/docker-compose.yml +++ /dev/null @@ -1,14 +0,0 @@ -version: "3.7" - -services: - retrieval: - build: - context: . - dockerfile: Dockerfile - env_file: ./.env - environment: - - EPID_INGESTION_ENV=local - - EPID_INGESTION_EMAIL=legit@real.com - localstack: - image: localstack/localstack:latest - env_file: ./.env diff --git a/ingestion/functions/make_rules.py b/ingestion/functions/make_rules.py deleted file mode 100755 index 752bc7f2b..000000000 --- a/ingestion/functions/make_rules.py +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env python3 - -# Need to run this from the directory containing this script, aws.py, and define_rules.py -# Run define_rules.py first to generate `rules.json`, then run this to create the rules - -import json -import subprocess -import sys - - -FILE_NAME = "rules.json" - - -print(f"Reading source information from {FILE_NAME} to create AWS EventBridge rules") - -with open(FILE_NAME, "r") as f: - rules = json.load(f) - for rule in rules: - rule_name = rule.get("rule_name") - target_name = rule.get("target_name") - source_name = rule.get("source_name") - job_name = rule.get("job_name") - description = rule.get("description") - if not rule_name: - print(f"Missing rule name in rule {rule}") - sys.exit(1) - if not target_name: - print(f"Missing target name in rule {rule}") - sys.exit(1) - if not source_name: - print(f"Missing source name in rule {rule}") - sys.exit(1) - if not job_name: - print(f"Missing job name in rule {rule}") - sys.exit(1) - cmd = f"./aws.py schedule {rule_name} -t {target_name} -s \"{source_name}\" -j {job_name} -d \"{description}\"" - print(f"Running command {cmd}") - out = subprocess.check_output(cmd, encoding="UTF-8", shell=True) - print(f"Output from command:\n{out}") - -print("Done") \ No newline at end of file diff --git a/ingestion/functions/parsing/GISAID/make_GISAID_df.py b/ingestion/functions/parsing/GISAID/make_GISAID_df.py deleted file mode 100644 index a3d443e27..000000000 --- a/ingestion/functions/parsing/GISAID/make_GISAID_df.py +++ /dev/null @@ -1,91 +0,0 @@ -import pandas as pd -from collections import defaultdict -from datetime import datetime -from dateutil.relativedelta import relativedelta - - -def convert_date(raw_date: str,dataserver=True): - """ - Messy function for extracting messy date formats from raw GISAID. Sometimes full dates are specified, but - sometimes just the month or year are specified and we need to include the full time period as a range. - """ - if raw_date == '2020': - return ["01/01/2020","31/12/2020"] - elif raw_date == '2021': - return ["01/01/2021",datetime.today().strftime("%d/%m/%Y")] - - elif raw_date=='2020-12': - return ["01/12/2020","31/12/2020"] - elif len(raw_date.split('-'))==2: - try: - month = int(raw_date.split('-')[1]) - year = int(raw_date.split('-')[0]) - date_start = raw_date + '-01' - date_end = f"{year}-{month+1}-01" - return [datetime.strptime(date_start,"%Y-%m-%d").strftime("%d/%m/%Y"),datetime.strptime(date_end,"%Y-%m-%d").strftime("%d/%m/%Y")] - except: - print(f'{raw_date} - date cannot be parsed') - return '' - else: - try: - date = datetime.strptime(raw_date.split(' ')[0], "%Y-%m-%d") - return [date.strftime("%d/%m/%Y"),date.strftime("%d/%m/%Y")] - except: - print(f'{raw_date} - date cannot be parsed') - return '' - -def convert_location(raw_entry): - if raw_entry['Location']: - return ", ".join([u for u in reversed(row['Location'].split(' / '))]) - else: - return '' - - -# Set path to GISAID file -gisaid_file = 'path/to/gisaid/file' - -# pick a variant of concern -voc = 'B.1.351' -gisaid = pd.read_csv(gisaid_file,sep='\t') - - -## Remove lines which don't specify lineage and clean -pangolin_lineage_colname = 'Pango lineage' -gisaid = gisaid.dropna(subset=[pangolin_lineage_colname]) -gisaid_voc = gisaid[gisaid[pangolin_lineage_colname].str.contains(voc)] -gisaid_voc = gisaid_voc.fillna(value='') -gisaid_voc = gisaid_voc.replace('?','') - - -# Set col names -age_col = 'Patient age' -sex_col='Gender' -accession_id_col = 'Accession ID' -date_submitted_col = 'Collection date' -virus_name_col = 'Virus name' -seq_length_col = 'Sequence length' - -cases_dict = defaultdict(list) -for idx,row in gisaid_voc.iterrows(): - dates = convert_date(row[date_submitted_col]) - if dates: # Only enter case if date submitted is not empty (ie convert_date function didn't work) - note = '' - if '-' in row[age_col]: - cases_dict['demographics.ageRange.start'].append(row[age_col].split('-')[0]) - cases_dict['demographics.ageRange.end'].append(row[age_col].split('-')[1]) - else: - cases_dict['demographics.ageRange.start'].append(row[age_col]) - cases_dict['demographics.ageRange.end'].append(row[age_col]) - cases_dict['demographics.gender'].append(row[sex_col]) - cases_dict['genomeSequences.sequence.accession'].append(row[accession_id_col]) - cases_dict['events.confirmed.date.start'].append(dates[0]) - cases_dict['events.confirmed.date.end'].append(dates[1]) - cases_dict['variantOfConcern'].append(row[pangolin_lineage_colname]) - cases_dict['genomeSequences.sequence.name'].append(row[virus_name_col]) - cases_dict['genomeSequences.sequence.length'].append(row[seq_length_col]) - cases_dict['genomeSequences.sample.collection.date'].append(dates[0]) - - cases_dict['location.query'].append(convert_location(row)) - -gisaid_voc_cases = pd.DataFrame.from_dict(cases_dict) -gisaid_voc_cases['caseReference.sourceUrl'] = 'https://www.gisaid.org/' \ No newline at end of file diff --git a/ingestion/functions/parsing/USA/USA.py b/ingestion/functions/parsing/USA/USA.py deleted file mode 100644 index 014737f03..000000000 --- a/ingestion/functions/parsing/USA/USA.py +++ /dev/null @@ -1,217 +0,0 @@ -import os -import argparse -import json -import sys -from datetime import datetime, timedelta -from pathlib import Path -import csv -import common.ingestion_logging as logging - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - -logger = logging.getLogger(__name__) - -_AGE = "age_group" -_GENDER = "sex" -_ETHNICITY = "race_ethnicity_combined" -# There's a space in the name of this column in the upstream data. -# This is defined as the earliest non-empty value of either the CDC report date, or -# specimen collection. https://data.cdc.gov/Case-Surveillance/COVID-19-Case-Surveillance-Public-Use-Data-with-Ge/n8mc-b4w4 -_DATE_CONFIRMED = "cdc_case_earliest_dt " -_DATE_SYMPTOMS = "onset_dt" -_COMORBIDITIES = "medcond_yn" -_CONFIRMED = "current_status" -_HOSPITALIZED = "hosp_yn" -_ICU = "icu_yn" -_DEATH = "death_yn" - -_NONE_TYPES = set(["Missing", "Unknown", "NA", None, ""]) - - -def convert_date(raw_date, manual_import=False): - """ - Convert raw date field into a value interpretable by the dataserver. - - If manual_import is set to True, returns in format recognized by MongoDB. - """ - try: - date = datetime.strptime(raw_date, "%Y/%m/%d") - return ( - {"$date": date.strftime("%Y-%m-%dT00:00:00Z")} - if manual_import else date.strftime("%m/%d/%YZ") - ) - except: - return None - - -def convert_gender(raw_gender: str): - if raw_gender == "Male": - return "Male" - if raw_gender == "Female": - return "Female" - if raw_gender == "Other": - return "Other" - - -def convert_outcome(hospitalized: str, icu: str, death: str): - if death == "Yes": - return { - "name": "outcome", - "value": "Death" - } - elif icu == "Yes": - return { - "name": "icuAdmission", - "value": "Yes" - } - elif hospitalized == "Yes": - return { - "name": "hospitalAdmission", - "value": "Yes" - } - - -def convert_events(date_confirmed, date_symptoms, hospitalized, icu, death, manual_import=False): - events = [ - { - "name": "confirmed", - "dateRange": { - "start": convert_date(date_confirmed, manual_import), - "end": convert_date(date_confirmed, manual_import) - } - } - ] - if date_symptoms not in _NONE_TYPES: - events.append( - { - "name": "onsetSymptoms", - "dateRange": { - "start": convert_date(date_symptoms, manual_import), - "end": convert_date(date_symptoms, manual_import) - }, - } - ) - if convert_outcome(hospitalized, icu, death) is not None: - events.append( - convert_outcome(hospitalized, icu, death) - ) - return events - - -def convert_preexisting_conditions(raw_comorbidities: str): - if raw_comorbidities == "Yes": - preexistingConditions = {} - preexistingConditions["hasPreexistingConditions"] = True - return preexistingConditions - - -def convert_age(age: str): - if age == "80+ Years": - return {"start": 80, "end": 120} - else: - # Age in format '70 - 79 Years' - age_range = age.partition(" - ") - return {"start": float(age_range[0]), "end": float(age_range[2][:2])} - - -def convert_demographics(gender: str, age: str, ethnicity: str): - if gender in _NONE_TYPES and age in _NONE_TYPES: - return None - demo = {} - if gender not in _NONE_TYPES: - demo["gender"] = convert_gender(gender) - if age not in _NONE_TYPES: - demo["ageRange"] = convert_age(age) - if ethnicity not in _NONE_TYPES: - demo["ethnicity"] = ethnicity - return demo - - -def convert_symptoms(date_symptoms): - # Date of first symptoms is only reported if the patient is symptomatic - if date_symptoms not in _NONE_TYPES: - return {"status": "Symptomatic"} - -def parse_cases(raw_data_file: str, source_id: str, source_url: str, last_date: str = None, manual_import: bool = False): - """ - Parses G.h-format case data from raw API data. - """ - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f, delimiter=",") - for row in reader: - confirmation_date = convert_date(row[_DATE_CONFIRMED], manual_import) - if ( - manual_import and last_date and confirmation_date and - confirmation_date["$date"] >= last_date - ): - logger.info(f"Skipping too recent case, on or after {last_date}") - continue - if row[_CONFIRMED] == "Laboratory-confirmed case" and confirmation_date is not None: - try: - case = { - "caseReference": {"sourceId": source_id, "sourceUrl": source_url}, - "location": { - "country": "United States", - "geoResolution": "Country", - "name": "United States", - "geometry": { - "latitude": 37.0902, - "longitude": -95.7129 - } - }, - "events": convert_events( - row[_DATE_CONFIRMED], - row[_DATE_SYMPTOMS], - row[_HOSPITALIZED], - row[_ICU], - row[_DEATH], - manual_import - ), - "symptoms": convert_symptoms(row[_DATE_SYMPTOMS]), - "demographics": convert_demographics( - row[_GENDER], row[_AGE], row[_ETHNICITY] - ), - "preexistingConditions": convert_preexisting_conditions( - row[_COMORBIDITIES] - ) - } - yield case - except ValueError as ve: - raise ValueError(f"error converting case: {ve}") - -def prepare_manual_import(raw_data_file: str, source_url: str, last_date: str = None): - """Prepares JSON file for import to MongoDB""" - last_date = last_date or (datetime.now() - timedelta(days=2)).date().isoformat() - if last_date: - logger.info(f"Will load cases before {last_date}") - from tqdm import tqdm - source_id = f"{Path(__file__).stem.lower()}-manual-import" - case_json = Path('cases.json') - if case_json.exists(): - logger.error("Existing cases.json found, remove and rerun") - return None - with case_json.open('w') as f: - for c in tqdm(parse_cases(raw_data_file, source_id, source_url, last_date, manual_import=True)): - for non_null_field in ['symptoms', 'preexistingConditions']: - if c[non_null_field] is None: - del c[non_null_field] - f.write(json.dumps(c) + "\n") - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/USA/USA_test.py b/ingestion/functions/parsing/USA/USA_test.py deleted file mode 100644 index 952f29b82..000000000 --- a/ingestion/functions/parsing/USA/USA_test.py +++ /dev/null @@ -1,54 +0,0 @@ -import os -import unittest -from USA import USA - -_SOURCE_ID = "abc123" -_SOURCE_URL = "https://data.cdc.gov/api/views/vbim-akqf/rows.csv?accessType=DOWNLOAD" - - -class USATest(unittest.TestCase): - def setUp(self): - # Default of 1500 is not enough to show diffs when there is one. - self.maxDiff = 10000 - - def test_parse(self): - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = USA.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), [ - { - "caseReference": { - "sourceId": "abc123", - "sourceUrl": "https://data.cdc.gov/api/views/vbim-akqf/rows.csv?accessType=DOWNLOAD", - }, - "location": { - "country": "United States", - "geoResolution": "Country", - "name": "United States", - "geometry": { - "latitude": 37.0902, - "longitude": -95.7129 - } - }, - "events": [ - { - "name": "confirmed", - "dateRange": {"start": "08/29/2020Z", "end": "08/29/2020Z"}, - }, - { - "name": "onsetSymptoms", - "dateRange": {"start": "08/30/2020Z", "end": "08/30/2020Z"}, - } - ], - "symptoms": { - "status": "Symptomatic" - }, - "demographics": { - "gender": "Female", - "ageRange": {"start": 20.0, "end": 29.0}, - "ethnicity": "White, Non-Hispanic" - }, - "preexistingConditions": {"hasPreexistingConditions": True} - } - ]) diff --git a/ingestion/functions/parsing/USA/__init__.py b/ingestion/functions/parsing/USA/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/USA/input_event.json b/ingestion/functions/parsing/USA/input_event.json deleted file mode 100644 index d5e6b671e..000000000 --- a/ingestion/functions/parsing/USA/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "5fc25486c26f2600385e210e/2020/11/28/1354/content.csv", - "sourceUrl": "https://data.cdc.gov/api/views/vbim-akqf/rows.csv?accessType=DOWNLOAD", - "sourceId": "5fc25486c26f2600385e210e" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/USA/sample_data.csv b/ingestion/functions/parsing/USA/sample_data.csv deleted file mode 100644 index b53477394..000000000 --- a/ingestion/functions/parsing/USA/sample_data.csv +++ /dev/null @@ -1,2 +0,0 @@ -cdc_case_earliest_dt ,cdc_report_dt,pos_spec_dt,onset_dt,current_status,sex,age_group,race_ethnicity_combined,hosp_yn,icu_yn,death_yn,medcond_yn -2020/08/29,2020/08/30,,2020/08/30,Laboratory-confirmed case,Female,20 - 29 Years,"White, Non-Hispanic",No,No,No,Yes \ No newline at end of file diff --git a/ingestion/functions/parsing/argentina/__init__.py b/ingestion/functions/parsing/argentina/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/argentina/argentina.py b/ingestion/functions/parsing/argentina/argentina.py deleted file mode 100644 index e2cbed315..000000000 --- a/ingestion/functions/parsing/argentina/argentina.py +++ /dev/null @@ -1,337 +0,0 @@ -import os -import sys -from datetime import datetime -import csv -import json -import common.ingestion_logging as logging - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir, os.pardir, 'common')) - import parsing_lib - -logger = logging.getLogger(__name__) - -# The location data for Argentinian cases is obtained by using a lookup table (from https://datos.gob.ar/dataset/ign-unidades-territoriales/archivo/ign_01.03.02) which allows for cross-referencing of location down to administrative level 2 and latitude/longitude -# This data has been collated into several dictionaries: -# "mismatch_locations" has entries where the spelling in the case data and the lookup table differs -# "department_lat_long" has information from source regarding longitude/latitude of administrative level 2 locations -# "province_lat_long" has information from source regarding longitude/latitude of administrative level 1 locations -# "country_iso2" maps Spanish country names to their ISO-2 codes, and also includes common alternative spellings of country names as observed in data (e.g. lack of accents, common typos) -# 'country_translate_lat_long' maps country ISO-2 codes to longitude/latitude of country centroids, obtained from https://raw.githubusercontent.com/google/dspl/master/samples/google/canonical/countries.csv, as well as the corresponding country name in English -with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "dictionaries.json"), encoding='utf-8') as json_file: - dictionaries = json.load(json_file) - -_MISMATCH_LOCATIONS = dictionaries["mismatch_locations"] - -_DEPARTMENT_LAT_LONG_MAP = dictionaries["department_lat_long"] - -_PROVINCE_LAT_LONG_MAP = dictionaries["province_lat_long"] - -_COUNTRY_ISO2_MAP = dictionaries["country_iso2"] - -_COUNTRY_LAT_LONG_MAP = dictionaries['country_translate_lat_long'] - -private_public_map = {'Público': 'Public', 'Privado': 'Private'} - - -def convert_date(date_str: str): - """ - Convert raw date field into a value interpretable by the dataserver. - - The date is listed in YYYY-mm-dd format - """ - date = datetime.strptime(date_str, "%Y-%m-%d") - - return date.strftime("%m/%d/%Y") - - -def convert_gender(raw_gender): - if raw_gender == "M": - return "Male" - if raw_gender == "F": - return "Female" - - -def convert_location(entry): - ''' - This gets the residential address of the patient, which is given to administrative level 2 in most cases. - When it is not, we default to the administrative level 1 residence data. - In some cases, residence of patient is reported as outside Argentina, or residence location is not reported at all; in these cases the case location to administrative level 1 ('carga_provincia_nombre') is used to provide location information. - ''' - location = {} - geometry = {} - country = entry["residencia_pais_nombre"] - admin1 = entry["residencia_provincia_nombre"] - admin1_case = entry['carga_provincia_nombre'] - admin2 = entry["residencia_departamento_nombre"] - # Deal with cases where the spelling of the administrative level 2 or 1 locations do not exactly match official source of latitude/longitude data - if admin2 in _MISMATCH_LOCATIONS.keys(): - admin2 = _MISMATCH_LOCATIONS[admin2] - if admin1 in _MISMATCH_LOCATIONS.keys(): - admin1 = _MISMATCH_LOCATIONS[admin1] - if admin1_case in _MISMATCH_LOCATIONS.keys(): - admin1_case = _MISMATCH_LOCATIONS[admin1_case] - - if country == 'Argentina': - if admin2 in _DEPARTMENT_LAT_LONG_MAP.keys(): - location["administrativeAreaLevel2"] = admin2 - location["country"] = country - location["administrativeAreaLevel1"] = admin1 - location["geoResolution"] = "Admin2" - location["name"] = ", ".join([admin2, admin1, country]) - - geometry["latitude"] = _DEPARTMENT_LAT_LONG_MAP[admin2]["latitude"] - geometry["longitude"] = _DEPARTMENT_LAT_LONG_MAP[admin2]["longitude"] - location["geometry"] = geometry - elif admin1 in _PROVINCE_LAT_LONG_MAP.keys(): - location["country"] = country - location["administrativeAreaLevel1"] = admin1 - location["geoResolution"] = "Admin1" - location["name"] = ", ".join([admin1, country]) - - geometry["latitude"] = _PROVINCE_LAT_LONG_MAP[admin1]["latitude"] - geometry["longitude"] = _PROVINCE_LAT_LONG_MAP[admin1]["longitude"] - location["geometry"] = geometry - else: - # In the case of neither administrative level 1 or 2 information provided, default to country information. - location["country"] = country - location["geoResolution"] = "Country" - location["name"] = country - - Argentina_ISO2 = _COUNTRY_ISO2_MAP[country.lower()] - geometry["latitude"] = _COUNTRY_LAT_LONG_MAP[Argentina_ISO2]["latitude"] - geometry["longitude"] = _COUNTRY_LAT_LONG_MAP[Argentina_ISO2]["longitude"] - location["geometry"] = geometry - else: - # This encompasses both cases where country == 'SIN ESPECIFICAR' or where country of residence is other than Argentina - # In these cases the case location to administrative level 1 (which is always an Argentinian province) is used for location information - if admin1_case in _PROVINCE_LAT_LONG_MAP.keys(): - location["country"] = "Argentina" - location["administrativeAreaLevel1"] = admin1_case - location["geoResolution"] = "Admin1" - location["name"] = ", ".join([admin1_case, "Argentina"]) - - geometry["latitude"] = _PROVINCE_LAT_LONG_MAP[admin1_case]["latitude"] - geometry["longitude"] = _PROVINCE_LAT_LONG_MAP[admin1_case]["longitude"] - location["geometry"] = geometry - if location: - return location - else: - return None - - -def convert_travel(entry): - ''' - When the residence location is a country other than Argentina we assume travel history. - ''' - if entry not in ["Argentina", "SIN_ESPECIFICAR", "SIN ESPECIFICAR"]: - location = {} - geometry = {} - travel = {} - travel_countries = [] - country = entry - - if country.lower() in _COUNTRY_ISO2_MAP: - country_ISO2 = _COUNTRY_ISO2_MAP[country.lower()] - - location["country"] = country_ISO2 - location["geoResolution"] = "Country" - location["name"] = _COUNTRY_LAT_LONG_MAP[country_ISO2]["name_english"] - geometry["latitude"] = _COUNTRY_LAT_LONG_MAP[country_ISO2]["latitude"] - geometry["longitude"] = _COUNTRY_LAT_LONG_MAP[country_ISO2]["longitude"] - location["geometry"] = geometry - - travel_countries.append({"location": location}) - else: - logger.warning(f"Country code not found for: {country.lower()}") - travel["traveledPrior30Days"] = True - travel["travel"] = travel_countries - if travel: - return travel - else: - return None - - -def convert_age(entry): - ''' - Want to return a float specifying age in years. If age field is empty, return None - ''' - if entry['edad']: - if int(entry['edad']) < 121: - if entry['edad_años_meses'] == 'Años': - return float(entry['edad']) - elif entry['edad_años_meses'] == 'Meses': - return float(entry['edad']) / 12 - return None - - -def get_confirmed_event(entry): - if entry['fecha_diagnostico']: - confirmation_date = convert_date(entry['fecha_diagnostico']) - note = 'Using Date of Diagnosis as the date of confirmation.' - - elif entry['fecha_inicio_sintomas']: - confirmation_date = convert_date(entry['fecha_inicio_sintomas']) - note = 'Using Date of Symptom Onset as the date of confirmation, because Date of Diagnosis is missing.' - - elif entry['fecha_apertura']: - confirmation_date = convert_date(entry['fecha_apertura']) - note = 'Using Date of Case Opening as the date of confirmation, because both Date of Diagnosis and Date of Symptom Onset are missing.' - - if 'Caso confirmado por laboratorio' in entry['clasificacion']: - confirmed_value = 'Laboratory Test' - elif 'Caso confirmado por criterio clínico-epidemiológico' in entry['clasificacion']: - confirmed_value = 'Clinical Diagnosis' - else: - confirmed_value = 'Method Unknown' - - confirmed_event = { - "name": "confirmed", - "value": confirmed_value, - "dateRange": - { - "start": confirmation_date, - "end": confirmation_date - }} - - return confirmed_event, note - - -def convert_case_location(entry): - ''' - Additional information is provided regarding where case was diagnosed/hospitalised, but to less detail than residential location. - ''' - if entry['carga_provincia_nombre']: - return ", ".join([entry.get("carga_provincia_nombre", ""), "Argentina"]) - else: - return "NOT REPORTED" - - -def parse_cases(raw_data_file, source_id, source_url): - """ - Parses G.h-format case data from raw API data. - - We are currently only incorporating cases classified ('clasificacion_resumen') as 'Confirmed'. However, - 970k out of 1.5M cases are listed as 'Discarded', even though many have data values resembling confirmed - Covid-19 patients, eg date_of_diagnosis, ICU_admission, mechanical breathing assistance. Future versions may - want to modify this behaviour. - - For cases classified as Confirmed but lacking a Date of Diagnosis, we use Date of Symptom onset where present, - and Date of Case Opening where neither Date of Diagnosis or Date of Symptom Onset are present. - - For case location, we use the residential address of the patient, as this gives more detailed location information (to department level) - than 'carga_provincia_nombre' (== location where test was carried out, given to province level). - - """ - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f) - for entry in reader: - notes = [] - if entry["clasificacion_resumen"] == "Confirmado": - case = { - "caseReference": { - "sourceId": source_id, - "sourceEntryId": entry["id_evento_caso"], - "sourceUrl": source_url - }, - "location": convert_location(entry), - "demographics": { - "ageRange": { - "start": convert_age(entry), - "end": convert_age(entry) - }, - "gender": convert_gender(entry["sexo"]) - } - } - - confirmed_event, confirmation_note = get_confirmed_event(entry) - case["events"] = [confirmed_event] - notes.append(confirmation_note) - - if entry["fecha_inicio_sintomas"]: - case["symptoms"] = { - "status": "Symptomatic", - } - case["events"].append({ - "name": "onsetSymptoms", - "dateRange": { - "start": convert_date(entry['fecha_inicio_sintomas']), - "end": convert_date(entry['fecha_inicio_sintomas']), - } - }) - - if entry["fecha_fallecimiento"]: - case["events"].append({ - "name": "outcome", - "value": "Death", - "dateRange": { - "start": convert_date(entry['fecha_fallecimiento']), - "end": convert_date(entry['fecha_fallecimiento']), - } - }) - if entry["fecha_internacion"]: - case["events"].append({ - "name": "hospitalAdmission", - "value": "Yes", - "dateRange": { - "start": convert_date(entry['fecha_internacion']), - "end": convert_date(entry['fecha_internacion']), - } - }) - if entry["fecha_cui_intensivo"]: - case["events"].append({ - "name": "icuAdmission", - "value": "Yes", - "dateRange": { - "start": convert_date(entry['fecha_cui_intensivo']), - "end": convert_date(entry['fecha_cui_intensivo']), - } - }) - - if 'no activo' in entry['clasificacion'].lower(): - case["events"].append({ - "name": "outcome", - "value": "Recovered"}) - if 'No activo (por tiempo de evolución)' in entry['clasificacion']: - notes.append( - "Patient recovery was confirmed by a number of days elapsing with no symptoms.") - elif "No Activo por criterio de laboratorio" in entry['clasificacion']: - notes.append( - "Patient recovery was confirmed by a negative laboratory test.") - - travel_history = convert_travel(entry["residencia_pais_nombre"]) - case['travelHistory'] = travel_history - - notes.append( - f"Province in charge of case reported as {convert_case_location(entry)}.") - notes.append( - f"Case last updated on {convert_date(entry['ultima_actualizacion'])}.") - if entry['origen_financiamiento'] in ['Público', 'Privado']: - notes.append( - f"Case was dealt with through {private_public_map[entry['origen_financiamiento']]} health system.") - - if entry['asistencia_respiratoria_mecanica'] == 'SI': - notes.append("Patient received mechanical ventilation.") - if entry['clasificacion']: - notes.append(f"Diagnostic notes: {entry['clasificacion']}") - - case["notes"] = ", ".join(notes) - yield case - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/argentina/argentina_test.py b/ingestion/functions/parsing/argentina/argentina_test.py deleted file mode 100644 index ad21e4f9f..000000000 --- a/ingestion/functions/parsing/argentina/argentina_test.py +++ /dev/null @@ -1,157 +0,0 @@ -import os -import unittest -from datetime import date -from argentina import argentina - -_SOURCE_ID = "placeholder_ID" -_SOURCE_URL = "placeholder_URL" - - -class ArgentinaTest(unittest.TestCase): - def setUp(self): - self.maxDiff = None - - def test_parse(self): - ''' - Includes imported and internally transmitted cases - ''' - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - result = argentina.parse_cases( - sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), [ - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '1000007', - 'sourceUrl': 'placeholder_URL'}, - 'location': { - "administrativeAreaLevel2": "Patiño", - "country": "Argentina", - "administrativeAreaLevel1": "Formosa", - "geoResolution": "Admin2", - "name": 'Patiño, Formosa, Argentina', - "geometry": { - "latitude": -24.87505855, - "longitude": -59.95853733 - }, - }, - 'demographics': {'ageRange': {'start': 26.0, 'end': 26.0}, 'gender': 'Male'}, - 'events': [{'name': 'confirmed', - 'value': 'Laboratory Test', - 'dateRange': {'start': '06/25/2020', 'end': '06/25/2020'}}, - {'name': 'outcome', 'value': 'Recovered'}], - 'travelHistory': None, - 'notes': 'Using Date of Diagnosis as the date of confirmation., Patient recovery was confirmed by a negative laboratory test., Province in charge of case reported as Formosa, Argentina., Case last updated on 09/18/2020., Case was dealt with through Public health system., Diagnostic notes: Caso confirmado por laboratorio - No Activo por criterio de laboratorio'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '1000010', - 'sourceUrl': 'placeholder_URL'}, - 'location': { - "administrativeAreaLevel2": "Comuna 7", - "country": "Argentina", - "administrativeAreaLevel1": "Ciudad Autónoma de Buenos Aires", - "geoResolution": "Admin2", - "name": 'Comuna 7, Ciudad Autónoma de Buenos Aires, Argentina', - "geometry": { - "latitude": -34.63655441, - "longitude": -58.45188686 - }, - }, - 'demographics': {'ageRange': {'start': 7.0, 'end': 7.0}, 'gender': 'Male'}, - 'events': [{'name': 'confirmed', - 'value': 'Laboratory Test', - 'dateRange': {'start': '06/01/2020', 'end': '06/01/2020'}}, - {'name': 'outcome', 'value': 'Recovered'}], - 'travelHistory': None, - 'notes': 'Using Date of Diagnosis as the date of confirmation., Patient recovery was confirmed by a number of days elapsing with no symptoms., Province in charge of case reported as CABA, Argentina., Case last updated on 09/18/2020., Case was dealt with through Public health system., Diagnostic notes: Caso confirmado por laboratorio - No activo (por tiempo de evolución)'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '1000012', - 'sourceUrl': 'placeholder_URL'}, - 'location': { - "country": "Argentina", - "administrativeAreaLevel1": "Ciudad Autónoma de Buenos Aires", - "geoResolution": "Admin1", - "name": 'Ciudad Autónoma de Buenos Aires, Argentina', - "geometry": { - "latitude": -34.61448692, - "longitude": -58.44590845 - }, - }, - 'demographics': {'ageRange': {'start': 46.0, 'end': 46.0}, 'gender': 'Male'}, - 'events': [{'name': 'confirmed', - 'value': 'Laboratory Test', - 'dateRange': {'start': '05/31/2020', 'end': '05/31/2020'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '05/26/2020', 'end': '05/26/2020'}}, - {'name': 'outcome', - 'value': 'Death', - 'dateRange': {'start': '07/01/2020', 'end': '07/01/2020'}}, - {'name': 'hospitalAdmission', - 'value': 'Yes', - 'dateRange': {'start': '05/31/2020', 'end': '05/31/2020'}}], - 'symptoms': {'status': 'Symptomatic'}, - 'travelHistory': None, - 'notes': 'Using Date of Diagnosis as the date of confirmation., Province in charge of case reported as CABA, Argentina., Case last updated on 07/01/2020., Case was dealt with through Private health system., Diagnostic notes: Caso confirmado por laboratorio'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '1000015', - 'sourceUrl': 'placeholder_URL'}, - 'location': { - "administrativeAreaLevel2": "Comuna 7", - "country": "Argentina", - "administrativeAreaLevel1": "Ciudad Autónoma de Buenos Aires", - "geoResolution": "Admin2", - "name": 'Comuna 7, Ciudad Autónoma de Buenos Aires, Argentina', - "geometry": { - "latitude": -34.63655441, - "longitude": -58.45188686 - }, - }, - 'demographics': {'ageRange': {'start': 29.0, 'end': 29.0}, - 'gender': 'Female'}, - 'events': [{'name': 'confirmed', - 'value': 'Laboratory Test', - 'dateRange': {'start': '06/01/2020', 'end': '06/01/2020'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '05/18/2020', 'end': '05/18/2020'}}, - {'name': 'outcome', 'value': 'Recovered'}], - 'symptoms': {'status': 'Symptomatic'}, - 'travelHistory': None, - 'notes': 'Using Date of Diagnosis as the date of confirmation., Patient recovery was confirmed by a number of days elapsing with no symptoms., Province in charge of case reported as Buenos Aires, Argentina., Case last updated on 09/18/2020., Case was dealt with through Private health system., Diagnostic notes: Caso confirmado por laboratorio - No activo (por tiempo de evolución)'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '1039608', - 'sourceUrl': 'placeholder_URL'}, - 'location': { - "country": "Argentina", - "administrativeAreaLevel1": "Buenos Aires", - "geoResolution": "Admin1", - "name": 'Buenos Aires, Argentina', - "geometry": { - "latitude": -36.67373207, - "longitude": -60.55722017 - }, - }, - 'demographics': {'ageRange': {'start': 70.0, 'end': 70.0}, - 'gender': 'Male'}, - 'events': [{'name': 'confirmed', - 'value': 'Laboratory Test', - 'dateRange': {'start': '06/10/2020', 'end': '06/10/2020'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '06/04/2020', 'end': '06/04/2020'}}, - {'name': 'outcome', 'value': 'Recovered'}], - 'symptoms': {'status': 'Symptomatic'}, - 'travelHistory': { - "traveledPrior30Days": True, - "travel": [ - { - "location": { - "country": "IT", - "geoResolution": "Country", - "name": 'Italy', - "geometry": { - "latitude": 41.87194, - "longitude": 12.56738 - } - } - } - ] - }, - 'notes': 'Using Date of Diagnosis as the date of confirmation., Patient recovery was confirmed by a negative laboratory test., Province in charge of case reported as Buenos Aires, Argentina., Case last updated on 03/03/2021., Case was dealt with through Public health system., Diagnostic notes: Caso confirmado por laboratorio - No Activo por criterio de laboratorio'} - ]) diff --git a/ingestion/functions/parsing/argentina/dictionaries.json b/ingestion/functions/parsing/argentina/dictionaries.json deleted file mode 100644 index cb50ac0df..000000000 --- a/ingestion/functions/parsing/argentina/dictionaries.json +++ /dev/null @@ -1,3480 +0,0 @@ -{ - "country_iso2": { - "afganistán": "AF", - "albania": "AL", - "alemania": "DE", - "andorra": "AD", - "angola": "AO", - "anguila": "AI", - "antártida": "AQ", - "antigua y barbuda": "AG", - "arabia saudí": "SA", - "argelia": "DZ", - "argentina": "AR", - "armenia": "AM", - "aruba": "AW", - "australia": "AU", - "austria": "AT", - "azerbaiyán": "AZ", - "bahamas": "BS", - "bangladés": "BD", - "barbados": "BB", - "baréin": "BH", - "bélgica": "BE", - "belice": "BZ", - "benín": "BJ", - "bermudas": "BM", - "bielorrusia": "BY", - "bolivia": "BO", - "bosnia y herzegovina": "BA", - "botsuana": "BW", - "brasil": "BR", - "brunéi": "BN", - "bulgaria": "BG", - "burkina faso": "BF", - "burundi": "BI", - "bután": "BT", - "cabo verde": "CV", - "camboya": "KH", - "camerún": "CM", - "canadá": "CA", - "caribe neerlandés": "BQ", - "catar": "QA", - "chad": "TD", - "chequia": "CZ", - "chile": "CL", - "china": "CN", - "chipre": "CY", - "ciudad del vaticano": "VA", - "colombia": "CO", - "comoras": "KM", - "congo": "CG", - "corea del norte": "KP", - "corea del sur": "KR", - "corea republicana": "KR", - "costa rica": "CR", - "côte d’ivoire": "CI", - "croacia": "HR", - "cuba": "CU", - "curazao": "CW", - "dinamarca": "DK", - "dominica": "DM", - "ecuador": "EC", - "egipto": "EG", - "el salvador": "SV", - "emiratos árabes unidos": "AE", - "eritrea": "ER", - "eslovaquia": "SK", - "eslovenia": "SI", - "españa": "ES", - "estados unidos": "US", - "ee.uu.": "US", - "estonia": "EE", - "esuatini": "SZ", - "etiopía": "ET", - "filipinas": "PH", - "finlandia": "FI", - "fiyi": "FJ", - "francia": "FR", - "gabón": "GA", - "gambia": "GM", - "georgia": "GE", - "ghana": "GH", - "gibraltar": "GI", - "granada": "GD", - "grecia": "GR", - "groenlandia": "GL", - "guadalupe": "GP", - "guam": "GU", - "guatemala": "GT", - "guayana francesa": "GF", - "guernsey": "GG", - "guinea": "GN", - "guinea ecuatorial": "GQ", - "guinea-bisáu": "GW", - "guyana": "GY", - "haití": "HT", - "honduras": "HN", - "hungría": "HU", - "india": "IN", - "indonesia": "ID", - "irak": "IQ", - "irán": "IR", - "irlanda": "IE", - "isla bouvet": "BV", - "isla de man": "IM", - "isla de navidad": "CX", - "isla norfolk": "NF", - "islandia": "IS", - "islas åland": "AX", - "islas caimán": "KY", - "islas cocos": "CC", - "islas cook": "CK", - "islas feroe": "FO", - "islas georgia del sur y sandwich del sur": "GS", - "islas heard y mcdonald": "HM", - "islas malvinas": "FK", - "islas marianas del norte": "MP", - "islas marshall": "MH", - "islas menores alejadas de ee. uu.": "UM", - "islas pitcairn": "PN", - "islas salomón": "SB", - "islas turcas y caicos": "TC", - "islas vírgenes británicas": "VG", - "islas vírgenes de ee. uu.": "VI", - "israel": "IL", - "italia": "IT", - "jamaica": "JM", - "japón": "JP", - "jersey": "JE", - "jordania": "JO", - "kazajistán": "KZ", - "kenia": "KE", - "kirguistán": "KG", - "kiribati": "KI", - "kuwait": "KW", - "laos": "LA", - "lesoto": "LS", - "letonia": "LV", - "líbano": "LB", - "liberia": "LR", - "libia": "LY", - "liechtenstein": "LI", - "lituania": "LT", - "luxemburgo": "LU", - "macedonia del norte": "MK", - "madagascar": "MG", - "malasia": "MY", - "malaui": "MW", - "maldivas": "MV", - "mali": "ML", - "malta": "MT", - "marruecos": "MA", - "martinica": "MQ", - "mauricio": "MU", - "mauritania": "MR", - "mayotte": "YT", - "méxico": "MX", - "micronesia": "FM", - "moldavia": "MD", - "mónaco": "MC", - "mongolia": "MN", - "montenegro": "ME", - "montserrat": "MS", - "mozambique": "MZ", - "myanmar (birmania)": "MM", - "namibia": "NA", - "nauru": "NR", - "nepal": "NP", - "nicaragua": "NI", - "níger": "NE", - "nigeria": "NG", - "niue": "NU", - "noruega": "NO", - "nueva caledonia": "NC", - "nueva zelanda": "NZ", - "omán": "OM", - "países bajos": "NL", - "pakistán": "PK", - "palaos": "PW", - "panamá": "PA", - "papúa nueva guinea": "PG", - "paraguay": "PY", - "perú": "PE", - "polinesia francesa": "PF", - "polonia": "PL", - "portugal": "PT", - "puerto rico": "PR", - "rae de hong kong (china)": "HK", - "rae de macao (china)": "MO", - "reino unido": "GB", - "república centroafricana": "CF", - "república democrática del congo": "CD", - "república dominicana": "DO", - "reunión": "RE", - "ruanda": "RW", - "rumanía": "RO", - "rusia": "RU", - "sáhara occidental": "EH", - "samoa": "WS", - "samoa americana": "AS", - "san bartolomé": "BL", - "san cristóbal y nieves": "KN", - "san marino": "SM", - "san martín": "MF", - "san pedro y miquelón": "PM", - "san vicente y las granadinas": "VC", - "santa elena": "SH", - "santa lucía": "LC", - "santo tomé y príncipe": "ST", - "senegal": "SN", - "serbia": "RS", - "seychelles": "SC", - "sierra leona": "SL", - "singapur": "SG", - "sint maarten": "SX", - "siria": "SY", - "somalia": "SO", - "sri lanka": "LK", - "sudáfrica": "ZA", - "sudán": "SD", - "sudán del sur": "SS", - "suecia": "SE", - "suiza": "CH", - "surinam": "SR", - "svalbard y jan mayen": "SJ", - "tailandia": "TH", - "taiwán": "TW", - "tanzania": "TZ", - "tayikistán": "TJ", - "territorio británico del océano índico": "IO", - "territorios australes franceses": "TF", - "territorios palestinos": "PS", - "timor-leste": "TL", - "togo": "TG", - "tokelau": "TK", - "tonga": "TO", - "trinidad y tobago": "TT", - "túnez": "TN", - "turkmenistán": "TM", - "turquía": "TR", - "tuvalu": "TV", - "ucrania": "UA", - "uganda": "UG", - "uruguay": "UY", - "uzbekistán": "UZ", - "vanuatu": "VU", - "venezuela": "VE", - "vietnam": "VN", - "wallis y futuna": "WF", - "yemen": "YE", - "yibuti": "DJ", - "zambia": "ZM", - "zimbabue": "ZW", - "afganistan": "AF", - "antartida": "AQ", - "arabia saudi": "SA", - "azerbaiyan": "AZ", - "banglades": "BD", - "barein": "BH", - "belgica": "BE", - "benin": "BJ", - "brunei": "BN", - "butan": "BT", - "camerun": "CM", - "canada": "CA", - "caribe neerlandes": "BQ", - "cote d'ivoire": "CI", - "emiratos arabes unidos": "AE", - "espana": "ES", - "etiopia": "ET", - "gabon": "GA", - "guinea-bisau": "GW", - "haiti": "HT", - "hungria": "HU", - "iran": "IR", - "islas aland": "AX", - "islas caiman": "KY", - "islas salomon": "SB", - "islas virgenes britanicas": "VG", - "islas virgenes de ee. uu.": "VI", - "japon": "JP", - "kazajistan": "KZ", - "kirguistan": "KG", - "libano": "LB", - "mexico": "MX", - "monaco": "MC", - "niger": "NE", - "oman": "OM", - "paises bajos": "NL", - "pakistan": "PK", - "panama": "PA", - "papua nueva guinea": "PG", - "peru": "PE", - "republica centroafricana": "CF", - "republica democratica del congo": "CD", - "republica dominicana": "DO", - "reunion": "RE", - "rumania": "RO", - "sahara occidental": "EH", - "san bartolome": "BL", - "san cristobal y nieves": "KN", - "san martin": "MF", - "san pedro y miquelon": "PM", - "santa lucia": "LC", - "santo tome y principe": "ST", - "sudafrica": "ZA", - "sudan": "SD", - "sudan del sur": "SS", - "taiwan": "TW", - "tayikistan": "TJ", - "territorio britanico del oceano indico": "IO", - "tunez": "TN", - "turkmenistan": "TM", - "turquia": "TR", - "uzbekistan": "UZ", - "república árabe siria": "SY", - "república de corea": "KR", - "arabia saudita": "SA", - "belarusia": "BY", - "estados unidos de américa": "US", - "islas vírgenes de los estados unidos": "VI", - "federación de rusia": "RU", - "reino unido de gran bretaña e irlanda del norte": "GB", - "república docimincana": "DO", - "santa helena": "SH", - "veneuela": "VE", - "kenya": "KE", - "qatar": "QA", - "antillas neerlandesas": "BQ" - }, - "mismatch_locations": { - "Juan F. Ibarra": "Juan Felipe Ibarra", - "General Juan F. Quiroga": "General Juan Facundo Quiroga", - "1º de Mayo": "1° de Mayo", - "Ullúm": "Ullum", - "General Ocampo": "General Ortiz de Ocampo", - "Grl. José de San Martín": "General José de San Martín", - "Coronel de Marina L. Rosales": "Coronel de Marina Leonardo Rosales", - "Ñorquincó": "Ñorquinco", - "General Angel V. Peñaloza": "Ángel Vicente Peñaloza", - "Coronel Felipe Varela": "General Felipe Varela", - "San Blas de los Sauces": "San Blas de Los Sauces", - "COMUNA 01": "Comuna 1", - "COMUNA 02": "Comuna 2", - "COMUNA 03": "Comuna 3", - "COMUNA 04": "Comuna 4", - "COMUNA 05": "Comuna 5", - "COMUNA 06": "Comuna 6", - "COMUNA 07": "Comuna 7", - "COMUNA 08": "Comuna 8", - "COMUNA 09": "Comuna 9", - "COMUNA 10": "Comuna 10", - "COMUNA 11": "Comuna 11", - "COMUNA 12": "Comuna 12", - "COMUNA 13": "Comuna 13", - "COMUNA 14": "Comuna 14", - "COMUNA 15": "Comuna 15", - "CABA": "Ciudad Autónoma de Buenos Aires", - "Tierra del Fuego": "Tierra del Fuego, Antártida e Islas del Atlántico Sur" - }, - "country_translate_lat_long": { - "AD": { - "name_english": "Andorra", - "latitude": 42.546245, - "longitude": 1.601554 - }, - "AE": { - "name_english": "United Arab Emirates", - "latitude": 23.424076, - "longitude": 53.847818 - }, - "AF": { - "name_english": "Afghanistan", - "latitude": 33.93911, - "longitude": 67.709953 - }, - "AG": { - "name_english": "Antigua and Barbuda", - "latitude": 17.060816, - "longitude": -61.796428 - }, - "AI": { - "name_english": "Anguilla", - "latitude": 18.220554, - "longitude": -63.068615 - }, - "AL": { - "name_english": "Albania", - "latitude": 41.153332, - "longitude": 20.168331 - }, - "AM": { - "name_english": "Armenia", - "latitude": 40.069099, - "longitude": 45.038189 - }, - "AN": { - "name_english": "Netherlands Antilles", - "latitude": 12.226079, - "longitude": -69.060087 - }, - "AO": { - "name_english": "Angola", - "latitude": -11.202692, - "longitude": 17.873887 - }, - "AQ": { - "name_english": "Antarctica", - "latitude": -75.250973, - "longitude": -0.071389 - }, - "AR": { - "name_english": "Argentina", - "latitude": -38.416097, - "longitude": -63.616672 - }, - "AS": { - "name_english": "American Samoa", - "latitude": -14.270972, - "longitude": -170.132217 - }, - "AT": { - "name_english": "Austria", - "latitude": 47.516231, - "longitude": 14.550072 - }, - "AU": { - "name_english": "Australia", - "latitude": -25.274398, - "longitude": 133.775136 - }, - "AW": { - "name_english": "Aruba", - "latitude": 12.52111, - "longitude": -69.968338 - }, - "AZ": { - "name_english": "Azerbaijan", - "latitude": 40.143105, - "longitude": 47.576927 - }, - "BA": { - "name_english": "Bosnia and Herzegovina", - "latitude": 43.915886, - "longitude": 17.679076 - }, - "BB": { - "name_english": "Barbados", - "latitude": 13.193887, - "longitude": -59.543198 - }, - "BD": { - "name_english": "Bangladesh", - "latitude": 23.684994, - "longitude": 90.356331 - }, - "BE": { - "name_english": "Belgium", - "latitude": 50.503887, - "longitude": 4.469936 - }, - "BF": { - "name_english": "Burkina Faso", - "latitude": 12.238333, - "longitude": -1.561593 - }, - "BG": { - "name_english": "Bulgaria", - "latitude": 42.733883, - "longitude": 25.48583 - }, - "BH": { - "name_english": "Bahrain", - "latitude": 25.930414, - "longitude": 50.637772 - }, - "BI": { - "name_english": "Burundi", - "latitude": -3.373056, - "longitude": 29.918886 - }, - "BJ": { - "name_english": "Benin", - "latitude": 9.30769, - "longitude": 2.315834 - }, - "BM": { - "name_english": "Bermuda", - "latitude": 32.321384, - "longitude": -64.75737 - }, - "BN": { - "name_english": "Brunei", - "latitude": 4.535277, - "longitude": 114.727669 - }, - "BO": { - "name_english": "Bolivia", - "latitude": -16.290154, - "longitude": -63.588653 - }, - "BR": { - "name_english": "Brazil", - "latitude": -14.235004, - "longitude": -51.92528 - }, - "BS": { - "name_english": "Bahamas", - "latitude": 25.03428, - "longitude": -77.39628 - }, - "BT": { - "name_english": "Bhutan", - "latitude": 27.514162, - "longitude": 90.433601 - }, - "BV": { - "name_english": "Bouvet Island", - "latitude": -54.423199, - "longitude": 3.413194 - }, - "BW": { - "name_english": "Botswana", - "latitude": -22.328474, - "longitude": 24.684866 - }, - "BY": { - "name_english": "Belarus", - "latitude": 53.709807, - "longitude": 27.953389 - }, - "BZ": { - "name_english": "Belize", - "latitude": 17.189877, - "longitude": -88.49765 - }, - "CA": { - "name_english": "Canada", - "latitude": 56.130366, - "longitude": -106.346771 - }, - "CC": { - "name_english": "Cocos [Keeling] Islands", - "latitude": -12.164165, - "longitude": 96.870956 - }, - "CD": { - "name_english": "Congo [DRC]", - "latitude": -4.038333, - "longitude": 21.758664 - }, - "CF": { - "name_english": "Central African Republic", - "latitude": 6.611111, - "longitude": 20.939444 - }, - "CG": { - "name_english": "Congo [Republic]", - "latitude": -0.228021, - "longitude": 15.827659 - }, - "CH": { - "name_english": "Switzerland", - "latitude": 46.818188, - "longitude": 8.227512 - }, - "CI": { - "name_english": "Côte d'Ivoire", - "latitude": 7.539989, - "longitude": -5.54708 - }, - "CK": { - "name_english": "Cook Islands", - "latitude": -21.236736, - "longitude": -159.777671 - }, - "CL": { - "name_english": "Chile", - "latitude": -35.675147, - "longitude": -71.542969 - }, - "CM": { - "name_english": "Cameroon", - "latitude": 7.369722, - "longitude": 12.354722 - }, - "CN": { - "name_english": "China", - "latitude": 35.86166, - "longitude": 104.195397 - }, - "CO": { - "name_english": "Colombia", - "latitude": 4.570868, - "longitude": -74.297333 - }, - "CR": { - "name_english": "Costa Rica", - "latitude": 9.748917, - "longitude": -83.753428 - }, - "CU": { - "name_english": "Cuba", - "latitude": 21.521757, - "longitude": -77.781167 - }, - "CV": { - "name_english": "Cape Verde", - "latitude": 16.002082, - "longitude": -24.013197 - }, - "CX": { - "name_english": "Christmas Island", - "latitude": -10.447525, - "longitude": 105.690449 - }, - "CY": { - "name_english": "Cyprus", - "latitude": 35.126413, - "longitude": 33.429859 - }, - "CZ": { - "name_english": "Czech Republic", - "latitude": 49.817492, - "longitude": 15.472962 - }, - "DE": { - "name_english": "Germany", - "latitude": 51.165691, - "longitude": 10.451526 - }, - "DJ": { - "name_english": "Djibouti", - "latitude": 11.825138, - "longitude": 42.590275 - }, - "DK": { - "name_english": "Denmark", - "latitude": 56.26392, - "longitude": 9.501785 - }, - "DM": { - "name_english": "Dominica", - "latitude": 15.414999, - "longitude": -61.370976 - }, - "DO": { - "name_english": "Dominican Republic", - "latitude": 18.735693, - "longitude": -70.162651 - }, - "DZ": { - "name_english": "Algeria", - "latitude": 28.033886, - "longitude": 1.659626 - }, - "EC": { - "name_english": "Ecuador", - "latitude": -1.831239, - "longitude": -78.183406 - }, - "EE": { - "name_english": "Estonia", - "latitude": 58.595272, - "longitude": 25.013607 - }, - "EG": { - "name_english": "Egypt", - "latitude": 26.820553, - "longitude": 30.802498 - }, - "EH": { - "name_english": "Western Sahara", - "latitude": 24.215527, - "longitude": -12.885834 - }, - "ER": { - "name_english": "Eritrea", - "latitude": 15.179384, - "longitude": 39.782334 - }, - "ES": { - "name_english": "Spain", - "latitude": 40.463667, - "longitude": -3.74922 - }, - "ET": { - "name_english": "Ethiopia", - "latitude": 9.145, - "longitude": 40.489673 - }, - "FI": { - "name_english": "Finland", - "latitude": 61.92411, - "longitude": 25.748151 - }, - "FJ": { - "name_english": "Fiji", - "latitude": -16.578193, - "longitude": 179.414413 - }, - "FK": { - "name_english": "Falkland Islands [Islas Malvinas]", - "latitude": -51.796253, - "longitude": -59.523613 - }, - "FM": { - "name_english": "Micronesia", - "latitude": 7.425554, - "longitude": 150.550812 - }, - "FO": { - "name_english": "Faroe Islands", - "latitude": 61.892635, - "longitude": -6.911806 - }, - "FR": { - "name_english": "France", - "latitude": 46.227638, - "longitude": 2.213749 - }, - "GA": { - "name_english": "Gabon", - "latitude": -0.803689, - "longitude": 11.609444 - }, - "GB": { - "name_english": "United Kingdom", - "latitude": 55.378051, - "longitude": -3.435973 - }, - "GD": { - "name_english": "Grenada", - "latitude": 12.262776, - "longitude": -61.604171 - }, - "GE": { - "name_english": "Georgia", - "latitude": 42.315407, - "longitude": 43.356892 - }, - "GF": { - "name_english": "French Guiana", - "latitude": 3.933889, - "longitude": -53.125782 - }, - "GG": { - "name_english": "Guernsey", - "latitude": 49.465691, - "longitude": -2.585278 - }, - "GH": { - "name_english": "Ghana", - "latitude": 7.946527, - "longitude": -1.023194 - }, - "GI": { - "name_english": "Gibraltar", - "latitude": 36.137741, - "longitude": -5.345374 - }, - "GL": { - "name_english": "Greenland", - "latitude": 71.706936, - "longitude": -42.604303 - }, - "GM": { - "name_english": "Gambia", - "latitude": 13.443182, - "longitude": -15.310139 - }, - "GN": { - "name_english": "Guinea", - "latitude": 9.945587, - "longitude": -9.696645 - }, - "GP": { - "name_english": "Guadeloupe", - "latitude": 16.995971, - "longitude": -62.067641 - }, - "GQ": { - "name_english": "Equatorial Guinea", - "latitude": 1.650801, - "longitude": 10.267895 - }, - "GR": { - "name_english": "Greece", - "latitude": 39.074208, - "longitude": 21.824312 - }, - "GS": { - "name_english": "South Georgia and the South Sandwich Islands", - "latitude": -54.429579, - "longitude": -36.587909 - }, - "GT": { - "name_english": "Guatemala", - "latitude": 15.783471, - "longitude": -90.230759 - }, - "GU": { - "name_english": "Guam", - "latitude": 13.444304, - "longitude": 144.793731 - }, - "GW": { - "name_english": "Guinea-Bissau", - "latitude": 11.803749, - "longitude": -15.180413 - }, - "GY": { - "name_english": "Guyana", - "latitude": 4.860416, - "longitude": -58.93018 - }, - "GZ": { - "name_english": "Gaza Strip", - "latitude": 31.354676, - "longitude": 34.308825 - }, - "HK": { - "name_english": "Hong Kong", - "latitude": 22.396428, - "longitude": 114.109497 - }, - "HM": { - "name_english": "Heard Island and McDonald Islands", - "latitude": -53.08181, - "longitude": 73.504158 - }, - "HN": { - "name_english": "Honduras", - "latitude": 15.199999, - "longitude": -86.241905 - }, - "HR": { - "name_english": "Croatia", - "latitude": 45.1, - "longitude": 15.2 - }, - "HT": { - "name_english": "Haiti", - "latitude": 18.971187, - "longitude": -72.285215 - }, - "HU": { - "name_english": "Hungary", - "latitude": 47.162494, - "longitude": 19.503304 - }, - "ID": { - "name_english": "Indonesia", - "latitude": -0.789275, - "longitude": 113.921327 - }, - "IE": { - "name_english": "Ireland", - "latitude": 53.41291, - "longitude": -8.24389 - }, - "IL": { - "name_english": "Israel", - "latitude": 31.046051, - "longitude": 34.851612 - }, - "IM": { - "name_english": "Isle of Man", - "latitude": 54.236107, - "longitude": -4.548056 - }, - "IN": { - "name_english": "India", - "latitude": 20.593684, - "longitude": 78.96288 - }, - "IO": { - "name_english": "British Indian Ocean Territory", - "latitude": -6.343194, - "longitude": 71.876519 - }, - "IQ": { - "name_english": "Iraq", - "latitude": 33.223191, - "longitude": 43.679291 - }, - "IR": { - "name_english": "Iran", - "latitude": 32.427908, - "longitude": 53.688046 - }, - "IS": { - "name_english": "Iceland", - "latitude": 64.963051, - "longitude": -19.020835 - }, - "IT": { - "name_english": "Italy", - "latitude": 41.87194, - "longitude": 12.56738 - }, - "JE": { - "name_english": "Jersey", - "latitude": 49.214439, - "longitude": -2.13125 - }, - "JM": { - "name_english": "Jamaica", - "latitude": 18.109581, - "longitude": -77.297508 - }, - "JO": { - "name_english": "Jordan", - "latitude": 30.585164, - "longitude": 36.238414 - }, - "JP": { - "name_english": "Japan", - "latitude": 36.204824, - "longitude": 138.252924 - }, - "KE": { - "name_english": "Kenya", - "latitude": -0.023559, - "longitude": 37.906193 - }, - "KG": { - "name_english": "Kyrgyzstan", - "latitude": 41.20438, - "longitude": 74.766098 - }, - "KH": { - "name_english": "Cambodia", - "latitude": 12.565679, - "longitude": 104.990963 - }, - "KI": { - "name_english": "Kiribati", - "latitude": -3.370417, - "longitude": -168.734039 - }, - "KM": { - "name_english": "Comoros", - "latitude": -11.875001, - "longitude": 43.872219 - }, - "KN": { - "name_english": "Saint Kitts and Nevis", - "latitude": 17.357822, - "longitude": -62.782998 - }, - "KP": { - "name_english": "North Korea", - "latitude": 40.339852, - "longitude": 127.510093 - }, - "KR": { - "name_english": "South Korea", - "latitude": 35.907757, - "longitude": 127.766922 - }, - "KW": { - "name_english": "Kuwait", - "latitude": 29.31166, - "longitude": 47.481766 - }, - "KY": { - "name_english": "Cayman Islands", - "latitude": 19.513469, - "longitude": -80.566956 - }, - "KZ": { - "name_english": "Kazakhstan", - "latitude": 48.019573, - "longitude": 66.923684 - }, - "LA": { - "name_english": "Laos", - "latitude": 19.85627, - "longitude": 102.495496 - }, - "LB": { - "name_english": "Lebanon", - "latitude": 33.854721, - "longitude": 35.862285 - }, - "LC": { - "name_english": "Saint Lucia", - "latitude": 13.909444, - "longitude": -60.978893 - }, - "LI": { - "name_english": "Liechtenstein", - "latitude": 47.166, - "longitude": 9.555373 - }, - "LK": { - "name_english": "Sri Lanka", - "latitude": 7.873054, - "longitude": 80.771797 - }, - "LR": { - "name_english": "Liberia", - "latitude": 6.428055, - "longitude": -9.429499 - }, - "LS": { - "name_english": "Lesotho", - "latitude": -29.609988, - "longitude": 28.233608 - }, - "LT": { - "name_english": "Lithuania", - "latitude": 55.169438, - "longitude": 23.881275 - }, - "LU": { - "name_english": "Luxembourg", - "latitude": 49.815273, - "longitude": 6.129583 - }, - "LV": { - "name_english": "Latvia", - "latitude": 56.879635, - "longitude": 24.603189 - }, - "LY": { - "name_english": "Libya", - "latitude": 26.3351, - "longitude": 17.228331 - }, - "MA": { - "name_english": "Morocco", - "latitude": 31.791702, - "longitude": -7.09262 - }, - "MC": { - "name_english": "Monaco", - "latitude": 43.750298, - "longitude": 7.412841 - }, - "MD": { - "name_english": "Moldova", - "latitude": 47.411631, - "longitude": 28.369885 - }, - "ME": { - "name_english": "Montenegro", - "latitude": 42.708678, - "longitude": 19.37439 - }, - "MG": { - "name_english": "Madagascar", - "latitude": -18.766947, - "longitude": 46.869107 - }, - "MH": { - "name_english": "Marshall Islands", - "latitude": 7.131474, - "longitude": 171.184478 - }, - "MK": { - "name_english": "Macedonia [FYROM]", - "latitude": 41.608635, - "longitude": 21.745275 - }, - "ML": { - "name_english": "Mali", - "latitude": 17.570692, - "longitude": -3.996166 - }, - "MM": { - "name_english": "Myanmar [Burma]", - "latitude": 21.913965, - "longitude": 95.956223 - }, - "MN": { - "name_english": "Mongolia", - "latitude": 46.862496, - "longitude": 103.846656 - }, - "MO": { - "name_english": "Macau", - "latitude": 22.198745, - "longitude": 113.543873 - }, - "MP": { - "name_english": "Northern Mariana Islands", - "latitude": 17.33083, - "longitude": 145.38469 - }, - "MQ": { - "name_english": "Martinique", - "latitude": 14.641528, - "longitude": -61.024174 - }, - "MR": { - "name_english": "Mauritania", - "latitude": 21.00789, - "longitude": -10.940835 - }, - "MS": { - "name_english": "Montserrat", - "latitude": 16.742498, - "longitude": -62.187366 - }, - "MT": { - "name_english": "Malta", - "latitude": 35.937496, - "longitude": 14.375416 - }, - "MU": { - "name_english": "Mauritius", - "latitude": -20.348404, - "longitude": 57.552152 - }, - "MV": { - "name_english": "Maldives", - "latitude": 3.202778, - "longitude": 73.22068 - }, - "MW": { - "name_english": "Malawi", - "latitude": -13.254308, - "longitude": 34.301525 - }, - "MX": { - "name_english": "Mexico", - "latitude": 23.634501, - "longitude": -102.552784 - }, - "MY": { - "name_english": "Malaysia", - "latitude": 4.210484, - "longitude": 101.975766 - }, - "MZ": { - "name_english": "Mozambique", - "latitude": -18.665695, - "longitude": 35.529562 - }, - "NaN": { - "name_english": "Namibia", - "latitude": -22.95764, - "longitude": 18.49041 - }, - "NC": { - "name_english": "New Caledonia", - "latitude": -20.904305, - "longitude": 165.618042 - }, - "NE": { - "name_english": "Niger", - "latitude": 17.607789, - "longitude": 8.081666 - }, - "NF": { - "name_english": "Norfolk Island", - "latitude": -29.040835, - "longitude": 167.954712 - }, - "NG": { - "name_english": "Nigeria", - "latitude": 9.081999, - "longitude": 8.675277 - }, - "NI": { - "name_english": "Nicaragua", - "latitude": 12.865416, - "longitude": -85.207229 - }, - "NL": { - "name_english": "Netherlands", - "latitude": 52.132633, - "longitude": 5.291266 - }, - "NO": { - "name_english": "Norway", - "latitude": 60.472024, - "longitude": 8.468946 - }, - "NP": { - "name_english": "Nepal", - "latitude": 28.394857, - "longitude": 84.124008 - }, - "NR": { - "name_english": "Nauru", - "latitude": -0.522778, - "longitude": 166.931503 - }, - "NU": { - "name_english": "Niue", - "latitude": -19.054445, - "longitude": -169.867233 - }, - "NZ": { - "name_english": "New Zealand", - "latitude": -40.900557, - "longitude": 174.885971 - }, - "OM": { - "name_english": "Oman", - "latitude": 21.512583, - "longitude": 55.923255 - }, - "PA": { - "name_english": "Panama", - "latitude": 8.537981, - "longitude": -80.782127 - }, - "PE": { - "name_english": "Peru", - "latitude": -9.189967, - "longitude": -75.015152 - }, - "PF": { - "name_english": "French Polynesia", - "latitude": -17.679742, - "longitude": -149.406843 - }, - "PG": { - "name_english": "Papua New Guinea", - "latitude": -6.314993, - "longitude": 143.95555 - }, - "PH": { - "name_english": "Philippines", - "latitude": 12.879721, - "longitude": 121.774017 - }, - "PK": { - "name_english": "Pakistan", - "latitude": 30.375321, - "longitude": 69.345116 - }, - "PL": { - "name_english": "Poland", - "latitude": 51.919438, - "longitude": 19.145136 - }, - "PM": { - "name_english": "Saint Pierre and Miquelon", - "latitude": 46.941936, - "longitude": -56.27111 - }, - "PN": { - "name_english": "Pitcairn Islands", - "latitude": -24.703615, - "longitude": -127.439308 - }, - "PR": { - "name_english": "Puerto Rico", - "latitude": 18.220833, - "longitude": -66.590149 - }, - "PS": { - "name_english": "Palestinian Territories", - "latitude": 31.952162, - "longitude": 35.233154 - }, - "PT": { - "name_english": "Portugal", - "latitude": 39.399872, - "longitude": -8.224454 - }, - "PW": { - "name_english": "Palau", - "latitude": 7.51498, - "longitude": 134.58252 - }, - "PY": { - "name_english": "Paraguay", - "latitude": -23.442503, - "longitude": -58.443832 - }, - "QA": { - "name_english": "Qatar", - "latitude": 25.354826, - "longitude": 51.183884 - }, - "RE": { - "name_english": "Réunion", - "latitude": -21.115141, - "longitude": 55.536384 - }, - "RO": { - "name_english": "Romania", - "latitude": 45.943161, - "longitude": 24.96676 - }, - "RS": { - "name_english": "Serbia", - "latitude": 44.016521, - "longitude": 21.005859 - }, - "RU": { - "name_english": "Russia", - "latitude": 61.52401, - "longitude": 105.318756 - }, - "RW": { - "name_english": "Rwanda", - "latitude": -1.940278, - "longitude": 29.873888 - }, - "SA": { - "name_english": "Saudi Arabia", - "latitude": 23.885942, - "longitude": 45.079162 - }, - "SB": { - "name_english": "Solomon Islands", - "latitude": -9.64571, - "longitude": 160.156194 - }, - "SC": { - "name_english": "Seychelles", - "latitude": -4.679574, - "longitude": 55.491977 - }, - "SD": { - "name_english": "Sudan", - "latitude": 12.862807, - "longitude": 30.217636 - }, - "SE": { - "name_english": "Sweden", - "latitude": 60.128161, - "longitude": 18.643501 - }, - "SG": { - "name_english": "Singapore", - "latitude": 1.352083, - "longitude": 103.819836 - }, - "SH": { - "name_english": "Saint Helena", - "latitude": -24.143474, - "longitude": -10.030696 - }, - "SI": { - "name_english": "Slovenia", - "latitude": 46.151241, - "longitude": 14.995463 - }, - "SJ": { - "name_english": "Svalbard and Jan Mayen", - "latitude": 77.553604, - "longitude": 23.670272 - }, - "SK": { - "name_english": "Slovakia", - "latitude": 48.669026, - "longitude": 19.699024 - }, - "SL": { - "name_english": "Sierra Leone", - "latitude": 8.460555, - "longitude": -11.779889 - }, - "SM": { - "name_english": "San Marino", - "latitude": 43.94236, - "longitude": 12.457777 - }, - "SN": { - "name_english": "Senegal", - "latitude": 14.497401, - "longitude": -14.452362 - }, - "SO": { - "name_english": "Somalia", - "latitude": 5.152149, - "longitude": 46.199616 - }, - "SR": { - "name_english": "Suriname", - "latitude": 3.919305, - "longitude": -56.027783 - }, - "ST": { - "name_english": "São Tomé and Príncipe", - "latitude": 0.18636, - "longitude": 6.613081 - }, - "SV": { - "name_english": "El Salvador", - "latitude": 13.794185, - "longitude": -88.89653 - }, - "SY": { - "name_english": "Syria", - "latitude": 34.802075, - "longitude": 38.996815 - }, - "SZ": { - "name_english": "Swaziland", - "latitude": -26.522503, - "longitude": 31.465866 - }, - "TC": { - "name_english": "Turks and Caicos Islands", - "latitude": 21.694025, - "longitude": -71.797928 - }, - "TD": { - "name_english": "Chad", - "latitude": 15.454166, - "longitude": 18.732207 - }, - "TF": { - "name_english": "French Southern Territories", - "latitude": -49.280366, - "longitude": 69.348557 - }, - "TG": { - "name_english": "Togo", - "latitude": 8.619543, - "longitude": 0.824782 - }, - "TH": { - "name_english": "Thailand", - "latitude": 15.870032, - "longitude": 100.992541 - }, - "TJ": { - "name_english": "Tajikistan", - "latitude": 38.861034, - "longitude": 71.276093 - }, - "TK": { - "name_english": "Tokelau", - "latitude": -8.967363, - "longitude": -171.855881 - }, - "TL": { - "name_english": "Timor-Leste", - "latitude": -8.874217, - "longitude": 125.727539 - }, - "TM": { - "name_english": "Turkmenistan", - "latitude": 38.969719, - "longitude": 59.556278 - }, - "TN": { - "name_english": "Tunisia", - "latitude": 33.886917, - "longitude": 9.537499 - }, - "TO": { - "name_english": "Tonga", - "latitude": -21.178986, - "longitude": -175.198242 - }, - "TR": { - "name_english": "Turkey", - "latitude": 38.963745, - "longitude": 35.243322 - }, - "TT": { - "name_english": "Trinidad and Tobago", - "latitude": 10.691803, - "longitude": -61.222503 - }, - "TV": { - "name_english": "Tuvalu", - "latitude": -7.109535, - "longitude": 177.64933 - }, - "TW": { - "name_english": "Taiwan", - "latitude": 23.69781, - "longitude": 120.960515 - }, - "TZ": { - "name_english": "Tanzania", - "latitude": -6.369028, - "longitude": 34.888822 - }, - "UA": { - "name_english": "Ukraine", - "latitude": 48.379433, - "longitude": 31.16558 - }, - "UG": { - "name_english": "Uganda", - "latitude": 1.373333, - "longitude": 32.290275 - }, - "UM": { - "name_english": "U.S. Minor Outlying Islands", - "latitude": NaN, - "longitude": NaN - }, - "US": { - "name_english": "United States", - "latitude": 37.09024, - "longitude": -95.712891 - }, - "UY": { - "name_english": "Uruguay", - "latitude": -32.522779, - "longitude": -55.765835 - }, - "UZ": { - "name_english": "Uzbekistan", - "latitude": 41.377491, - "longitude": 64.585262 - }, - "VA": { - "name_english": "Vatican City", - "latitude": 41.902916, - "longitude": 12.453389 - }, - "VC": { - "name_english": "Saint Vincent and the Grenadines", - "latitude": 12.984305, - "longitude": -61.287228 - }, - "VE": { - "name_english": "Venezuela", - "latitude": 6.42375, - "longitude": -66.58973 - }, - "VG": { - "name_english": "British Virgin Islands", - "latitude": 18.420695, - "longitude": -64.639968 - }, - "VI": { - "name_english": "U.S. Virgin Islands", - "latitude": 18.335765, - "longitude": -64.896335 - }, - "VN": { - "name_english": "Vietnam", - "latitude": 14.058324, - "longitude": 108.277199 - }, - "VU": { - "name_english": "Vanuatu", - "latitude": -15.376706, - "longitude": 166.959158 - }, - "WF": { - "name_english": "Wallis and Futuna", - "latitude": -13.768752, - "longitude": -177.156097 - }, - "WS": { - "name_english": "Samoa", - "latitude": -13.759029, - "longitude": -172.104629 - }, - "XK": { - "name_english": "Kosovo", - "latitude": 42.602636, - "longitude": 20.902977 - }, - "YE": { - "name_english": "Yemen", - "latitude": 15.552727, - "longitude": 48.516388 - }, - "YT": { - "name_english": "Mayotte", - "latitude": -12.8275, - "longitude": 45.166244 - }, - "ZA": { - "name_english": "South Africa", - "latitude": -30.559482, - "longitude": 22.937506 - }, - "ZM": { - "name_english": "Zambia", - "latitude": -13.133897, - "longitude": 27.849332 - }, - "ZW": { - "name_english": "Zimbabwe", - "latitude": -19.015438, - "longitude": 29.154857 - } - }, - "province_lat_long": { - "Ciudad Autónoma de Buenos Aires": { - "latitude": -34.61448692, - "longitude": -58.44590845 - }, - "Neuquén": { - "latitude": -38.64169774, - "longitude": -70.11876961 - }, - "San Luis": { - "latitude": -33.75772574, - "longitude": -66.02812982 - }, - "Santa Fe": { - "latitude": -30.7070661, - "longitude": -60.94991396 - }, - "La Rioja": { - "latitude": -29.6857763, - "longitude": -67.18173597 - }, - "Catamarca": { - "latitude": -27.33589277, - "longitude": -66.94768934 - }, - "Tucumán": { - "latitude": -26.94806025, - "longitude": -65.36485177 - }, - "Chaco": { - "latitude": -26.38643104, - "longitude": -60.76582969 - }, - "Formosa": { - "latitude": -24.89494807, - "longitude": -59.93245743 - }, - "Santa Cruz": { - "latitude": -48.81547371, - "longitude": -69.95596754 - }, - "Chubut": { - "latitude": -43.7885142, - "longitude": -68.52699392 - }, - "Mendoza": { - "latitude": -34.62997937, - "longitude": -68.5831277 - }, - "Córdoba": { - "latitude": -32.14291978, - "longitude": -63.80186077 - }, - "Entre Ríos": { - "latitude": -32.05912618, - "longitude": -59.20114936 - }, - "San Juan": { - "latitude": -30.86536801, - "longitude": -68.88949084 - }, - "Jujuy": { - "latitude": -23.31999025, - "longitude": -65.76432926 - }, - "Santiago del Estero": { - "latitude": -27.78241591, - "longitude": -63.2523834 - }, - "Río Negro": { - "latitude": -40.40577072, - "longitude": -67.22939812 - }, - "Buenos Aires": { - "latitude": -36.67373207, - "longitude": -60.55722017 - }, - "Corrientes": { - "latitude": -28.77991795, - "longitude": -57.80480706 - }, - "Misiones": { - "latitude": -26.87540564, - "longitude": -54.65167998 - }, - "Salta": { - "latitude": -24.29927454, - "longitude": -64.81450471 - }, - "La Pampa": { - "latitude": -37.13155377, - "longitude": -65.4466547 - }, - "Tierra del Fuego, Antártida e Islas del Atlántico Sur": { - "latitude": -85.18646388, - "longitude": -47.39471187 - } - }, - "department_lat_long": { - "General Lavalle": { - "latitude": -36.65075038, - "longitude": -56.94100299 - }, - "La Costa": { - "latitude": -36.69716782, - "longitude": -56.71594028 - }, - "Magdalena": { - "latitude": -35.18510307, - "longitude": -57.68612798 - }, - "Vicente López": { - "latitude": -34.52653142, - "longitude": -58.50448651 - }, - "San Justo": { - "latitude": -31.24269105, - "longitude": -62.52725629 - }, - "Comuna 14": { - "latitude": -34.57387474, - "longitude": -58.42229408 - }, - "Cerrillos": { - "latitude": -24.98854394, - "longitude": -65.40381611 - }, - "Susques": { - "latitude": -23.52067099, - "longitude": -66.66171189 - }, - "Marcos Paz": { - "latitude": -34.81400296, - "longitude": -58.8478312 - }, - "Concordia": { - "latitude": -31.29029837, - "longitude": -58.23786969 - }, - "Federal": { - "latitude": -30.99242678, - "longitude": -58.89186005 - }, - "Gualeguaychú": { - "latitude": -33.02234924, - "longitude": -58.78579049 - }, - "Islas del Ibicuy": { - "latitude": -33.62412882, - "longitude": -58.93515806 - }, - "Victoria": { - "latitude": -32.78394246, - "longitude": -60.21807003 - }, - "Diamante": { - "latitude": -32.2280402, - "longitude": -60.52393371 - }, - "Uruguay": { - "latitude": -32.44996669, - "longitude": -58.58226614 - }, - "Paraná": { - "latitude": -31.6952294, - "longitude": -60.0411742 - }, - "Saladillo": { - "latitude": -35.67680645, - "longitude": -59.70266074 - }, - "Las Flores": { - "latitude": -36.01582666, - "longitude": -59.17646095 - }, - "Rojas": { - "latitude": -34.19281739, - "longitude": -60.78802346 - }, - "Escobar": { - "latitude": -34.32868283, - "longitude": -58.77117861 - }, - "José C. Paz": { - "latitude": -34.51185316, - "longitude": -58.7776346 - }, - "San Antonio de Areco": { - "latitude": -34.22075757, - "longitude": -59.51944348 - }, - "Maipú": { - "latitude": -36.88693321, - "longitude": -57.5861191 - }, - "Antártida Argentina": { - "latitude": -85.18646388, - "longitude": -47.39471187 - }, - "Iguazú": { - "latitude": -25.87473549, - "longitude": -54.40041859 - }, - "Ushuaia": { - "latitude": -54.76808027, - "longitude": -66.84699431 - }, - "General Ortiz de Ocampo": { - "latitude": -31.00664177, - "longitude": -66.05905483 - }, - "Corpen Aike": { - "latitude": -49.9474837, - "longitude": -69.44695072 - }, - "O'Higgins": { - "latitude": -27.25565377, - "longitude": -60.67997492 - }, - "Moreno": { - "latitude": -34.61068079, - "longitude": -58.81089851 - }, - "La Matanza": { - "latitude": -34.77034267, - "longitude": -58.62542798 - }, - "Tandil": { - "latitude": -37.33642932, - "longitude": -59.18198279 - }, - "Coronel Suárez": { - "latitude": -37.53485625, - "longitude": -61.88909224 - }, - "Adolfo Gonzales Chaves": { - "latitude": -37.96461591, - "longitude": -60.24828213 - }, - "Bahía Blanca": { - "latitude": -38.58156561, - "longitude": -62.1660766 - }, - "General Alvarado": { - "latitude": -38.20262771, - "longitude": -58.07180537 - }, - "General Pueyrredón": { - "latitude": -37.96568314, - "longitude": -57.74302835 - }, - "Mar Chiquita": { - "latitude": -37.4986406, - "longitude": -57.64326606 - }, - "Villa Gesell": { - "latitude": -37.36707196, - "longitude": -57.06339788 - }, - "Conesa": { - "latitude": -40.14871618, - "longitude": -64.30489265 - }, - "Pinamar": { - "latitude": -37.11107429, - "longitude": -56.87028341 - }, - "General Paz": { - "latitude": -35.46618301, - "longitude": -58.38965196 - }, - "General Guido": { - "latitude": -36.66603454, - "longitude": -57.9957366 - }, - "General Juan Madariaga": { - "latitude": -37.15351572, - "longitude": -57.2306606 - }, - "Alberdi": { - "latitude": -26.52105131, - "longitude": -62.72747422 - }, - "Juan Felipe Ibarra": { - "latitude": -28.03949631, - "longitude": -62.54401375 - }, - "General Taboada": { - "latitude": -28.56828474, - "longitude": -62.33882585 - }, - "Cruz del Eje": { - "latitude": -30.65701812, - "longitude": -65.07771603 - }, - "Punilla": { - "latitude": -31.21875828, - "longitude": -64.58587222 - }, - "Santa María": { - "latitude": -31.70971231, - "longitude": -64.30590216 - }, - "Gaiman": { - "latitude": -43.27251409, - "longitude": -66.17207058 - }, - "Rawson": { - "latitude": -43.13732926, - "longitude": -65.07571706 - }, - "Rivadavia": { - "latitude": -30.02056338, - "longitude": -62.28045304 - }, - "Ojo de Agua": { - "latitude": -29.30409006, - "longitude": -64.01499327 - }, - "Choya": { - "latitude": -28.75363359, - "longitude": -64.76389962 - }, - "Gobernador Dupuy": { - "latitude": -35.36908708, - "longitude": -65.81481938 - }, - "Cachi": { - "latitude": -25.03875579, - "longitude": -66.20262009 - }, - "Chicoana": { - "latitude": -25.15144133, - "longitude": -65.60633276 - }, - "La Viña": { - "latitude": -25.44717867, - "longitude": -65.58058314 - }, - "Rauch": { - "latitude": -36.57219445, - "longitude": -58.94414137 - }, - "Metán": { - "latitude": -25.42516745, - "longitude": -64.58814082 - }, - "Molinos": { - "latitude": -25.56436428, - "longitude": -66.45490599 - }, - "Minas": { - "latitude": -31.03519016, - "longitude": -65.41200432 - }, - "San Alberto": { - "latitude": -31.70802959, - "longitude": -65.15656016 - }, - "Río Segundo": { - "latitude": -31.73310879, - "longitude": -63.47485552 - }, - "Salliqueló": { - "latitude": -36.67177754, - "longitude": -63.04797353 - }, - "Berazategui": { - "latitude": -34.81824477, - "longitude": -58.15546151 - }, - "General Güemes": { - "latitude": -24.76459748, - "longitude": -64.95606022 - }, - "San Carlos": { - "latitude": -25.82908924, - "longitude": -66.17447837 - }, - "Santa Rosa": { - "latitude": -33.61699891, - "longitude": -67.96385611 - }, - "Unión": { - "latitude": -32.87838166, - "longitude": -62.79159706 - }, - "Tornquist": { - "latitude": -38.25775158, - "longitude": -62.29066476 - }, - "La Paz": { - "latitude": -33.70118911, - "longitude": -67.2498855 - }, - "Coronel Pringles": { - "latitude": -38.14791727, - "longitude": -61.26441745 - }, - "Tigre": { - "latitude": -34.3827776, - "longitude": -58.60388624 - }, - "Chamical": { - "latitude": -30.16770653, - "longitude": -65.95628695 - }, - "Tercero Arriba": { - "latitude": -32.28768002, - "longitude": -63.7790049 - }, - "General Pinto": { - "latitude": -34.66852315, - "longitude": -62.03987934 - }, - "San Cayetano": { - "latitude": -38.3890732, - "longitude": -59.58632644 - }, - "Tres Arroyos": { - "latitude": -38.51181428, - "longitude": -60.23741732 - }, - "Coronel Dorrego": { - "latitude": -38.67081761, - "longitude": -61.09555057 - }, - "Necochea": { - "latitude": -38.255411, - "longitude": -59.16738695 - }, - "Independencia": { - "latitude": -30.11446125, - "longitude": -67.33552022 - }, - "General Lamadrid": { - "latitude": -28.79043536, - "longitude": -68.69775473 - }, - "Ayacucho": { - "latitude": -32.16565656, - "longitude": -66.54225098 - }, - "Tapalqué": { - "latitude": -36.34714364, - "longitude": -60.13106503 - }, - "Arauco": { - "latitude": -28.53307353, - "longitude": -66.7191515 - }, - "Lezama": { - "latitude": -35.84920839, - "longitude": -57.89484439 - }, - "Chascomús": { - "latitude": -35.61868831, - "longitude": -57.90398107 - }, - "Punta Indio": { - "latitude": -35.42605588, - "longitude": -57.39923404 - }, - "El Carmen": { - "latitude": -24.44753764, - "longitude": -65.10129753 - }, - "Campana": { - "latitude": -34.13838712, - "longitude": -58.88295716 - }, - "Magallanes": { - "latitude": -48.83822803, - "longitude": -68.46838892 - }, - "Comuna 6": { - "latitude": -34.61684339, - "longitude": -58.44356823 - }, - "12 de Octubre": { - "latitude": -27.33369034, - "longitude": -61.47494578 - }, - "Tulumba": { - "latitude": -30.21887163, - "longitude": -63.82952409 - }, - "Río Cuarto": { - "latitude": -33.33108084, - "longitude": -64.49428791 - }, - "Tupungato": { - "latitude": -33.29340099, - "longitude": -69.2962859 - }, - "Pilagás": { - "latitude": -25.10537731, - "longitude": -58.66162775 - }, - "Laishi": { - "latitude": -26.46758532, - "longitude": -58.56543521 - }, - "Pirané": { - "latitude": -25.76728934, - "longitude": -59.15925735 - }, - "Valcheta": { - "latitude": -40.97458106, - "longitude": -66.3108866 - }, - "San Antonio": { - "latitude": -40.95280203, - "longitude": -65.37127724 - }, - "9 de Julio": { - "latitude": -40.92563673, - "longitude": -67.45749059 - }, - "Ñorquinco": { - "latitude": -41.73982574, - "longitude": -70.40111395 - }, - "25 de Mayo": { - "latitude": -41.13308231, - "longitude": -68.90631545 - }, - "Villarino": { - "latitude": -39.13064649, - "longitude": -62.74572384 - }, - "Vera": { - "latitude": -28.97001144, - "longitude": -60.41351578 - }, - "Telsen": { - "latitude": -42.4389444, - "longitude": -67.17690769 - }, - "Pilcaniyeu": { - "latitude": -40.88755236, - "longitude": -70.46271054 - }, - "Adolfo Alsina": { - "latitude": -37.19676037, - "longitude": -63.05605658 - }, - "Capital": { - "latitude": -31.41675688, - "longitude": -64.18358377 - }, - "Pellegrini": { - "latitude": -36.27118963, - "longitude": -63.2257573 - }, - "General Roca": { - "latitude": -34.61707448, - "longitude": -64.37875981 - }, - "General Alvear": { - "latitude": -35.21873259, - "longitude": -67.08087466 - }, - "La Caldera": { - "latitude": -24.56239958, - "longitude": -65.42909945 - }, - "San Rafael": { - "latitude": -34.94591144, - "longitude": -68.38410496 - }, - "Anta": { - "latitude": -24.87517533, - "longitude": -63.84001552 - }, - "Picún Leufú": { - "latitude": -39.40396522, - "longitude": -69.42719072 - }, - "Zapala": { - "latitude": -38.92204416, - "longitude": -69.82220743 - }, - "Aluminé": { - "latitude": -39.13148635, - "longitude": -71.04631796 - }, - "Sarmiento": { - "latitude": -45.34502353, - "longitude": -69.00283536 - }, - "Antofagasta de la Sierra": { - "latitude": -25.94564878, - "longitude": -67.67783582 - }, - "Tunuyán": { - "latitude": -33.6228877, - "longitude": -69.50929657 - }, - "Luján de Cuyo": { - "latitude": -33.03849464, - "longitude": -69.45168406 - }, - "Puán": { - "latitude": -38.07604175, - "longitude": -63.05741161 - }, - "Presidente Roque Sáenz Peña": { - "latitude": -34.14010636, - "longitude": -63.41877052 - }, - "Comuna 1": { - "latitude": -34.60644332, - "longitude": -58.37151215 - }, - "Comuna 4": { - "latitude": -34.64211258, - "longitude": -58.38756086 - }, - "General Belgrano": { - "latitude": -30.57769165, - "longitude": -65.93163105 - }, - "Futaleufú": { - "latitude": -43.07059712, - "longitude": -71.45546537 - }, - "Tapenagá": { - "latitude": -27.6588485, - "longitude": -59.82781094 - }, - "Comuna 5": { - "latitude": -34.61736992, - "longitude": -58.42057219 - }, - "Chapaleufú": { - "latitude": -35.22724287, - "longitude": -63.66091211 - }, - "General Villegas": { - "latitude": -34.76871192, - "longitude": -62.95376491 - }, - "Comuna 12": { - "latitude": -34.56622761, - "longitude": -58.49042804 - }, - "Fray Mamerto Esquiú": { - "latitude": -28.33294295, - "longitude": -65.73090093 - }, - "Cushamen": { - "latitude": -42.366391, - "longitude": -70.71203082 - }, - "Lácar": { - "latitude": -40.31422309, - "longitude": -71.18426396 - }, - "Hucal": { - "latitude": -37.97923404, - "longitude": -63.95448276 - }, - "Río Chico": { - "latitude": -48.28732902, - "longitude": -71.1138375 - }, - "Lago Argentino": { - "latitude": -49.83648814, - "longitude": -72.06547133 - }, - "El Cuy": { - "latitude": -39.70035947, - "longitude": -68.48279044 - }, - "Comuna 7": { - "latitude": -34.63655441, - "longitude": -58.45188686 - }, - "Iruya": { - "latitude": -22.81534528, - "longitude": -64.92051413 - }, - "Quitilipi": { - "latitude": -26.66631852, - "longitude": -60.17297428 - }, - "Los Lagos": { - "latitude": -40.77435037, - "longitude": -71.48672325 - }, - "Comuna 10": { - "latitude": -34.62785179, - "longitude": -58.50281785 - }, - "Ñorquín": { - "latitude": -37.63787989, - "longitude": -70.67777641 - }, - "Realicó": { - "latitude": -35.22579174, - "longitude": -64.21022693 - }, - "Las Heras": { - "latitude": -32.52580338, - "longitude": -69.26699979 - }, - "Lavalle": { - "latitude": -32.57529125, - "longitude": -67.89690164 - }, - "Comuna 11": { - "latitude": -34.60613701, - "longitude": -58.49674201 - }, - "Caleu Caleu": { - "latitude": -38.67558326, - "longitude": -63.89681799 - }, - "Lihuel Calel": { - "latitude": -38.26165538, - "longitude": -65.0966304 - }, - "Curacó": { - "latitude": -38.17973755, - "longitude": -66.33013347 - }, - "Belén": { - "latitude": -27.10015885, - "longitude": -66.92237823 - }, - "Confluencia": { - "latitude": -38.83216778, - "longitude": -68.79408518 - }, - "Picunches": { - "latitude": -38.57426979, - "longitude": -70.37293477 - }, - "Añelo": { - "latitude": -38.09877533, - "longitude": -69.01232276 - }, - "Loncopué": { - "latitude": -38.06590543, - "longitude": -70.31405684 - }, - "San Martín": { - "latitude": -28.18776128, - "longitude": -63.85411458 - }, - "Yavi": { - "latitude": -22.29064524, - "longitude": -65.56673919 - }, - "Santa Catalina": { - "latitude": -22.13764069, - "longitude": -66.22726138 - }, - "San Pedro": { - "latitude": -24.29850888, - "longitude": -64.81099028 - }, - "Valle Grande": { - "latitude": -23.46661384, - "longitude": -65.01201928 - }, - "Patiño": { - "latitude": -24.87505855, - "longitude": -59.95853733 - }, - "Bermejo": { - "latitude": -24.02552565, - "longitude": -61.28278288 - }, - "Matacos": { - "latitude": -23.85485708, - "longitude": -62.07689066 - }, - "Los Andes": { - "latitude": -24.6426249, - "longitude": -67.34409572 - }, - "Orán": { - "latitude": -23.49876843, - "longitude": -64.15087005 - }, - "Tilcara": { - "latitude": -23.56040152, - "longitude": -65.32001059 - }, - "Palpalá": { - "latitude": -24.19492252, - "longitude": -65.12644981 - }, - "Loventué": { - "latitude": -36.4787683, - "longitude": -65.53296941 - }, - "Eldorado": { - "latitude": -26.313845, - "longitude": -54.44073634 - }, - "Limay Mahuida": { - "latitude": -37.24190212, - "longitude": -66.55523269 - }, - "Puelén": { - "latitude": -37.43418079, - "longitude": -67.60496416 - }, - "Chalileo": { - "latitude": -36.39540951, - "longitude": -66.57275566 - }, - "Chical Co": { - "latitude": -36.39789947, - "longitude": -67.69539326 - }, - "Quebrachos": { - "latitude": -29.38230242, - "longitude": -63.35351277 - }, - "Monte Caseros": { - "latitude": -30.22895098, - "longitude": -57.87028656 - }, - "Esquina": { - "latitude": -29.98547458, - "longitude": -59.24142113 - }, - "Montecarlo": { - "latitude": -26.65790819, - "longitude": -54.56317745 - }, - "Presidencia de la Plaza": { - "latitude": -27.04462474, - "longitude": -59.77456404 - }, - "Pergamino": { - "latitude": -33.8360889, - "longitude": -60.5447827 - }, - "Sargento Cabral": { - "latitude": -26.7997133, - "longitude": -59.51910571 - }, - "Belgrano": { - "latitude": -32.73561154, - "longitude": -66.71500695 - }, - "Lago Buenos Aires": { - "latitude": -46.83410307, - "longitude": -70.63141001 - }, - "Malargüe": { - "latitude": -36.15863828, - "longitude": -69.31378359 - }, - "Pichi Mahuida": { - "latitude": -39.4076189, - "longitude": -64.40069015 - }, - "Río Senguer": { - "latitude": -45.34045625, - "longitude": -70.64007348 - }, - "Mayor Luis J. Fontana": { - "latitude": -27.74263898, - "longitude": -60.65719319 - }, - "Fray Justo Santa María de Oro": { - "latitude": -27.86534552, - "longitude": -61.30078351 - }, - "Las Colonias": { - "latitude": -31.3153379, - "longitude": -61.1094808 - }, - "San Cristóbal": { - "latitude": -30.22831914, - "longitude": -61.36001516 - }, - "San Javier": { - "latitude": -30.10414611, - "longitude": -59.89807047 - }, - "General Obligado": { - "latitude": -28.67197045, - "longitude": -59.5266517 - }, - "Maracó": { - "latitude": -35.67961776, - "longitude": -63.66248915 - }, - "Trenel": { - "latitude": -35.63187501, - "longitude": -64.21437663 - }, - "Copo": { - "latitude": -25.93925147, - "longitude": -62.7304992 - }, - "Ancasti": { - "latitude": -28.92666788, - "longitude": -65.50380878 - }, - "Pehuenches": { - "latitude": -37.39855847, - "longitude": -69.40211983 - }, - "Chos Malal": { - "latitude": -36.88026675, - "longitude": -70.28632751 - }, - "La Candelaria": { - "latitude": -26.0848734, - "longitude": -65.17602232 - }, - "Guasayán": { - "latitude": -27.97677103, - "longitude": -64.87115322 - }, - "Biedma": { - "latitude": -42.44367092, - "longitude": -64.93324812 - }, - "Río Hondo": { - "latitude": -27.48540567, - "longitude": -64.76018737 - }, - "Vinchina": { - "latitude": -28.31642038, - "longitude": -68.52539846 - }, - "Río Seco": { - "latitude": -30.04284068, - "longitude": -63.1974579 - }, - "Avellaneda": { - "latitude": -39.41023711, - "longitude": -66.20635744 - }, - "Comuna 2": { - "latitude": -34.58578888, - "longitude": -58.39490354 - }, - "Güer Aike": { - "latitude": -51.41344806, - "longitude": -70.56194316 - }, - "Comuna 13": { - "latitude": -34.5541263, - "longitude": -58.45400296 - }, - "Yerba Buena": { - "latitude": -26.78392447, - "longitude": -65.34117393 - }, - "Comuna 8": { - "latitude": -34.67456648, - "longitude": -58.46194805 - }, - "Pomán": { - "latitude": -28.23226322, - "longitude": -66.38929908 - }, - "Bariloche": { - "latitude": -41.49810496, - "longitude": -71.5310882 - }, - "Huiliches": { - "latitude": -39.79467768, - "longitude": -71.25900255 - }, - "Catán Lil": { - "latitude": -39.48079429, - "longitude": -70.43355933 - }, - "Silípica": { - "latitude": -28.18884866, - "longitude": -64.27326838 - }, - "Sobremonte": { - "latitude": -29.76547762, - "longitude": -64.14231517 - }, - "Río Grande": { - "latitude": -53.74629199, - "longitude": -68.13610465 - }, - "Banda": { - "latitude": -27.43470677, - "longitude": -64.20986581 - }, - "Paso de Indios": { - "latitude": -44.03018438, - "longitude": -68.68586284 - }, - "Mártires": { - "latitude": -43.81384795, - "longitude": -67.2399811 - }, - "Deseado": { - "latitude": -47.33044778, - "longitude": -68.02937145 - }, - "Languiñeo": { - "latitude": -43.32349188, - "longitude": -70.34840799 - }, - "Aguirre": { - "latitude": -29.29786827, - "longitude": -62.51534168 - }, - "Humahuaca": { - "latitude": -23.08200995, - "longitude": -65.40952266 - }, - "Almirante Brown": { - "latitude": -25.74412219, - "longitude": -61.96098861 - }, - "Rosario de la Frontera": { - "latitude": -25.8718801, - "longitude": -64.72790281 - }, - "Collón Curá": { - "latitude": -40.05291943, - "longitude": -70.28136678 - }, - "Comuna 3": { - "latitude": -34.61384308, - "longitude": -58.40265145 - }, - "Famaillá": { - "latitude": -26.97596898, - "longitude": -65.4789085 - }, - "General Donovan": { - "latitude": -27.13888999, - "longitude": -59.34678294 - }, - "Robles": { - "latitude": -27.85394407, - "longitude": -63.90750926 - }, - "Nogoyá": { - "latitude": -32.21871235, - "longitude": -59.76970192 - }, - "Tala": { - "latitude": -32.31741172, - "longitude": -59.26728649 - }, - "Loreto": { - "latitude": -28.62448044, - "longitude": -64.31072743 - }, - "Gualeguay": { - "latitude": -33.11990269, - "longitude": -59.60162349 - }, - "Federación": { - "latitude": -30.73489315, - "longitude": -58.15915412 - }, - "Feliciano": { - "latitude": -30.41394446, - "longitude": -58.72879589 - }, - "Toay": { - "latitude": -36.66216215, - "longitude": -64.69221101 - }, - "Colón": { - "latitude": -32.01148275, - "longitude": -58.36991296 - }, - "Villaguay": { - "latitude": -31.6477389, - "longitude": -59.05947081 - }, - "Castelli": { - "latitude": -36.04148974, - "longitude": -57.65742519 - }, - "San Salvador": { - "latitude": -31.57688354, - "longitude": -58.48637286 - }, - "Libertador Grl. San Martín": { - "latitude": -32.57841924, - "longitude": -65.70958877 - }, - "Chacabuco": { - "latitude": -32.7269647, - "longitude": -65.19823445 - }, - "General Las Heras": { - "latitude": -34.90942438, - "longitude": -58.99544662 - }, - "Presidente Perón": { - "latitude": -34.92984784, - "longitude": -58.39808421 - }, - "Junín": { - "latitude": -34.54647513, - "longitude": -61.00525013 - }, - "Curuzú Cuatiá": { - "latitude": -29.69551523, - "longitude": -58.32484649 - }, - "San Miguel": { - "latitude": -27.87585966, - "longitude": -57.41004217 - }, - "Malvinas Argentinas": { - "latitude": -34.48731134, - "longitude": -58.71213724 - }, - "Brandsen": { - "latitude": -35.2225198, - "longitude": -58.1752339 - }, - "Chivilcoy": { - "latitude": -34.91548733, - "longitude": -59.95841949 - }, - "Alberti": { - "latitude": -35.03696851, - "longitude": -60.28197659 - }, - "Bragado": { - "latitude": -35.06141227, - "longitude": -60.60404665 - }, - "Carlos Casares": { - "latitude": -35.74992221, - "longitude": -61.37437779 - }, - "General Viamonte": { - "latitude": -34.99777889, - "longitude": -61.04965723 - }, - "Ezeiza": { - "latitude": -34.87609684, - "longitude": -58.56470137 - }, - "Angaco": { - "latitude": -31.19227187, - "longitude": -68.13204833 - }, - "Candelaria": { - "latitude": -27.46085005, - "longitude": -55.58269004 - }, - "Carlos Tejedor": { - "latitude": -35.37974494, - "longitude": -62.42978958 - }, - "Pehuajó": { - "latitude": -35.88362083, - "longitude": -61.92812573 - }, - "Santa Bárbara": { - "latitude": -24.00726369, - "longitude": -64.40229675 - }, - "Trenque Lauquen": { - "latitude": -36.05676627, - "longitude": -62.63507978 - }, - "Capayán": { - "latitude": -28.90923419, - "longitude": -65.90157027 - }, - "Monte": { - "latitude": -35.50982676, - "longitude": -58.76723584 - }, - "Roque Pérez": { - "latitude": -35.4816357, - "longitude": -59.35751182 - }, - "Olavarría": { - "latitude": -36.85763405, - "longitude": -60.6702054 - }, - "Merlo": { - "latitude": -34.71100328, - "longitude": -58.74195841 - }, - "Esteban Echeverría": { - "latitude": -34.83121357, - "longitude": -58.47694793 - }, - "Arrecifes": { - "latitude": -34.01181191, - "longitude": -60.06266255 - }, - "Capitán Sarmiento": { - "latitude": -34.14984453, - "longitude": -59.85401478 - }, - "General Felipe Varela": { - "latitude": -29.44979561, - "longitude": -68.3284823 - }, - "Carmen de Areco": { - "latitude": -34.40679779, - "longitude": -59.88441349 - }, - "Salto": { - "latitude": -34.27107856, - "longitude": -60.30528927 - }, - "Exaltación de la Cruz": { - "latitude": -34.29513422, - "longitude": -59.15594613 - }, - "San Andrés de Giles": { - "latitude": -34.43773143, - "longitude": -59.47319859 - }, - "Mercedes": { - "latitude": -34.69732133, - "longitude": -59.42048114 - }, - "Pilar": { - "latitude": -34.44816024, - "longitude": -58.90333273 - }, - "Luján": { - "latitude": -34.56732242, - "longitude": -59.15845644 - }, - "Hurlingham": { - "latitude": -34.59928306, - "longitude": -58.64952539 - }, - "Empedrado": { - "latitude": -27.89611267, - "longitude": -58.6658403 - }, - "Ituzaingó": { - "latitude": -27.92537619, - "longitude": -56.78835966 - }, - "Morón": { - "latitude": -34.64938616, - "longitude": -58.61983171 - }, - "Godoy Cruz": { - "latitude": -32.93156193, - "longitude": -68.89006895 - }, - "Cafayate": { - "latitude": -26.12574863, - "longitude": -65.87670854 - }, - "San Luis del Palmar": { - "latitude": -27.60205308, - "longitude": -58.26835082 - }, - "San Cosme": { - "latitude": -27.38251488, - "longitude": -58.5175865 - }, - "Itatí": { - "latitude": -27.34697604, - "longitude": -58.07115755 - }, - "Berón de Astrada": { - "latitude": -27.48166204, - "longitude": -57.61765413 - }, - "Tres Lomas": { - "latitude": -36.49710022, - "longitude": -62.86390777 - }, - "Guaminí": { - "latitude": -36.89067551, - "longitude": -62.41853106 - }, - "Ensenada": { - "latitude": -34.84214974, - "longitude": -57.97910909 - }, - "General Manuel Belgrano": { - "latitude": -25.97843171, - "longitude": -53.9638551 - }, - "Guaymallén": { - "latitude": -32.89295951, - "longitude": -68.7332465 - }, - "General San Martín": { - "latitude": -34.55277193, - "longitude": -58.56428217 - }, - "Lincoln": { - "latitude": -35.07044797, - "longitude": -61.68245839 - }, - "Laprida": { - "latitude": -37.51650558, - "longitude": -60.76814818 - }, - "San Isidro": { - "latitude": -34.48689295, - "longitude": -58.53720908 - }, - "Benito Juárez": { - "latitude": -37.58611071, - "longitude": -59.88839784 - }, - "Tolhuin": { - "latitude": -54.42456089, - "longitude": -67.50348495 - }, - "General Rodríguez": { - "latitude": -34.65061569, - "longitude": -58.9878468 - }, - "Suipacha": { - "latitude": -34.74857414, - "longitude": -59.70338605 - }, - "Tres de Febrero": { - "latitude": -34.59601005, - "longitude": -58.57918842 - }, - "Florencio Varela": { - "latitude": -34.87774482, - "longitude": -58.25855489 - }, - "Navarro": { - "latitude": -35.03048448, - "longitude": -59.42935855 - }, - "Cañuelas": { - "latitude": -35.1448045, - "longitude": -58.69109418 - }, - "Cainguás": { - "latitude": -27.14783658, - "longitude": -54.80234379 - }, - "Libertador General San Martín": { - "latitude": -26.89314489, - "longitude": -54.92336296 - }, - "San Vicente": { - "latitude": -35.07150872, - "longitude": -58.43181206 - }, - "Lobos": { - "latitude": -35.21958579, - "longitude": -59.14574188 - }, - "Quilmes": { - "latitude": -34.7349708, - "longitude": -58.27685802 - }, - "Pila": { - "latitude": -36.20298422, - "longitude": -58.34044305 - }, - "General La Madrid": { - "latitude": -37.35612778, - "longitude": -61.34413089 - }, - "Bolívar": { - "latitude": -36.29894796, - "longitude": -61.14986009 - }, - "Guaraní": { - "latitude": -27.0262349, - "longitude": -54.26936513 - }, - "Balcarce": { - "latitude": -37.71461981, - "longitude": -58.27174756 - }, - "Hipólito Yrigoyen": { - "latitude": -36.25918902, - "longitude": -61.66018763 - }, - "Oberá": { - "latitude": -27.4763636, - "longitude": -55.07122211 - }, - "Dolores": { - "latitude": -36.39893767, - "longitude": -57.63192612 - }, - "Azul": { - "latitude": -36.78593522, - "longitude": -59.69647834 - }, - "Daireaux": { - "latitude": -36.64086922, - "longitude": -61.89124955 - }, - "Juárez Celman": { - "latitude": -33.32957448, - "longitude": -63.60638586 - }, - "Figueroa": { - "latitude": -27.32185675, - "longitude": -63.57963202 - }, - "Saavedra": { - "latitude": -37.77063813, - "longitude": -62.43438291 - }, - "Monte Hermoso": { - "latitude": -38.96162379, - "longitude": -61.2921467 - }, - "Lobería": { - "latitude": -38.09005282, - "longitude": -58.69354978 - }, - "Berisso": { - "latitude": -34.90935511, - "longitude": -57.82837977 - }, - "Tordillo": { - "latitude": -36.39051512, - "longitude": -57.27381165 - }, - "San Fernando": { - "latitude": -34.14710279, - "longitude": -58.53839442 - }, - "Zárate": { - "latitude": -33.9970898, - "longitude": -59.1282153 - }, - "Ramallo": { - "latitude": -33.58717215, - "longitude": -60.05736279 - }, - "San Nicolás": { - "latitude": -33.4829732, - "longitude": -60.2931352 - }, - "Salavina": { - "latitude": -28.91874359, - "longitude": -63.30359495 - }, - "San Ignacio": { - "latitude": -27.17659395, - "longitude": -55.33929017 - }, - "Leandro N. Alem": { - "latitude": -27.63066526, - "longitude": -55.38806773 - }, - "Guachipas": { - "latitude": -25.70295843, - "longitude": -65.44454062 - }, - "Islas del Atlántico Sur": { - "latitude": -51.74139392, - "longitude": -58.75617516 - }, - "Pocho": { - "latitude": -31.46275652, - "longitude": -65.43536649 - }, - "Conhelo": { - "latitude": -36.03154358, - "longitude": -64.51060303 - }, - "Castro Barros": { - "latitude": -28.85998295, - "longitude": -66.91858476 - }, - "General López": { - "latitude": -33.92514834, - "longitude": -61.94499869 - }, - "Constitución": { - "latitude": -33.48547776, - "longitude": -60.851259 - }, - "Sanagasta": { - "latitude": -29.15852697, - "longitude": -67.06588363 - }, - "General Juan Facundo Quiroga": { - "latitude": -30.80095903, - "longitude": -66.86810451 - }, - "Chilecito": { - "latitude": -29.39593748, - "longitude": -67.42788679 - }, - "Caseros": { - "latitude": -33.22149503, - "longitude": -61.53101928 - }, - "Rosario": { - "latitude": -33.12785574, - "longitude": -60.71084167 - }, - "San Lorenzo": { - "latitude": -32.9423146, - "longitude": -60.96150147 - }, - "Iriondo": { - "latitude": -32.70608361, - "longitude": -61.27338771 - }, - "San Jerónimo": { - "latitude": -32.15377136, - "longitude": -61.04812658 - }, - "Ángel Vicente Peñaloza": { - "latitude": -30.31289754, - "longitude": -66.66305212 - }, - "Rosario Vera Peñaloza": { - "latitude": -31.42059777, - "longitude": -66.67886217 - }, - "Totoral": { - "latitude": -30.72634427, - "longitude": -63.98440399 - }, - "Río Primero": { - "latitude": -31.03152408, - "longitude": -63.43611478 - }, - "Tinogasta": { - "latitude": -27.54051817, - "longitude": -67.92922497 - }, - "Marcos Juárez": { - "latitude": -33.03115964, - "longitude": -62.27742329 - }, - "Famatina": { - "latitude": -28.6973038, - "longitude": -67.55929204 - }, - "San Blas de Los Sauces": { - "latitude": -28.54333091, - "longitude": -67.15815307 - }, - "Cochinoca": { - "latitude": -22.93921305, - "longitude": -65.93472605 - }, - "Tumbaya": { - "latitude": -23.74347495, - "longitude": -65.6961902 - }, - "Dr. Manuel Belgrano": { - "latitude": -24.08911842, - "longitude": -65.44787838 - }, - "Rinconada": { - "latitude": -22.621442, - "longitude": -66.54156322 - }, - "Ramón Lista": { - "latitude": -23.12004066, - "longitude": -62.13819538 - }, - "La Poma": { - "latitude": -24.14697651, - "longitude": -66.20729736 - }, - "Formosa": { - "latitude": -25.93963523, - "longitude": -58.37731745 - }, - "Andalgalá": { - "latitude": -27.57094236, - "longitude": -66.37382925 - }, - "Ambato": { - "latitude": -28.0189345, - "longitude": -65.92229836 - }, - "Paclín": { - "latitude": -28.11005166, - "longitude": -65.67387787 - }, - "Pilcomayo": { - "latitude": -25.37003772, - "longitude": -58.06260627 - }, - "El Alto": { - "latitude": -28.43038823, - "longitude": -65.35991553 - }, - "Tehuelches": { - "latitude": -44.2001445, - "longitude": -70.57694937 - }, - "Escalante": { - "latitude": -45.28287529, - "longitude": -67.7090277 - }, - "Ischilín": { - "latitude": -30.39851579, - "longitude": -64.60992802 - }, - "Gastre": { - "latitude": -42.74906887, - "longitude": -68.80232253 - }, - "General Arenales": { - "latitude": -34.23770272, - "longitude": -61.28376095 - }, - "Calamuchita": { - "latitude": -32.2017736, - "longitude": -64.61482137 - }, - "Cruz Alta": { - "latitude": -26.91799251, - "longitude": -64.97386945 - }, - "Lules": { - "latitude": -26.86223535, - "longitude": -65.43102459 - }, - "Patagones": { - "latitude": -40.19651422, - "longitude": -62.85803862 - }, - "Juan Martín de Pueyrredón": { - "latitude": -33.90087952, - "longitude": -66.50257757 - }, - "General Pedernera": { - "latitude": -33.89055146, - "longitude": -65.56285208 - }, - "Tafí Viejo": { - "latitude": -26.66014914, - "longitude": -65.46407393 - }, - "Comuna 9": { - "latitude": -34.6517888, - "longitude": -58.49917517 - }, - "Mitre": { - "latitude": -29.61506599, - "longitude": -62.73868052 - }, - "Atamisqui": { - "latitude": -28.69181817, - "longitude": -63.881564 - }, - "Burruyacú": { - "latitude": -26.53055249, - "longitude": -64.81968942 - }, - "Trancas": { - "latitude": -26.34341255, - "longitude": -65.40582095 - }, - "Tafí del Valle": { - "latitude": -26.59139946, - "longitude": -65.88949394 - }, - "Jiménez": { - "latitude": -26.89959115, - "longitude": -64.27251588 - }, - "Coronel de Marina Leonardo Rosales": { - "latitude": -38.84907733, - "longitude": -61.83558442 - }, - "Baradero": { - "latitude": -33.93196138, - "longitude": -59.49278714 - }, - "Santa Victoria": { - "latitude": -22.39589183, - "longitude": -64.89556461 - }, - "General José de San Martín": { - "latitude": -22.71446238, - "longitude": -63.65828643 - }, - "Rosario de Lerma": { - "latitude": -24.54575198, - "longitude": -65.85300787 - }, - "Ledesma": { - "latitude": -23.78548316, - "longitude": -64.82887149 - }, - "Florentino Ameghino": { - "latitude": -34.87410581, - "longitude": -62.40171626 - }, - "La Cocha": { - "latitude": -27.79370448, - "longitude": -65.59812454 - }, - "Graneros": { - "latitude": -27.71322897, - "longitude": -65.25508323 - }, - "Juan Bautista Alberdi": { - "latitude": -27.60596962, - "longitude": -65.78309775 - }, - "Simoca": { - "latitude": -27.42383706, - "longitude": -65.29248478 - }, - "Chicligasta": { - "latitude": -27.26957375, - "longitude": -65.81101509 - }, - "Monteros": { - "latitude": -27.11060848, - "longitude": -65.64313626 - }, - "Leales": { - "latitude": -27.19182463, - "longitude": -65.0850119 - }, - "La Capital": { - "latitude": -31.47535632, - "longitude": -60.66947932 - }, - "Rancul": { - "latitude": -35.40158891, - "longitude": -64.80149044 - }, - "Castellanos": { - "latitude": -31.23141494, - "longitude": -61.65696265 - }, - "Garay": { - "latitude": -31.05464163, - "longitude": -60.12580784 - }, - "Quemú Quemú": { - "latitude": -36.13063978, - "longitude": -63.66373617 - }, - "Catriló": { - "latitude": -36.58166789, - "longitude": -63.66487085 - }, - "Atreucó": { - "latitude": -37.03249567, - "longitude": -63.77888557 - }, - "Guatraché": { - "latitude": -37.4836474, - "longitude": -63.78130867 - }, - "Utracán": { - "latitude": -37.33387948, - "longitude": -65.08283167 - }, - "Sauce": { - "latitude": -29.99954643, - "longitude": -58.79503851 - }, - "Paso de los Libres": { - "latitude": -29.59363634, - "longitude": -57.29963384 - }, - "Goya": { - "latitude": -29.45145351, - "longitude": -59.25591215 - }, - "San Roque": { - "latitude": -28.70580719, - "longitude": -58.6130359 - }, - "Concepción": { - "latitude": -28.40839953, - "longitude": -58.03139284 - }, - "Bella Vista": { - "latitude": -28.49738701, - "longitude": -58.93043543 - }, - "Santo Tomé": { - "latitude": -28.23111255, - "longitude": -56.22221216 - }, - "Saladas": { - "latitude": -28.21246869, - "longitude": -58.61991289 - }, - "Mburucuyá": { - "latitude": -28.0163839, - "longitude": -58.185564 - }, - "Apóstoles": { - "latitude": -27.88880399, - "longitude": -55.6782739 - }, - "1° de Mayo": { - "latitude": -27.16780374, - "longitude": -58.95874156 - }, - "Valle Viejo": { - "latitude": -28.59871329, - "longitude": -65.70718344 - }, - "2 de Abril": { - "latitude": -27.61985516, - "longitude": -61.32895196 - }, - "Lanús": { - "latitude": -34.70565424, - "longitude": -58.3946965 - }, - "Lomas de Zamora": { - "latitude": -34.75498087, - "longitude": -58.42406757 - }, - "Libertad": { - "latitude": -27.3493251, - "longitude": -59.25978777 - }, - "Comandante Fernández": { - "latitude": -26.78539004, - "longitude": -60.46128691 - }, - "Comuna 15": { - "latitude": -34.59188367, - "longitude": -58.46277402 - }, - "Santa Lucía": { - "latitude": -31.53271976, - "longitude": -68.46341005 - }, - "Pocito": { - "latitude": -31.7472539, - "longitude": -68.58467982 - }, - "Zonda": { - "latitude": -31.64177836, - "longitude": -68.95484188 - }, - "Ullum": { - "latitude": -31.08528537, - "longitude": -68.88239092 - }, - "Chimbas": { - "latitude": -31.48741969, - "longitude": -68.52392897 - }, - "Albardón": { - "latitude": -31.20973551, - "longitude": -68.45217924 - }, - "Caucete": { - "latitude": -31.50681221, - "longitude": -67.54607731 - }, - "Calingasta": { - "latitude": -31.45087369, - "longitude": -69.83187423 - }, - "Iglesia": { - "latitude": -29.60136389, - "longitude": -69.43880813 - }, - "Jáchal": { - "latitude": -30.35456302, - "longitude": -68.44008521 - }, - "Valle Fértil": { - "latitude": -30.71225929, - "longitude": -67.53232233 - }, - "La Plata": { - "latitude": -35.00561232, - "longitude": -58.01727784 - } - } -} diff --git a/ingestion/functions/parsing/argentina/input_event.json b/ingestion/functions/parsing/argentina/input_event.json deleted file mode 100644 index 94ac42257..000000000 --- a/ingestion/functions/parsing/argentina/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "argentina_test_Mar21/content.csv", - "sourceUrl": "https://sisa.msal.gov.ar/datos/descargas/covid-19/files/Covid19Casos.csv", - "sourceId": "604f40985005d80036af99bb" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/argentina/sample_data.csv b/ingestion/functions/parsing/argentina/sample_data.csv deleted file mode 100644 index 611124f77..000000000 --- a/ingestion/functions/parsing/argentina/sample_data.csv +++ /dev/null @@ -1,17 +0,0 @@ -id_evento_caso,sexo,edad,edad_años_meses,residencia_pais_nombre,residencia_provincia_nombre,residencia_departamento_nombre,carga_provincia_nombre,fecha_inicio_sintomas,fecha_apertura,sepi_apertura,fecha_internacion,cuidado_intensivo,fecha_cui_intensivo,fallecido,fecha_fallecimiento,asistencia_respiratoria_mecanica,carga_provincia_id,origen_financiamiento,clasificacion,clasificacion_resumen,residencia_provincia_id,fecha_diagnostico,residencia_departamento_id,ultima_actualizacion -1000000,M,53,Años,Argentina,CABA,SIN ESPECIFICAR,Buenos Aires,,2020-06-01,23,,NO,,NO,,NO,6,Privado,Caso Descartado,Descartado,2,2020-06-09,0,2020-09-18 -1000002,M,21,Años,Argentina,Buenos Aires,La Matanza,Buenos Aires,,2020-06-01,23,,NO,,NO,,NO,6,Público,Caso Descartado,Descartado,6,2020-06-01,427,2020-09-18 -1000003,F,40,Años,Argentina,Córdoba,Capital,Córdoba,2020-05-24,2020-06-01,23,,NO,,NO,,NO,14,Privado,Caso Descartado,Descartado,14,2020-06-01,14,2020-09-18 -1000005,F,58,Años,Argentina,Mendoza,Las Heras,Mendoza,,2020-06-01,23,,NO,,NO,,NO,50,Público,Caso Descartado,Descartado,50,2020-06-01,49,2020-09-18 -1000006,M,28,Años,Argentina,Buenos Aires,Malvinas Argentinas,Buenos Aires,2020-05-30,2020-06-01,23,,NO,,NO,,NO,6,Público,Caso sospechoso - Con muestra sin resultado,Sospechoso,6,,515,2020-09-18 -1000007,M,26,Años,Argentina,Formosa,Patiño,Formosa,,2020-06-01,23,,NO,,NO,,NO,34,Público,Caso confirmado por laboratorio - No Activo por criterio de laboratorio,Confirmado,34,2020-06-25,35,2020-09-18 -1000008,F,69,Años,Argentina,CABA,SIN ESPECIFICAR,CABA,2020-05-31,2020-06-01,23,,NO,,NO,,NO,2,Privado,Caso Descartado,Descartado,2,2020-06-01,0,2020-09-18 -1000009,M,73,Años,Argentina,Buenos Aires,Esteban Echeverría,Buenos Aires,2020-05-31,2020-06-01,23,,NO,,NO,,NO,6,Privado,Caso Descartado,Descartado,6,2020-06-02,260,2020-09-18 -1000010,M,7,Años,Argentina,CABA,COMUNA 07,CABA,,2020-06-01,23,,NO,,NO,,NO,2,Público,Caso confirmado por laboratorio - No activo (por tiempo de evolución),Confirmado,2,2020-06-01,7,2020-09-18 -1000011,M,42,Años,Argentina,Santa Fe,Rosario,Santa Fe,,2020-06-01,23,,NO,,NO,,NO,82,Público,Caso Descartado,Descartado,82,2020-06-01,84,2020-09-18 -1000012,M,46,Años,Argentina,CABA,SIN ESPECIFICAR,CABA,2020-05-26,2020-06-01,23,2020-05-31,NO,,NO,2020-07-01,NO,2,Privado,Caso confirmado por laboratorio,Confirmado,2,2020-05-31,0,2020-07-01 -1000013,F,43,Años,Argentina,Buenos Aires,Tigre,Buenos Aires,,2020-06-01,23,,NO,,NO,,NO,6,Privado,Caso Descartado,Descartado,6,2020-06-01,805,2020-09-18 -1000014,M,60,Años,Argentina,Santa Fe,Rosario,Santa Fe,,2020-06-01,23,,NO,,NO,,NO,82,Público,Caso Descartado,Descartado,82,2020-06-01,84,2020-09-18 -1000015,F,29,Años,Argentina,CABA,COMUNA 07,Buenos Aires,2020-05-18,2020-06-01,23,,NO,,NO,,NO,6,Privado,Caso confirmado por laboratorio - No activo (por tiempo de evolución),Confirmado,2,2020-06-01,7,2020-09-18 -1000016,F,37,Años,Argentina,Buenos Aires,Tres de Febrero,Buenos Aires,2020-05-29,2020-06-01,23,2020-05-30,NO,,NO,,NO,6,Privado,Caso Descartado,Descartado,6,2020-06-02,840,2020-09-18 -1039608,M,70,Años,Italia,Buenos Aires,Lanús,Buenos Aires,2020-06-04,2020-06-08,24,,NO,,NO,,NO,6,Público,Caso confirmado por laboratorio - No Activo por criterio de laboratorio,Confirmado,6,2020-06-10,434,2021-03-03 diff --git a/ingestion/functions/parsing/brazil_acre/__init__.py b/ingestion/functions/parsing/brazil_acre/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/brazil_acre/acre.py b/ingestion/functions/parsing/brazil_acre/acre.py deleted file mode 100644 index 8c367ba5a..000000000 --- a/ingestion/functions/parsing/brazil_acre/acre.py +++ /dev/null @@ -1,270 +0,0 @@ -import json -import os -import sys -from datetime import datetime -import csv - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - - -_AGE = "idade" -_GENDER = "sexo" -_MUNICIPALITY = "municipio" -_STATE = "estado" -_DATE_CONFIRMED = "dataNotificacao" -_DATE_SYMPTOMS = "dataInicioSintomas" -_SYMPTOMS = "sintomas" -_OTHER_SYMPTOMS = "outrosSintomas" -_HEALTHCARE_PROFESSIONAL = "profissionalSaude" -_COMORBIDITIES = "condicoes" -_TEST_TYPE = "tipoTeste" -_TEST_RESULT = "resultadoTeste" -_OUTCOME = "evolucaoCaso" -_ETHNICITY = "racaCor" -_SECURITY_PROFESSIONAL = "profissionalSeguranca" -_INDIGENOUS_GROUP = "etnia" -_FINAL_CLASSIFICATION = "classificacaoFinal" - - -# Symptoms and comorbidities written with variation in capitalization, so all forced to lowercase -_COMORBIDITIES_MAP = { - "diabetes": "diabetes mellitus", - "gestante": "pregnancy", - "gestante de alto risco": "high risk pregnancy", - "doenças respiratórias crônicas descompensadas": "respiratory system disease", - "doenças renais crônicas em estágio avançado (graus 3, 4 e 5)": "chronic kidney disease", - "doenças cardíacas crônicas": "heart disease", - "obesidade": "obesity" -} - - -_SYMPTOMS_MAP = { - "dor de garganta": "throat pain", - "dispneia": "dyspnea", - "febre": "fever", - "tosse": "cough", - # According to symptom ontology, breathing difficulty is exact synonym of dyspnea - "dificuldade de respirar": "dyspnea", - "dor de cabeça": "headache", - "distúrbios gustativos": "taste alteration", - "distúrbios olfativos": "smell alteration" -} - - -def convert_date(raw_date): - """ - Convert raw date field into a value interpretable by the dataserver. - """ - try: - date = datetime.strptime(raw_date.split("T")[0], "%Y-%m-%d") - return date.strftime("%m/%d/%YZ") - except: - return None - - -def convert_gender(raw_gender: str): - if raw_gender == "Masculino": - return "Male" - if raw_gender == "Feminino": - return "Female" - - -def convert_test(test_type: str): - if test_type: - if test_type == "RT-PCR": - return "PCR test" - for i in ["TESTE", "ELISA", "CLIA"]: - if i in test_type: - return "Serological test" - - -def convert_outcome(outcome: str): - if outcome == "Óbito": - return { - "name": "outcome", - "value": "Death" - } - elif outcome == "Cura": - return { - "name": "outcome", - "value": "Recovered" - } - elif outcome == "Internado em UTI": - return { - "name": "icuAdmission", - "value": "Yes" - } - elif outcome == "Internado": - return { - "name": "hospitalAdmission", - "value": "Yes" - } - - -def convert_events(date_confirmed, date_symptoms, test_type, outcome): - events = [ - { - "name": "confirmed", - "dateRange": { - "start": convert_date(date_confirmed), - "end": convert_date(date_confirmed) - }, - "value": convert_test(test_type) - } - ] - # One case dated July 2019 - if date_symptoms: - if datetime.strptime(date_symptoms.split("T")[0], "%Y-%m-%d") > datetime.strptime("2019-11-01", "%Y-%m-%d"): - events.append( - { - "name": "onsetSymptoms", - "dateRange": { - "start": convert_date(date_symptoms), - "end": convert_date(date_symptoms) - } - } - ) - if outcome: - events.append( - convert_outcome(outcome) - ) - return events - - -def convert_symptoms(raw_symptoms: str): - values = [] - if raw_symptoms: - # Some entries have 'assintomático' listed with other symptoms e.g. "Assintomático, Coriza, Tosse". These cases can't be considered as asymptomatic - if raw_symptoms.lower() == "assintomático": - return {"status": "Asymptomatic"} - else: - for key in _SYMPTOMS_MAP: - if key in raw_symptoms.lower(): - values.append(_SYMPTOMS_MAP[key]) - return {"status": "Symptomatic", - "values": values} - - -def convert_preexisting_conditions(raw_comorbidities: str): - preexistingConditions = {} - comorbidities = [] - - for key in _COMORBIDITIES_MAP: - if key in raw_comorbidities.lower(): - comorbidities.append(_COMORBIDITIES_MAP[key]) - - if comorbidities: - preexistingConditions["hasPreexistingConditions"] = True - preexistingConditions["values"] = comorbidities - return preexistingConditions - - -def convert_ethnicity(raw_ethnicity: str): - if raw_ethnicity == "Preta": - return "Black" - elif raw_ethnicity == "Parda": - return "Mixed" - elif raw_ethnicity == "Amarela": - return "Asian" - elif raw_ethnicity == "Branca": - return "White" - elif raw_ethnicity == "Indigena": - return "Indigenous" - - -def convert_demographics(gender: str, age: str, healthcare_professional: str, security_professional: str, raw_ethnicity: str): - if not any((gender, age, raw_ethnicity, healthcare_professional, security_professional)): - return None - demo = {} - if gender: - demo["gender"] = convert_gender(gender) - if age and float(age) <= 120.0: - demo["ageRange"] = {"start": float(age), "end": float(age)} - if raw_ethnicity: - demo["ethnicity"] = convert_ethnicity(raw_ethnicity) - if healthcare_professional == "Sim": - demo["occupation"] = "Healthcare worker" - if security_professional == "Sim": - demo["occupation"] = "Security guard" - return demo - - -def convert_notes(raw_comorbidities: str, raw_symptoms: str, indigenous_group: str, other_symptoms: str): - raw_notes = [] - if "imunossupressão" in raw_comorbidities.lower(): - raw_notes.append("Patient with immunosuppression") - if "portador de doenças cromossômicas ou estado de fragilidade imunológica" in raw_comorbidities.lower(): - raw_notes.append("Primary immunodeficiency disease or chromosomal disease") - if "puérpera (até 45 dias do parto)" in raw_comorbidities.lower(): - raw_notes.append("Patient given birth in the last 45 days") - if "coriza" in raw_symptoms.lower(): - raw_notes.append("Patient with coryza") - if "outros" in raw_symptoms.lower(): - raw_notes.append("Other symptoms reported") - if other_symptoms: - raw_notes.append("Non-standard symptoms listed but not parsed (please see raw data for further information)") - if indigenous_group: - raw_notes.append("Patient from the following indigenous group: " + indigenous_group) - - if raw_notes: - return (", ").join(raw_notes) - - -def parse_cases(raw_data_file: str, source_id: str, source_url: str): - """ - Parses G.h-format case data from raw API data. - """ - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f, delimiter=",") - for row in reader: - confirmation_date = convert_date(row[_DATE_CONFIRMED]) - if row[_TEST_RESULT] == "Positivo" and row[_FINAL_CLASSIFICATION] != "Descartado" and row[_STATE] == "ACRE" and confirmation_date is not None: - try: - case = { - "caseReference": {"sourceId": source_id, "sourceUrl": source_url}, - "location": { - "query": ", ".join( - [row[_MUNICIPALITY], "Acre", "Brazil"] - ) - }, - "events": convert_events( - row[_DATE_CONFIRMED], - row[_DATE_SYMPTOMS], - row[_TEST_TYPE], - row[_OUTCOME] - ), - "symptoms": convert_symptoms(row[_SYMPTOMS]), - "demographics": convert_demographics( - row[_GENDER], row[_AGE], row[_HEALTHCARE_PROFESSIONAL], row[_SECURITY_PROFESSIONAL], row[_ETHNICITY] - ), - "preexistingConditions": convert_preexisting_conditions( - row[_COMORBIDITIES] - ) - } - notes = convert_notes( - row[_COMORBIDITIES], row[_SYMPTOMS], row[_INDIGENOUS_GROUP], row[_OTHER_SYMPTOMS] - ) - if notes: - case["restrictedNotes"] = notes - yield case - except ValueError as ve: - raise ValueError(f"error converting case: {ve}") - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/brazil_acre/acre_test.py b/ingestion/functions/parsing/brazil_acre/acre_test.py deleted file mode 100644 index 93b9dd19f..000000000 --- a/ingestion/functions/parsing/brazil_acre/acre_test.py +++ /dev/null @@ -1,68 +0,0 @@ -import os -import unittest - -from brazil_acre import acre - -_SOURCE_ID = "abc123" -_SOURCE_URL = "foo.bar" - - -class AcreTest(unittest.TestCase): - def setUp(self): - # Default of 1500 is not enough to show diffs when there is one. - self.maxDiff = 10000 - - def test_parse(self): - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = acre.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), [ - { - "caseReference": {"sourceId": _SOURCE_ID, "sourceUrl": _SOURCE_URL}, - "location": { - "query": "Rio Branco, Acre, Brazil" - }, - "events": [ - { - "name": "confirmed", - "dateRange": { - "start": "05/20/2020Z", - "end": "05/20/2020Z" - }, - "value": "PCR test" - }, - { - "name": "onsetSymptoms", - "dateRange": { - "start": "05/14/2020Z", - "end": "05/14/2020Z" - } - }, - { - "name": "outcome", - "value": "Recovered" - } - ], - "symptoms": { - "status": "Symptomatic", - "values": ["throat pain", "dyspnea", "cough"] - }, - "demographics": { - "gender": "Female", - "ageRange": { - "start": 32.0, - "end": 32.0 - }, - "ethnicity": "Asian", - "occupation": "Healthcare worker" - }, - "preexistingConditions": { - "hasPreexistingConditions": True, - "values": [ - "diabetes mellitus", "obesity" - ] - }, - "restrictedNotes": "Other symptoms reported, Non-standard symptoms listed but not parsed (please see raw data for further information)" - } - ]) diff --git a/ingestion/functions/parsing/brazil_acre/input_event.json b/ingestion/functions/parsing/brazil_acre/input_event.json deleted file mode 100644 index 53225719d..000000000 --- a/ingestion/functions/parsing/brazil_acre/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "5faeae8bec03f700457b63b2/2020/11/13/1608/content.csv", - "sourceUrl": "http://covid19.ac.gov.br/monitoramento/notificacoes/csv", - "sourceId": "5faeae8bec03f700457b63b2" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/brazil_acre/sample_data.csv b/ingestion/functions/parsing/brazil_acre/sample_data.csv deleted file mode 100644 index 60b89b5a7..000000000 --- a/ingestion/functions/parsing/brazil_acre/sample_data.csv +++ /dev/null @@ -1,3 +0,0 @@ -dataNotificacao,dataInicioSintomas,dataTeste,profissionalSaude,profissionalSeguranca,sexo,racaCor,bairro_final,estado,municipio,sintomas,outrosSintomas,condicoes,estadoTeste,tipoTeste,resultadoTeste,cnes,estadoNotificacao,municipioNotificacao,estadoIBGE,estadoNotificacaoIBGE,municipioIBGE,municipioNotificacaoIBGE,idade,classificacaoFinal,dataEncerramento,evolucaoCaso,etnia,testeSorologico,dataTesteSorologico,tipoTesteSorologico,resultadoTesteSorologicoIgA,resultadoTesteSorologicoIgG,resultadoTesteSorologicoIgM,resultadoTesteSorologicoTotais,data_atualizacao,cnes_nome,cnes_latitude,cnes_longitude,ordem_evolucao,cod_ibge,municipio_latitude,municipio_longitude,reginoal_saude -2020-05-20T05:00:00.000Z,2020-05-14T05:00:00.000Z,2020-05-20T03:00:00.000Z,Sim,N�o,Feminino,Amarela,BAIXADA DA HABITASA,ACRE,Rio Branco,"Tosse, Dispneia, Dor de Garganta, Outros","CEFALEIA, CONGESTAO NASAL, MIALGIA","Diabetes, Obesidade",Conclu�do,RT-PCR,Positivo,None,ACRE,Rio Branco,12,12,1200401,1200401,32.0,Confirmado Laboratorial,2020-07-05T03:00:00.000Z,Cura,,,,,,,,,2020-10-16 00:00:09.269,N�o identificado,,,2,1200401,-9.97499,-67.8243,Regional Baixo Acre -,2020-05-19T04:00:00.000Z,2020-05-29T04:00:00.000Z,Sim,Sim,Masculino,Branca,RES BOUGANVILE,ACRE,Rio Branco,"Dor de Garganta, Febre, Outros","CEFAL�IA, ANOSMIA, AGEUSIA",,Conclu�do,TESTE R�PIDO - ANTICORPO,Positivo,None,ACRE,Rio Branco,12,12,1200401,1200401,29.0,Confirmado Laboratorial,2020-07-30T03:00:00.000Z,Cura,,,,,,,,,2020-10-16 00:00:09.269,N�o identificado,,,2,1200401,-9.97499,-67.8243,Regional Baixo Acre \ No newline at end of file diff --git a/ingestion/functions/parsing/brazil_amapa/__init__.py b/ingestion/functions/parsing/brazil_amapa/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/brazil_amapa/amapa.py b/ingestion/functions/parsing/brazil_amapa/amapa.py deleted file mode 100644 index 348fe9095..000000000 --- a/ingestion/functions/parsing/brazil_amapa/amapa.py +++ /dev/null @@ -1,217 +0,0 @@ -import json -import os -import sys -from datetime import datetime -import csv -import common.ingestion_logging as logging - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - -logger = logging.getLogger(__name__) - -_DATE_CONFIRMED = "Data de Notificação" -_HEALTHCARE_WORKER = "Profissional de Saúde" -_PREEXISTING_CONDITIONS = "Comorbidades" -_METHOD_CONFIRMATION = "Tipo de Teste" -_GENDER = "Sexo" -_NOTES_BAIRRO = "Bairro" -_MUNICIPALITY = "Município" -_AGE = "Idade" -_ETHNICITY = "Raça/Cor" -_OUTCOME = "Evolução do Caso" - -_COMORBIDITIES_MAP = { - "Diabetes": "diabetes mellitus", - "Gestante": "pregnancy", - "Gestante de alto risco": "high risk pregnancy", - "Doenças respiratórias crônicas descompensadas": "respiratory system disease", - "Doenças renais crônicas em estágio avançado (graus 3, 4 ou 5)": "chronic kidney disease", - "Doenças cardíacas crônicas": "heart disease", - "Obesidade": "obesity" -} - - -def convert_gender(raw_gender: str): - if raw_gender == "Masculino": - return "Male" - elif raw_gender == "Feminino": - return "Female" - - -def convert_age(age: str): - # It seems for some cases the wrong information has been entered into the wrong columns, and so we get instances of Masculino and Feminino in the age column - try: - return { - "start": float(age), - "end": float(age) - } - except: - return None - - -def convert_confirmation_method(raw_test: str): - if raw_test == "RT-PCR": - return "PCR test" - elif "TESTE" or "ensaio" in raw_test: - return "Serological test" - else: - logger.warning(f'unknown confirmation method: {raw_test}') - return "Unknown" - - -def convert_profession(raw_profession: str): - if raw_profession == "Sim": - return "Healthcare worker" - - -def convert_ethnicity(raw_ethnicity: str): - if raw_ethnicity == "PRETA": - return "Black" - elif raw_ethnicity == "PARDA": - return "Mixed" - elif raw_ethnicity == "AMARELA": - return "Asian" - elif raw_ethnicity == "BRANCA": - return "White" - elif raw_ethnicity == "INDIGENA": - return "Indigenous" - - -def convert_preexisting_conditions(raw_comorbidities: str): - preexistingConditions = {} - comorbidities = [] - - for key in _COMORBIDITIES_MAP: - if key in raw_comorbidities: - comorbidities.append(_COMORBIDITIES_MAP[key]) - - if comorbidities: - preexistingConditions["hasPreexistingConditions"] = True - preexistingConditions["values"] = comorbidities - return preexistingConditions - else: - return None - -def convert_location(raw_entry: str): - query = ", ".join(word for word in [raw_entry, "Amapá", "Brazil"] if word) - return {"query": query} - - -def convert_notes( - raw_comorbidities: str, raw_notes_neighbourhood: str): - raw_notes = [] - if "Imunossupressão" in raw_comorbidities: - raw_notes.append("Patient with immunosupression") - if "Portador de doenças cromossômicas ou estado de fragilidade imunológica" in raw_comorbidities: - raw_notes.append("primary immunodeficiency disease or chromosomal disease") - if "Puérpera (até 45 dias do parto)" in raw_comorbidities: - raw_notes.append("Patient given birth in the last 45 days") - if raw_notes_neighbourhood: - raw_notes.append("Neighbourhood: " + raw_notes_neighbourhood) - - notes = (', ').join(raw_notes) - return notes - - -def convert_date(raw_date: str): - """ - Convert raw date field into a value interpretable by the dataserver. - - The date filtering API expects mm/dd/YYYYZ format. - """ - if raw_date.startswith("None"): - return None - try: - date = datetime.strptime(raw_date, "%Y-%m-%d %H:%M:%S") - return date.strftime("%m/%d/%YZ") - except ValueError: - try: - date = datetime.strptime(raw_date, "%Y-%m-%dT%H:%M:%S.%fZ") - return date.strftime("%m/%d/%YZ") - except: - return None - - -def convert_outcome(outcome: str): - if outcome == "Óbito": - return { - "name": "outcome", - "value": "Death" - } - elif outcome == "Cura": - return { - "name": "outcome", - "value": "Recovered" - } - elif outcome == "Internado": - return { - "name": "hospitalAdmission", - "value": "Yes" - } - - -def parse_cases(raw_data_file: str, source_id: str, source_url: str): - """Parses G.h-format case data from raw API data. - Caveats: - 1. There are no patient ID/case ID in the raw API so we aren't able - to dedupe. - 2. There are two files in the source for Amapa, one for confirmed cases and one for confirmed - deaths; some of these cases may also be deaths but without patient IDs we are unable to confirm. - """ - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f) - for row in reader: - # We have entries as high as 351 - unclear if this is days. - confirmation_date = convert_date(row[_DATE_CONFIRMED]) - age = convert_age(row[_AGE]) - if age is not None and float(row[_AGE]) <= 110 and confirmation_date is not None: - case = { - "caseReference": { - "sourceId": source_id, - "sourceUrl": source_url - }, - "location": convert_location(row[_MUNICIPALITY]), - "demographics": { - "gender": convert_gender(row[_GENDER]), - "ageRange": convert_age(row[_AGE]), - "ethnicity": convert_ethnicity(row[_ETHNICITY]), - "occupation": convert_profession(row[_HEALTHCARE_WORKER]) - }, - "events": [ - { - "name": "confirmed", - "dateRange": - { - "start": confirmation_date, - "end": confirmation_date, - }, - "value": convert_confirmation_method(row[_METHOD_CONFIRMATION]) - }, - convert_outcome(row[_OUTCOME]) - ], - "preexistingConditions": convert_preexisting_conditions(row[_PREEXISTING_CONDITIONS]), - "restrictedNotes": convert_notes( - row[_PREEXISTING_CONDITIONS], - row[_NOTES_BAIRRO]) - } - yield case - - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/brazil_amapa/amapa_test.py b/ingestion/functions/parsing/brazil_amapa/amapa_test.py deleted file mode 100644 index db081d237..000000000 --- a/ingestion/functions/parsing/brazil_amapa/amapa_test.py +++ /dev/null @@ -1,70 +0,0 @@ -import os -import unittest - -from brazil_amapa import amapa - -_SOURCE_ID = "abc123" -_SOURCE_URL = "foo.bar" - - -class AmapaTest(unittest.TestCase): - def setUp(self): - # Default of 1500 is not enough to show diffs when there is one. - self.maxDiff = 10000 - - def test_parse(self): - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - expected_case = { - "caseReference": { - "sourceId": _SOURCE_ID, - "sourceUrl": _SOURCE_URL - }, - "location": { - "query": "Ferreira Gomes, Amapá, Brazil" - }, - "demographics": { - "gender": "Male", - "ageRange": - { - "start": float(52), - "end": float(52) - }, - "ethnicity": "Mixed", - "occupation": None - }, - "events": [ - { - "name": "confirmed", - "dateRange": - { - "start": "06/04/2020Z", - "end": "06/04/2020Z" - }, - "value": "Serological test" - }, - { - "name": "outcome", - "value": "Recovered" - } - ], - "preexistingConditions": { - "hasPreexistingConditions": True, - "values": ["diabetes mellitus"] - }, - "restrictedNotes": "Patient with immunosupression, Neighbourhood: FERREIRA GOMES" - } - - result = amapa.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), [ - expected_case, - expected_case - ]) - - def test_drop_broken_date(self): - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "broken_date.csv") - - result = amapa.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), []) diff --git a/ingestion/functions/parsing/brazil_amapa/broken_date.csv b/ingestion/functions/parsing/brazil_amapa/broken_date.csv deleted file mode 100644 index fa5cc1b20..000000000 --- a/ingestion/functions/parsing/brazil_amapa/broken_date.csv +++ /dev/null @@ -1,2 +0,0 @@ -Data de Notificação,Município,Bairro,Tipo de Teste,Profissional de Saúde,Sexo,Idade,Raça/Cor,Comorbidades,Evolução do Caso -None 12:30:00,Ferreira Gomes,FERREIRA GOMES,TESTE RÁPIDO - ANTICORPO,Não,Masculino,52,PARDA,"Diabetes, Imunossupressão",Cura diff --git a/ingestion/functions/parsing/brazil_amapa/input_event.json b/ingestion/functions/parsing/brazil_amapa/input_event.json deleted file mode 100644 index f75b6383d..000000000 --- a/ingestion/functions/parsing/brazil_amapa/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "5fb686d201340e0044cb7ff5/2020/11/19/1458/content.csv", - "sourceUrl": "https://drive.google.com/uc?export=download&id=1_BcEumgJRFQ52PBiKUGrp_ik6na2bVPz", - "sourceId": "5fb686d201340e0044cb7ff5" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/brazil_amapa/sample_data.csv b/ingestion/functions/parsing/brazil_amapa/sample_data.csv deleted file mode 100644 index a3a27984a..000000000 --- a/ingestion/functions/parsing/brazil_amapa/sample_data.csv +++ /dev/null @@ -1,3 +0,0 @@ -Data de Notificação,Município,Bairro,Tipo de Teste,Profissional de Saúde,Sexo,Idade,Raça/Cor,Comorbidades,Evolução do Caso -2020-06-04 12:30:00,Ferreira Gomes,FERREIRA GOMES,TESTE RÁPIDO - ANTICORPO,Não,Masculino,52,PARDA,"Diabetes, Imunossupressão",Cura -2020-06-04T12:30:00.000Z,Ferreira Gomes,FERREIRA GOMES,TESTE RÁPIDO - ANTICORPO,Não,Masculino,52,PARDA,"Diabetes, Imunossupressão",Cura diff --git a/ingestion/functions/parsing/brazil_ceara/__init__.py b/ingestion/functions/parsing/brazil_ceara/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/brazil_ceara/ceara.py b/ingestion/functions/parsing/brazil_ceara/ceara.py deleted file mode 100644 index 7645d2ad2..000000000 --- a/ingestion/functions/parsing/brazil_ceara/ceara.py +++ /dev/null @@ -1,239 +0,0 @@ -import json -import os -import sys -from datetime import datetime -import csv - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - -_UUID = "ÿid" -_AGE = "idade" -_GENDER = "sexo" -_MUNICIPALITY = "municipio" -_STATE = "estado" -_DATE_CONFIRMED = "dataNotificacao" -_DATE_SYMPTOMS = "dataInicioSintomas" -_SYMPTOMS = "sintomas" -_HEALTHCARE_PROFESSIONAL = "profissionalSaude" -_COMORBIDITIES = "condicoes" -_TEST_TYPE = "tipoTeste" -_TEST_RESULT = "resultadoTeste" -_OUTCOME = "evolucaoCaso" - -_COMORBIDITIES_MAP = { - "diabetes": "diabetes mellitus", - "gestante": "pregnancy", - "gestante de alto risco": "high risk pregnancy", - "doenças respiratórias crônicas descompensadas": "respiratory system disease", - "doenças renais crônicas": "chronic kidney disease", - "doenças cardíacas crônicas": "heart disease", - "obesidade": "obesity" -} - -_NONE_TYPES = set(["Não", "null", "undefined", None]) - -_SYMPTOMS_MAP = { - "Dor de Cabeça": "headache", - "Distúrbios Gustativos": "taste alteration", - "Distúrbios Olfativos": "smell alteration", - "Dor de Garganta": "throat pain", - "Dispneia": "dyspnea", - "Febre": "fever", - "Tosse": "cough" -} - - -def convert_date(raw_date): - """ - Convert raw date field into a value interpretable by the dataserver. - """ - try: - date = datetime.strptime(raw_date.split("T")[0], "%Y-%m-%d") - return date.strftime("%m/%d/%YZ") - except: - return None - - -def convert_gender(raw_gender: str): - if raw_gender == "Masculino": - return "Male" - if raw_gender == "Feminino": - return "Female" - - -def convert_test(test_type: str): - if test_type not in _NONE_TYPES: - if test_type == "RT-PCR": - return "PCR test" - for i in ["TESTE", "ELISA", "CLIA", "ECLIA"]: - if i in test_type: - return "Serological test" - - -def convert_outcome(outcome: str): - if outcome == "Óbito": - return { - "name": "outcome", - "value": "Death" - } - elif outcome == "Cura": - return { - "name": "outcome", - "value": "Recovered" - } - elif outcome == "Internado em UTI": - return { - "name": "icuAdmission", - "value": "Yes" - } - elif outcome == "Internado": - return { - "name": "hospitalAdmission", - "value": "Yes" - } - - -def convert_events(date_confirmed, date_symptoms, test_type, outcome): - events = [ - { - "name": "confirmed", - "dateRange": { - "start": convert_date(date_confirmed), - "end": convert_date(date_confirmed) - }, - "value": convert_test(test_type) - } - ] - if date_symptoms not in _NONE_TYPES and datetime.strptime(date_symptoms.split("T")[0], "%Y-%m-%d") > datetime.strptime("2019-11-01", "%Y-%m-%d"): - events.append( - { - "name": "onsetSymptoms", - "dateRange": { - "start": convert_date(date_symptoms), - "end": convert_date(date_symptoms) - }, - } - ) - if outcome not in _NONE_TYPES: - events.append( - convert_outcome(outcome) - ) - return events - - -def convert_symptoms(raw_symptoms: str): - values = [] - if raw_symptoms not in _NONE_TYPES: - # Some cases list "Assintomático" with other symptoms e.g. "Assintomático, Tosse, Febre", but these cannot be treated as asymptomatic - if raw_symptoms == "Assintomático": - return {"status": "Asymptomatic"} - else: - for key in _SYMPTOMS_MAP: - if key in raw_symptoms: - values.append(_SYMPTOMS_MAP[key]) - return {"status": "Symptomatic", - "values": values} - - -def convert_preexisting_conditions(raw_comorbidities: str): - preexistingConditions = {} - comorbidities = [] - # Inconsistent use of capitalization means all entries forced to lower case - for key in _COMORBIDITIES_MAP: - if key in raw_comorbidities.lower(): - comorbidities.append(_COMORBIDITIES_MAP[key]) - if comorbidities: - preexistingConditions["hasPreexistingConditions"] = True - preexistingConditions["values"] = comorbidities - return preexistingConditions - else: - return None - - -def convert_demographics(gender: str, age: str, occupation: str): - if gender in _NONE_TYPES and age in _NONE_TYPES and occupation in _NONE_TYPES: - return None - demo = {} - if gender not in _NONE_TYPES: - demo["gender"] = convert_gender(gender) - if age not in _NONE_TYPES and float(age) <= 120.0: - demo["ageRange"] = {"start": float(age), "end": float(age)} - if occupation == "Sim": - demo["occupation"] = "Healthcare worker" - return demo - - -def convert_notes(raw_comorbidities: str, raw_symptoms: str): - raw_notes = [] - if "imunossupressão" in raw_comorbidities.lower(): - raw_notes.append("Patient with immunosuppression") - if "portador de doenças cromossômicas ou estado de fragilidade imunológica" in raw_comorbidities.lower(): - raw_notes.append("Primary immunodeficiency disease or chromosomal disease") - if "puérpera" in raw_comorbidities.lower(): - raw_notes.append("Recently gave birth") - if "Coriza" in raw_symptoms: - raw_notes.append("Patient with coryza") - if "Outros" in raw_symptoms: - raw_notes.append("Other symptoms reported") - notes = (', ').join(raw_notes) - return notes - - -def parse_cases(raw_data_file: str, source_id: str, source_url: str): - """ - Parses G.h-format case data from raw API data. - """ - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f, delimiter=";") - for row in reader: - confirmation_date = convert_date(row[_DATE_CONFIRMED]) - if row[_TEST_RESULT] == "Positivo" and row[_OUTCOME] != "Cancelado" and row[_STATE] == "CEARÁ" and confirmation_date is not None: - try: - case = { - "caseReference": {"sourceId": source_id, "sourceEntryId": row[_UUID], "sourceUrl": source_url}, - "location": { - "query": ", ".join( - [row[_MUNICIPALITY], "Ceará", "Brazil"] - ) - }, - "events": convert_events( - row[_DATE_CONFIRMED], - row[_DATE_SYMPTOMS], - row[_TEST_TYPE], - row[_OUTCOME] - ), - "symptoms": convert_symptoms(row[_SYMPTOMS]), - "demographics": convert_demographics( - row[_GENDER], row[_AGE], row[_HEALTHCARE_PROFESSIONAL] - ), - "preexistingConditions": convert_preexisting_conditions( - row[_COMORBIDITIES] - ) - } - notes = convert_notes( - row[_COMORBIDITIES], row[_SYMPTOMS] - ) - if notes: - case["restrictedNotes"] = notes - yield case - except ValueError as ve: - raise ValueError(f"error converting case: {ve}") - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/brazil_ceara/ceara_test.py b/ingestion/functions/parsing/brazil_ceara/ceara_test.py deleted file mode 100644 index d5b24aced..000000000 --- a/ingestion/functions/parsing/brazil_ceara/ceara_test.py +++ /dev/null @@ -1,68 +0,0 @@ -import os -import unittest - -from brazil_ceara import ceara - -_SOURCE_ID = "abc123" -_SOURCE_URL = "foo.bar" - - -class CearaTest(unittest.TestCase): - def setUp(self): - # Default of 1500 is not enough to show diffs when there is one. - self.maxDiff = 10000 - - def test_parse(self): - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = ceara.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), [ - { - "caseReference": {"sourceId": _SOURCE_ID, "sourceEntryId": "z5OztE51HE", "sourceUrl": _SOURCE_URL}, - "location": { - "query": "Tauá, Ceará, Brazil" - }, - "events": [ - { - "name": "confirmed", - "dateRange": { - "start": "08/10/2020Z", - "end": "08/10/2020Z" - }, - "value": "Serological test" - }, - { - "name": "onsetSymptoms", - "dateRange": { - "start": "08/10/2020Z", - "end": "08/10/2020Z" - } - }, - { - "name": "outcome", - "value": "Recovered" - } - ], - "symptoms": { - "status": "Symptomatic", - "values": ["fever", "cough"] - }, - "demographics": { - "gender": "Female", - "ageRange": { - "start": 71.0, - "end": 71.0 - } - }, - "preexistingConditions": { - "hasPreexistingConditions": True, - "values": [ - "diabetes mellitus", - "respiratory system disease", - "chronic kidney disease" - ] - }, - "restrictedNotes": "Primary immunodeficiency disease or chromosomal disease, Other symptoms reported" - } - ]) diff --git a/ingestion/functions/parsing/brazil_ceara/input_event.json b/ingestion/functions/parsing/brazil_ceara/input_event.json deleted file mode 100644 index 2fe89811a..000000000 --- a/ingestion/functions/parsing/brazil_ceara/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "5fda33f9f3ea0a004de3e26e/2020/12/16/1625/content.csv", - "sourceUrl": "https://s3-sa-east-1.amazonaws.com/ckan.saude.gov.br/dados-ce.csv", - "sourceId": "5fda33f9f3ea0a004de3e26e" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/brazil_ceara/sample_data.csv b/ingestion/functions/parsing/brazil_ceara/sample_data.csv deleted file mode 100644 index e1d2372a5..000000000 --- a/ingestion/functions/parsing/brazil_ceara/sample_data.csv +++ /dev/null @@ -1,2 +0,0 @@ -ÿid;dataNotificacao;dataInicioSintomas;dataNascimento;sintomas;profissionalSaude;cbo;condicoes;estadoTeste;dataTeste;tipoTeste;resultadoTeste;paisOrigem;sexo;estado;estadoIBGE;municipio;municipioIBGE;origem;cnes;estadoNotificacao;estadoNotificacaoIBGE;municipioNotificacao;municipioNotificacaoIBGE;excluido;validado;idade;dataEncerramento;evolucaoCaso;classificacaoFinal -z5OztE51HE;2020-08-10T03:00:08.634Z;2020-08-10T03:00:00.000Z;1949-07-16T03:00:00.000Z;Tosse, Febre, Outros;Não;null;Diabetes, Portador de doenças cromossômicas ou estado de fragilidade imunológica, Doenças renais crônicas em estágio avançado (graus 3, 4 ou 5), Doenças respiratórias crônicas descompensadas;Concluído;2020-09-15T03:00:00.000Z;TESTE RÁPIDO - ANTICORPO;Positivo;undefined;Feminino;CEARÁ;23;Tauá;2313302;undefined;6362869;CEARÁ;23;Parambu;2310308;undefined;undefined;71;2020-09-21T03:00:00.000Z;Cura;Confirmado Laboratorial \ No newline at end of file diff --git a/ingestion/functions/parsing/brazil_distrito_federal/__init__.py b/ingestion/functions/parsing/brazil_distrito_federal/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/brazil_distrito_federal/dictionaries.json b/ingestion/functions/parsing/brazil_distrito_federal/dictionaries.json deleted file mode 100644 index abc696e8c..000000000 --- a/ingestion/functions/parsing/brazil_distrito_federal/dictionaries.json +++ /dev/null @@ -1,143 +0,0 @@ -{ - "comorbidities": { - "Pneumopatia": "lung disease", - "Nefropatia": "kidney disease", - "Distúrbios Metabólicos": "disease of metabolism", - "Obesidade": "obesity", - "Cardiovasculopatia": "cardiovascular system disease" - }, - "admin_districts": { - "Plano Piloto": { - "latitude": -15.7939, - "longitude": -47.8828 - }, - "Gama": { - "latitude": -16.0194, - "longitude": -48.0669 - }, - "Taguatinga": { - "latitude": -15.8333, - "longitude": -48.0564 - }, - "Brazlândia": { - "latitude": -15.675, - "longitude": -48.2008 - }, - "Sobradinho": { - "latitude": -15.6531, - "longitude": -47.7914 - }, - "Planaltina": { - "latitude": -15.6192, - "longitude": -47.6525 - }, - "Paranoá": { - "latitude": -15.7686, - "longitude": -47.7797 - }, - "Núcleo Bandeirante": { - "latitude": -15.87, - "longitude": -47.9678 - }, - "Ceilândia": { - "latitude": -15.8192, - "longitude": -48.1083 - }, - "Guará": { - "latitude": -15.8256, - "longitude": -47.98 - }, - "Cruzeiro": { - "latitude": -15.7908, - "longitude": -47.9372 - }, - "Samambaia": { - "latitude": -15.8761, - "longitude": -48.0886 - }, - "Santa Maria": { - "latitude": -16.0153, - "longitude": -48.0131 - }, - "São Sebastião": { - "latitude": -15.9006, - "longitude": -47.7794 - }, - "Recanto das Emas": { - "latitude": -15.9081, - "longitude": -48.0731 - }, - "Lago Sul": { - "latitude": -15.8428, - "longitude": -47.8778 - }, - "Riacho Fundo": { - "latitude": -15.8833, - "longitude": -48.0175 - }, - "Lago Norte": { - "latitude": -15.7386, - "longitude": -47.8594 - }, - "Candangolândia": { - "latitude": -15.8544, - "longitude": -47.95 - }, - "Águas Claras": { - "latitude": -15.8403, - "longitude": -48.0278 - }, - "Riacho Fundo II": { - "latitude": -15.8954, - "longitude": -48.0494 - }, - "Sudoeste/Octogonal": { - "latitude": -15.8055, - "longitude": -47.9429 - }, - "Varjão": { - "latitude": -15.7097, - "longitude": -47.8789 - }, - "Park Way": { - "latitude": -15.9070, - "longitude": -47.9647 - }, - "SCIA": { - "latitude": -15.7875, - "longitude": -47.9786 - }, - "Sobradinho II": { - "latitude": -15.6549, - "longitude": -47.7931 - }, - "Jardim Botânico": { - "latitude": -15.8667, - "longitude": -47.7892 - }, - "Itapoã": { - "latitude": -15.7483, - "longitude": -47.7689 - }, - "SIA": { - "latitude": -15.8011, - "longitude": -47.9506 - }, - "Vicente Pires": { - "latitude": -15.8033, - "longitude": -48.03 - }, - "Fercal": { - "latitude": -15.6028, - "longitude": -47.8708 - }, - "Pôr do Sol": { - "latitude": -15.8553, - "longitude": -48.1113 - }, - "Arniqueira": { - "latitude": -15.8579, - "longitude": -48.0046 - } - } -} \ No newline at end of file diff --git a/ingestion/functions/parsing/brazil_distrito_federal/distrito_federal.py b/ingestion/functions/parsing/brazil_distrito_federal/distrito_federal.py deleted file mode 100644 index 067ce048b..000000000 --- a/ingestion/functions/parsing/brazil_distrito_federal/distrito_federal.py +++ /dev/null @@ -1,224 +0,0 @@ -import os -import sys -from datetime import datetime -import csv -import json -import common.ingestion_logging as logging - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - -logger = logging.getLogger(__name__) - -_AGE = "Faixa Etária" -_GENDER = "Sexo" -_MUNICIPALITY = "RA" -# UF stands for Unidade Federada which is the same as State -_STATE = "UF" -_DATE_CONFIRMED = "Data Cadastro" -_DATE_SYMPTOMS = "dataPrimeirosintomas" -_DEATH = "Óbito" -_LUNG = "Pneumopatia" -_KIDNEY = "Nefropatia" -_HEMATOLOGIC = "Doença Hematológica" -_METABOLIC = "Distúrbios Metabólicos" -_IMMUNOSUPPRESSED = "Imunopressão" -_OBESITY = "Obesidade" -_OTHERS = "Outros" -_CARDIOVASCULAR = "Cardiovasculopatia" - - -with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "dictionaries.json")) as json_file: - dictionaries = json.load(json_file) - -_COMORBIDITIES_MAP = dictionaries["comorbidities"] - -_ADMINISTRATIVE_DISTRICTS_MAP = dictionaries["admin_districts"] - - -def convert_date(raw_date): - """ - Convert raw date field into a value interpretable by the dataserver. - """ - # Some date fields are empty - try: - # There is variation in how dates are reported - if "-" in raw_date: - date = datetime.strptime(raw_date, "%Y-%m-%d") - else: - date = datetime.strptime(raw_date, "%d/%m/%Y") - return date.strftime("%m/%d/%YZ") - except: - return None - - -def convert_gender(raw_gender: str): - if raw_gender == "Masculino": - return "Male" - if raw_gender == "Feminino": - return "Female" - - -def convert_events(date_confirmed, date_symptoms, death): - """There is no date of death""" - events = [ - { - "name": "confirmed", - "dateRange": { - "start": convert_date(date_confirmed), - "end": convert_date(date_confirmed), - }, - } - ] - if date_symptoms: - events.append( - { - "name": "onsetSymptoms", - "dateRange": { - "start": convert_date(date_symptoms), - "end": convert_date(date_symptoms), - }, - } - ) - if death == "Sim": - events.append( - { - "name": "outcome", - "value": "Death", - } - ) - return events - - -def convert_preexisting_conditions(lung: str, kidney: str, metabolic: str, - cardiovascular: str, obesity: str): - preexistingConditions = {} - comorbidities = [] - - if lung == "Sim": - comorbidities.append(_COMORBIDITIES_MAP["Pneumopatia"]) - if kidney == "Sim": - comorbidities.append(_COMORBIDITIES_MAP["Nefropatia"]) - if metabolic == "Sim": - comorbidities.append(_COMORBIDITIES_MAP["Distúrbios Metabólicos"]) - if cardiovascular == "Sim": - comorbidities.append(_COMORBIDITIES_MAP["Cardiovasculopatia"]) - if obesity == "Sim": - comorbidities.append(_COMORBIDITIES_MAP["Obesidade"]) - - if comorbidities: - preexistingConditions["hasPreexistingConditions"] = True - preexistingConditions["values"] = comorbidities - return preexistingConditions - else: - return None - - -def convert_demographics(gender: str, age: str): - if not any((gender, age)): - return None - demo = {} - if gender: - demo["gender"] = convert_gender(gender) - if age: - if age == ">= 60 anos": - demo["ageRange"] = {"start": 60, "end": 120} - # No age resolution provided below 19 years - elif age == "<= 19 anos": - demo["ageRange"] = {"start": 0, "end": 19} - else: - # Age in format '20 a 29 anos' - age_range = age.partition(" a ") - demo["ageRange"] = {"start": float(age_range[0]), "end": float("".join([i for i in age_range[2] if not i.isalpha()]))} - return demo - - -def convert_notes(hematologic: str, immunosuppressed: str, other: str): - raw_notes = [] - if immunosuppressed == "Sim": - raw_notes.append("Patient with immunosuppression") - if hematologic == "Sim": - raw_notes.append("Hematologic disease") - if other == "Sim": - raw_notes.append("Unspecified pre-existing condition") - - if raw_notes: - return (", ").join(raw_notes) - - -def convert_location(municipality: str): - location = {} - geometry = {} - if municipality and municipality in _ADMINISTRATIVE_DISTRICTS_MAP.keys(): - location["place"] = municipality - location["country"] = "Brazil" - location["administrativeAreaLevel1"] = "Distrito Federal" - location["geoResolution"] = "Point" - location["name"] = str(municipality + ", Distrito Federal, Brazil") - - geometry["latitude"] = _ADMINISTRATIVE_DISTRICTS_MAP[municipality]["latitude"] - geometry["longitude"] = _ADMINISTRATIVE_DISTRICTS_MAP[municipality]["longitude"] - location["geometry"] = geometry - else: - # In local testing the only unknown administrative districts were empty entries, 'Entorno DF' (== Surroundings of Distrito Federal), and 'Sistema Penitenciário' (== Penitenciary system) - logger.warning(f'Unknown administrative district: {municipality}') - location["query"] = "Distrito Federal, Brazil" - if location: - return location - else: - return None - - -def parse_cases(raw_data_file: str, source_id: str, source_url: str): - """ - Parses G.h-format case data from raw API data. - """ - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f, delimiter=";") - for row in reader: - confirmed_date = convert_date(row[_DATE_CONFIRMED]) - # There are a few entries for other states - if row[_STATE] == "DISTRITO FEDERAL" and confirmed_date is not None: - try: - case = { - "caseReference": {"sourceId": source_id, "sourceUrl": source_url}, - "location": convert_location(row[_MUNICIPALITY]), - "events": convert_events( - row[_DATE_CONFIRMED], - row[_DATE_SYMPTOMS], - row[_DEATH] - ), - "demographics": convert_demographics( - row[_GENDER], row[_AGE] - ), - } - case["preexistingConditions"] = convert_preexisting_conditions( - row[_LUNG], row[_KIDNEY], row[_METABOLIC], row[_CARDIOVASCULAR], row[_OBESITY] - ) - notes = convert_notes( - row[_HEMATOLOGIC], row[_IMMUNOSUPPRESSED], row[_OTHERS] - ) - if notes: - case["restrictedNotes"] = notes - yield case - except ValueError as ve: - raise ValueError(f"error converting case: {ve}") - - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/brazil_distrito_federal/distrito_federal_test.py b/ingestion/functions/parsing/brazil_distrito_federal/distrito_federal_test.py deleted file mode 100644 index fabc6d8cb..000000000 --- a/ingestion/functions/parsing/brazil_distrito_federal/distrito_federal_test.py +++ /dev/null @@ -1,52 +0,0 @@ -import os -import unittest -from brazil_distrito_federal import distrito_federal - -_SOURCE_ID = "abc123" -_SOURCE_URL = "https://covid19.ssp.df.gov.br/resources/dados/dados-abertos.csv?param=[random]" -_PARSED_CASE = ({ - "caseReference": { - "sourceId": "abc123", - "sourceUrl": "https://covid19.ssp.df.gov.br/resources/dados/dados-abertos.csv?param=[random]", - }, - "location": { - "place": "Lago Sul", - "country": "Brazil", - "administrativeAreaLevel1": "Distrito Federal", - "geoResolution": "Point", - "name": "Lago Sul, Distrito Federal, Brazil", - "geometry": { - "latitude": -15.8428, - "longitude": -47.8778 - } - }, - "events": [ - { - "name": "confirmed", - "dateRange": {"start": "03/18/2020Z", "end": "03/18/2020Z"}, - }, - { - "name": "onsetSymptoms", - "dateRange": {"start": "02/26/2020Z", "end": "02/26/2020Z"}, - } - ], - "demographics": { - "gender": "Female", - "ageRange": {"start": 50.0, "end": 59.0} - }, - "preexistingConditions": {"hasPreexistingConditions": True, "values": ["disease of metabolism", "obesity"]}, - "restrictedNotes": "Patient with immunosuppression", -}) - - -class DFTest(unittest.TestCase): - def test_parse(self): - # Default of 1500 is not enough to show diffs when there is one. - self.maxDiff = 5000 - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = next( - distrito_federal.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - ) - self.assertCountEqual([result], [_PARSED_CASE]) \ No newline at end of file diff --git a/ingestion/functions/parsing/brazil_distrito_federal/input_event.json b/ingestion/functions/parsing/brazil_distrito_federal/input_event.json deleted file mode 100644 index 6f8e76e40..000000000 --- a/ingestion/functions/parsing/brazil_distrito_federal/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "5ff34f6a5556a3004c58a270/2021/01/04/1729/content.csv", - "sourceUrl": "https://covid19.ssp.df.gov.br/resources/dados/dados-abertos.csv", - "sourceId": "5ff34f6a5556a3004c58a270" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/brazil_distrito_federal/sample_data.csv b/ingestion/functions/parsing/brazil_distrito_federal/sample_data.csv deleted file mode 100644 index 2d1100796..000000000 --- a/ingestion/functions/parsing/brazil_distrito_federal/sample_data.csv +++ /dev/null @@ -1,3 +0,0 @@ -Data;Data Cadastro;Sexo;Faixa Etária;RA;UF;Óbito;dataPrimeirosintomas;Pneumopatia;Nefropatia;Doença Hematológica;Distúrbios Metabólicos;Imunopressão;Obesidade;Outros;Cardiovasculopatia -24/09/2020;2020-03-18;Feminino;50 a 59 anos;Lago Sul;DISTRITO FEDERAL;Não;26/02/2020;Não;Não;Não;Sim;Sim;Sim;Não;Não -08/12/2020;;Feminino;20 a 29 anos;Gama;DISTRITO FEDERAL;Não;12/06/2020;;;;;;;; \ No newline at end of file diff --git a/ingestion/functions/parsing/brazil_espirito_santo/__init__.py b/ingestion/functions/parsing/brazil_espirito_santo/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/brazil_espirito_santo/espirito_santo.py b/ingestion/functions/parsing/brazil_espirito_santo/espirito_santo.py deleted file mode 100644 index 0b0e743a7..000000000 --- a/ingestion/functions/parsing/brazil_espirito_santo/espirito_santo.py +++ /dev/null @@ -1,326 +0,0 @@ -import json -import os -import sys -from datetime import datetime -import csv - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - -_AGE = "FaixaEtaria" -_GENDER = "Sexo" -_MUNICIPALITY = "Municipio" -_DATE_CONFIRMED = "DataNotificacao" -_DATE_DEATH = "DataObito" -_CLASSIFICATION = "Classificacao" -_OUTCOME = "Evolucao" -_LUNG = "ComorbidadePulmao" -_KIDNEY = "ComorbidadeRenal" -_DIABETES = "ComorbidadeDiabetes" -_OBESITY = "ComorbidadeObesidade" -_CARDIOVASCULAR = "ComorbidadeCardio" -_SMOKER = "ComorbidadeTabagismo" -_PCR = "DataColeta_RT_PCR" -_SEROLOGICAL_METHOD1 = "DataColetaTesteRapido" -_SEROLOGICAL_METHOD2 = "DataColetaSorologia" -_SEROLOGICAL_METHOD3 = "DataColetaSorologiaIGG" -_TEST_CLASS = "CriterioConfirmacao" -_ETHNICITY = "RacaCor" -_NEIGHBOURHOOD = "Bairro" -_FEVER = "Febre" -_DIFFICULTY_BREATHING = "DificuldadeRespiratoria" -_COUGH = "Tosse" -_SORE_THROAT = "DorGarganta" -_DIARRHOEA = "Diarreia" -_HEADACHE = "Cefaleia" -_CORYZA = "Coriza" -_HOSPITALIZED = "FicouInternado" -_INTERNAL_TRAVEL = "ViagemBrasil" -_INTERNATIONAL_TRAVEL = "ViagemInternacional" -_HEALTHCARE_PROFESSIONAL = "ProfissionalSaude" -_HOMELESS = "MoradorDeRua" -_DISABILITY = "PossuiDeficiencia" -_SCHOOLING = "Escolaridade" - - -_COMORBIDITIES_MAP = { - "ComorbidadePulmao": "lung disease", - "ComorbidadeRenal": "kidney disease", - "ComorbidadeDiabetes": "diabetes mellitus", - "ComorbidadeObesidade": "obesity", - "ComorbidadeCardio": "cardiovascular system disease" -} - - -_EDUCATION_MAP = { - "1ª a 4ª série incompleta do EF (antigo primário ou 1º grau)": "First four years of elementary school not completed", - "Ensino fundamental completo (antigo ginásio ou 1º grau) ": "Elementary school completed", - "Ensino médio completo (antigo colegial ou 2º grau ) ": "High school completed", - "5ª à 8ª série incompleta do EF (antigo ginásio ou 1º grau)": "Years 5 to 8 of elementary school not completed", - "Ensino médio incompleto (antigo colegial ou 2º grau )": "High school not completed", - "Educação superior incompleta ": "Higher education not completed", - "Educação superior completa": "Higher education completed", - "Analfabeto": "Analphabet", - "4ª série completa do EF (antigo primário ou 1º grau)": "Fourth year of elementary school completed" -} - - -_NONE_TYPES = set(["Não", "Ignorado", "-", "Não Informado", "Não se aplica", None]) - - -_SYMPTOMS_MAP = { - "Cefaleia": "headache", - "DorGarganta": "throat pain", - "Febre": "fever", - "Tosse": "cough", - "Diarreia": "diarrhoea", - "DificuldadeRespiratoria": "dyspnea" -} - - -def convert_date(raw_date): - """ - Convert raw date field into a value interpretable by the dataserver. - """ - if raw_date: - date = datetime.strptime(raw_date, "%Y-%m-%d") - return date.strftime("%m/%d/%YZ") - - -def convert_gender(raw_gender: str): - if raw_gender == "M": - return "Male" - if raw_gender == "F": - return "Female" - - -def convert_events(date_confirmed, pcr, serological_method1, serological_method2, serological_method3, test_class, outcome, date_death, hospitalized): - events = [ - { - "name": "confirmed", - "dateRange": { - "start": convert_date(date_confirmed), - "end": convert_date(date_confirmed) - }, - "value": convert_test(pcr, serological_method1, serological_method2, serological_method3, test_class) - } - ] - if hospitalized == "Sim": - events.append( - { - "name": "hospitalAdmission", - "value": "Yes" - } - ) - if "Óbito" in outcome: - events.append( - { - "name": "outcome", - "dateRange": { - "start": convert_date(date_death), - "end": convert_date(date_death) - }, - "value": "Death", - } - ) - if "Cura" in outcome: - events.append( - { - "name": "outcome", - "value": "Recovered", - } - ) - return events - - -def convert_test(pcr: str, serological_method1: str, serological_method2: str, serological_method3: str, test_class: str): - items = (serological_method1, serological_method2, serological_method3) - if pcr: - return "PCR test" - elif any(item not in _NONE_TYPES for item in items): - return "Serological test" - elif "Clinico" in test_class: - return "Clinical diagnosis" - - -def convert_preexisting_conditions(lung: str, kidney: str, diabetes: str, - cardiovascular: str, obesity: str): - preexistingConditions = {} - comorbidities = [] - - if lung == "Sim": - comorbidities.append(_COMORBIDITIES_MAP["ComorbidadePulmao"]) - if kidney == "Sim": - comorbidities.append(_COMORBIDITIES_MAP["ComorbidadeRenal"]) - if diabetes == "Sim": - comorbidities.append(_COMORBIDITIES_MAP["ComorbidadeDiabetes"]) - if cardiovascular == "Sim": - comorbidities.append(_COMORBIDITIES_MAP["ComorbidadeCardio"]) - if obesity == "Sim": - comorbidities.append(_COMORBIDITIES_MAP["ComorbidadeObesidade"]) - - if comorbidities: - preexistingConditions["hasPreexistingConditions"] = True - preexistingConditions["values"] = comorbidities - return preexistingConditions - else: - return None - - -def convert_symptoms(headache: str, throat: str, fever: str, cough: str, diarrhoea: str, dyspnea: str): - symptoms = {} - items = (headache, throat, fever, cough, diarrhoea, dyspnea) - if all(item in _NONE_TYPES for item in items): - return None - - symptoms["status"] = "Symptomatic" - values = [] - - if headache == "Sim": - values.append(_SYMPTOMS_MAP["Cefaleia"]) - if throat == "Sim": - values.append(_SYMPTOMS_MAP["DorGarganta"]) - if fever == "Sim": - values.append(_SYMPTOMS_MAP["Febre"]) - if cough == "Sim": - values.append(_SYMPTOMS_MAP["Tosse"]) - if diarrhoea == "Sim": - values.append(_SYMPTOMS_MAP["Diarreia"]) - if dyspnea == "Sim": - values.append(_SYMPTOMS_MAP["DificuldadeRespiratoria"]) - - if values: - symptoms["values"] = values - - return symptoms - - -def convert_ethnicity(ethnicity: str): - if ethnicity == "Preta": - return "Black" - elif ethnicity == "Parda": - return "Mixed" - elif ethnicity == "Amarela": - return "Asian" - elif ethnicity == "Branca": - return "White" - elif ethnicity == "Indigena": - return "Indigenous" - - -def convert_demographics(gender: str, age: str, ethnicity: str, healthcare_professional: str): - demo = {} - if gender: - demo["gender"] = convert_gender(gender) - if age not in _NONE_TYPES: - if age == "90 anos ou mais": - demo["ageRange"] = {"start": 90, "end": 120} - else: - # Age in format '20 a 29 anos', except for '05 a 9 anos' which has a leading 0 - age_range = age.partition(" a ") - demo["ageRange"] = {"start": float(age_range[0]), "end": float(age_range[2][:2])} - if ethnicity: - demo["ethnicity"] = convert_ethnicity(ethnicity) - if healthcare_professional == "Sim": - demo["occupation"] = "Healthcare worker" - return demo - - -def convert_notes(coryza: str, smoker: str, homeless: str, neighbourhood: str, disability: str, national_travel: str, international_travel: str, education: str): - raw_notes = [] - if coryza == "Sim": - raw_notes.append("Patient with coryza") - if smoker == "Sim": - raw_notes.append("Smoker") - if homeless == "Sim": - raw_notes.append("Patient is homeless") - if neighbourhood not in _NONE_TYPES: - raw_notes.append("Neighbourhood: " + neighbourhood) - if disability == "Sim": - raw_notes.append("Patient with disability") - if national_travel == "Sim": - raw_notes.append("National travel indicated") - if international_travel == "Sim": - raw_notes.append("International travel indicated") - for key in _EDUCATION_MAP: - if key in education: - raw_notes.append(_EDUCATION_MAP[key]) - if raw_notes: - return (", ").join(raw_notes) - - -def parse_cases(raw_data_file: str, source_id: str, source_url: str): - """ - Parses G.h-format case data from raw API data. - """ - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f, delimiter=";") - for row in reader: - if row[_CLASSIFICATION] == "Confirmados": - try: - case = { - "caseReference": {"sourceId": source_id, "sourceUrl": source_url}, - "location": { - "query": ", ".join( - [row[_MUNICIPALITY], "Espirito Santo", "Brazil"] - ) - }, - "events": convert_events( - row[_DATE_CONFIRMED], - row[_PCR], - row[_SEROLOGICAL_METHOD1], - row[_SEROLOGICAL_METHOD2], - row[_SEROLOGICAL_METHOD3], - row[_TEST_CLASS], - row[_OUTCOME], - row[_DATE_DEATH], - row[_HOSPITALIZED] - ), - "symptoms": convert_symptoms( - row[_HEADACHE], - row[_SORE_THROAT], - row[_FEVER], - row[_COUGH], - row[_DIARRHOEA], - row[_DIFFICULTY_BREATHING] - ), - "demographics": convert_demographics( - row[_GENDER], row[_AGE], row[_ETHNICITY], row[_HEALTHCARE_PROFESSIONAL] - ), - } - case["preexistingConditions"] = convert_preexisting_conditions( - row[_LUNG], row[_KIDNEY], row[_DIABETES], row[_CARDIOVASCULAR], row[_OBESITY] - ) - notes = convert_notes( - row[_CORYZA], - row[_SMOKER], - row[_HOMELESS], - row[_NEIGHBOURHOOD], - row[_DISABILITY], - row[_INTERNAL_TRAVEL], - row[_INTERNATIONAL_TRAVEL], - row[_SCHOOLING] - ) - if notes: - case["restrictedNotes"] = notes - yield case - except ValueError as ve: - raise ValueError(f"error converting case: {ve}") - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) \ No newline at end of file diff --git a/ingestion/functions/parsing/brazil_espirito_santo/espirito_santo_test.py b/ingestion/functions/parsing/brazil_espirito_santo/espirito_santo_test.py deleted file mode 100644 index d8a70aa9b..000000000 --- a/ingestion/functions/parsing/brazil_espirito_santo/espirito_santo_test.py +++ /dev/null @@ -1,90 +0,0 @@ -import os -import unittest - -from brazil_espirito_santo import espirito_santo - -_SOURCE_ID = "abc123" -_SOURCE_URL = "foo.bar" - - -class EspiritoSantoTest(unittest.TestCase): - def setUp(self): - # Default of 1500 is not enough to show diffs when there is one. - self.maxDiff = 10000 - - def test_parse(self): - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = espirito_santo.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), [ - { - "caseReference": {"sourceId": _SOURCE_ID, "sourceUrl": _SOURCE_URL}, - "location": { - "query": "SERRA, Espirito Santo, Brazil" - }, - "events": [ - { - "name": "confirmed", - "dateRange": { - "start": "10/27/2020Z", - "end": "10/27/2020Z" - }, - "value": "Serological test" - }, - { - "name": "outcome", - "value": "Recovered" - } - ], - "symptoms": { - "status": "Symptomatic", - "values": [ - "headache", "fever", "cough", "diarrhoea" - ] - }, - "demographics": { - "gender": "Female", - "ageRange": { - "start": 5.0, - "end": 9.0 - }, - "ethnicity": "Asian" - }, - "preexistingConditions": { - "hasPreexistingConditions": True, - "values": [ - "lung disease" - ] - }, - "restrictedNotes": "Neighbourhood: JARDIM CARAPINA, First four years of elementary school not completed" - }, - { - "caseReference": {"sourceId": _SOURCE_ID, "sourceUrl": _SOURCE_URL}, - "location": { - "query": "RIO NOVO DO SUL, Espirito Santo, Brazil" - }, - "events": [ - { - "name": "confirmed", - "dateRange": { - "start": "10/29/2020Z", - "end": "10/29/2020Z" - }, - "value": "Serological test" - } - ], - "symptoms": { - "status": "Symptomatic", - "values": [ - "headache", "diarrhoea" - ] - }, - "demographics": { - "gender": "Female", - "ethnicity": "White" - }, - "preexistingConditions": None, - "restrictedNotes": "Neighbourhood: CENTRO, Elementary school completed" - } - ]) diff --git a/ingestion/functions/parsing/brazil_espirito_santo/input_event.json b/ingestion/functions/parsing/brazil_espirito_santo/input_event.json deleted file mode 100644 index 22d4a9415..000000000 --- a/ingestion/functions/parsing/brazil_espirito_santo/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "5f9c06e8c83590004ccd9c43/2020/10/30/1311/content.csv", - "sourceUrl": "https://bi.static.es.gov.br/covid19/MICRODADOS.csv", - "sourceId": "5f9c06e8c83590004ccd9c43" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/brazil_espirito_santo/sample_data.csv b/ingestion/functions/parsing/brazil_espirito_santo/sample_data.csv deleted file mode 100644 index 1ea0acbf8..000000000 --- a/ingestion/functions/parsing/brazil_espirito_santo/sample_data.csv +++ /dev/null @@ -1,3 +0,0 @@ -DataNotificacao;DataCadastro;DataDiagnostico;DataColeta_RT_PCR;DataColetaTesteRapido;DataColetaSorologia;DataColetaSorologiaIGG;DataEncerramento;DataObito;Classificacao;Evolucao;CriterioConfirmacao;StatusNotificacao;Municipio;Bairro;FaixaEtaria;IdadeNaDataNotificacao;Sexo;RacaCor;Escolaridade;Febre;DificuldadeRespiratoria;Tosse;Coriza;DorGarganta;Diarreia;Cefaleia;ComorbidadePulmao;ComorbidadeCardio;ComorbidadeRenal;ComorbidadeDiabetes;ComorbidadeTabagismo;ComorbidadeObesidade;FicouInternado;ViagemBrasil;ViagemInternacional;ProfissionalSaude;PossuiDeficiencia;MoradorDeRua;ResultadoRT_PCR;ResultadoTesteRapido;ResultadoSorologia;ResultadoSorologia_IGG -2020-10-27;2020-10-27;2020-10-18;;2020-10-27;;;2020-10-27;;Confirmados;Cura;Laboratorial;Encerrado;SERRA;JARDIM CARAPINA;05 a 9 anos;7 anos, 2 meses, 17 dias;F;Amarela;1ª a 4ª série incompleta do EF (antigo primário ou 1º grau);Sim;Não;Sim;Não;Não;Sim;Sim;Sim;Não;Não;Não;Não;Não;Não;Não;Não Informado;Não;Não;Não;Não Informado;Positivo;Não Informado;Não Informado -2020-10-29;2020-10-29;2020-10-20;;2020-10-29;;;;;Confirmados;-;Laboratorial;Em Aberto;RIO NOVO DO SUL;CENTRO;-;39 anos, 3 meses, 25 dias;F;Branca;Ensino fundamental completo (antigo ginásio ou 1º grau) ;Não;Não;Não;Não;Não;Sim;Sim;Não;Não;Não;Não;Não;Não;Não;Não;Não;Não;Não;Não;Não Informado;Positivo;Não Informado;Não Informado \ No newline at end of file diff --git a/ingestion/functions/parsing/brazil_goias/__init__.py b/ingestion/functions/parsing/brazil_goias/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/brazil_goias/goias.py b/ingestion/functions/parsing/brazil_goias/goias.py deleted file mode 100644 index 723719513..000000000 --- a/ingestion/functions/parsing/brazil_goias/goias.py +++ /dev/null @@ -1,196 +0,0 @@ -import json -import os -import sys -from datetime import datetime -import csv - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - -_AGE = "faixa_etaria" -_GENDER = "sexo" -_MUNICIPALITY = "municipio" -_DATE_CONFIRMED = "data_notificacao" -_DATE_SYMPTOMS = "data_inicio_sintomas" -_RECOVERED = "recuperado" -_ETHNICITY = "raca_cor" -_DIABETES = "diabetes" -_LUNG = "doenca_respiratoria" -_IMMUNOSUPPRESSED = "imunossupressao" -_CARDIOVASCULAR = "doenca_cardiovascular" - -_COMORBIDITIES_MAP = { - "doenca_respiratoria": "lung disease", - "doenca_cardiovascular": "cardiovascular system disease", - "diabetes": "diabetes mellitus" -} - - -def convert_date(raw_date): - """ - Convert raw date field into a value interpretable by the dataserver. - """ - date = datetime.strptime(raw_date, "%Y%m%d") - return date.strftime("%m/%d/%YZ") - - -def convert_gender(raw_gender: str): - if raw_gender == "MASCULINO": - return "Male" - if raw_gender == "FEMININO": - return "Female" - - -def convert_events(date_confirmed, date_symptoms, recovered): - events = [ - { - "name": "confirmed", - "dateRange": { - "start": convert_date(date_confirmed), - "end": convert_date(date_confirmed), - }, - } - ] - if date_symptoms: - events.append( - { - "name": "onsetSymptoms", - "dateRange": { - "start": convert_date(date_symptoms), - "end": convert_date(date_symptoms), - }, - } - ) - if recovered == "SIM": - events.append( - { - "name": "outcome", - "value": "Recovered", - } - ) - return events - - -def convert_preexisting_conditions(lung: str, cardiovascular: str, diabetes: str): - preexistingConditions = {} - items = (lung, cardiovascular, diabetes) - if all(item == "NAO" for item in items): - return None - - preexistingConditions["hasPreexistingConditions"] = True - comorbidities = [] - - if lung == "SIM": - comorbidities.append(_COMORBIDITIES_MAP["doenca_respiratoria"]) - if cardiovascular == "SIM": - comorbidities.append(_COMORBIDITIES_MAP["doenca_cardiovascular"]) - if diabetes == "SIM": - comorbidities.append(_COMORBIDITIES_MAP["diabetes"]) - - if comorbidities: - preexistingConditions["values"] = comorbidities - - return preexistingConditions - - -def convert_ethnicity(ethnicity: str): - if ethnicity == "PRETA": - return "Black" - elif ethnicity == "PARDA": - return "Mixed" - elif ethnicity == "AMARELA": - return "Asian" - elif ethnicity == "BRANCA": - return "White" - elif ethnicity == "INDIGENA": - return "Indigenous" - - -def convert_demographics(gender: str, age: str, ethnicity: str): - if not any((gender, age, ethnicity)): - return None - demo = {} - if gender: - demo["gender"] = convert_gender(gender) - if age: - if age == ">= 80 anos": - demo["ageRange"] = {"start": 80, "end": 120} - # No age resolution provided below 10 years - elif age == "< 10 anos": - demo["ageRange"] = {"start": 0, "end": 9} - else: - # Age in format '20 a 29 anos' - age_range = age.partition(" a ") - demo["ageRange"] = {"start": float(age_range[0]), "end": float(age_range[2][:2])} - if ethnicity: - demo["ethnicity"] = convert_ethnicity(ethnicity) - return demo - - -def convert_notes(immunosuppressed: str): - raw_notes = [] - if immunosuppressed == "SIM": - raw_notes.append("Patient with immunosuppression") - - if raw_notes: - return (", ").join(raw_notes) - - -def parse_cases(raw_data_file: str, source_id: str, source_url: str): - """ - Parses G.h-format case data from raw API data. - """ - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f, delimiter=";") - for row in reader: - try: - case = { - "caseReference": {"sourceId": source_id, "sourceUrl": source_url}, - "location": { - "query": ", ".join( - [row[_MUNICIPALITY], "Goiás", "Brazil"] - ) - }, - "events": convert_events( - row[_DATE_CONFIRMED], - row[_DATE_SYMPTOMS], - row[_RECOVERED] - ), - "demographics": convert_demographics( - row[_GENDER], - row[_AGE], - row[_ETHNICITY] - ), - } - case["preexistingConditions"] = convert_preexisting_conditions( - row[_LUNG], - row[_CARDIOVASCULAR], - row[_DIABETES] - ) - notes = convert_notes( - row[_IMMUNOSUPPRESSED] - ) - if notes: - case["restrictedNotes"] = notes - yield case - except ValueError as ve: - raise ValueError(f"error converting case: {ve}") - - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/brazil_goias/goias_test.py b/ingestion/functions/parsing/brazil_goias/goias_test.py deleted file mode 100644 index 6f7f22f60..000000000 --- a/ingestion/functions/parsing/brazil_goias/goias_test.py +++ /dev/null @@ -1,46 +0,0 @@ -import os -import unittest -from brazil_goias import goias - -_SOURCE_ID = "abc123" -_SOURCE_URL = "http://datasets.saude.go.gov.br/coronavirus/casos_confirmados.csv" -_PARSED_CASE = ({ - "caseReference": { - "sourceId": "abc123", - "sourceUrl": "http://datasets.saude.go.gov.br/coronavirus/casos_confirmados.csv", - }, - "location": {"query": "APARECIDA DE GOIANIA, Goiás, Brazil"}, - "events": [ - { - "name": "confirmed", - "dateRange": {"start": "07/18/2020Z", "end": "07/18/2020Z"}, - }, - { - "name": "onsetSymptoms", - "dateRange": {"start": "07/12/2020Z", "end": "07/12/2020Z"}, - }, - { - "name": "outcome", - "value": "Recovered" - } - ], - "demographics": { - "gender": "Female", - "ageRange": {"start": 20.0, "end": 29.0}, - "ethnicity": "Mixed" - }, - "preexistingConditions": {"hasPreexistingConditions": True, "values": ["cardiovascular system disease", "diabetes mellitus"]} -}) - - -class GoiasTest(unittest.TestCase): - def test_parse(self): - # Default of 1500 is not enough to show diffs when there is one. - self.maxDiff = 5000 - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = next( - goias.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - ) - self.assertCountEqual([result], [_PARSED_CASE]) \ No newline at end of file diff --git a/ingestion/functions/parsing/brazil_goias/input_event.json b/ingestion/functions/parsing/brazil_goias/input_event.json deleted file mode 100644 index 6ecd43f62..000000000 --- a/ingestion/functions/parsing/brazil_goias/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "5f7dfafa75d469002ffdd0ac/2020/10/07/1733/content.csv", - "sourceUrl": "http://datasets.saude.go.gov.br/coronavirus/casos_confirmados.csv", - "sourceId": "5f7dfafa75d469002ffdd0ac" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/brazil_goias/sample_data.csv b/ingestion/functions/parsing/brazil_goias/sample_data.csv deleted file mode 100644 index efd17e239..000000000 --- a/ingestion/functions/parsing/brazil_goias/sample_data.csv +++ /dev/null @@ -1,2 +0,0 @@ -data_notificacao;data_inicio_sintomas;ano_epi;semana_epi;sexo;raca_cor;faixa_etaria;diabetes;doenca_cardiovascular;doenca_respiratoria;imunossupressao;codigo_ibge;municipio;regiao_saude;recuperado -20200718;20200712;2020;29;FEMININO;PARDA;20 a 29 anos;SIM;SIM;NAO;NAO;520140;APARECIDA DE GOIANIA;CENTRO SUL;SIM diff --git a/ingestion/functions/parsing/brazil_para/__init__.py b/ingestion/functions/parsing/brazil_para/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/brazil_para/input_event.json b/ingestion/functions/parsing/brazil_para/input_event.json deleted file mode 100644 index 0f240b389..000000000 --- a/ingestion/functions/parsing/brazil_para/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "5fbfbac62fd76800392dd1a7/2020/11/26/1428/content.csv", - "sourceUrl": "https://s3-sa-east-1.amazonaws.com/ckan.saude.gov.br/dados-pa.csv", - "sourceId": "5fbfbac62fd76800392dd1a7" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/brazil_para/para.py b/ingestion/functions/parsing/brazil_para/para.py deleted file mode 100644 index bfe1af9ac..000000000 --- a/ingestion/functions/parsing/brazil_para/para.py +++ /dev/null @@ -1,248 +0,0 @@ -import json -import os -import sys -from datetime import datetime -import csv - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - -_UUID = "ÿid" -_AGE = "idade" -_GENDER = "sexo" -_MUNICIPALITY = "municipio" -_STATE = "estado" -_DATE_CONFIRMED = "dataNotificacao" -_DATE_SYMPTOMS = "dataInicioSintomas" -_SYMPTOMS = "sintomas" -_HEALTHCARE_PROFESSIONAL = "profissionalSaude" -_COMORBIDITIES = "condicoes" -_TEST_TYPE = "tipoTeste" -_TEST_RESULT = "resultadoTeste" -_OUTCOME = "evolucaoCaso" - -_COMORBIDITIES_MAP = { - "diabetes": "diabetes mellitus", - "gestante": "pregnancy", - "gestante de alto risco": "high risk pregnancy", - "doenças respiratórias crônicas descompensadas": "respiratory system disease", - "doenças renais crônicas em estágio avançado (graus 3, 4 e 5)": "chronic kidney disease", - "doenças cardíacas crônicas": "heart disease", - "obesidade": "obesity", - "pressão alta": "high blood pressure", - "pneumopatia": "respiratory system disease", - "cardiopatia": "heart disease", - "doenca cardiaca": "heart disease", - "doenca renal": "kidney disease", - "imunodeficiencia": "primary immunodeficency disease", - "doenças autoimunes": "autoimmune disease" -} - -_NONE_TYPES = set(["Não", "null", "undefined", None]) - -_SYMPTOMS_MAP = { - "Dor de Cabeça": "headache", - "Distúrbios Gustativos": "taste alteration", - "Distúrbios Olfativos": "smell alteration", - "Dor de Garganta": "throat pain", - "Dispneia": "dyspnea", - "Febre": "fever", - "Tosse": "cough" -} - - -def convert_date(raw_date): - """ - Convert raw date field into a value interpretable by the dataserver. - """ - try: - date = datetime.strptime(raw_date.split("T")[0], "%Y-%m-%d") - return date.strftime("%m/%d/%YZ") - except: - return None - - -def convert_gender(raw_gender: str): - if raw_gender == "Masculino": - return "Male" - if raw_gender == "Feminino": - return "Female" - - -def convert_test(test_type: str): - if test_type not in _NONE_TYPES: - if test_type == "RT-PCR": - return "PCR test" - for i in ["TESTE", "ELISA", "CLIA", "ECLIA"]: - if i in test_type: - return "Serological test" - - -def convert_outcome(outcome: str): - if outcome == "Óbito": - return { - "name": "outcome", - "value": "Death" - } - elif outcome == "Cura": - return { - "name": "outcome", - "value": "Recovered" - } - elif outcome == "Internado em UTI": - return { - "name": "icuAdmission", - "value": "Yes" - } - elif outcome == "Internado": - return { - "name": "hospitalAdmission", - "value": "Yes" - } - - -def convert_events(date_confirmed, date_symptoms, test_type, outcome): - events = [ - { - "name": "confirmed", - "dateRange": { - "start": convert_date(date_confirmed), - "end": convert_date(date_confirmed) - }, - "value": convert_test(test_type) - } - ] - # There are some date entries which are before the earliest allowed date - if date_symptoms not in _NONE_TYPES and datetime.strptime(date_symptoms.split("T")[0], "%Y-%m-%d") > datetime.strptime("2019-11-01", "%Y-%m-%d"): - events.append( - { - "name": "onsetSymptoms", - "dateRange": { - "start": convert_date(date_symptoms), - "end": convert_date(date_symptoms) - }, - } - ) - if outcome not in _NONE_TYPES: - events.append( - convert_outcome(outcome) - ) - return events - - -def convert_symptoms(raw_symptoms: str): - values = [] - if raw_symptoms not in _NONE_TYPES: - # Some cases list "Assintomático" with other symptoms e.g. "Assintomático, Tosse, Febre", but these cannot be treated as asymptomatic - if raw_symptoms == "Assintomático": - return {"status": "Asymptomatic"} - else: - for key in _SYMPTOMS_MAP: - if key in raw_symptoms: - values.append(_SYMPTOMS_MAP[key]) - return {"status": "Symptomatic", - "values": values} - - -def convert_preexisting_conditions(raw_comorbidities: str): - preexistingConditions = {} - comorbidities = [] - # Inconsistent use of capitalization means all entries forced to lower case - for key in _COMORBIDITIES_MAP: - if key in raw_comorbidities.lower(): - comorbidities.append(_COMORBIDITIES_MAP[key]) - if comorbidities: - preexistingConditions["hasPreexistingConditions"] = True - preexistingConditions["values"] = comorbidities - return preexistingConditions - else: - return None - - -def convert_demographics(gender: str, age: str, occupation: str): - if gender in _NONE_TYPES and age in _NONE_TYPES and occupation in _NONE_TYPES: - return None - demo = {} - if gender not in _NONE_TYPES: - demo["gender"] = convert_gender(gender) - if age not in _NONE_TYPES and float(age) <= 120.0: - demo["ageRange"] = {"start": float(age), "end": float(age)} - if occupation == "Sim": - demo["occupation"] = "Healthcare worker" - return demo - - -def convert_notes(raw_comorbidities: str, raw_symptoms: str): - raw_notes = [] - if "imunossupressão" in raw_comorbidities.lower(): - raw_notes.append("Patient with immunosuppression") - if "portador de doenças cromossômicas ou estado de fragilidade imunológica" in raw_comorbidities.lower(): - raw_notes.append("Primary immunodeficiency disease or chromosomal disease") - if "puérpera" in raw_comorbidities.lower(): - raw_notes.append("Recently gave birth") - if "Coriza" in raw_symptoms: - raw_notes.append("Patient with coryza") - if "Outros" in raw_symptoms: - raw_notes.append("Other symptoms reported") - notes = (', ').join(raw_notes) - return notes - - -def parse_cases(raw_data_file: str, source_id: str, source_url: str): - """ - Parses G.h-format case data from raw API data. - """ - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f, delimiter=";") - for row in reader: - confirmation_date = convert_date(row[_DATE_CONFIRMED]) - if row[_TEST_RESULT] == "Positivo" and row[_OUTCOME] != "Cancelado" and row[_STATE] == "PARÁ" and confirmation_date is not None: - try: - case = { - "caseReference": {"sourceId": source_id, "sourceEntryId": row[_UUID], "sourceUrl": source_url}, - "location": { - "query": ", ".join( - [row[_MUNICIPALITY], "Pará", "Brazil"] - ) - }, - "events": convert_events( - row[_DATE_CONFIRMED], - row[_DATE_SYMPTOMS], - row[_TEST_TYPE], - row[_OUTCOME] - ), - "symptoms": convert_symptoms(row[_SYMPTOMS]), - "demographics": convert_demographics( - row[_GENDER], row[_AGE], row[_HEALTHCARE_PROFESSIONAL] - ), - "preexistingConditions": convert_preexisting_conditions( - row[_COMORBIDITIES] - ) - } - notes = convert_notes( - row[_COMORBIDITIES], row[_SYMPTOMS] - ) - if notes: - case["restrictedNotes"] = notes - yield case - except ValueError as ve: - raise ValueError(f"error converting case: {ve}") - - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/brazil_para/para_test.py b/ingestion/functions/parsing/brazil_para/para_test.py deleted file mode 100644 index 81d8178e1..000000000 --- a/ingestion/functions/parsing/brazil_para/para_test.py +++ /dev/null @@ -1,95 +0,0 @@ -import os -import unittest - -from brazil_para import para - -_SOURCE_ID = "abc123" -_SOURCE_URL = "foo.bar" - - -class ParaTest(unittest.TestCase): - def setUp(self): - # Default of 1500 is not enough to show diffs when there is one. - self.maxDiff = 10000 - - def test_parse(self): - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = para.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), [ - { - "caseReference": {"sourceId": _SOURCE_ID, "sourceEntryId": "fbWC81cdgZ", "sourceUrl": _SOURCE_URL}, - "location": { - "query": "Belém, Pará, Brazil" - }, - "events": [ - { - "name": "confirmed", - "dateRange": { - "start": "05/22/2020Z", - "end": "05/22/2020Z" - }, - "value": "Serological test" - }, - { - "name": "onsetSymptoms", - "dateRange": { - "start": "04/16/2020Z", - "end": "04/16/2020Z" - } - }, - { - "name": "outcome", - "value": "Recovered" - } - ], - "symptoms": { - "status": "Symptomatic", - "values": ["fever", "cough"] - }, - "demographics": { - "gender": "Female", - "ageRange": { - "start": 41.0, - "end": 41.0 - } - }, - "preexistingConditions": { - "hasPreexistingConditions": True, - "values": [ - "heart disease" - ] - }, - "restrictedNotes": "Other symptoms reported" - }, - { - "caseReference": {"sourceId": _SOURCE_ID, "sourceEntryId": "1BbNtddcVG", "sourceUrl": _SOURCE_URL}, - "location": { - "query": "Santa Isabel do Pará, Pará, Brazil" - }, - "events": [ - { - "name": "confirmed", - "dateRange": { - "start": "06/16/2020Z", - "end": "06/16/2020Z" - }, - "value": "Serological test" - }, - None - ], - "symptoms": { - "status": "Symptomatic", - "values": ["throat pain", "cough"] - }, - "demographics": { - "gender": "Female", - "ageRange": { - "start": 73.0, - "end": 73.0 - } - }, - "preexistingConditions": None - } - ]) diff --git a/ingestion/functions/parsing/brazil_para/sample_data.csv b/ingestion/functions/parsing/brazil_para/sample_data.csv deleted file mode 100644 index 6b11b8c14..000000000 --- a/ingestion/functions/parsing/brazil_para/sample_data.csv +++ /dev/null @@ -1,3 +0,0 @@ -ÿid;dataNotificacao;dataInicioSintomas;dataNascimento;sintomas;profissionalSaude;cbo;condicoes;estadoTeste;dataTeste;tipoTeste;resultadoTeste;paisOrigem;sexo;estado;estadoIBGE;municipio;municipioIBGE;origem;cnes;estadoNotificacao;estadoNotificacaoIBGE;municipioNotificacao;municipioNotificacaoIBGE;excluido;validado;idade;dataEncerramento;evolucaoCaso;classificacaoFinal -fbWC81cdgZ;2020-05-22T03:00:00.000Z;2020-04-16T03:00:00.000Z;1978-10-16T03:00:00.000Z;Febre, Tosse, Outros;Não;null;Doenças cardíacas crônicas;Concluído;2020-05-01T03:00:00.000Z;TESTE RÁPIDO - ANTÍGENO;Positivo;undefined;Feminino;PARÁ;15;Belém;1501402;undefined;2694808;PARÁ;15;Belém;1501402;undefined;undefined;41;;Cura; -1BbNtddcVG;2020-06-16T18:30:15.618Z;2018-04-19T00:00:00.000Z;1946-10-19T00:00:00.000Z;Tosse,Dor de Garganta;;;;Concluído;2020-05-26T00:00:00.000Z;TESTE RÁPIDO - ANTICORPO;Positivo;undefined;Feminino;PARÁ;15;Santa Isabel do Pará;undefined;undefined;9225323;PARÁ;15;SANTA ISABEL DO PARA;undefined;undefined;undefined;73;;; \ No newline at end of file diff --git a/ingestion/functions/parsing/brazil_paraiba/__init__.py b/ingestion/functions/parsing/brazil_paraiba/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/brazil_paraiba/input_event.json b/ingestion/functions/parsing/brazil_paraiba/input_event.json deleted file mode 100644 index a848b7724..000000000 --- a/ingestion/functions/parsing/brazil_paraiba/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "5f731b4084386d0041c333f7/2020/09/29/1139/content.csv", - "sourceUrl": "https://s3-sa-east-1.amazonaws.com/ckan.saude.gov.br/dados-pb.csv", - "sourceId": "5f731b4084386d0041c333f7" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/brazil_paraiba/paraiba.py b/ingestion/functions/parsing/brazil_paraiba/paraiba.py deleted file mode 100644 index 72dacb5cd..000000000 --- a/ingestion/functions/parsing/brazil_paraiba/paraiba.py +++ /dev/null @@ -1,237 +0,0 @@ -import json -import os -import sys -from datetime import datetime -import csv - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - -_UUID = "ÿid" -_AGE = "idade" -_GENDER = "sexo" -_MUNICIPALITY = "municipio" -_STATE = "estado" -_DATE_CONFIRMED = "dataNotificacao" -_DATE_SYMPTOMS = "dataInicioSintomas" -_SYMPTOMS = "sintomas" -_HEALTHCARE_PROFESSIONAL = "profissionalSaude" -_COMORBIDITIES = "condicoes" -_TEST_TYPE = "tipoTeste" -_TEST_RESULT = "resultadoTeste" -_OUTCOME = "evolucaoCaso" - -_COMORBIDITIES_MAP = { - "Diabetes": "diabetes mellitus", - "Gestante": "pregnancy", - "Doenças respiratórias crônicas descompensadas": "respiratory system disease", - "Doenças renais crônicas em estágio avançado (graus 3, 4 e 5)": "chronic kidney disease", - "Doenças cardíacas crônicas": "heart disease", - "Obesidade": "obesity", -} - -_NONE_TYPES = set(["Não", "null", "undefined"]) - -_SYMPTOMS_MAP = { - "Dor de Cabeça": "headache", - "Distúrbios Gustativos": "taste alteration", - "Distúrbios Olfativos": "smell alteration", - "Dor de garganta": "throat pain", - "Dispneia": "dyspnea", - "Febre": "fever", - "Tosse": "cough" -} - - -def convert_date(raw_date): - """ - Convert raw date field into a value interpretable by the dataserver. - """ - try: - date = datetime.strptime(raw_date.split("T")[0], "%Y-%m-%d") - return date.strftime("%m/%d/%YZ") - except: - return None - - -def convert_gender(raw_gender: str): - if raw_gender == "Masculino": - return "Male" - if raw_gender == "Feminino": - return "Female" - - -def convert_test(test_type: str): - if test_type not in _NONE_TYPES: - if test_type == "RT-PCR": - return "PCR test" - for i in ["TESTE", "ELISA", "CLIA"]: - if i in test_type: - return "Serological test" - - -def convert_outcome(outcome: str): - if outcome == "Óbito": - return { - "name": "outcome", - "value": "Death" - } - elif outcome == "Cura": - return { - "name": "outcome", - "value": "Recovered" - } - elif outcome == "Internado em UTI": - return { - "name": "icuAdmission", - "value": "Yes" - } - elif outcome == "Internado": - return { - "name": "hospitalAdmission", - "value": "Yes" - } - - -def convert_events(date_confirmed, date_symptoms, test_type, outcome): - events = [ - { - "name": "confirmed", - "dateRange": { - "start": convert_date(date_confirmed), - "end": convert_date(date_confirmed) - }, - "value": convert_test(test_type) - } - ] - if date_symptoms not in _NONE_TYPES: - events.append( - { - "name": "onsetSymptoms", - "dateRange": { - "start": convert_date(date_symptoms), - "end": convert_date(date_symptoms) - }, - } - ) - if outcome not in _NONE_TYPES: - events.append( - convert_outcome(outcome) - ) - return events - - -def convert_symptoms(raw_symptoms: str): - values = [] - if raw_symptoms not in _NONE_TYPES: - if "Assintomático" in raw_symptoms: - return {"status": "Asymptomatic"} - else: - for key in _SYMPTOMS_MAP: - if key in raw_symptoms: - values.append(_SYMPTOMS_MAP[key]) - return {"status": "Symptomatic", - "values": values} - - -def convert_preexisting_conditions(raw_comorbidities: str): - preexistingConditions = {} - comorbidities = [] - for key in _COMORBIDITIES_MAP: - if key in raw_comorbidities: - comorbidities.append(_COMORBIDITIES_MAP[key]) - if comorbidities: - preexistingConditions["hasPreexistingConditions"] = True - preexistingConditions["values"] = comorbidities - return preexistingConditions - else: - return None - - -def convert_demographics(gender: str, age: str, occupation: str): - if gender in _NONE_TYPES and age in _NONE_TYPES and occupation in _NONE_TYPES: - return None - demo = {} - if gender not in _NONE_TYPES: - demo["gender"] = convert_gender(gender) - if age not in _NONE_TYPES and float(age) <= 120.0: - demo["ageRange"] = {"start": float(age), "end": float(age)} - if occupation not in _NONE_TYPES: - demo["occupation"] = "Healthcare worker" - return demo - - -def convert_notes(raw_comorbidities: str, raw_symptoms: str): - raw_notes = [] - if "Imunossupressão" in raw_comorbidities: - raw_notes.append("Patient with immunosuppression") - if "Portador de doenças cromossômicas ou estado de fragilidade imunológica" in raw_comorbidities: - raw_notes.append("Primary immunodeficiency disease or chromosomal disease") - if "Puérpera" in raw_comorbidities: - raw_notes.append("Recently gave birth") - if "Coriza" in raw_symptoms: - raw_notes.append("Patient with coryza") - if "Outros" in raw_symptoms: - raw_notes.append("Other symptoms reported") - notes = (', ').join(raw_notes) - return notes - - -def parse_cases(raw_data_file: str, source_id: str, source_url: str): - """ - Parses G.h-format case data from raw API data. - """ - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f, delimiter=";") - for row in reader: - confirmation_date = convert_date(row[_DATE_CONFIRMED]) - if row[_TEST_RESULT] == "Positivo" and row[_OUTCOME] != "Cancelado" and row[_STATE] == "PARAÍBA" and confirmation_date is not None: - try: - case = { - "caseReference": {"sourceId": source_id, "sourceEntryId": row[_UUID], "sourceUrl": source_url}, - "location": { - "query": ", ".join( - [row[_MUNICIPALITY], "Paraíba", "Brazil"] - ) - }, - "events": convert_events( - row[_DATE_CONFIRMED], - row[_DATE_SYMPTOMS], - row[_TEST_TYPE], - row[_OUTCOME] - ), - "symptoms": convert_symptoms(row[_SYMPTOMS]), - "demographics": convert_demographics( - row[_GENDER], row[_AGE], row[_HEALTHCARE_PROFESSIONAL] - ), - "preexistingConditions": convert_preexisting_conditions( - row[_COMORBIDITIES] - ) - } - notes = convert_notes( - row[_COMORBIDITIES], row[_SYMPTOMS] - ) - if notes: - case["restrictedNotes"] = notes - yield case - except ValueError as ve: - raise ValueError(f"error converting case: {ve}") - - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/brazil_paraiba/paraiba_test.py b/ingestion/functions/parsing/brazil_paraiba/paraiba_test.py deleted file mode 100644 index 3998233c7..000000000 --- a/ingestion/functions/parsing/brazil_paraiba/paraiba_test.py +++ /dev/null @@ -1,66 +0,0 @@ -import os -import unittest - -from brazil_paraiba import paraiba - -_SOURCE_ID = "abc123" -_SOURCE_URL = "foo.bar" - - -class ParaibaTest(unittest.TestCase): - def setUp(self): - # Default of 1500 is not enough to show diffs when there is one. - self.maxDiff = 10000 - - def test_parse(self): - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = paraiba.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), [ - { - "caseReference": {"sourceId": _SOURCE_ID, "sourceEntryId": "ymF8MCjS33", "sourceUrl": _SOURCE_URL}, - "location": { - "query": "João Pessoa, Paraíba, Brazil" - }, - "events": [ - { - "name": "confirmed", - "dateRange": { - "start": "04/26/2020Z", - "end": "04/26/2020Z" - }, - "value": "Serological test" - }, - { - "name": "onsetSymptoms", - "dateRange": { - "start": "04/16/2020Z", - "end": "04/16/2020Z" - } - }, - { - "name": "icuAdmission", - "value": "Yes" - } - ], - "symptoms": { - "status": "Symptomatic", - "values": ["cough"] - }, - "demographics": { - "gender": "Female", - "ageRange": { - "start": 47.0, - "end": 47.0 - } - }, - "preexistingConditions": { - "hasPreexistingConditions": True, - "values": [ - "diabetes mellitus" - ] - }, - "restrictedNotes": "Other symptoms reported" - } - ]) diff --git a/ingestion/functions/parsing/brazil_paraiba/sample_data.csv b/ingestion/functions/parsing/brazil_paraiba/sample_data.csv deleted file mode 100644 index 95e03cbe3..000000000 --- a/ingestion/functions/parsing/brazil_paraiba/sample_data.csv +++ /dev/null @@ -1,3 +0,0 @@ -ÿid;dataNotificacao;dataInicioSintomas;dataNascimento;sintomas;profissionalSaude;cbo;condicoes;estadoTeste;dataTeste;tipoTeste;resultadoTeste;paisOrigem;sexo;estado;estadoIBGE;municipio;municipioIBGE;origem;cnes;estadoNotificacao;estadoNotificacaoIBGE;municipioNotificacao;municipioNotificacaoIBGE;excluido;validado;idade;dataEncerramento;evolucaoCaso;classificacaoFinal -ymF8MCjS33;2020-04-26T03:00:00.000Z;2020-04-16T03:00:00.000Z;1973-02-10T03:00:00.000Z;Tosse, Outros;Não;null;Diabetes;Concluído;2020-04-26T03:00:00.000Z;TESTE RÁPIDO - ANTICORPO;Positivo;undefined;Feminino;PARAÍBA;25;João Pessoa;2507507;undefined;3726401;PARAÍBA;25;João Pessoa;2507507;undefined;undefined;47;2020-04-29T03:00:00.000Z;Internado em UTI;Confirmado Laboratorial - diff --git a/ingestion/functions/parsing/brazil_rio_de_janeiro/__init__.py b/ingestion/functions/parsing/brazil_rio_de_janeiro/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/brazil_rio_de_janeiro/input_event.json b/ingestion/functions/parsing/brazil_rio_de_janeiro/input_event.json deleted file mode 100644 index 7e35e02d6..000000000 --- a/ingestion/functions/parsing/brazil_rio_de_janeiro/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "5fc921cec89abf0050348be8/2020/12/03/1750/content.csv", - "sourceUrl": "http://painel.saude.rj.gov.br/arquivos/COVID.CSV", - "sourceId": "5fc921cec89abf0050348be8" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/brazil_rio_de_janeiro/rio_de_janeiro.py b/ingestion/functions/parsing/brazil_rio_de_janeiro/rio_de_janeiro.py deleted file mode 100644 index 28c0ac01b..000000000 --- a/ingestion/functions/parsing/brazil_rio_de_janeiro/rio_de_janeiro.py +++ /dev/null @@ -1,156 +0,0 @@ -import json -import os -import sys -from datetime import datetime -import csv - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - -def convert_date(date_str: str,dataserver=True): - """ - Convert raw date field into a value interpretable by the dataserver. - - The date is listed in dd/mm/YYYY format - """ - date = datetime.strptime(date_str.split(' ')[0], "%Y/%m/%d") - if not dataserver: - return date.strftime("%m/%d/%Y") - return date.strftime("%m/%d/%YZ") - - - -def convert_gender(raw_gender): - if raw_gender == "M": - return "Male" - if raw_gender == "F": - return "Female" - - - -def convert_location(raw_entry): - ''' - Using residential municipality as only available location information. - ''' - query_terms = [ - term for term in [ - raw_entry.get("municipio_res", ""), - "Rio de Janeiro, Brazil"] - if type(term) == str] - - return {"query": ", ".join(query_terms)} - - -def convert_age(entry: float): - ''' - Want to return a float specifying age in years. If age field is empty, return None. - There are some odd ages in this dataset (43 people over the age of 150). These erroneous ages - don't have a value for the FAIXA_ETARIA field, so will only return age if this field is populated - ''' - if entry['idade']: - return float(entry['idade']) - - - -def parse_cases(raw_data_file, source_id, source_url): - """ - Parses G.h-format case data from raw API data. - - Only include cases which include a 'dt_evento' as confirmed date field. This loses ~400 cases out of 350k. - - Using residential municipality ('municipio_res') as case location, as its the only location field other than - 'bairro' (neighborhood), which is missing in ~2/5 cases and cannot be easily geocoded with mapbox. - - - """ - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f,delimiter=';') - cases = [] - for entry in reader: - if entry['classificacao'] and entry['dt_evento']: - notes = [] - case = { - "caseReference": { - "sourceId": source_id, - "sourceUrl": source_url - }, - "events": [ - { - "name": "confirmed", - "dateRange": - { - "start": convert_date(entry["dt_evento"]), - "end": convert_date(entry["dt_evento"]) - } - } - ], - "location": convert_location(entry), - "demographics": { - "ageRange": { - "start": convert_age(entry), - "end": convert_age(entry) - }, - "gender": convert_gender(entry["sexo"]) - } - } - - if entry['dt_sintoma']: - case["symptoms"] = { - "status": "Symptomatic", - } - case["events"].append({ - "name": "onsetSymptoms", - "dateRange": { - "start": convert_date(entry['dt_sintoma']), - "end": convert_date(entry['dt_sintoma']), - } - }) - - if entry['evolucao'] == 'OBITO': - case["events"].append({ - "name": "outcome", - "value": "Death", - "dateRange": { - "start": convert_date(entry['dt_obito']), - "end": convert_date(entry['dt_obito']), - }}) - else: - case["symptoms"] = { - "status": "Asymptomatic", - } - - if entry["sexo"]=='I': - notes.append(f'Gender not specified in case notes.') - - if entry["bairro"]: - notes.append(f'Neighborhood of case is listed as {entry["bairro"]}') - - if entry['dias']: - notes.append(f'Number of epidemiological days = {entry["dias"]}') - - if entry['dt_coleta_dt_notif']: - notes.append(f'Date case was reported was {convert_date(entry["dt_coleta_dt_notif"],dataserver=False)}') - - - case["restrictedNotes"] = "\n".join(notes) - cases.append(case) - - yield case - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/brazil_rio_de_janeiro/rio_de_janeiro_test.py b/ingestion/functions/parsing/brazil_rio_de_janeiro/rio_de_janeiro_test.py deleted file mode 100644 index c08db19f7..000000000 --- a/ingestion/functions/parsing/brazil_rio_de_janeiro/rio_de_janeiro_test.py +++ /dev/null @@ -1,120 +0,0 @@ -import os -import unittest -from brazil_rio_de_janeiro import rio_de_janeiro - -_SOURCE_ID = "placeholder_ID" -_SOURCE_URL = "placeholder_URL" - - -class RioDeJaneiroTest(unittest.TestCase): - def setUp(self): - # Default of 1500 is not enough to show diffs when there is one. - self.maxDiff = 10000 - - def test_parse(self): - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = rio_de_janeiro.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), [{'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'placeholder_URL'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '05/05/2020Z', 'end': '05/05/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '05/05/2020Z', 'end': '05/05/2020Z'}}], - 'location': {'query': 'NOVA IGUACU , Rio de Janeiro, Brazil'}, - 'demographics': {'ageRange': {'start': 46.0, 'end': 46.0}, - 'gender': 'Female'}, - 'symptoms': {'status': 'Asymptomatic'}, - 'restrictedNotes': 'Number of epidemiological days = 212.0\nDate case was reported was 05/05/2020'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'placeholder_URL'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '05/03/2020Z', 'end': '05/03/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '05/03/2020Z', 'end': '05/03/2020Z'}}], - 'location': {'query': 'MACAE , Rio de Janeiro, Brazil'}, - 'demographics': {'ageRange': {'start': 23.0, 'end': 23.0}, 'gender': 'Male'}, - 'symptoms': {'status': 'Asymptomatic'}, - 'restrictedNotes': 'Neighborhood of case is listed as PARQUE AEROPORTO \nNumber of epidemiological days = 214.0\nDate case was reported was 05/06/2020'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'placeholder_URL'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '05/01/2020Z', 'end': '05/01/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '05/01/2020Z', 'end': '05/01/2020Z'}}], - 'location': {'query': 'MACAE , Rio de Janeiro, Brazil'}, - 'demographics': {'ageRange': {'start': 23.0, 'end': 23.0}, 'gender': 'Male'}, - 'symptoms': {'status': 'Asymptomatic'}, - 'restrictedNotes': 'Neighborhood of case is listed as AJUDA DE BAIXO \nNumber of epidemiological days = 216.0\nDate case was reported was 05/03/2020'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'placeholder_URL'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '05/23/2020Z', 'end': '05/23/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '05/23/2020Z', 'end': '05/23/2020Z'}}], - 'location': {'query': 'ANGRA DOS REIS , Rio de Janeiro, Brazil'}, - 'demographics': {'ageRange': {'start': 55.0, 'end': 55.0}, 'gender': 'Male'}, - 'symptoms': {'status': 'Asymptomatic'}, - 'restrictedNotes': 'Neighborhood of case is listed as CENTRO \nNumber of epidemiological days = 194.0\nDate case was reported was 05/23/2020'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'placeholder_URL'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '10/04/2020Z', 'end': '10/04/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '10/04/2020Z', 'end': '10/04/2020Z'}}], - 'location': {'query': 'MESQUITA , Rio de Janeiro, Brazil'}, - 'demographics': {'ageRange': {'start': 53.0, 'end': 53.0}, 'gender': 'Male'}, - 'symptoms': {'status': 'Asymptomatic'}, - 'restrictedNotes': 'Neighborhood of case is listed as COREIA \nNumber of epidemiological days = 60.0\nDate case was reported was 10/13/2020'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'placeholder_URL'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '08/07/2020Z', 'end': '08/07/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '08/07/2020Z', 'end': '08/07/2020Z'}}], - 'location': {'query': 'MARICA , Rio de Janeiro, Brazil'}, - 'demographics': {'ageRange': {'start': 47.0, 'end': 47.0}, - 'gender': 'Female'}, - 'symptoms': {'status': 'Asymptomatic'}, - 'restrictedNotes': 'Neighborhood of case is listed as GUARATIBA \nNumber of epidemiological days = 118.0\nDate case was reported was 08/20/2020'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'placeholder_URL'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '09/07/2020Z', 'end': '09/07/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '09/07/2020Z', 'end': '09/07/2020Z'}}], - 'location': {'query': 'SAO JOAO DE MERITI , Rio de Janeiro, Brazil'}, - 'demographics': {'ageRange': {'start': 25.0, 'end': 25.0}, 'gender': 'Male'}, - 'symptoms': {'status': 'Asymptomatic'}, - 'restrictedNotes': 'Neighborhood of case is listed as EDEN \nNumber of epidemiological days = 87.0\nDate case was reported was 09/17/2020'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'placeholder_URL'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '06/03/2020Z', 'end': '06/03/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '06/03/2020Z', 'end': '06/03/2020Z'}}], - 'location': {'query': 'DUQUE DE CAXIAS , Rio de Janeiro, Brazil'}, - 'demographics': {'ageRange': {'start': 57.0, 'end': 57.0}, 'gender': 'Male'}, - 'symptoms': {'status': 'Asymptomatic'}, - 'restrictedNotes': 'Neighborhood of case is listed as PARQUE VITORIA \nNumber of epidemiological days = 183.0\nDate case was reported was 06/04/2020'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'placeholder_URL'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '07/03/2020Z', 'end': '07/03/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '07/03/2020Z', 'end': '07/03/2020Z'}}], - 'location': {'query': 'MACAE , Rio de Janeiro, Brazil'}, - 'demographics': {'ageRange': {'start': 33.0, 'end': 33.0}, 'gender': 'Male'}, - 'symptoms': {'status': 'Asymptomatic'}, - 'restrictedNotes': 'Neighborhood of case is listed as AEROPORTO \nNumber of epidemiological days = 153.0\nDate case was reported was 07/03/2020'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'placeholder_URL'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '07/20/2020Z', 'end': '07/20/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '07/20/2020Z', 'end': '07/20/2020Z'}}], - 'location': {'query': 'ITATIAIA , Rio de Janeiro, Brazil'}, - 'demographics': {'ageRange': {'start': 50.0, 'end': 50.0}, 'gender': 'Male'}, - 'symptoms': {'status': 'Asymptomatic'}, - 'restrictedNotes': 'Neighborhood of case is listed as CAMPO ALEGRE \nNumber of epidemiological days = 136.0\nDate case was reported was 07/20/2020'}]) diff --git a/ingestion/functions/parsing/brazil_rio_de_janeiro/sample_data.csv b/ingestion/functions/parsing/brazil_rio_de_janeiro/sample_data.csv deleted file mode 100644 index d0bd6b1f9..000000000 --- a/ingestion/functions/parsing/brazil_rio_de_janeiro/sample_data.csv +++ /dev/null @@ -1,11 +0,0 @@ -sexo;idade;municipio_res;uf;dt_sintoma;dt_coleta_dt_notif;classificacao;evolucao;dt_obito;comorbidade;dias;dt_evento;bairro;cep -F;46.0;NOVA IGUACU ;RJ;2020/05/05 00:00:00.000;2020/05/05 00:00:00.000;CONFIRMADO ;;;;212.0;2020/05/05 00:00:00.000;;26000000 -M;23.0;MACAE ;RJ;2020/05/03 00:00:00.000;2020/05/06 00:00:00.000;CONFIRMADO ;;;;214.0;2020/05/03 00:00:00.000;PARQUE AEROPORTO ; -M;23.0;MACAE ;RJ;2020/05/01 00:00:00.000;2020/05/03 00:00:00.000;CONFIRMADO ;;;;216.0;2020/05/01 00:00:00.000;AJUDA DE BAIXO ;27910000 -M;55.0;ANGRA DOS REIS ;RJ;2020/05/23 00:00:00.000;2020/05/23 00:00:00.000;CONFIRMADO ;;;;194.0;2020/05/23 00:00:00.000;CENTRO ;23900000 -M;53.0;MESQUITA ;RJ;2020/10/04 00:00:00.000;2020/10/13 00:00:00.000;CONFIRMADO ;;;;60.0;2020/10/04 00:00:00.000;COREIA ;26556005 -F;47.0;MARICA ;RJ;2020/08/07 00:00:00.000;2020/08/20 00:00:00.000;CONFIRMADO ;;;;118.0;2020/08/07 00:00:00.000;GUARATIBA ; -M;25.0;SAO JOAO DE MERITI ;RJ;2020/09/07 00:00:00.000;2020/09/17 00:00:00.000;CONFIRMADO ;;;;87.0;2020/09/07 00:00:00.000;EDEN ;25530460 -M;57.0;DUQUE DE CAXIAS ;RJ;2020/06/03 00:00:00.000;2020/06/04 00:00:00.000;CONFIRMADO ;;;;183.0;2020/06/03 00:00:00.000;PARQUE VITORIA ;25045490 -M;33.0;MACAE ;RJ;2020/07/03 00:00:00.000;2020/07/03 00:00:00.000;CONFIRMADO ;;;;153.0;2020/07/03 00:00:00.000;AEROPORTO ;27900000 -M;50.0;ITATIAIA ;RJ;2020/07/20 00:00:00.000;2020/07/20 00:00:00.000;CONFIRMADO ;;;;136.0;2020/07/20 00:00:00.000;CAMPO ALEGRE ;27580000 diff --git a/ingestion/functions/parsing/brazil_santa_catarina/__init__.py b/ingestion/functions/parsing/brazil_santa_catarina/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/brazil_santa_catarina/input_event.json b/ingestion/functions/parsing/brazil_santa_catarina/input_event.json deleted file mode 100644 index 37c4eb314..000000000 --- a/ingestion/functions/parsing/brazil_santa_catarina/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "santa_cat_test/content.csv", - "sourceUrl": "ftp://boavista:dados_abertos@ftp2.ciasc.gov.br/boavista_covid_dados_abertos.csv", - "sourceId": "5f7dddf22d0ee7002fe0d56d" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/brazil_santa_catarina/sample_data.csv b/ingestion/functions/parsing/brazil_santa_catarina/sample_data.csv deleted file mode 100644 index bb88696b6..000000000 --- a/ingestion/functions/parsing/brazil_santa_catarina/sample_data.csv +++ /dev/null @@ -1,4 +0,0 @@ -data_publicacao;recuperados;data_inicio_sintomas;data_coleta;sintomas;comorbidades;gestante;internacao;internacao_uti;sexo;municipio;obito;data_obito;idade;regional;raca;data_resultado;codigo_ibge_municipio;latitude;longitude;estado;criterio_confirmacao;tipo_teste;municipio_notificacao;codigo_ibge_municipio_notificacao;latitude_notificacao;longitude_notificacao;classificacao;origem_esus;origem_sivep;origem_lacen;origem_laboratorio_privado;nom_laboratorio;fez_teste_rapido;fez_pcr;data_internacao;data_entrada_uti;regional_saude;data_evolucao_caso;data_saida_uti;bairro,,,,,,,,,,,,, -2021-01-17 16:00:09;SIM;2020-12-06;IGNORADO;TOSSE, DOR DE GARGANTA, FEBRE;;;NAO INTERNADO;NAO INTERNADO UTI;FEMININO;BLUMENAU;NAO;NULL;44;ALTO VALE DO ITAJAI;NAO INFORMADO;2021-01-17 11:31:35.276543000;4202404;-26.88500595;-49.09702682;SANTA CATARINA;LABORATORIAL;IMUNOLOGICO (TESTE RAPIDO);BLUMENAU;4202404;-26.88500595;-49.09702682;CONFIRMADO;SIM;NAO;NAO;NAO;NULL;SIM;NAO;NULL;NULL;MEDIO VALE DO ITAJAI;NULL;NULL;ESCOLA AGRICOLA -2021-01-17 16:00:09;SIM;2020-08-03;2020-08-14;TOSSE, DOR DE GARGANTA, FEBRE;;;NAO INTERNADO;NAO INTERNADO UTI;FEMININO;OTACILIO COSTA;NAO;NULL;29;MEIO OESTE E SERRA CATARINENSE;NAO INFORMADO;1991-04-19 00:00:00;4211751;-27.51730537;-49.97157288;SANTA CATARINA;LABORATORIAL;IMUNOLOGICO (TESTE RAPIDO);OTACILIO COSTA;4211751;-27.51730537;-49.97157288;CONFIRMADO;SIM;NAO;NAO;SIM;LABORATORIO SALDANHA LTDA;SIM;SIM;NULL;NULL;SERRA CATARINENSE;NULL;NULL;NULL -2021-01-17 16:00:09;NAO;2020-12-04 00:00:00;2020-12-07;DIARREIA, DISPNEIA, FEBRE;DOENCA CARDIOVASCULAR CRONICA;;INTERNADO;INTERNADO UTI;MASCULINO;FLORIANOPOLIS;SIM;2020-12-10;83;GRANDE FLORIANOPOLIS;BRANCA;2020-12-07 00:00:00;4205407;-27.57880592;-48.50902557;SANTA CATARINA;LABORATORIAL;BIOLOGIA MOLECULAR (RT-PCR);FLORIANOPOLIS;4205407;-27.57880592;-48.50902557;CONFIRMADO;SIM;SIM;NAO;SIM;LABORATORIO MEDICO SANTA LUZIA MATRIZ;NAO;SIM;2020-12-07;2020-12-08;GRANDE FLORIANOPOLIS;2020-12-10;NULL;JARDIM ATLANTICO \ No newline at end of file diff --git a/ingestion/functions/parsing/brazil_santa_catarina/santa_catarina.py b/ingestion/functions/parsing/brazil_santa_catarina/santa_catarina.py deleted file mode 100644 index 3e890e6d4..000000000 --- a/ingestion/functions/parsing/brazil_santa_catarina/santa_catarina.py +++ /dev/null @@ -1,294 +0,0 @@ -import json -import os -import sys -from datetime import datetime -import csv - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - - -_AGE = "idade" -_GENDER = "sexo" -_MUNICIPALITY = "municipio" -_STATE = "estado" -_DATE_CONFIRMED = "data_resultado" -_DATE_SYMPTOMS = "data_inicio_sintomas" -_SYMPTOMS = "sintomas" -_COMORBIDITIES = "comorbidades" -_PREGNANCY = "gestante" -_TEST_TYPE = "tipo_teste" -_RECOVERED = "recuperados" -_HOSPITALIZED = "internacao" -_HOSPITALIZED_ICU = "internacao_uti" -_DEATH = "obito" -_DATE_DEATH = "data_obito" -_ETHNICITY = "raca" -_CLASSIFICATION = "classificacao" -_DATE_HOSPITALIZATION = "data_internacao" -_DATE_ICU_ADMISSION = "data_entrada_uti" -_NEIGHBOURHOOD = "bairro,,,,,,,,,,,,," - -_COMORBIDITIES_MAP = { - "ASMA": "asthma", - "DIABETES": "diabetes mellitus", - "OBESIDADE": "obesity", - "DOENCA CARDIOVASCULAR CRONICA": "cardiovascular system disease", - "DOENCA NEUROLOGICA CRONICA": "nervous system disease", - "DOENCA PNEUMATICA CRONICA": "respiratory system disease", - "SINDROME DE DOWN": "Down syndrome", - "DOENCA HEMATOLOGICA CRONICA": "hematological disease", - "DOENCA HEPATICA CRONICA": "liver disease", - "DOENCA RENAL CRONICA": "chronic kidney disease", - "HIPERTENSAO": "hypertension", - "CANCER": "cancer" -} - - -_SYMPTOMS_MAP = { - "CANSACO": "tiredness", - "TOSSE": "cough", - "DOR DE GARGANTA": "throat pain", - "DISPNEIA": "dyspnea", - "CEFALEIA": "headache", - "FEBRE": "fever", - "DIARREIA": "diarrhoea", - "DOR NO CORPO": "body ache", - "MIALGIA": "myalgia", - "CONGESTAO NASAL": "blocked nose" -} - - -def convert_date(raw_date): - """ - Convert raw date field into a value interpretable by the dataserver. - The date filtering API expects mm/dd/YYYYZ format. - """ - # Two date formats in use - try: - date = datetime.strptime(raw_date.split(" ")[0], "%Y-%m-%d") - return date.strftime("%m/%d/%YZ") - except ValueError: - try: - date = datetime.strptime(raw_date.split(" ")[0], "%d-%m-%Y") - return date.strftime("%m/%d/%YZ") - except: - return None - - -def convert_gender(raw_gender: str): - if raw_gender == "MASCULINO": - return "Male" - if raw_gender == "FEMININO": - return "Female" - - -def convert_test(test_type: str): - if test_type: - if test_type == "BIOLOGIA MOLECULAR (RT-PCR)": - return "PCR test" - if test_type == "IMUNOLOGICO (TESTE RAPIDO)": - return "Serological test" - - -def convert_events(date_confirmed, date_symptoms, test_type, recovered, death, date_death, hospitalized, hospitalized_icu, date_hospitalized, date_icu_admission): - events = [ - { - "name": "confirmed", - "dateRange": { - "start": convert_date(date_confirmed), - "end": convert_date(date_confirmed) - }, - "value": convert_test(test_type) - } - ] - if date_symptoms: - events.append( - { - "name": "onsetSymptoms", - "dateRange": { - "start": convert_date(date_symptoms), - "end": convert_date(date_symptoms) - } - } - ) - if recovered == "SIM": - events.append( - { - "name": "outcome", - "value": "Recovered" - } - ) - if death == "SIM": - events.append( - { - "name": "outcome", - "dateRange": { - "start": convert_date(date_death), - "end": convert_date(date_death) - }, - "value": "Death" - } - ) - if hospitalized == "INTERNADO": - events.append( - { - "name": "hospitalAdmission", - "dateRange": { - "start": convert_date(date_hospitalized), - "end": convert_date(date_hospitalized) - }, - "value": "Yes" - } - ) - if hospitalized_icu == "INTERNADO UTI": - events.append( - { - "name": "icuAdmission", - "dateRange": { - "start": convert_date(date_icu_admission), - "end": convert_date(date_icu_admission) - }, - "value": "Yes" - } - ) - return events - - -def convert_symptoms(raw_symptoms: str): - values = [] - if raw_symptoms: - for key in _SYMPTOMS_MAP: - if key in raw_symptoms: - values.append(_SYMPTOMS_MAP[key]) - return {"status": "Symptomatic", - "values": values} - - -def convert_preexisting_conditions(raw_comorbidities: str, pregnancy): - preexistingConditions = {} - comorbidities = [] - - for key in _COMORBIDITIES_MAP: - if key in raw_comorbidities: - comorbidities.append(_COMORBIDITIES_MAP[key]) - - if pregnancy == "IDADE GESTATIONAL": - comorbidities.append("pregnancy") - - if comorbidities: - preexistingConditions["hasPreexistingConditions"] = True - preexistingConditions["values"] = comorbidities - return preexistingConditions - - -def convert_ethnicity(raw_ethnicity: str): - if raw_ethnicity == "PRETA": - return "Black" - elif raw_ethnicity == "PARDA": - return "Mixed" - elif raw_ethnicity == "AMARELA": - return "Asian" - elif raw_ethnicity == "BRANCA": - return "White" - elif raw_ethnicity == "INDIGENA": - return "Indigenous" - - -def convert_demographics(gender: str, age: str, raw_ethnicity: str): - if not any((gender, age, raw_ethnicity)): - return None - demo = {} - if gender: - demo["gender"] = convert_gender(gender) - if age and age != "NULL" and float(age) <= 120.0: - demo["ageRange"] = {"start": float(age), "end": float(age)} - if raw_ethnicity: - demo["ethnicity"] = convert_ethnicity(raw_ethnicity) - return demo - - -def convert_notes(raw_comorbidities: str, raw_symptoms: str, neighbourhood, given_birth): - raw_notes = [] - if "IMUNODEPRESSAO" in raw_comorbidities: - raw_notes.append("Patient with immunosuppression") - if "CORIZA" in raw_symptoms: - raw_notes.append("Patient with coryza") - if "PUERPERA" in given_birth: - raw_notes.append("Recently gave birth") - # The neighbourhood entry is very variable and includes entries such as "00000" - if neighbourhood and neighbourhood != "NULL": - raw_notes.append("Neighbourhood: " + neighbourhood) - if raw_notes: - return (", ").join(raw_notes) - - -def parse_cases(raw_data_file: str, source_id: str, source_url: str): - """ - Parses G.h-format case data from raw API data. - - Note that this dataset has no UUIDs. - - The neighbourhood data contains very variable information and should be interpreted with caution. - """ - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f, delimiter=";") - for row in reader: - # A few anomalous confirmation dates reported e.g. from the year 1990 - confirmation_date = convert_date(row[_DATE_CONFIRMED]) - if row[_CLASSIFICATION] == "CONFIRMADO" and row[_STATE] == "SANTA CATARINA" and confirmation_date is not None and datetime.strptime(confirmation_date.split("Z")[0], "%m/%d/%Y") > datetime.strptime("11/01/2020", "%m/%d/%Y"): - try: - case = { - "caseReference": {"sourceId": source_id, "sourceUrl": source_url}, - "location": { - "query": ", ".join( - [row[_MUNICIPALITY], "Santa Catarina", "Brazil"] - ) - }, - "events": convert_events( - row[_DATE_CONFIRMED], - row[_DATE_SYMPTOMS], - row[_TEST_TYPE], - row[_RECOVERED], - row[_DEATH], - row[_DATE_DEATH], - row[_HOSPITALIZED], - row[_HOSPITALIZED_ICU], - row[_DATE_HOSPITALIZATION], - row[_DATE_ICU_ADMISSION] - ), - "symptoms": convert_symptoms(row[_SYMPTOMS]), - "demographics": convert_demographics( - row[_GENDER], row[_AGE], row[_ETHNICITY] - ), - "preexistingConditions": convert_preexisting_conditions( - row[_COMORBIDITIES], row[_PREGNANCY] - ) - } - notes = convert_notes( - row[_COMORBIDITIES], row[_SYMPTOMS], row[_NEIGHBOURHOOD], row[_PREGNANCY] - ) - if notes: - case["restrictedNotes"] = notes - yield case - except ValueError as ve: - raise ValueError(f"error converting case: {ve}") - - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) \ No newline at end of file diff --git a/ingestion/functions/parsing/brazil_santa_catarina/santa_catarina_test.py b/ingestion/functions/parsing/brazil_santa_catarina/santa_catarina_test.py deleted file mode 100644 index 6550066b2..000000000 --- a/ingestion/functions/parsing/brazil_santa_catarina/santa_catarina_test.py +++ /dev/null @@ -1,126 +0,0 @@ -import os -import unittest - -from brazil_santa_catarina import santa_catarina - -_SOURCE_ID = "abc123" -_SOURCE_URL = "foo.bar" - - -class SantaCatarinaTest(unittest.TestCase): - def setUp(self): - # Default of 1500 is not enough to show diffs when there is one. - self.maxDiff = 10000 - - def test_parse(self): - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = santa_catarina.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), [ - { - "caseReference": {"sourceId": _SOURCE_ID, "sourceUrl": _SOURCE_URL}, - "location": { - "query": "BLUMENAU, Santa Catarina, Brazil" - }, - "events": [ - { - "name": "confirmed", - "dateRange": { - "start": "01/17/2021Z", - "end": "01/17/2021Z" - }, - "value": "Serological test" - }, - { - "name": "onsetSymptoms", - "dateRange": { - "start": "12/06/2020Z", - "end": "12/06/2020Z" - } - }, - { - "name": "outcome", - "value": "Recovered" - } - ], - "symptoms": { - "status": "Symptomatic", - "values": ["cough", "throat pain", "fever"] - }, - "demographics": { - "gender": "Female", - "ageRange": { - "start": 44.0, - "end": 44.0 - }, - "ethnicity": None - }, - "preexistingConditions": None, - "restrictedNotes": "Neighbourhood: ESCOLA AGRICOLA" - }, - { - "caseReference": {"sourceId": _SOURCE_ID, "sourceUrl": _SOURCE_URL}, - "location": { - "query": "FLORIANOPOLIS, Santa Catarina, Brazil" - }, - "events": [ - { - "name": "confirmed", - "dateRange": { - "start": "12/07/2020Z", - "end": "12/07/2020Z" - }, - "value": "PCR test" - }, - { - "name": "onsetSymptoms", - "dateRange": { - "start": "12/04/2020Z", - "end": "12/04/2020Z" - } - }, - { - "name": "outcome", - "dateRange": { - "start": "12/10/2020Z", - "end": "12/10/2020Z" - }, - "value": "Death" - }, - { - "name": "hospitalAdmission", - "dateRange": { - "start": "12/07/2020Z", - "end": "12/07/2020Z" - }, - "value": "Yes" - }, - { - "name": "icuAdmission", - "dateRange": { - "start": "12/08/2020Z", - "end": "12/08/2020Z" - }, - "value": "Yes" - } - ], - "symptoms": { - "status": "Symptomatic", - "values": ["dyspnea", "fever", "diarrhoea"] - }, - "demographics": { - "gender": "Male", - "ageRange": { - "start": 83.0, - "end": 83.0 - }, - "ethnicity": "White" - }, - "preexistingConditions": { - "hasPreexistingConditions": True, - "values": ["cardiovascular system disease"] - }, - "restrictedNotes": "Neighbourhood: JARDIM ATLANTICO" - } - ]) diff --git a/ingestion/functions/parsing/brazil_srag/__init__.py b/ingestion/functions/parsing/brazil_srag/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/brazil_srag/dictionaries.json b/ingestion/functions/parsing/brazil_srag/dictionaries.json deleted file mode 100644 index bec597eb0..000000000 --- a/ingestion/functions/parsing/brazil_srag/dictionaries.json +++ /dev/null @@ -1,28222 +0,0 @@ -{ - "code_name_latlong": { - "110001": { - "latitude": -12.47013228, - "longitude": -62.274661, - "name": "Alta Floresta D'Oeste" - }, - "110002": { - "latitude": -9.951890007, - "longitude": -62.95725522, - "name": "Ariquemes" - }, - "110003": { - "latitude": -13.47487855, - "longitude": -60.63980722, - "name": "Cabixi" - }, - "110004": { - "latitude": -11.30128736, - "longitude": -61.32472874, - "name": "Cacoal" - }, - "110005": { - "latitude": -13.20356161, - "longitude": -61.26094956, - "name": "Cerejeiras" - }, - "110006": { - "latitude": -13.15915311, - "longitude": -60.55024441, - "name": "Colorado do Oeste" - }, - "110007": { - "latitude": -12.92662942, - "longitude": -61.09164646, - "name": "Corumbiara" - }, - "110008": { - "latitude": -12.1472501, - "longitude": -64.05877174, - "name": "Costa Marques" - }, - "110009": { - "latitude": -11.35134211, - "longitude": -60.78483065, - "name": "Espigão D'Oeste" - }, - "110010": { - "latitude": -11.30563631, - "longitude": -64.5375569, - "name": "Guajará-Mirim" - }, - "110011": { - "latitude": -10.59244806, - "longitude": -62.58486558, - "name": "Jaru" - }, - "110012": { - "latitude": -10.46222053, - "longitude": -61.75725267, - "name": "Ji-Paraná" - }, - "110013": { - "latitude": -9.204091498, - "longitude": -62.01037965, - "name": "Machadinho D'Oeste" - }, - "110014": { - "latitude": -11.64311901, - "longitude": -62.28023793, - "name": "Nova Brasilândia D'Oeste" - }, - "110015": { - "latitude": -10.610553, - "longitude": -62.17253238, - "name": "Ouro Preto do Oeste" - }, - "110018": { - "latitude": -11.89446662, - "longitude": -60.83039667, - "name": "Pimenta Bueno" - }, - "110020": { - "latitude": -9.153592827, - "longitude": -64.30681433, - "name": "Porto Velho" - }, - "110025": { - "latitude": -11.16627397, - "longitude": -61.87795282, - "name": "Presidente Médici" - }, - "110026": { - "latitude": -9.645211563, - "longitude": -62.79007448, - "name": "Rio Crespo" - }, - "110028": { - "latitude": -11.73255774, - "longitude": -61.77155553, - "name": "Rolim de Moura" - }, - "110029": { - "latitude": -12.02696779, - "longitude": -61.7010906, - "name": "Santa Luzia D'Oeste" - }, - "110030": { - "latitude": -12.09562189, - "longitude": -60.24842048, - "name": "Vilhena" - }, - "110032": { - "latitude": -11.61496887, - "longitude": -62.98324825, - "name": "São Miguel do Guaporé" - }, - "110033": { - "latitude": -10.38216746, - "longitude": -64.62909952, - "name": "Nova Mamoré" - }, - "110034": { - "latitude": -11.31142097, - "longitude": -62.54499224, - "name": "Alvorada D'Oeste" - }, - "110037": { - "latitude": -12.59373608, - "longitude": -61.88080742, - "name": "Alto Alegre dos Parecis" - }, - "110040": { - "latitude": -9.649310304, - "longitude": -63.39432225, - "name": "Alto Paraíso" - }, - "110045": { - "latitude": -10.0521153, - "longitude": -63.94116273, - "name": "Buritis" - }, - "110050": { - "latitude": -11.68109391, - "longitude": -62.08320197, - "name": "Novo Horizonte do Oeste" - }, - "110060": { - "latitude": -10.33160281, - "longitude": -62.98726129, - "name": "Cacaulândia" - }, - "110070": { - "latitude": -10.48493398, - "longitude": -63.79971647, - "name": "Campo Novo de Rondônia" - }, - "110080": { - "latitude": -8.886993889, - "longitude": -63.32562063, - "name": "Candeias do Jamari" - }, - "110090": { - "latitude": -11.47080226, - "longitude": -61.88006979, - "name": "Castanheiras" - }, - "110092": { - "latitude": -12.53732824, - "longitude": -60.89838405, - "name": "Chupinguaia" - }, - "110094": { - "latitude": -9.171093633, - "longitude": -62.56533584, - "name": "Cujubim" - }, - "110100": { - "latitude": -10.74802935, - "longitude": -63.18401214, - "name": "Governador Jorge Teixeira" - }, - "110110": { - "latitude": -9.170209678, - "longitude": -63.04494129, - "name": "Itapuã do Oeste" - }, - "110120": { - "latitude": -11.16029427, - "longitude": -61.56896917, - "name": "Ministro Andreazza" - }, - "110130": { - "latitude": -11.07683784, - "longitude": -62.84797933, - "name": "Mirante da Serra" - }, - "110140": { - "latitude": -10.2108325, - "longitude": -63.37239261, - "name": "Monte Negro" - }, - "110143": { - "latitude": -10.88934429, - "longitude": -62.53235714, - "name": "Nova União" - }, - "110145": { - "latitude": -12.26232691, - "longitude": -61.41538368, - "name": "Parecis" - }, - "110146": { - "latitude": -13.17387596, - "longitude": -61.54530688, - "name": "Pimenteiras do Oeste" - }, - "110147": { - "latitude": -11.87868596, - "longitude": -61.31533538, - "name": "Primavera de Rondônia" - }, - "110148": { - "latitude": -11.90496797, - "longitude": -61.46707042, - "name": "São Felipe D'Oeste" - }, - "110149": { - "latitude": -12.36868778, - "longitude": -63.12211265, - "name": "São Francisco do Guaporé" - }, - "110150": { - "latitude": -11.80721765, - "longitude": -63.23069907, - "name": "Seringueiras" - }, - "110155": { - "latitude": -10.94345328, - "longitude": -62.2797716, - "name": "Teixeirópolis" - }, - "110160": { - "latitude": -10.12176887, - "longitude": -62.34250455, - "name": "Theobroma" - }, - "110170": { - "latitude": -11.10395282, - "longitude": -62.42441034, - "name": "Urupá" - }, - "110175": { - "latitude": -9.732434292, - "longitude": -61.93910067, - "name": "Vale do Anari" - }, - "110180": { - "latitude": -10.3842567, - "longitude": -62.09404653, - "name": "Vale do Paraíso" - }, - "120001": { - "latitude": -9.933934858, - "longitude": -66.9501677, - "name": "Acrelândia" - }, - "120005": { - "latitude": -10.77975886, - "longitude": -70.0056837, - "name": "Assis Brasil" - }, - "120010": { - "latitude": -10.74737378, - "longitude": -69.20747773, - "name": "Brasiléia" - }, - "120013": { - "latitude": -9.614094874, - "longitude": -68.17371087, - "name": "Bujari" - }, - "120017": { - "latitude": -10.47423341, - "longitude": -67.83584236, - "name": "Capixaba" - }, - "120020": { - "latitude": -7.971860231, - "longitude": -72.75480753, - "name": "Cruzeiro do Sul" - }, - "120025": { - "latitude": -10.88919626, - "longitude": -68.61822203, - "name": "Epitaciolândia" - }, - "120030": { - "latitude": -8.924431928, - "longitude": -70.74477078, - "name": "Feijó" - }, - "120032": { - "latitude": -9.242653117, - "longitude": -71.90611215, - "name": "Jordão" - }, - "120033": { - "latitude": -7.504429807, - "longitude": -73.43909378, - "name": "Mâncio Lima" - }, - "120034": { - "latitude": -9.381104114, - "longitude": -69.85377943, - "name": "Manoel Urbano" - }, - "120035": { - "latitude": -9.09628644, - "longitude": -72.55923165, - "name": "Marechal Thaumaturgo" - }, - "120038": { - "latitude": -10.24909402, - "longitude": -67.34031894, - "name": "Plácido de Castro" - }, - "120039": { - "latitude": -8.491908531, - "longitude": -72.73355121, - "name": "Porto Walter" - }, - "120040": { - "latitude": -10.06613495, - "longitude": -68.37106195, - "name": "Rio Branco" - }, - "120042": { - "latitude": -7.843835283, - "longitude": -73.22344787, - "name": "Rodrigues Alves" - }, - "120043": { - "latitude": -9.410637702, - "longitude": -70.39578416, - "name": "Santa Rosa do Purus" - }, - "120045": { - "latitude": -9.997220896, - "longitude": -67.42759363, - "name": "Senador Guiomard" - }, - "120050": { - "latitude": -9.77142177, - "longitude": -69.38179518, - "name": "Sena Madureira" - }, - "120060": { - "latitude": -8.239465959, - "longitude": -71.44499153, - "name": "Tarauacá" - }, - "120070": { - "latitude": -10.57559943, - "longitude": -68.50473328, - "name": "Xapuri" - }, - "120080": { - "latitude": -9.629473706, - "longitude": -67.69848711, - "name": "Porto Acre" - }, - "130002": { - "latitude": -3.694684747, - "longitude": -65.3244467, - "name": "Alvarães" - }, - "130006": { - "latitude": -3.418433428, - "longitude": -68.28649947, - "name": "Amaturá" - }, - "130008": { - "latitude": -3.501856787, - "longitude": -61.71798788, - "name": "Anamã" - }, - "130010": { - "latitude": -4.198680215, - "longitude": -62.09540948, - "name": "Anori" - }, - "130014": { - "latitude": -7.75995148, - "longitude": -59.43210835, - "name": "Apuí" - }, - "130020": { - "latitude": -5.711904462, - "longitude": -71.74137109, - "name": "Atalaia do Norte" - }, - "130030": { - "latitude": -3.787230511, - "longitude": -59.5255339, - "name": "Autazes" - }, - "130040": { - "latitude": -0.465099219, - "longitude": -63.43471764, - "name": "Barcelos" - }, - "130050": { - "latitude": -3.129025206, - "longitude": -57.1723833, - "name": "Barreirinha" - }, - "130060": { - "latitude": -5.426668847, - "longitude": -70.2761166, - "name": "Benjamin Constant" - }, - "130063": { - "latitude": -4.606232874, - "longitude": -61.80435257, - "name": "Beruri" - }, - "130068": { - "latitude": -3.137810907, - "longitude": -57.67010991, - "name": "Boa Vista do Ramos" - }, - "130070": { - "latitude": -8.773154668, - "longitude": -68.04763359, - "name": "Boca do Acre" - }, - "130080": { - "latitude": -4.957617435, - "longitude": -59.53469393, - "name": "Borba" - }, - "130083": { - "latitude": -3.082018998, - "longitude": -61.87775781, - "name": "Caapiranga" - }, - "130090": { - "latitude": -7.3007581, - "longitude": -64.06190341, - "name": "Canutama" - }, - "130100": { - "latitude": -5.118516488, - "longitude": -67.33747164, - "name": "Carauari" - }, - "130110": { - "latitude": -3.770484299, - "longitude": -60.18327327, - "name": "Careiro" - }, - "130115": { - "latitude": -3.28601205, - "longitude": -59.598677, - "name": "Careiro da Várzea" - }, - "130120": { - "latitude": -4.436351417, - "longitude": -64.12531065, - "name": "Coari" - }, - "130130": { - "latitude": -3.288971966, - "longitude": -62.97331502, - "name": "Codajás" - }, - "130140": { - "latitude": -7.021998047, - "longitude": -70.21824815, - "name": "Eirunepé" - }, - "130150": { - "latitude": -7.57330419, - "longitude": -70.05508589, - "name": "Envira" - }, - "130160": { - "latitude": -2.490985541, - "longitude": -66.35792421, - "name": "Fonte Boa" - }, - "130165": { - "latitude": -7.22978093, - "longitude": -72.84458795, - "name": "Guajará" - }, - "130170": { - "latitude": -7.361217641, - "longitude": -62.48643529, - "name": "Humaitá" - }, - "130180": { - "latitude": -7.180511579, - "longitude": -71.41286687, - "name": "Ipixuna" - }, - "130185": { - "latitude": -3.095218725, - "longitude": -60.47968722, - "name": "Iranduba" - }, - "130190": { - "latitude": -3.174123473, - "longitude": -58.7753428, - "name": "Itacoatiara" - }, - "130195": { - "latitude": -6.68282224, - "longitude": -68.11284122, - "name": "Itamarati" - }, - "130200": { - "latitude": -2.497237443, - "longitude": -58.61326834, - "name": "Itapiranga" - }, - "130210": { - "latitude": -1.69708071, - "longitude": -68.3211177, - "name": "Japurá" - }, - "130220": { - "latitude": -3.524464207, - "longitude": -66.30779919, - "name": "Juruá" - }, - "130230": { - "latitude": -4.715290852, - "longitude": -68.40630449, - "name": "Jutaí" - }, - "130240": { - "latitude": -8.37560148, - "longitude": -65.81166286, - "name": "Lábrea" - }, - "130250": { - "latitude": -3.291538169, - "longitude": -60.9587578, - "name": "Manacapuru" - }, - "130255": { - "latitude": -3.779050741, - "longitude": -60.69726606, - "name": "Manaquiri" - }, - "130260": { - "latitude": -2.625919383, - "longitude": -60.25962801, - "name": "Manaus" - }, - "130270": { - "latitude": -6.459959761, - "longitude": -61.44677314, - "name": "Manicoré" - }, - "130280": { - "latitude": -2.426828643, - "longitude": -65.03955123, - "name": "Maraã" - }, - "130290": { - "latitude": -4.98478095, - "longitude": -58.06092285, - "name": "Maués" - }, - "130300": { - "latitude": -1.680585792, - "longitude": -57.65624541, - "name": "Nhamundá" - }, - "130310": { - "latitude": -3.989502822, - "longitude": -58.59976987, - "name": "Nova Olinda do Norte" - }, - "130320": { - "latitude": -2.048245988, - "longitude": -61.70342029, - "name": "Novo Airão" - }, - "130330": { - "latitude": -6.824012902, - "longitude": -60.4771548, - "name": "Novo Aripuanã" - }, - "130340": { - "latitude": -2.688097966, - "longitude": -56.85464487, - "name": "Parintins" - }, - "130350": { - "latitude": -7.75780544, - "longitude": -68.19714095, - "name": "Pauini" - }, - "130353": { - "latitude": -1.370919582, - "longitude": -59.98955277, - "name": "Presidente Figueiredo" - }, - "130356": { - "latitude": -2.529822925, - "longitude": -59.63838042, - "name": "Rio Preto da Eva" - }, - "130360": { - "latitude": -0.318364, - "longitude": -65.52132858, - "name": "Santa Isabel do Rio Negro" - }, - "130370": { - "latitude": -3.052904849, - "longitude": -69.08934841, - "name": "Santo Antônio do Içá" - }, - "130380": { - "latitude": 0.374898072, - "longitude": -67.99693268, - "name": "São Gabriel da Cachoeira" - }, - "130390": { - "latitude": -4.501436485, - "longitude": -69.45111859, - "name": "São Paulo de Olivença" - }, - "130395": { - "latitude": -1.94176235, - "longitude": -58.70526098, - "name": "São Sebastião do Uatumã" - }, - "130400": { - "latitude": -2.820549321, - "longitude": -58.53708735, - "name": "Silves" - }, - "130406": { - "latitude": -4.028516857, - "longitude": -69.67808655, - "name": "Tabatinga" - }, - "130410": { - "latitude": -6.093701967, - "longitude": -64.95579642, - "name": "Tapauá" - }, - "130420": { - "latitude": -4.470110667, - "longitude": -65.53153604, - "name": "Tefé" - }, - "130423": { - "latitude": -2.691809172, - "longitude": -67.82604943, - "name": "Tonantins" - }, - "130426": { - "latitude": -3.165655864, - "longitude": -65.41078966, - "name": "Uarini" - }, - "130430": { - "latitude": -0.894390408, - "longitude": -59.02958765, - "name": "Urucará" - }, - "130440": { - "latitude": -2.813757324, - "longitude": -57.77131014, - "name": "Urucurituba" - }, - "140002": { - "latitude": 3.732902037, - "longitude": -62.43702176, - "name": "Amajari" - }, - "140005": { - "latitude": 3.072100356, - "longitude": -62.74236801, - "name": "Alto Alegre" - }, - "140010": { - "latitude": 3.117915001, - "longitude": -60.71795309, - "name": "Boa Vista" - }, - "140015": { - "latitude": 2.78766233, - "longitude": -60.10061132, - "name": "Bonfim" - }, - "140017": { - "latitude": 2.272836718, - "longitude": -60.54228497, - "name": "Cantá" - }, - "140020": { - "latitude": 0.990734209, - "longitude": -61.47156263, - "name": "Caracaraí" - }, - "140023": { - "latitude": 0.914690287, - "longitude": -59.33814403, - "name": "Caroebe" - }, - "140028": { - "latitude": 2.181807877, - "longitude": -62.40165933, - "name": "Iracema" - }, - "140030": { - "latitude": 2.510970975, - "longitude": -61.99678865, - "name": "Mucajaí" - }, - "140040": { - "latitude": 3.878878783, - "longitude": -60.0654338, - "name": "Normandia" - }, - "140045": { - "latitude": 4.168524264, - "longitude": -60.83938098, - "name": "Pacaraima" - }, - "140047": { - "latitude": 0.038040997, - "longitude": -61.01117501, - "name": "Rorainópolis" - }, - "140050": { - "latitude": 0.635780084, - "longitude": -59.84501997, - "name": "São João da Baliza" - }, - "140060": { - "latitude": 0.884434676, - "longitude": -60.151836, - "name": "São Luiz" - }, - "140070": { - "latitude": 4.68542495, - "longitude": -60.27933517, - "name": "Uiramutã" - }, - "150010": { - "latitude": -1.730257272, - "longitude": -48.88306888, - "name": "Abaetetuba" - }, - "150013": { - "latitude": -4.957318689, - "longitude": -48.42460077, - "name": "Abel Figueiredo" - }, - "150020": { - "latitude": -2.035385965, - "longitude": -48.41145042, - "name": "Acará" - }, - "150030": { - "latitude": -0.26284105, - "longitude": -50.72590507, - "name": "Afuá" - }, - "150034": { - "latitude": -6.772978677, - "longitude": -50.43015506, - "name": "Água Azul do Norte" - }, - "150040": { - "latitude": -0.604682709, - "longitude": -55.0391555, - "name": "Alenquer" - }, - "150050": { - "latitude": 0.284478936, - "longitude": -53.89358505, - "name": "Almeirim" - }, - "150060": { - "latitude": -6.486171806, - "longitude": -53.88668321, - "name": "Altamira" - }, - "150070": { - "latitude": -0.827132549, - "longitude": -49.96139117, - "name": "Anajás" - }, - "150080": { - "latitude": -1.334076858, - "longitude": -48.38354433, - "name": "Ananindeua" - }, - "150085": { - "latitude": -3.997185122, - "longitude": -51.30127774, - "name": "Anapu" - }, - "150090": { - "latitude": -1.106888109, - "longitude": -46.50821625, - "name": "Augusto Corrêa" - }, - "150095": { - "latitude": -2.231178571, - "longitude": -47.72635255, - "name": "Aurora do Pará" - }, - "150100": { - "latitude": -3.667215101, - "longitude": -56.01629836, - "name": "Aveiro" - }, - "150110": { - "latitude": -2.373143109, - "longitude": -50.18176698, - "name": "Bagre" - }, - "150120": { - "latitude": -3.129827241, - "longitude": -49.69897986, - "name": "Baião" - }, - "150125": { - "latitude": -7.486384401, - "longitude": -50.63441634, - "name": "Bannach" - }, - "150130": { - "latitude": -1.498617993, - "longitude": -48.63423095, - "name": "Barcarena" - }, - "150140": { - "latitude": -1.240718656, - "longitude": -48.45991077, - "name": "Belém" - }, - "150145": { - "latitude": -3.191127451, - "longitude": -54.99284971, - "name": "Belterra" - }, - "150150": { - "latitude": -1.339617611, - "longitude": -48.27562032, - "name": "Benevides" - }, - "150157": { - "latitude": -5.054266699, - "longitude": -48.76351445, - "name": "Bom Jesus do Tocantins" - }, - "150160": { - "latitude": -1.38733737, - "longitude": -47.3022805, - "name": "Bonito" - }, - "150170": { - "latitude": -1.193215244, - "longitude": -46.76359393, - "name": "Bragança" - }, - "150172": { - "latitude": -3.292106289, - "longitude": -52.68540476, - "name": "Brasil Novo" - }, - "150175": { - "latitude": -5.735506807, - "longitude": -48.43188898, - "name": "Brejo Grande do Araguaia" - }, - "150178": { - "latitude": -3.733484054, - "longitude": -49.3712201, - "name": "Breu Branco" - }, - "150180": { - "latitude": -1.120905041, - "longitude": -50.62814637, - "name": "Breves" - }, - "150190": { - "latitude": -1.632969008, - "longitude": -48.08987704, - "name": "Bujaru" - }, - "150195": { - "latitude": -1.988673657, - "longitude": -46.44321356, - "name": "Cachoeira do Piriá" - }, - "150200": { - "latitude": -0.869423617, - "longitude": -48.87724142, - "name": "Cachoeira do Arari" - }, - "150210": { - "latitude": -2.253061762, - "longitude": -49.51357185, - "name": "Cametá" - }, - "150215": { - "latitude": -6.424205512, - "longitude": -50.085674, - "name": "Canaã dos Carajás" - }, - "150220": { - "latitude": -1.142083829, - "longitude": -47.11790092, - "name": "Capanema" - }, - "150230": { - "latitude": -2.042165067, - "longitude": -47.23339596, - "name": "Capitão Poço" - }, - "150240": { - "latitude": -1.268514868, - "longitude": -47.87698077, - "name": "Castanhal" - }, - "150250": { - "latitude": -0.033159924, - "longitude": -49.84343908, - "name": "Chaves" - }, - "150260": { - "latitude": -0.93584592, - "longitude": -48.2737191, - "name": "Colares" - }, - "150270": { - "latitude": -8.182491118, - "longitude": -49.51270839, - "name": "Conceição do Araguaia" - }, - "150275": { - "latitude": -1.881720383, - "longitude": -47.97465721, - "name": "Concórdia do Pará" - }, - "150276": { - "latitude": -8.458172013, - "longitude": -51.2210371, - "name": "Cumaru do Norte" - }, - "150277": { - "latitude": -6.228930192, - "longitude": -49.62461067, - "name": "Curionópolis" - }, - "150280": { - "latitude": -1.583462266, - "longitude": -49.9880339, - "name": "Curralinho" - }, - "150285": { - "latitude": -1.845742852, - "longitude": -55.11349124, - "name": "Curuá" - }, - "150290": { - "latitude": -0.743581552, - "longitude": -47.86343073, - "name": "Curuçá" - }, - "150293": { - "latitude": -4.18657616, - "longitude": -47.89811163, - "name": "Dom Eliseu" - }, - "150295": { - "latitude": -6.06964532, - "longitude": -49.24543529, - "name": "Eldorado do Carajás" - }, - "150300": { - "latitude": -1.15915039, - "longitude": -57.80590759, - "name": "Faro" - }, - "150304": { - "latitude": -7.548322817, - "longitude": -49.57603054, - "name": "Floresta do Araguaia" - }, - "150307": { - "latitude": -2.168305805, - "longitude": -47.07597679, - "name": "Garrafão do Norte" - }, - "150309": { - "latitude": -4.027193117, - "longitude": -49.00571835, - "name": "Goianésia do Pará" - }, - "150310": { - "latitude": -1.149438285, - "longitude": -51.5539215, - "name": "Gurupá" - }, - "150320": { - "latitude": -1.145018485, - "longitude": -47.56598771, - "name": "Igarapé-Açu" - }, - "150330": { - "latitude": -2.062705659, - "longitude": -49.13074464, - "name": "Igarapé-Miri" - }, - "150340": { - "latitude": -1.464677078, - "longitude": -47.92266995, - "name": "Inhangapi" - }, - "150345": { - "latitude": -2.805778162, - "longitude": -47.92154625, - "name": "Ipixuna do Pará" - }, - "150350": { - "latitude": -1.811535564, - "longitude": -47.39985943, - "name": "Irituia" - }, - "150360": { - "latitude": -5.871135292, - "longitude": -56.4967153, - "name": "Itaituba" - }, - "150370": { - "latitude": -5.114824257, - "longitude": -49.86970606, - "name": "Itupiranga" - }, - "150375": { - "latitude": -7.445286923, - "longitude": -57.3027053, - "name": "Jacareacanga" - }, - "150380": { - "latitude": -4.598532716, - "longitude": -49.18119783, - "name": "Jacundá" - }, - "150390": { - "latitude": -2.62288887, - "longitude": -56.2213899, - "name": "Juruti" - }, - "150400": { - "latitude": -1.864269102, - "longitude": -49.46913654, - "name": "Limoeiro do Ajuru" - }, - "150405": { - "latitude": -1.991012524, - "longitude": -47.51278297, - "name": "Mãe do Rio" - }, - "150410": { - "latitude": -0.809851742, - "longitude": -47.63520971, - "name": "Magalhães Barata" - }, - "150420": { - "latitude": -5.629799735, - "longitude": -50.01696035, - "name": "Marabá" - }, - "150430": { - "latitude": -0.810134913, - "longitude": -47.49744145, - "name": "Maracanã" - }, - "150440": { - "latitude": -0.837412842, - "longitude": -47.709813, - "name": "Marapanim" - }, - "150442": { - "latitude": -1.397450259, - "longitude": -48.31978976, - "name": "Marituba" - }, - "150445": { - "latitude": -3.16021317, - "longitude": -53.19499824, - "name": "Medicilândia" - }, - "150450": { - "latitude": -1.607631796, - "longitude": -51.10386391, - "name": "Melgaço" - }, - "150460": { - "latitude": -2.576689166, - "longitude": -49.46638172, - "name": "Mocajuba" - }, - "150470": { - "latitude": -2.683911486, - "longitude": -49.07404191, - "name": "Moju" - }, - "150475": { - "latitude": -3.070440004, - "longitude": -54.57515311, - "name": "Mojuí dos Campos" - }, - "150480": { - "latitude": -1.074400167, - "longitude": -54.35304896, - "name": "Monte Alegre" - }, - "150490": { - "latitude": -1.355675248, - "longitude": -49.30925025, - "name": "Muaná" - }, - "150495": { - "latitude": -2.392643684, - "longitude": -46.90004255, - "name": "Nova Esperança do Piriá" - }, - "150497": { - "latitude": -4.98107037, - "longitude": -49.23077059, - "name": "Nova Ipixuna" - }, - "150500": { - "latitude": -1.156442981, - "longitude": -47.39214769, - "name": "Nova Timboteua" - }, - "150503": { - "latitude": -8.062276597, - "longitude": -55.61202636, - "name": "Novo Progresso" - }, - "150506": { - "latitude": -4.502843479, - "longitude": -50.27160968, - "name": "Novo Repartimento" - }, - "150510": { - "latitude": -0.169646068, - "longitude": -55.67486499, - "name": "Óbidos" - }, - "150520": { - "latitude": -2.278918912, - "longitude": -49.90233023, - "name": "Oeiras do Pará" - }, - "150530": { - "latitude": 0.254979591, - "longitude": -57.14982549, - "name": "Oriximiná" - }, - "150540": { - "latitude": -1.495919384, - "longitude": -47.13919608, - "name": "Ourém" - }, - "150543": { - "latitude": -7.520545379, - "longitude": -51.4309361, - "name": "Ourilândia do Norte" - }, - "150548": { - "latitude": -3.684125743, - "longitude": -50.63168055, - "name": "Pacajá" - }, - "150549": { - "latitude": -5.927267065, - "longitude": -48.37018418, - "name": "Palestina do Pará" - }, - "150550": { - "latitude": -3.203450009, - "longitude": -47.60315146, - "name": "Paragominas" - }, - "150553": { - "latitude": -6.151734286, - "longitude": -50.48977246, - "name": "Parauapebas" - }, - "150555": { - "latitude": -7.736975192, - "longitude": -50.1236223, - "name": "Pau D'Arco" - }, - "150560": { - "latitude": -1.130711397, - "longitude": -47.27198228, - "name": "Peixe-Boi" - }, - "150563": { - "latitude": -6.541034913, - "longitude": -49.01176915, - "name": "Piçarra" - }, - "150565": { - "latitude": -3.889824154, - "longitude": -54.50065903, - "name": "Placas" - }, - "150570": { - "latitude": -1.117508432, - "longitude": -49.07728201, - "name": "Ponta de Pedras" - }, - "150580": { - "latitude": -2.565429098, - "longitude": -50.95562441, - "name": "Portel" - }, - "150590": { - "latitude": -2.184592864, - "longitude": -52.54775052, - "name": "Porto de Moz" - }, - "150600": { - "latitude": -2.120245271, - "longitude": -53.66017206, - "name": "Prainha" - }, - "150610": { - "latitude": -0.952686536, - "longitude": -47.13147439, - "name": "Primavera" - }, - "150611": { - "latitude": -0.860089243, - "longitude": -47.0155307, - "name": "Quatipuru" - }, - "150613": { - "latitude": -8.069328965, - "longitude": -50.19812406, - "name": "Redenção" - }, - "150616": { - "latitude": -7.340632794, - "longitude": -49.89514344, - "name": "Rio Maria" - }, - "150618": { - "latitude": -4.516927472, - "longitude": -48.46003674, - "name": "Rondon do Pará" - }, - "150619": { - "latitude": -4.241042514, - "longitude": -55.21074008, - "name": "Rurópolis" - }, - "150620": { - "latitude": -0.68395459, - "longitude": -47.3517023, - "name": "Salinópolis" - }, - "150630": { - "latitude": -0.796623637, - "longitude": -48.62998389, - "name": "Salvaterra" - }, - "150635": { - "latitude": -1.194335572, - "longitude": -48.25051696, - "name": "Santa Bárbara do Pará" - }, - "150640": { - "latitude": -0.583350036, - "longitude": -49.31385904, - "name": "Santa Cruz do Arari" - }, - "150650": { - "latitude": -1.365206765, - "longitude": -48.12930742, - "name": "Santa Izabel do Pará" - }, - "150655": { - "latitude": -1.656634413, - "longitude": -46.92691695, - "name": "Santa Luzia do Pará" - }, - "150658": { - "latitude": -8.633787536, - "longitude": -50.31437024, - "name": "Santa Maria das Barreiras" - }, - "150660": { - "latitude": -1.374485278, - "longitude": -47.52164211, - "name": "Santa Maria do Pará" - }, - "150670": { - "latitude": -9.364055728, - "longitude": -50.61128172, - "name": "Santana do Araguaia" - }, - "150680": { - "latitude": -2.679336294, - "longitude": -55.23845547, - "name": "Santarém" - }, - "150690": { - "latitude": -0.913343979, - "longitude": -47.33294661, - "name": "Santarém Novo" - }, - "150700": { - "latitude": -1.093255829, - "longitude": -48.18276546, - "name": "Santo Antônio do Tauá" - }, - "150710": { - "latitude": -0.866067164, - "longitude": -48.02583585, - "name": "São Caetano de Odivelas" - }, - "150715": { - "latitude": -5.657595271, - "longitude": -48.73059443, - "name": "São Domingos do Araguaia" - }, - "150720": { - "latitude": -1.882565259, - "longitude": -47.7714875, - "name": "São Domingos do Capim" - }, - "150730": { - "latitude": -7.233364916, - "longitude": -52.25269763, - "name": "São Félix do Xingu" - }, - "150740": { - "latitude": -1.206000277, - "longitude": -47.74684435, - "name": "São Francisco do Pará" - }, - "150745": { - "latitude": -6.189251146, - "longitude": -48.748223, - "name": "São Geraldo do Araguaia" - }, - "150746": { - "latitude": -0.870468399, - "longitude": -47.96446616, - "name": "São João da Ponta" - }, - "150747": { - "latitude": -0.783800564, - "longitude": -47.21787286, - "name": "São João de Pirabas" - }, - "150750": { - "latitude": -5.447322885, - "longitude": -48.69679179, - "name": "São João do Araguaia" - }, - "150760": { - "latitude": -1.551532387, - "longitude": -47.61077252, - "name": "São Miguel do Guamá" - }, - "150770": { - "latitude": -1.434118275, - "longitude": -49.68028251, - "name": "São Sebastião da Boa Vista" - }, - "150775": { - "latitude": -6.838887424, - "longitude": -49.56976978, - "name": "Sapucaia" - }, - "150780": { - "latitude": -4.32409362, - "longitude": -51.76375723, - "name": "Senador José Porfírio" - }, - "150790": { - "latitude": -0.448291812, - "longitude": -48.69768095, - "name": "Soure" - }, - "150795": { - "latitude": -2.907818874, - "longitude": -48.73670062, - "name": "Tailândia" - }, - "150796": { - "latitude": -1.002593098, - "longitude": -47.84829434, - "name": "Terra Alta" - }, - "150797": { - "latitude": -1.951503493, - "longitude": -56.45842414, - "name": "Terra Santa" - }, - "150800": { - "latitude": -2.636125874, - "longitude": -48.26762548, - "name": "Tomé-Açu" - }, - "150803": { - "latitude": -1.040966523, - "longitude": -46.9389774, - "name": "Tracuateua" - }, - "150805": { - "latitude": -5.130225126, - "longitude": -56.00346708, - "name": "Trairão" - }, - "150808": { - "latitude": -6.820196209, - "longitude": -51.39138573, - "name": "Tucumã" - }, - "150810": { - "latitude": -3.856279249, - "longitude": -49.82113441, - "name": "Tucuruí" - }, - "150812": { - "latitude": -3.80983984, - "longitude": -47.49360911, - "name": "Ulianópolis" - }, - "150815": { - "latitude": -3.583616144, - "longitude": -53.8073361, - "name": "Uruará" - }, - "150820": { - "latitude": -0.933415473, - "longitude": -48.1049293, - "name": "Vigia" - }, - "150830": { - "latitude": -1.525564291, - "longitude": -46.45375116, - "name": "Viseu" - }, - "150835": { - "latitude": -3.135268237, - "longitude": -51.97397424, - "name": "Vitória do Xingu" - }, - "150840": { - "latitude": -6.917778413, - "longitude": -49.63526941, - "name": "Xinguara" - }, - "160005": { - "latitude": 1.651747648, - "longitude": -52.2681388, - "name": "Serra do Navio" - }, - "160010": { - "latitude": 1.729894927, - "longitude": -50.60237832, - "name": "Amapá" - }, - "160015": { - "latitude": 1.157614448, - "longitude": -52.5195645, - "name": "Pedra Branca do Amapari" - }, - "160020": { - "latitude": 2.423843973, - "longitude": -51.40664792, - "name": "Calçoene" - }, - "160021": { - "latitude": 1.03557404, - "longitude": -50.48707712, - "name": "Cutias" - }, - "160023": { - "latitude": 0.95710433, - "longitude": -51.41735136, - "name": "Ferreira Gomes" - }, - "160025": { - "latitude": 0.538387979, - "longitude": -50.64025107, - "name": "Itaubal" - }, - "160027": { - "latitude": 1.101363553, - "longitude": -53.31054594, - "name": "Laranjal do Jari" - }, - "160030": { - "latitude": 0.562753202, - "longitude": -50.69178036, - "name": "Macapá" - }, - "160040": { - "latitude": -0.066836624, - "longitude": -51.95119334, - "name": "Mazagão" - }, - "160050": { - "latitude": 3.11180784, - "longitude": -51.89869075, - "name": "Oiapoque" - }, - "160053": { - "latitude": 0.58562844, - "longitude": -51.66998321, - "name": "Porto Grande" - }, - "160055": { - "latitude": 1.625814909, - "longitude": -51.27852952, - "name": "Pracuúba" - }, - "160060": { - "latitude": 0.129806464, - "longitude": -51.37836544, - "name": "Santana" - }, - "160070": { - "latitude": 1.297577102, - "longitude": -50.99261556, - "name": "Tartarugalzinho" - }, - "160080": { - "latitude": -0.996442322, - "longitude": -52.06117847, - "name": "Vitória do Jari" - }, - "170025": { - "latitude": -9.478807702, - "longitude": -49.31125315, - "name": "Abreulândia" - }, - "170030": { - "latitude": -6.488578775, - "longitude": -47.51337205, - "name": "Aguiarnópolis" - }, - "170035": { - "latitude": -11.33118268, - "longitude": -48.90829469, - "name": "Aliança do Tocantins" - }, - "170040": { - "latitude": -11.42950523, - "longitude": -47.21101898, - "name": "Almas" - }, - "170070": { - "latitude": -12.40749576, - "longitude": -49.11179393, - "name": "Alvorada" - }, - "170100": { - "latitude": -6.232678534, - "longitude": -48.18663835, - "name": "Ananás" - }, - "170105": { - "latitude": -6.435793949, - "longitude": -47.91316489, - "name": "Angico" - }, - "170110": { - "latitude": -9.986598002, - "longitude": -48.00004031, - "name": "Aparecida do Rio Negro" - }, - "170130": { - "latitude": -6.945523747, - "longitude": -48.63233015, - "name": "Aragominas" - }, - "170190": { - "latitude": -8.939098763, - "longitude": -49.50553999, - "name": "Araguacema" - }, - "170200": { - "latitude": -12.83985847, - "longitude": -49.69635389, - "name": "Araguaçu" - }, - "170210": { - "latitude": -7.331298749, - "longitude": -48.58780158, - "name": "Araguaína" - }, - "170215": { - "latitude": -6.790970407, - "longitude": -48.52454083, - "name": "Araguanã" - }, - "170220": { - "latitude": -5.665840503, - "longitude": -48.1048218, - "name": "Araguatins" - }, - "170230": { - "latitude": -7.723417227, - "longitude": -48.99983006, - "name": "Arapoema" - }, - "170240": { - "latitude": -12.81719263, - "longitude": -47.04777446, - "name": "Arraias" - }, - "170255": { - "latitude": -5.497817643, - "longitude": -47.92815452, - "name": "Augustinópolis" - }, - "170270": { - "latitude": -12.64663622, - "longitude": -46.43288117, - "name": "Aurora do Tocantins" - }, - "170290": { - "latitude": -5.649398421, - "longitude": -47.76610862, - "name": "Axixá do Tocantins" - }, - "170300": { - "latitude": -7.174540673, - "longitude": -47.85683716, - "name": "Babaçulândia" - }, - "170305": { - "latitude": -7.903014329, - "longitude": -48.67554443, - "name": "Bandeirantes do Tocantins" - }, - "170307": { - "latitude": -7.717768856, - "longitude": -47.5786079, - "name": "Barra do Ouro" - }, - "170310": { - "latitude": -9.865780969, - "longitude": -48.79119008, - "name": "Barrolândia" - }, - "170320": { - "latitude": -7.983475216, - "longitude": -48.96911675, - "name": "Bernardo Sayão" - }, - "170330": { - "latitude": -9.012406581, - "longitude": -47.87922006, - "name": "Bom Jesus do Tocantins" - }, - "170360": { - "latitude": -8.289902281, - "longitude": -48.44279293, - "name": "Brasilândia do Tocantins" - }, - "170370": { - "latitude": -11.02927078, - "longitude": -48.62412678, - "name": "Brejinho de Nazaré" - }, - "170380": { - "latitude": -5.337668759, - "longitude": -48.13631398, - "name": "Buriti do Tocantins" - }, - "170382": { - "latitude": -6.090008623, - "longitude": -47.841336, - "name": "Cachoeirinha" - }, - "170384": { - "latitude": -8.203799018, - "longitude": -46.80458427, - "name": "Campos Lindos" - }, - "170386": { - "latitude": -11.9330276, - "longitude": -49.20277778, - "name": "Cariri do Tocantins" - }, - "170388": { - "latitude": -7.045120555, - "longitude": -48.37454303, - "name": "Carmolândia" - }, - "170389": { - "latitude": -5.3371728, - "longitude": -48.00992545, - "name": "Carrasco Bonito" - }, - "170390": { - "latitude": -9.401668358, - "longitude": -49.84857197, - "name": "Caseara" - }, - "170410": { - "latitude": -9.073795005, - "longitude": -47.44478222, - "name": "Centenário" - }, - "170460": { - "latitude": -10.1657128, - "longitude": -49.19567144, - "name": "Chapada de Areia" - }, - "170510": { - "latitude": -11.54106995, - "longitude": -47.8464416, - "name": "Chapada da Natividade" - }, - "170550": { - "latitude": -8.076435622, - "longitude": -48.53011531, - "name": "Colinas do Tocantins" - }, - "170555": { - "latitude": -12.84628301, - "longitude": -46.50374865, - "name": "Combinado" - }, - "170560": { - "latitude": -12.17103423, - "longitude": -47.30367349, - "name": "Conceição do Tocantins" - }, - "170600": { - "latitude": -8.436744562, - "longitude": -49.16244725, - "name": "Couto Magalhães" - }, - "170610": { - "latitude": -10.63638178, - "longitude": -49.31240845, - "name": "Cristalândia" - }, - "170625": { - "latitude": -11.17186179, - "longitude": -49.0727469, - "name": "Crixás do Tocantins" - }, - "170650": { - "latitude": -6.763412861, - "longitude": -47.76787751, - "name": "Darcinópolis" - }, - "170700": { - "latitude": -11.69480343, - "longitude": -46.79575063, - "name": "Dianópolis" - }, - "170710": { - "latitude": -9.695133728, - "longitude": -49.354754, - "name": "Divinópolis do Tocantins" - }, - "170720": { - "latitude": -9.270936777, - "longitude": -49.06693251, - "name": "Dois Irmãos do Tocantins" - }, - "170730": { - "latitude": -11.42722827, - "longitude": -49.39127656, - "name": "Dueré" - }, - "170740": { - "latitude": -5.326292135, - "longitude": -48.5403192, - "name": "Esperantina" - }, - "170755": { - "latitude": -10.8097574, - "longitude": -48.87232658, - "name": "Fátima" - }, - "170765": { - "latitude": -12.26347056, - "longitude": -49.28279236, - "name": "Figueirópolis" - }, - "170770": { - "latitude": -7.496680436, - "longitude": -47.79374794, - "name": "Filadélfia" - }, - "170820": { - "latitude": -11.95827272, - "longitude": -50.09809065, - "name": "Formoso do Araguaia" - }, - "170825": { - "latitude": -9.071431543, - "longitude": -48.54602483, - "name": "Tabocão" - }, - "170830": { - "latitude": -8.873203968, - "longitude": -49.01119427, - "name": "Goianorte" - }, - "170900": { - "latitude": -8.094161091, - "longitude": -47.48153446, - "name": "Goiatins" - }, - "170930": { - "latitude": -8.738466691, - "longitude": -48.44167334, - "name": "Guaraí" - }, - "170950": { - "latitude": -11.65159703, - "longitude": -48.88735747, - "name": "Gurupi" - }, - "170980": { - "latitude": -11.13508239, - "longitude": -48.40352243, - "name": "Ipueiras" - }, - "171050": { - "latitude": -8.571533098, - "longitude": -47.66931771, - "name": "Itacajá" - }, - "171070": { - "latitude": -5.802727673, - "longitude": -47.59507332, - "name": "Itaguatins" - }, - "171090": { - "latitude": -8.316305488, - "longitude": -48.03331771, - "name": "Itapiratins" - }, - "171110": { - "latitude": -8.451208482, - "longitude": -48.75260812, - "name": "Itaporã do Tocantins" - }, - "171150": { - "latitude": -12.74773693, - "longitude": -48.64548505, - "name": "Jaú do Tocantins" - }, - "171180": { - "latitude": -8.140807661, - "longitude": -49.11033284, - "name": "Juarina" - }, - "171190": { - "latitude": -11.03499883, - "longitude": -50.16072229, - "name": "Lagoa da Confusão" - }, - "171195": { - "latitude": -10.34186258, - "longitude": -47.48114441, - "name": "Lagoa do Tocantins" - }, - "171200": { - "latitude": -9.850561801, - "longitude": -48.29095226, - "name": "Lajeado" - }, - "171215": { - "latitude": -12.81262735, - "longitude": -46.41045504, - "name": "Lavandeira" - }, - "171240": { - "latitude": -9.524825727, - "longitude": -46.93895289, - "name": "Lizarda" - }, - "171245": { - "latitude": -6.206019343, - "longitude": -47.83074217, - "name": "Luzinópolis" - }, - "171250": { - "latitude": -9.787577535, - "longitude": -49.7000395, - "name": "Marianópolis do Tocantins" - }, - "171270": { - "latitude": -10.58300801, - "longitude": -46.50260695, - "name": "Mateiros" - }, - "171280": { - "latitude": -6.023178211, - "longitude": -47.5899439, - "name": "Maurilândia do Tocantins" - }, - "171320": { - "latitude": -9.754160547, - "longitude": -48.55146789, - "name": "Miracema do Tocantins" - }, - "171330": { - "latitude": -9.416342737, - "longitude": -48.68376226, - "name": "Miranorte" - }, - "171360": { - "latitude": -10.74761966, - "longitude": -48.01721314, - "name": "Monte do Carmo" - }, - "171370": { - "latitude": -9.999481798, - "longitude": -49.06728282, - "name": "Monte Santo do Tocantins" - }, - "171380": { - "latitude": -6.60023102, - "longitude": -47.64269133, - "name": "Palmeiras do Tocantins" - }, - "171395": { - "latitude": -7.003342907, - "longitude": -48.78650624, - "name": "Muricilândia" - }, - "171420": { - "latitude": -11.79831351, - "longitude": -47.64882613, - "name": "Natividade" - }, - "171430": { - "latitude": -6.330341733, - "longitude": -47.78145161, - "name": "Nazaré" - }, - "171488": { - "latitude": -7.637885488, - "longitude": -48.36074526, - "name": "Nova Olinda" - }, - "171500": { - "latitude": -10.55001231, - "longitude": -48.97333177, - "name": "Nova Rosalândia" - }, - "171510": { - "latitude": -10.15497633, - "longitude": -47.38300811, - "name": "Novo Acordo" - }, - "171515": { - "latitude": -12.91426217, - "longitude": -46.55962873, - "name": "Novo Alegre" - }, - "171525": { - "latitude": -11.77901452, - "longitude": -46.57036077, - "name": "Novo Jardim" - }, - "171550": { - "latitude": -10.67448801, - "longitude": -48.87580535, - "name": "Oliveira de Fátima" - }, - "171570": { - "latitude": -7.885946595, - "longitude": -48.15628253, - "name": "Palmeirante" - }, - "171575": { - "latitude": -13.01979056, - "longitude": -48.34877369, - "name": "Palmeirópolis" - }, - "171610": { - "latitude": -10.21821749, - "longitude": -48.82726529, - "name": "Paraíso do Tocantins" - }, - "171620": { - "latitude": -12.69649333, - "longitude": -47.81347428, - "name": "Paranã" - }, - "171630": { - "latitude": -7.544930438, - "longitude": -48.98835522, - "name": "Pau D'Arco" - }, - "171650": { - "latitude": -9.226903886, - "longitude": -48.03421124, - "name": "Pedro Afonso" - }, - "171660": { - "latitude": -11.99676188, - "longitude": -48.5552191, - "name": "Peixe" - }, - "171665": { - "latitude": -8.379808422, - "longitude": -48.91715829, - "name": "Pequizeiro" - }, - "171670": { - "latitude": -8.836543096, - "longitude": -48.76558245, - "name": "Colméia" - }, - "171700": { - "latitude": -11.15971421, - "longitude": -47.55885221, - "name": "Pindorama do Tocantins" - }, - "171720": { - "latitude": -6.738636099, - "longitude": -48.23944884, - "name": "Piraquê" - }, - "171750": { - "latitude": -10.20953442, - "longitude": -49.8718874, - "name": "Pium" - }, - "171780": { - "latitude": -12.05758497, - "longitude": -46.59327543, - "name": "Ponte Alta do Bom Jesus" - }, - "171790": { - "latitude": -10.74950693, - "longitude": -47.32455913, - "name": "Ponte Alta do Tocantins" - }, - "171800": { - "latitude": -11.51083851, - "longitude": -47.04672643, - "name": "Porto Alegre do Tocantins" - }, - "171820": { - "latitude": -10.54370054, - "longitude": -48.49649346, - "name": "Porto Nacional" - }, - "171830": { - "latitude": -5.474839099, - "longitude": -47.78193227, - "name": "Praia Norte" - }, - "171840": { - "latitude": -8.461880447, - "longitude": -48.46159127, - "name": "Presidente Kennedy" - }, - "171845": { - "latitude": -10.42251527, - "longitude": -48.88235879, - "name": "Pugmil" - }, - "171850": { - "latitude": -8.697361042, - "longitude": -47.11310968, - "name": "Recursolândia" - }, - "171855": { - "latitude": -6.459935196, - "longitude": -48.13620853, - "name": "Riachinho" - }, - "171865": { - "latitude": -11.33699336, - "longitude": -46.73765722, - "name": "Rio da Conceição" - }, - "171870": { - "latitude": -9.235896132, - "longitude": -48.45251004, - "name": "Rio dos Bois" - }, - "171875": { - "latitude": -9.647383681, - "longitude": -47.495995, - "name": "Rio Sono" - }, - "171880": { - "latitude": -5.329649309, - "longitude": -47.9188195, - "name": "Sampaio" - }, - "171884": { - "latitude": -12.40098353, - "longitude": -49.87614542, - "name": "Sandolândia" - }, - "171886": { - "latitude": -7.093112725, - "longitude": -48.97497773, - "name": "Santa Fé do Araguaia" - }, - "171888": { - "latitude": -8.824680288, - "longitude": -47.8483007, - "name": "Santa Maria do Tocantins" - }, - "171889": { - "latitude": -10.96997018, - "longitude": -49.29503091, - "name": "Santa Rita do Tocantins" - }, - "171890": { - "latitude": -11.39731255, - "longitude": -48.10836905, - "name": "Santa Rosa do Tocantins" - }, - "171900": { - "latitude": -10.29895579, - "longitude": -47.74153664, - "name": "Santa Tereza do Tocantins" - }, - "172000": { - "latitude": -6.472653829, - "longitude": -47.75110293, - "name": "Santa Terezinha do Tocantins" - }, - "172010": { - "latitude": -5.976005001, - "longitude": -47.93986189, - "name": "São Bento do Tocantins" - }, - "172015": { - "latitude": -10.06860129, - "longitude": -46.67791406, - "name": "São Félix do Tocantins" - }, - "172020": { - "latitude": -5.543428309, - "longitude": -47.59777123, - "name": "São Miguel do Tocantins" - }, - "172025": { - "latitude": -12.57757034, - "longitude": -48.36415265, - "name": "São Salvador do Tocantins" - }, - "172030": { - "latitude": -5.241004387, - "longitude": -48.33174272, - "name": "São Sebastião do Tocantins" - }, - "172049": { - "latitude": -11.8040443, - "longitude": -48.16966341, - "name": "São Valério" - }, - "172065": { - "latitude": -11.13075317, - "longitude": -48.00498928, - "name": "Silvanópolis" - }, - "172080": { - "latitude": -5.635116375, - "longitude": -47.68409432, - "name": "Sítio Novo do Tocantins" - }, - "172085": { - "latitude": -12.1132813, - "longitude": -48.83434313, - "name": "Sucupira" - }, - "172090": { - "latitude": -12.38732173, - "longitude": -46.56568452, - "name": "Taguatinga" - }, - "172093": { - "latitude": -12.13972505, - "longitude": -46.99372366, - "name": "Taipas do Tocantins" - }, - "172097": { - "latitude": -12.68217115, - "longitude": -49.0484532, - "name": "Talismã" - }, - "172100": { - "latitude": -10.22018287, - "longitude": -48.15209202, - "name": "Palmas" - }, - "172110": { - "latitude": -9.603364361, - "longitude": -48.14091537, - "name": "Tocantínia" - }, - "172120": { - "latitude": -6.256849812, - "longitude": -47.53807174, - "name": "Tocantinópolis" - }, - "172125": { - "latitude": -8.938579127, - "longitude": -48.25959545, - "name": "Tupirama" - }, - "172130": { - "latitude": -8.356587102, - "longitude": -48.2106821, - "name": "Tupiratins" - }, - "172208": { - "latitude": -6.910060105, - "longitude": -48.00198171, - "name": "Wanderlândia" - }, - "172210": { - "latitude": -6.545436604, - "longitude": -48.45103512, - "name": "Xambioá" - }, - "210005": { - "latitude": -4.78582089, - "longitude": -47.33242907, - "name": "Açailândia" - }, - "210010": { - "latitude": -4.214790107, - "longitude": -43.29743023, - "name": "Afonso Cunha" - }, - "210015": { - "latitude": -2.946424229, - "longitude": -42.16619487, - "name": "Água Doce do Maranhão" - }, - "210020": { - "latitude": -2.379265525, - "longitude": -44.53995904, - "name": "Alcântara" - }, - "210030": { - "latitude": -4.502745645, - "longitude": -43.38346414, - "name": "Aldeias Altas" - }, - "210040": { - "latitude": -4.167027464, - "longitude": -45.50281311, - "name": "Altamira do Maranhão" - }, - "210043": { - "latitude": -4.21062827, - "longitude": -44.39583875, - "name": "Alto Alegre do Maranhão" - }, - "210047": { - "latitude": -3.870263758, - "longitude": -46.00168601, - "name": "Alto Alegre do Pindaré" - }, - "210050": { - "latitude": -9.50846707, - "longitude": -46.21330096, - "name": "Alto Parnaíba" - }, - "210055": { - "latitude": -1.673074839, - "longitude": -45.94804437, - "name": "Amapá do Maranhão" - }, - "210060": { - "latitude": -5.278402484, - "longitude": -46.58200457, - "name": "Amarante do Maranhão" - }, - "210070": { - "latitude": -3.255706443, - "longitude": -44.59890677, - "name": "Anajatuba" - }, - "210080": { - "latitude": -3.543886513, - "longitude": -43.10775036, - "name": "Anapurus" - }, - "210083": { - "latitude": -1.547323163, - "longitude": -45.08564361, - "name": "Apicum-Açu" - }, - "210087": { - "latitude": -3.079095825, - "longitude": -45.78733368, - "name": "Araguanã" - }, - "210090": { - "latitude": -2.972252207, - "longitude": -42.01698101, - "name": "Araioses" - }, - "210095": { - "latitude": -5.027710207, - "longitude": -45.94596786, - "name": "Arame" - }, - "210100": { - "latitude": -3.533380652, - "longitude": -44.72737405, - "name": "Arari" - }, - "210110": { - "latitude": -2.843894879, - "longitude": -44.09865044, - "name": "Axixá" - }, - "210120": { - "latitude": -4.17110453, - "longitude": -44.7618806, - "name": "Bacabal" - }, - "210125": { - "latitude": -2.936346391, - "longitude": -44.35796914, - "name": "Bacabeira" - }, - "210130": { - "latitude": -1.683277805, - "longitude": -45.16254962, - "name": "Bacuri" - }, - "210135": { - "latitude": -2.699600446, - "longitude": -44.6951676, - "name": "Bacurituba" - }, - "210140": { - "latitude": -8.237647994, - "longitude": -46.34275816, - "name": "Balsas" - }, - "210150": { - "latitude": -6.592878943, - "longitude": -43.18805147, - "name": "Barão de Grajaú" - }, - "210160": { - "latitude": -5.50412981, - "longitude": -45.18308477, - "name": "Barra do Corda" - }, - "210170": { - "latitude": -2.839745675, - "longitude": -42.91012155, - "name": "Barreirinhas" - }, - "210173": { - "latitude": -3.10130396, - "longitude": -43.46235262, - "name": "Belágua" - }, - "210177": { - "latitude": -3.757827822, - "longitude": -45.26595291, - "name": "Bela Vista do Maranhão" - }, - "210180": { - "latitude": -7.120543452, - "longitude": -44.56830181, - "name": "Benedito Leite" - }, - "210190": { - "latitude": -2.430937267, - "longitude": -44.78566592, - "name": "Bequimão" - }, - "210193": { - "latitude": -4.680138081, - "longitude": -44.68783724, - "name": "Bernardo do Mearim" - }, - "210197": { - "latitude": -1.762071909, - "longitude": -46.17891782, - "name": "Boa Vista do Gurupi" - }, - "210200": { - "latitude": -3.900403796, - "longitude": -46.41826673, - "name": "Bom Jardim" - }, - "210203": { - "latitude": -4.600799781, - "longitude": -46.68863505, - "name": "Bom Jesus das Selvas" - }, - "210207": { - "latitude": -4.346633515, - "longitude": -45.0209652, - "name": "Bom Lugar" - }, - "210210": { - "latitude": -3.687016481, - "longitude": -42.82851142, - "name": "Brejo" - }, - "210215": { - "latitude": -4.365104272, - "longitude": -45.65005878, - "name": "Brejo de Areia" - }, - "210220": { - "latitude": -3.90046461, - "longitude": -43.00151233, - "name": "Buriti" - }, - "210230": { - "latitude": -5.789168015, - "longitude": -43.8305078, - "name": "Buriti Bravo" - }, - "210232": { - "latitude": -4.493787954, - "longitude": -46.34241586, - "name": "Buriticupu" - }, - "210235": { - "latitude": -5.518161899, - "longitude": -47.06181854, - "name": "Buritirana" - }, - "210237": { - "latitude": -3.145213969, - "longitude": -43.91930474, - "name": "Cachoeira Grande" - }, - "210240": { - "latitude": -2.888240941, - "longitude": -44.53982953, - "name": "Cajapió" - }, - "210250": { - "latitude": -3.390636306, - "longitude": -45.05272627, - "name": "Cajari" - }, - "210255": { - "latitude": -6.176198372, - "longitude": -47.26384592, - "name": "Campestre do Maranhão" - }, - "210260": { - "latitude": -1.622294047, - "longitude": -45.6782048, - "name": "Cândido Mendes" - }, - "210270": { - "latitude": -3.621611604, - "longitude": -44.26269031, - "name": "Cantanhede" - }, - "210275": { - "latitude": -4.682126277, - "longitude": -44.30624112, - "name": "Capinzal do Norte" - }, - "210280": { - "latitude": -7.37641526, - "longitude": -47.21124709, - "name": "Carolina" - }, - "210290": { - "latitude": -1.350247406, - "longitude": -46.02945915, - "name": "Carutapera" - }, - "210300": { - "latitude": -4.86640897, - "longitude": -43.29918744, - "name": "Caxias" - }, - "210310": { - "latitude": -1.977444286, - "longitude": -44.59378545, - "name": "Cedral" - }, - "210312": { - "latitude": -2.25487666, - "longitude": -44.85793307, - "name": "Central do Maranhão" - }, - "210315": { - "latitude": -2.428719645, - "longitude": -46.11700296, - "name": "Centro do Guilherme" - }, - "210317": { - "latitude": -3.070709903, - "longitude": -46.53363376, - "name": "Centro Novo do Maranhão" - }, - "210320": { - "latitude": -3.848756057, - "longitude": -43.45384104, - "name": "Chapadinha" - }, - "210325": { - "latitude": -5.057160892, - "longitude": -47.82978344, - "name": "Cidelândia" - }, - "210330": { - "latitude": -4.607251809, - "longitude": -43.88600855, - "name": "Codó" - }, - "210340": { - "latitude": -4.248051258, - "longitude": -43.11193778, - "name": "Coelho Neto" - }, - "210350": { - "latitude": -6.055721011, - "longitude": -44.18144063, - "name": "Colinas" - }, - "210355": { - "latitude": -3.797023883, - "longitude": -44.83852332, - "name": "Conceição do Lago-Açu" - }, - "210360": { - "latitude": -4.102201114, - "longitude": -44.14530069, - "name": "Coroatá" - }, - "210370": { - "latitude": -1.774162872, - "longitude": -44.78613294, - "name": "Cururupu" - }, - "210375": { - "latitude": -5.598712784, - "longitude": -47.3004529, - "name": "Davinópolis" - }, - "210380": { - "latitude": -5.021280693, - "longitude": -44.39709685, - "name": "Dom Pedro" - }, - "210390": { - "latitude": -4.099139732, - "longitude": -43.00987291, - "name": "Duque Bacelar" - }, - "210400": { - "latitude": -4.89906547, - "longitude": -44.89050217, - "name": "Esperantinópolis" - }, - "210405": { - "latitude": -6.782434607, - "longitude": -47.20117355, - "name": "Estreito" - }, - "210407": { - "latitude": -7.01861359, - "longitude": -46.62675798, - "name": "Feira Nova do Maranhão" - }, - "210408": { - "latitude": -6.17379909, - "longitude": -45.30617843, - "name": "Fernando Falcão" - }, - "210409": { - "latitude": -6.514205379, - "longitude": -46.18625737, - "name": "Formosa da Serra Negra" - }, - "210410": { - "latitude": -6.941937626, - "longitude": -46.08192387, - "name": "Fortaleza dos Nogueiras" - }, - "210420": { - "latitude": -5.668384024, - "longitude": -44.02955999, - "name": "Fortuna" - }, - "210430": { - "latitude": -1.376049669, - "longitude": -45.76591479, - "name": "Godofredo Viana" - }, - "210440": { - "latitude": -5.152255337, - "longitude": -44.17200096, - "name": "Gonçalves Dias" - }, - "210450": { - "latitude": -4.999497703, - "longitude": -44.22150235, - "name": "Governador Archer" - }, - "210455": { - "latitude": -5.718470365, - "longitude": -47.32477452, - "name": "Governador Edison Lobão" - }, - "210460": { - "latitude": -5.385251129, - "longitude": -44.06723987, - "name": "Governador Eugênio Barros" - }, - "210462": { - "latitude": -5.537171565, - "longitude": -44.09330941, - "name": "Governador Luiz Rocha" - }, - "210465": { - "latitude": -3.41909922, - "longitude": -45.92589157, - "name": "Governador Newton Bello" - }, - "210467": { - "latitude": -2.061740505, - "longitude": -45.81821318, - "name": "Governador Nunes Freire" - }, - "210470": { - "latitude": -5.414802413, - "longitude": -44.31811971, - "name": "Graça Aranha" - }, - "210480": { - "latitude": -5.840227465, - "longitude": -46.01494475, - "name": "Grajaú" - }, - "210490": { - "latitude": -2.1464415, - "longitude": -44.66280979, - "name": "Guimarães" - }, - "210500": { - "latitude": -2.720995154, - "longitude": -43.56281095, - "name": "Humberto de Campos" - }, - "210510": { - "latitude": -2.653297746, - "longitude": -43.86300126, - "name": "Icatu" - }, - "210515": { - "latitude": -3.656465985, - "longitude": -45.12382918, - "name": "Igarapé do Meio" - }, - "210520": { - "latitude": -4.592090605, - "longitude": -44.82623955, - "name": "Igarapé Grande" - }, - "210530": { - "latitude": -5.339771433, - "longitude": -47.57523827, - "name": "Imperatriz" - }, - "210535": { - "latitude": -5.185122972, - "longitude": -45.67814925, - "name": "Itaipava do Grajaú" - }, - "210540": { - "latitude": -3.387457661, - "longitude": -44.27741305, - "name": "Itapecuru Mirim" - }, - "210542": { - "latitude": -4.271291343, - "longitude": -47.260522, - "name": "Itinga do Maranhão" - }, - "210545": { - "latitude": -5.852250347, - "longitude": -44.2939963, - "name": "Jatobá" - }, - "210547": { - "latitude": -5.392409661, - "longitude": -45.5758365, - "name": "Jenipapo dos Vieiras" - }, - "210550": { - "latitude": -5.229328444, - "longitude": -47.12638856, - "name": "João Lisboa" - }, - "210560": { - "latitude": -5.016048701, - "longitude": -44.75557917, - "name": "Joselândia" - }, - "210565": { - "latitude": -1.918482686, - "longitude": -46.11787541, - "name": "Junco do Maranhão" - }, - "210570": { - "latitude": -4.738995271, - "longitude": -45.20530646, - "name": "Lago da Pedra" - }, - "210580": { - "latitude": -4.522553665, - "longitude": -44.97657031, - "name": "Lago do Junco" - }, - "210590": { - "latitude": -3.989454082, - "longitude": -44.88205817, - "name": "Lago Verde" - }, - "210592": { - "latitude": -6.032194451, - "longitude": -43.49563669, - "name": "Lagoa do Mato" - }, - "210594": { - "latitude": -4.588604838, - "longitude": -44.93091813, - "name": "Lago dos Rodrigues" - }, - "210596": { - "latitude": -4.929709854, - "longitude": -45.40303251, - "name": "Lagoa Grande do Maranhão" - }, - "210598": { - "latitude": -6.10348878, - "longitude": -46.92947537, - "name": "Lajeado Novo" - }, - "210600": { - "latitude": -4.556896413, - "longitude": -44.46474224, - "name": "Lima Campos" - }, - "210610": { - "latitude": -7.22071444, - "longitude": -45.2198405, - "name": "Loreto" - }, - "210620": { - "latitude": -1.394668642, - "longitude": -45.89313921, - "name": "Luís Domingues" - }, - "210630": { - "latitude": -3.299356689, - "longitude": -42.18349368, - "name": "Magalhães de Almeida" - }, - "210632": { - "latitude": -1.9842782, - "longitude": -45.99395727, - "name": "Maracaçumé" - }, - "210635": { - "latitude": -4.705012343, - "longitude": -45.628516, - "name": "Marajá do Sena" - }, - "210637": { - "latitude": -2.412553541, - "longitude": -45.94690784, - "name": "Maranhãozinho" - }, - "210640": { - "latitude": -3.625897454, - "longitude": -43.22736608, - "name": "Mata Roma" - }, - "210650": { - "latitude": -3.071443797, - "longitude": -45.00180944, - "name": "Matinha" - }, - "210660": { - "latitude": -5.388663732, - "longitude": -43.30724733, - "name": "Matões" - }, - "210663": { - "latitude": -3.756648668, - "longitude": -44.47768892, - "name": "Matões do Norte" - }, - "210667": { - "latitude": -3.49654223, - "longitude": -42.79490114, - "name": "Milagres do Maranhão" - }, - "210670": { - "latitude": -6.453893987, - "longitude": -44.95100243, - "name": "Mirador" - }, - "210675": { - "latitude": -3.5314202, - "longitude": -44.52685155, - "name": "Miranda do Norte" - }, - "210680": { - "latitude": -2.058694885, - "longitude": -44.84327106, - "name": "Mirinzal" - }, - "210690": { - "latitude": -3.490651135, - "longitude": -45.32105238, - "name": "Monção" - }, - "210700": { - "latitude": -5.858002405, - "longitude": -47.04154244, - "name": "Montes Altos" - }, - "210710": { - "latitude": -2.974056776, - "longitude": -43.77674058, - "name": "Morros" - }, - "210720": { - "latitude": -3.437559891, - "longitude": -43.81331023, - "name": "Nina Rodrigues" - }, - "210725": { - "latitude": -7.144311474, - "longitude": -46.26452041, - "name": "Nova Colinas" - }, - "210730": { - "latitude": -6.749951945, - "longitude": -44.04004838, - "name": "Nova Iorque" - }, - "210735": { - "latitude": -2.89604154, - "longitude": -45.95527653, - "name": "Nova Olinda do Maranhão" - }, - "210740": { - "latitude": -4.094632504, - "longitude": -45.12034869, - "name": "Olho d'Água das Cunhãs" - }, - "210745": { - "latitude": -2.975552101, - "longitude": -45.00885052, - "name": "Olinda Nova do Maranhão" - }, - "210750": { - "latitude": -2.505228634, - "longitude": -44.12406887, - "name": "Paço do Lumiar" - }, - "210760": { - "latitude": -2.691991364, - "longitude": -45.02339472, - "name": "Palmeirândia" - }, - "210770": { - "latitude": -6.403787064, - "longitude": -43.92399146, - "name": "Paraibano" - }, - "210780": { - "latitude": -5.637884584, - "longitude": -43.4627419, - "name": "Parnarama" - }, - "210790": { - "latitude": -6.152673996, - "longitude": -43.7583729, - "name": "Passagem Franca" - }, - "210800": { - "latitude": -6.632213823, - "longitude": -44.18064635, - "name": "Pastos Bons" - }, - "210805": { - "latitude": -2.854706095, - "longitude": -42.61097706, - "name": "Paulino Neves" - }, - "210810": { - "latitude": -4.521937457, - "longitude": -45.39435384, - "name": "Paulo Ramos" - }, - "210820": { - "latitude": -4.618024469, - "longitude": -44.58137664, - "name": "Pedreiras" - }, - "210825": { - "latitude": -2.989010996, - "longitude": -45.43076054, - "name": "Pedro do Rosário" - }, - "210830": { - "latitude": -3.25157836, - "longitude": -45.29779405, - "name": "Penalva" - }, - "210840": { - "latitude": -2.570558316, - "longitude": -44.89581964, - "name": "Peri Mirim" - }, - "210845": { - "latitude": -4.419844727, - "longitude": -44.28118203, - "name": "Peritoró" - }, - "210850": { - "latitude": -3.693275631, - "longitude": -45.44015966, - "name": "Pindaré-Mirim" - }, - "210860": { - "latitude": -2.498115047, - "longitude": -45.12690338, - "name": "Pinheiro" - }, - "210870": { - "latitude": -3.851529466, - "longitude": -45.09315766, - "name": "Pio XII" - }, - "210880": { - "latitude": -3.782860886, - "longitude": -44.17259358, - "name": "Pirapemas" - }, - "210890": { - "latitude": -4.786829138, - "longitude": -44.91183714, - "name": "Poção de Pedras" - }, - "210900": { - "latitude": -6.368748899, - "longitude": -47.17994219, - "name": "Porto Franco" - }, - "210905": { - "latitude": -1.883853127, - "longitude": -44.63312811, - "name": "Porto Rico do Maranhão" - }, - "210910": { - "latitude": -5.283075398, - "longitude": -44.45709336, - "name": "Presidente Dutra" - }, - "210920": { - "latitude": -3.089666196, - "longitude": -44.07788334, - "name": "Presidente Juscelino" - }, - "210923": { - "latitude": -2.318954728, - "longitude": -45.7733687, - "name": "Presidente Médici" - }, - "210927": { - "latitude": -2.586655814, - "longitude": -45.36152818, - "name": "Presidente Sarney" - }, - "210930": { - "latitude": -3.381054729, - "longitude": -43.98527027, - "name": "Presidente Vargas" - }, - "210940": { - "latitude": -2.709182555, - "longitude": -43.36279571, - "name": "Primeira Cruz" - }, - "210945": { - "latitude": -2.43758607, - "longitude": -44.08967783, - "name": "Raposa" - }, - "210950": { - "latitude": -7.597923568, - "longitude": -46.65940257, - "name": "Riachão" - }, - "210955": { - "latitude": -5.958385363, - "longitude": -47.31610721, - "name": "Ribamar Fiquene" - }, - "210960": { - "latitude": -2.956326236, - "longitude": -44.20187825, - "name": "Rosário" - }, - "210970": { - "latitude": -7.431842017, - "longitude": -45.556273, - "name": "Sambaíba" - }, - "210975": { - "latitude": -5.518972609, - "longitude": -44.61850787, - "name": "Santa Filomena do Maranhão" - }, - "210980": { - "latitude": -2.41895348, - "longitude": -45.37108399, - "name": "Santa Helena" - }, - "210990": { - "latitude": -3.873519147, - "longitude": -45.43675349, - "name": "Santa Inês" - }, - "211000": { - "latitude": -4.269897679, - "longitude": -45.93160108, - "name": "Santa Luzia" - }, - "211003": { - "latitude": -2.539927832, - "longitude": -45.772286, - "name": "Santa Luzia do Paruá" - }, - "211010": { - "latitude": -3.345198885, - "longitude": -42.88003104, - "name": "Santa Quitéria do Maranhão" - }, - "211020": { - "latitude": -3.159539654, - "longitude": -44.32871233, - "name": "Santa Rita" - }, - "211023": { - "latitude": -3.197222707, - "longitude": -42.61470168, - "name": "Santana do Maranhão" - }, - "211027": { - "latitude": -2.623224888, - "longitude": -43.18409307, - "name": "Santo Amaro do Maranhão" - }, - "211030": { - "latitude": -4.826407914, - "longitude": -44.48116127, - "name": "Santo Antônio dos Lopes" - }, - "211040": { - "latitude": -3.375323813, - "longitude": -43.61845523, - "name": "São Benedito do Rio Preto" - }, - "211050": { - "latitude": -2.798067646, - "longitude": -44.9992785, - "name": "São Bento" - }, - "211060": { - "latitude": -3.311987387, - "longitude": -42.40606115, - "name": "São Bernardo" - }, - "211065": { - "latitude": -6.833216201, - "longitude": -44.61736197, - "name": "São Domingos do Azeitão" - }, - "211070": { - "latitude": -5.638220411, - "longitude": -44.33655637, - "name": "São Domingos do Maranhão" - }, - "211080": { - "latitude": -7.091898902, - "longitude": -44.88347638, - "name": "São Félix de Balsas" - }, - "211085": { - "latitude": -5.158489754, - "longitude": -47.35371556, - "name": "São Francisco do Brejão" - }, - "211090": { - "latitude": -6.20866609, - "longitude": -43.11391531, - "name": "São Francisco do Maranhão" - }, - "211100": { - "latitude": -3.006026394, - "longitude": -44.76459995, - "name": "São João Batista" - }, - "211102": { - "latitude": -3.510843461, - "longitude": -46.37905178, - "name": "São João do Carú" - }, - "211105": { - "latitude": -6.463387817, - "longitude": -46.90043069, - "name": "São João do Paraíso" - }, - "211107": { - "latitude": -5.04017606, - "longitude": -43.76664314, - "name": "São João do Soter" - }, - "211110": { - "latitude": -6.559408401, - "longitude": -43.63807678, - "name": "São João dos Patos" - }, - "211120": { - "latitude": -2.574257148, - "longitude": -44.13052223, - "name": "São José de Ribamar" - }, - "211125": { - "latitude": -5.039816635, - "longitude": -44.56835467, - "name": "São José dos Basílios" - }, - "211130": { - "latitude": -2.633877649, - "longitude": -44.28073433, - "name": "São Luís" - }, - "211140": { - "latitude": -4.377375132, - "longitude": -44.62313712, - "name": "São Luís Gonzaga do Maranhão" - }, - "211150": { - "latitude": -3.990212604, - "longitude": -44.52765929, - "name": "São Mateus do Maranhão" - }, - "211153": { - "latitude": -5.133523685, - "longitude": -48.36897952, - "name": "São Pedro da Água Branca" - }, - "211157": { - "latitude": -6.819536978, - "longitude": -46.70740905, - "name": "São Pedro dos Crentes" - }, - "211160": { - "latitude": -7.013853395, - "longitude": -45.69094108, - "name": "São Raimundo das Mangabeiras" - }, - "211163": { - "latitude": -5.089682001, - "longitude": -45.14617299, - "name": "São Raimundo do Doca Bezerra" - }, - "211167": { - "latitude": -5.018790007, - "longitude": -45.03474632, - "name": "São Roberto" - }, - "211170": { - "latitude": -2.877207909, - "longitude": -44.9415414, - "name": "São Vicente Ferrer" - }, - "211172": { - "latitude": -3.938627664, - "longitude": -45.25921972, - "name": "Satubinha" - }, - "211174": { - "latitude": -5.261045587, - "longitude": -43.98464897, - "name": "Senador Alexandre Costa" - }, - "211176": { - "latitude": -5.388541344, - "longitude": -47.14435633, - "name": "Senador La Rocque" - }, - "211178": { - "latitude": -1.873324679, - "longitude": -45.0173278, - "name": "Serrano do Maranhão" - }, - "211180": { - "latitude": -6.22786717, - "longitude": -46.5955737, - "name": "Sítio Novo" - }, - "211190": { - "latitude": -6.509858655, - "longitude": -44.3390035, - "name": "Sucupira do Norte" - }, - "211195": { - "latitude": -6.406772901, - "longitude": -43.48520095, - "name": "Sucupira do Riachão" - }, - "211200": { - "latitude": -8.332008844, - "longitude": -45.88629736, - "name": "Tasso Fragoso" - }, - "211210": { - "latitude": -4.15303821, - "longitude": -43.81348781, - "name": "Timbiras" - }, - "211220": { - "latitude": -5.18559087, - "longitude": -42.98107445, - "name": "Timon" - }, - "211223": { - "latitude": -4.539301317, - "longitude": -44.68177809, - "name": "Trizidela do Vale" - }, - "211227": { - "latitude": -3.758068812, - "longitude": -45.58129055, - "name": "Tufilândia" - }, - "211230": { - "latitude": -5.610438958, - "longitude": -44.73062416, - "name": "Tuntum" - }, - "211240": { - "latitude": -1.76565289, - "longitude": -45.46314475, - "name": "Turiaçu" - }, - "211245": { - "latitude": -2.158973291, - "longitude": -45.43758538, - "name": "Turilândia" - }, - "211250": { - "latitude": -2.923131203, - "longitude": -42.39062469, - "name": "Tutóia" - }, - "211260": { - "latitude": -3.260248263, - "longitude": -43.28095447, - "name": "Urbano Santos" - }, - "211270": { - "latitude": -3.710872947, - "longitude": -43.85380638, - "name": "Vargem Grande" - }, - "211280": { - "latitude": -3.156304546, - "longitude": -45.00250263, - "name": "Viana" - }, - "211285": { - "latitude": -5.074800002, - "longitude": -48.08049554, - "name": "Vila Nova dos Martírios" - }, - "211290": { - "latitude": -3.56809127, - "longitude": -44.92214018, - "name": "Vitória do Mearim" - }, - "211300": { - "latitude": -4.243725923, - "longitude": -45.31249947, - "name": "Vitorino Freire" - }, - "211400": { - "latitude": -3.259881634, - "longitude": -45.91261343, - "name": "Zé Doca" - }, - "220005": { - "latitude": -8.305962585, - "longitude": -41.00167432, - "name": "Acauã" - }, - "220010": { - "latitude": -5.768187456, - "longitude": -42.68237225, - "name": "Agricolândia" - }, - "220020": { - "latitude": -5.91407507, - "longitude": -42.62811981, - "name": "Água Branca" - }, - "220025": { - "latitude": -6.929342656, - "longitude": -40.91974302, - "name": "Alagoinha do Piauí" - }, - "220027": { - "latitude": -7.200515436, - "longitude": -40.79750336, - "name": "Alegrete do Piauí" - }, - "220030": { - "latitude": -5.379440992, - "longitude": -42.15469615, - "name": "Alto Longá" - }, - "220040": { - "latitude": -5.01480329, - "longitude": -42.4697151, - "name": "Altos" - }, - "220045": { - "latitude": -8.456000203, - "longitude": -43.96836814, - "name": "Alvorada do Gurguéia" - }, - "220050": { - "latitude": -6.370339525, - "longitude": -42.78783078, - "name": "Amarante" - }, - "220060": { - "latitude": -6.106947396, - "longitude": -42.75039024, - "name": "Angical do Piauí" - }, - "220070": { - "latitude": -9.214106266, - "longitude": -43.04196179, - "name": "Anísio de Abreu" - }, - "220080": { - "latitude": -7.219380108, - "longitude": -44.20270626, - "name": "Antônio Almeida" - }, - "220090": { - "latitude": -6.124476324, - "longitude": -41.83029193, - "name": "Aroazes" - }, - "220095": { - "latitude": -7.250345007, - "longitude": -41.53429857, - "name": "Aroeiras do Itaim" - }, - "220100": { - "latitude": -6.618082629, - "longitude": -42.52031341, - "name": "Arraial" - }, - "220105": { - "latitude": -5.879973772, - "longitude": -41.06877858, - "name": "Assunção do Piauí" - }, - "220110": { - "latitude": -10.17970146, - "longitude": -43.94236422, - "name": "Avelino Lopes" - }, - "220115": { - "latitude": -8.505752772, - "longitude": -45.16098042, - "name": "Baixa Grande do Ribeiro" - }, - "220117": { - "latitude": -6.529597646, - "longitude": -42.10650749, - "name": "Barra D'Alcântara" - }, - "220120": { - "latitude": -4.189928756, - "longitude": -42.36806464, - "name": "Barras" - }, - "220130": { - "latitude": -10.0034641, - "longitude": -45.71040798, - "name": "Barreiras do Piauí" - }, - "220140": { - "latitude": -5.801867037, - "longitude": -42.50275696, - "name": "Barro Duro" - }, - "220150": { - "latitude": -4.017580942, - "longitude": -42.05787049, - "name": "Batalha" - }, - "220155": { - "latitude": -7.996149953, - "longitude": -41.85571344, - "name": "Bela Vista do Piauí" - }, - "220157": { - "latitude": -7.389985185, - "longitude": -40.98241504, - "name": "Belém do Piauí" - }, - "220160": { - "latitude": -5.499403971, - "longitude": -42.39992877, - "name": "Beneditinos" - }, - "220170": { - "latitude": -7.744980155, - "longitude": -43.87721084, - "name": "Bertolínia" - }, - "220173": { - "latitude": -8.113511891, - "longitude": -40.75119718, - "name": "Betânia do Piauí" - }, - "220177": { - "latitude": -4.354201933, - "longitude": -42.10595357, - "name": "Boa Hora" - }, - "220180": { - "latitude": -6.905988934, - "longitude": -41.30419714, - "name": "Bocaina" - }, - "220190": { - "latitude": -9.245738488, - "longitude": -44.54020032, - "name": "Bom Jesus" - }, - "220191": { - "latitude": -3.157407487, - "longitude": -41.63063121, - "name": "Bom Princípio do Piauí" - }, - "220192": { - "latitude": -9.171356768, - "longitude": -42.87580858, - "name": "Bonfim do Piauí" - }, - "220194": { - "latitude": -4.54018388, - "longitude": -42.11151074, - "name": "Boqueirão do Piauí" - }, - "220196": { - "latitude": -4.12082909, - "longitude": -41.63662125, - "name": "Brasileira" - }, - "220198": { - "latitude": -8.382423536, - "longitude": -42.79094865, - "name": "Brejo do Piauí" - }, - "220200": { - "latitude": -3.239248596, - "longitude": -41.80418037, - "name": "Buriti dos Lopes" - }, - "220202": { - "latitude": -5.162304316, - "longitude": -41.19988066, - "name": "Buriti dos Montes" - }, - "220205": { - "latitude": -4.432025953, - "longitude": -42.33367937, - "name": "Cabeceiras do Piauí" - }, - "220207": { - "latitude": -6.781858415, - "longitude": -42.45931131, - "name": "Cajazeiras do Piauí" - }, - "220208": { - "latitude": -2.992705447, - "longitude": -41.36160272, - "name": "Cajueiro da Praia" - }, - "220209": { - "latitude": -7.307999159, - "longitude": -40.62280792, - "name": "Caldeirão Grande do Piauí" - }, - "220210": { - "latitude": -7.656540629, - "longitude": -41.8713729, - "name": "Campinas do Piauí" - }, - "220211": { - "latitude": -8.282815196, - "longitude": -41.8214761, - "name": "Campo Alegre do Fidalgo" - }, - "220213": { - "latitude": -7.183177226, - "longitude": -41.06532432, - "name": "Campo Grande do Piauí" - }, - "220217": { - "latitude": -3.881033612, - "longitude": -42.54604747, - "name": "Campo Largo do Piauí" - }, - "220220": { - "latitude": -4.876998623, - "longitude": -42.14499906, - "name": "Campo Maior" - }, - "220225": { - "latitude": -7.557716274, - "longitude": -43.55861145, - "name": "Canavieira" - }, - "220230": { - "latitude": -8.342574632, - "longitude": -43.33760851, - "name": "Canto do Buriti" - }, - "220240": { - "latitude": -4.522732671, - "longitude": -41.90105227, - "name": "Capitão de Campos" - }, - "220245": { - "latitude": -8.529253482, - "longitude": -41.90124156, - "name": "Capitão Gervásio Oliveira" - }, - "220250": { - "latitude": -9.089088177, - "longitude": -43.34672267, - "name": "Caracol" - }, - "220253": { - "latitude": -3.564811901, - "longitude": -41.82428411, - "name": "Caraúbas do Piauí" - }, - "220255": { - "latitude": -7.703613686, - "longitude": -40.95583766, - "name": "Caridade do Piauí" - }, - "220260": { - "latitude": -5.326581093, - "longitude": -41.56700403, - "name": "Castelo do Piauí" - }, - "220265": { - "latitude": -3.391899952, - "longitude": -41.85058192, - "name": "Caxingó" - }, - "220270": { - "latitude": -3.453676346, - "longitude": -41.54230193, - "name": "Cocal" - }, - "220271": { - "latitude": -4.616824198, - "longitude": -41.95763987, - "name": "Cocal de Telha" - }, - "220272": { - "latitude": -3.630339814, - "longitude": -41.42083938, - "name": "Cocal dos Alves" - }, - "220273": { - "latitude": -5.099885754, - "longitude": -42.28426419, - "name": "Coivaras" - }, - "220275": { - "latitude": -8.18133709, - "longitude": -43.69623287, - "name": "Colônia do Gurguéia" - }, - "220277": { - "latitude": -7.29385418, - "longitude": -42.18700788, - "name": "Colônia do Piauí" - }, - "220280": { - "latitude": -7.914562122, - "longitude": -41.58089243, - "name": "Conceição do Canindé" - }, - "220285": { - "latitude": -8.897320946, - "longitude": -42.33423505, - "name": "Coronel José Dias" - }, - "220290": { - "latitude": -10.39161106, - "longitude": -45.13966823, - "name": "Corrente" - }, - "220300": { - "latitude": -10.74188563, - "longitude": -45.11363547, - "name": "Cristalândia do Piauí" - }, - "220310": { - "latitude": -8.782192311, - "longitude": -43.9614969, - "name": "Cristino Castro" - }, - "220320": { - "latitude": -9.940693726, - "longitude": -44.30649503, - "name": "Curimatá" - }, - "220323": { - "latitude": -8.822489923, - "longitude": -44.67331238, - "name": "Currais" - }, - "220325": { - "latitude": -5.616094175, - "longitude": -42.84669062, - "name": "Curralinhos" - }, - "220327": { - "latitude": -7.887709844, - "longitude": -40.77092781, - "name": "Curral Novo do Piauí" - }, - "220330": { - "latitude": -5.339293241, - "longitude": -42.67164862, - "name": "Demerval Lobão" - }, - "220335": { - "latitude": -9.329754725, - "longitude": -42.46012189, - "name": "Dirceu Arcoverde" - }, - "220340": { - "latitude": -6.960050021, - "longitude": -41.69826896, - "name": "Dom Expedito Lopes" - }, - "220342": { - "latitude": -4.255217732, - "longitude": -41.30989673, - "name": "Domingos Mourão" - }, - "220345": { - "latitude": -8.917867974, - "longitude": -41.92249985, - "name": "Dom Inocêncio" - }, - "220350": { - "latitude": -6.184844563, - "longitude": -42.19348797, - "name": "Elesbão Veloso" - }, - "220360": { - "latitude": -7.970227532, - "longitude": -43.65934138, - "name": "Eliseu Martins" - }, - "220370": { - "latitude": -3.823374492, - "longitude": -42.18968434, - "name": "Esperantina" - }, - "220375": { - "latitude": -9.475700853, - "longitude": -42.78397411, - "name": "Fartura do Piauí" - }, - "220380": { - "latitude": -7.672973345, - "longitude": -42.86088654, - "name": "Flores do Piauí" - }, - "220385": { - "latitude": -7.473127137, - "longitude": -41.8043653, - "name": "Floresta do Piauí" - }, - "220390": { - "latitude": -7.005806362, - "longitude": -43.0793824, - "name": "Floriano" - }, - "220400": { - "latitude": -6.423008709, - "longitude": -42.23398647, - "name": "Francinópolis" - }, - "220410": { - "latitude": -6.669155418, - "longitude": -42.72150542, - "name": "Francisco Ayres" - }, - "220415": { - "latitude": -7.320830717, - "longitude": -40.78391764, - "name": "Francisco Macedo" - }, - "220420": { - "latitude": -7.012905763, - "longitude": -41.1471252, - "name": "Francisco Santos" - }, - "220430": { - "latitude": -7.07718911, - "longitude": -40.58374499, - "name": "Fronteiras" - }, - "220435": { - "latitude": -7.187692199, - "longitude": -41.33289282, - "name": "Geminiano" - }, - "220440": { - "latitude": -9.621890028, - "longitude": -45.40777559, - "name": "Gilbués" - }, - "220450": { - "latitude": -6.842379712, - "longitude": -43.70468739, - "name": "Guadalupe" - }, - "220455": { - "latitude": -9.063334284, - "longitude": -43.67089752, - "name": "Guaribas" - }, - "220460": { - "latitude": -6.035674108, - "longitude": -42.49809392, - "name": "Hugo Napoleão" - }, - "220465": { - "latitude": -2.828861192, - "longitude": -41.81416247, - "name": "Ilha Grande" - }, - "220470": { - "latitude": -6.672738377, - "longitude": -41.68601883, - "name": "Inhuma" - }, - "220480": { - "latitude": -6.818992133, - "longitude": -41.79101647, - "name": "Ipiranga do Piauí" - }, - "220490": { - "latitude": -7.650322145, - "longitude": -41.64980056, - "name": "Isaías Coelho" - }, - "220500": { - "latitude": -7.410115625, - "longitude": -41.48149171, - "name": "Itainópolis" - }, - "220510": { - "latitude": -7.504988262, - "longitude": -43.13371225, - "name": "Itaueira" - }, - "220515": { - "latitude": -7.896739628, - "longitude": -41.25252061, - "name": "Jacobina do Piauí" - }, - "220520": { - "latitude": -7.391460058, - "longitude": -41.20666582, - "name": "Jaicós" - }, - "220525": { - "latitude": -6.145848675, - "longitude": -42.52700715, - "name": "Jardim do Mulato" - }, - "220527": { - "latitude": -4.841501987, - "longitude": -41.91834928, - "name": "Jatobá do Piauí" - }, - "220530": { - "latitude": -7.11497954, - "longitude": -43.50155978, - "name": "Jerumenha" - }, - "220535": { - "latitude": -8.541683101, - "longitude": -42.48166983, - "name": "João Costa" - }, - "220540": { - "latitude": -3.539615786, - "longitude": -42.08250139, - "name": "Joaquim Pires" - }, - "220545": { - "latitude": -3.545719602, - "longitude": -42.4261459, - "name": "Joca Marques" - }, - "220550": { - "latitude": -4.713925583, - "longitude": -42.52494646, - "name": "José de Freitas" - }, - "220551": { - "latitude": -4.958305488, - "longitude": -41.58956814, - "name": "Juazeiro do Piauí" - }, - "220552": { - "latitude": -10.4253541, - "longitude": -44.17455466, - "name": "Júlio Borges" - }, - "220553": { - "latitude": -9.014467886, - "longitude": -43.16563677, - "name": "Jurema" - }, - "220554": { - "latitude": -5.820105704, - "longitude": -42.6273672, - "name": "Lagoinha do Piauí" - }, - "220555": { - "latitude": -4.489838871, - "longitude": -42.56486245, - "name": "Lagoa Alegre" - }, - "220556": { - "latitude": -8.568764962, - "longitude": -41.59995331, - "name": "Lagoa do Barro do Piauí" - }, - "220557": { - "latitude": -4.363968561, - "longitude": -41.58142248, - "name": "Lagoa de São Francisco" - }, - "220558": { - "latitude": -5.461294564, - "longitude": -42.60762188, - "name": "Lagoa do Piauí" - }, - "220559": { - "latitude": -6.490070404, - "longitude": -41.48638666, - "name": "Lagoa do Sítio" - }, - "220560": { - "latitude": -7.295758847, - "longitude": -43.92784903, - "name": "Landri Sales" - }, - "220570": { - "latitude": -3.082160175, - "longitude": -41.48168351, - "name": "Luís Correia" - }, - "220580": { - "latitude": -3.606778012, - "longitude": -42.36393334, - "name": "Luzilândia" - }, - "220585": { - "latitude": -3.564966694, - "longitude": -42.52924571, - "name": "Madeiro" - }, - "220590": { - "latitude": -8.206309417, - "longitude": -44.00766723, - "name": "Manoel Emídio" - }, - "220595": { - "latitude": -7.429493216, - "longitude": -40.7361432, - "name": "Marcolândia" - }, - "220600": { - "latitude": -7.076331938, - "longitude": -43.89455395, - "name": "Marcos Parente" - }, - "220605": { - "latitude": -7.535771181, - "longitude": -41.09544287, - "name": "Massapê do Piauí" - }, - "220610": { - "latitude": -3.707385757, - "longitude": -42.58435926, - "name": "Matias Olímpio" - }, - "220620": { - "latitude": -4.240515815, - "longitude": -42.77355664, - "name": "Miguel Alves" - }, - "220630": { - "latitude": -5.700953497, - "longitude": -42.70131638, - "name": "Miguel Leão" - }, - "220635": { - "latitude": -4.698773401, - "longitude": -41.48996716, - "name": "Milton Brandão" - }, - "220640": { - "latitude": -5.610994978, - "longitude": -42.6096602, - "name": "Monsenhor Gil" - }, - "220650": { - "latitude": -6.918525048, - "longitude": -41.03802654, - "name": "Monsenhor Hipólito" - }, - "220660": { - "latitude": -9.604220399, - "longitude": -45.03041539, - "name": "Monte Alegre do Piauí" - }, - "220665": { - "latitude": -9.811074507, - "longitude": -43.92212169, - "name": "Morro Cabeça no Tempo" - }, - "220667": { - "latitude": -3.705621244, - "longitude": -42.26348106, - "name": "Morro do Chapéu do Piauí" - }, - "220669": { - "latitude": -3.35668999, - "longitude": -42.01239023, - "name": "Murici dos Portelas" - }, - "220670": { - "latitude": -7.052256493, - "longitude": -42.74561072, - "name": "Nazaré do Piauí" - }, - "220672": { - "latitude": -5.445548751, - "longitude": -42.86784995, - "name": "Nazária" - }, - "220675": { - "latitude": -4.643589751, - "longitude": -42.18890024, - "name": "Nossa Senhora de Nazaré" - }, - "220680": { - "latitude": -4.026157249, - "longitude": -42.60614792, - "name": "Nossa Senhora dos Remédios" - }, - "220690": { - "latitude": -6.501061899, - "longitude": -41.97687201, - "name": "Novo Oriente do Piauí" - }, - "220695": { - "latitude": -5.278555139, - "longitude": -41.92273015, - "name": "Novo Santo Antônio" - }, - "220700": { - "latitude": -6.966341325, - "longitude": -42.164976, - "name": "Oeiras" - }, - "220710": { - "latitude": -5.857703913, - "longitude": -42.55212236, - "name": "Olho D'Água do Piauí" - }, - "220720": { - "latitude": -7.377804274, - "longitude": -40.88102497, - "name": "Padre Marcos" - }, - "220730": { - "latitude": -7.812743971, - "longitude": -42.28518837, - "name": "Paes Landim" - }, - "220735": { - "latitude": -7.903968797, - "longitude": -42.8335121, - "name": "Pajeú do Piauí" - }, - "220740": { - "latitude": -8.556773251, - "longitude": -44.46454026, - "name": "Palmeira do Piauí" - }, - "220750": { - "latitude": -5.88325939, - "longitude": -42.95578652, - "name": "Palmeirais" - }, - "220755": { - "latitude": -7.131534566, - "longitude": -41.6856397, - "name": "Paquetá" - }, - "220760": { - "latitude": -10.31573209, - "longitude": -44.56843654, - "name": "Parnaguá" - }, - "220770": { - "latitude": -2.959159128, - "longitude": -41.7534448, - "name": "Parnaíba" - }, - "220775": { - "latitude": -5.872975993, - "longitude": -42.41329064, - "name": "Passagem Franca do Piauí" - }, - "220777": { - "latitude": -7.673831905, - "longitude": -41.29612655, - "name": "Patos do Piauí" - }, - "220779": { - "latitude": -5.245036455, - "longitude": -42.47093929, - "name": "Pau D'Arco do Piauí" - }, - "220780": { - "latitude": -8.110397977, - "longitude": -41.14504619, - "name": "Paulistana" - }, - "220785": { - "latitude": -7.925300367, - "longitude": -43.33723145, - "name": "Pavussu" - }, - "220790": { - "latitude": -4.495397994, - "longitude": -41.39702487, - "name": "Pedro II" - }, - "220793": { - "latitude": -8.073182448, - "longitude": -42.26534666, - "name": "Pedro Laurentino" - }, - "220795": { - "latitude": -8.119479405, - "longitude": -42.02370355, - "name": "Nova Santa Rita" - }, - "220800": { - "latitude": -7.058920688, - "longitude": -41.52231122, - "name": "Picos" - }, - "220810": { - "latitude": -6.344724953, - "longitude": -41.16638991, - "name": "Pimenteiras" - }, - "220820": { - "latitude": -6.790279008, - "longitude": -40.71809758, - "name": "Pio IX" - }, - "220830": { - "latitude": -3.853572325, - "longitude": -41.61450666, - "name": "Piracuruca" - }, - "220840": { - "latitude": -4.330951275, - "longitude": -41.77135687, - "name": "Piripiri" - }, - "220850": { - "latitude": -3.949964301, - "longitude": -42.7076346, - "name": "Porto" - }, - "220855": { - "latitude": -6.956337218, - "longitude": -44.05721978, - "name": "Porto Alegre do Piauí" - }, - "220860": { - "latitude": -5.725259168, - "longitude": -42.16661796, - "name": "Prata do Piauí" - }, - "220865": { - "latitude": -8.51600794, - "longitude": -41.35118551, - "name": "Queimada Nova" - }, - "220870": { - "latitude": -9.524389222, - "longitude": -44.45489134, - "name": "Redenção do Gurguéia" - }, - "220880": { - "latitude": -6.352458969, - "longitude": -42.49045768, - "name": "Regeneração" - }, - "220885": { - "latitude": -9.930564127, - "longitude": -44.81288922, - "name": "Riacho Frio" - }, - "220887": { - "latitude": -7.927755698, - "longitude": -42.6135638, - "name": "Ribeira do Piauí" - }, - "220890": { - "latitude": -7.974185098, - "longitude": -45.3455757, - "name": "Ribeiro Gonçalves" - }, - "220900": { - "latitude": -7.771053013, - "longitude": -43.15220334, - "name": "Rio Grande do Piauí" - }, - "220910": { - "latitude": -7.237063662, - "longitude": -41.77447027, - "name": "Santa Cruz do Piauí" - }, - "220915": { - "latitude": -5.907956781, - "longitude": -41.86859631, - "name": "Santa Cruz dos Milagres" - }, - "220920": { - "latitude": -8.990545793, - "longitude": -45.675555, - "name": "Santa Filomena" - }, - "220930": { - "latitude": -9.045186294, - "longitude": -44.10542651, - "name": "Santa Luz" - }, - "220935": { - "latitude": -6.940736906, - "longitude": -41.49505028, - "name": "Santana do Piauí" - }, - "220937": { - "latitude": -6.809355332, - "longitude": -42.22751167, - "name": "Santa Rosa do Piauí" - }, - "220940": { - "latitude": -6.906800274, - "longitude": -41.2073985, - "name": "Santo Antônio de Lisboa" - }, - "220945": { - "latitude": -6.050070599, - "longitude": -42.70265947, - "name": "Santo Antônio dos Milagres" - }, - "220950": { - "latitude": -7.458212368, - "longitude": -42.01433396, - "name": "Santo Inácio do Piauí" - }, - "220955": { - "latitude": -8.962839021, - "longitude": -43.00787261, - "name": "São Braz do Piauí" - }, - "220960": { - "latitude": -5.935569305, - "longitude": -42.10292968, - "name": "São Félix do Piauí" - }, - "220965": { - "latitude": -8.193504006, - "longitude": -41.58343109, - "name": "São Francisco de Assis do Piauí" - }, - "220970": { - "latitude": -7.198617667, - "longitude": -42.50098525, - "name": "São Francisco do Piauí" - }, - "220975": { - "latitude": -10.08826356, - "longitude": -45.32165594, - "name": "São Gonçalo do Gurguéia" - }, - "220980": { - "latitude": -6.002822387, - "longitude": -42.6522343, - "name": "São Gonçalo do Piauí" - }, - "220985": { - "latitude": -6.69191864, - "longitude": -41.39159242, - "name": "São João da Canabrava" - }, - "220987": { - "latitude": -3.992347076, - "longitude": -41.28379873, - "name": "São João da Fronteira" - }, - "220990": { - "latitude": -5.542505076, - "longitude": -41.87784585, - "name": "São João da Serra" - }, - "220995": { - "latitude": -6.956534091, - "longitude": -41.8821508, - "name": "São João da Varjota" - }, - "220997": { - "latitude": -3.818880915, - "longitude": -42.44940111, - "name": "São João do Arraial" - }, - "221000": { - "latitude": -8.320437719, - "longitude": -42.2573676, - "name": "São João do Piauí" - }, - "221005": { - "latitude": -3.774482854, - "longitude": -41.86101304, - "name": "São José do Divino" - }, - "221010": { - "latitude": -7.482427683, - "longitude": -42.58232106, - "name": "São José do Peixe" - }, - "221020": { - "latitude": -6.814959272, - "longitude": -41.49103032, - "name": "São José do Piauí" - }, - "221030": { - "latitude": -7.081581525, - "longitude": -40.82058606, - "name": "São Julião" - }, - "221035": { - "latitude": -9.171655114, - "longitude": -42.53549221, - "name": "São Lourenço do Piauí" - }, - "221037": { - "latitude": -6.764509623, - "longitude": -41.26342238, - "name": "São Luis do Piauí" - }, - "221038": { - "latitude": -5.818825266, - "longitude": -42.27299125, - "name": "São Miguel da Baixa Grande" - }, - "221039": { - "latitude": -7.5967516, - "longitude": -42.33266524, - "name": "São Miguel do Fidalgo" - }, - "221040": { - "latitude": -5.741035784, - "longitude": -41.43977361, - "name": "São Miguel do Tapuio" - }, - "221050": { - "latitude": -5.818189009, - "longitude": -42.78660415, - "name": "São Pedro do Piauí" - }, - "221060": { - "latitude": -8.965650922, - "longitude": -42.71563073, - "name": "São Raimundo Nonato" - }, - "221062": { - "latitude": -10.65438344, - "longitude": -44.8333543, - "name": "Sebastião Barros" - }, - "221063": { - "latitude": -7.74501683, - "longitude": -44.09258047, - "name": "Sebastião Leal" - }, - "221065": { - "latitude": -4.975551489, - "longitude": -41.80513847, - "name": "Sigefredo Pacheco" - }, - "221070": { - "latitude": -7.670979561, - "longitude": -40.74173211, - "name": "Simões" - }, - "221080": { - "latitude": -7.79890933, - "longitude": -42.02139283, - "name": "Simplício Mendes" - }, - "221090": { - "latitude": -7.896698797, - "longitude": -42.47638466, - "name": "Socorro do Piauí" - }, - "221093": { - "latitude": -7.019034977, - "longitude": -41.35619353, - "name": "Sussuapara" - }, - "221095": { - "latitude": -8.485813971, - "longitude": -43.08211582, - "name": "Tamboril do Piauí" - }, - "221097": { - "latitude": -6.662132603, - "longitude": -42.26622117, - "name": "Tanque do Piauí" - }, - "221100": { - "latitude": -5.102658079, - "longitude": -42.74060768, - "name": "Teresina" - }, - "221110": { - "latitude": -4.595331814, - "longitude": -42.79503733, - "name": "União" - }, - "221120": { - "latitude": -7.7918828, - "longitude": -44.56948594, - "name": "Uruçuí" - }, - "221130": { - "latitude": -6.367114904, - "longitude": -41.79895684, - "name": "Valença do Piauí" - }, - "221135": { - "latitude": -9.322692554, - "longitude": -42.9216445, - "name": "Várzea Branca" - }, - "221140": { - "latitude": -6.553610121, - "longitude": -42.22543095, - "name": "Várzea Grande" - }, - "221150": { - "latitude": -7.597709882, - "longitude": -41.51856577, - "name": "Vera Mendes" - }, - "221160": { - "latitude": -7.202113524, - "longitude": -40.93614445, - "name": "Vila Nova do Piauí" - }, - "221170": { - "latitude": -7.265638141, - "longitude": -41.87765549, - "name": "Wall Ferraz" - }, - "230010": { - "latitude": -7.360573959, - "longitude": -39.03682475, - "name": "Abaiara" - }, - "230015": { - "latitude": -4.21683205, - "longitude": -38.66212488, - "name": "Acarape" - }, - "230020": { - "latitude": -2.967897828, - "longitude": -40.08813329, - "name": "Acaraú" - }, - "230030": { - "latitude": -6.122030613, - "longitude": -39.49384181, - "name": "Acopiara" - }, - "230040": { - "latitude": -6.605146591, - "longitude": -40.29858505, - "name": "Aiuaba" - }, - "230050": { - "latitude": -3.592264848, - "longitude": -40.54301785, - "name": "Alcântaras" - }, - "230060": { - "latitude": -6.985614665, - "longitude": -39.69929737, - "name": "Altaneira" - }, - "230070": { - "latitude": -5.516684962, - "longitude": -38.19864031, - "name": "Alto Santo" - }, - "230075": { - "latitude": -3.239600586, - "longitude": -39.7851849, - "name": "Amontada" - }, - "230080": { - "latitude": -6.756486774, - "longitude": -39.98127311, - "name": "Antonina do Norte" - }, - "230090": { - "latitude": -3.968315921, - "longitude": -39.3306981, - "name": "Apuiarés" - }, - "230100": { - "latitude": -3.976570081, - "longitude": -38.39408073, - "name": "Aquiraz" - }, - "230110": { - "latitude": -4.680982474, - "longitude": -37.68550528, - "name": "Aracati" - }, - "230120": { - "latitude": -4.482964407, - "longitude": -38.71346302, - "name": "Aracoiaba" - }, - "230125": { - "latitude": -4.772962855, - "longitude": -40.7462324, - "name": "Ararendá" - }, - "230130": { - "latitude": -7.239284732, - "longitude": -40.07654293, - "name": "Araripe" - }, - "230140": { - "latitude": -4.417332586, - "longitude": -39.02495246, - "name": "Aratuba" - }, - "230150": { - "latitude": -6.239363415, - "longitude": -40.15494534, - "name": "Arneiroz" - }, - "230160": { - "latitude": -6.909634742, - "longitude": -39.86923288, - "name": "Assaré" - }, - "230170": { - "latitude": -6.988913231, - "longitude": -38.96912434, - "name": "Aurora" - }, - "230180": { - "latitude": -6.711448914, - "longitude": -38.75303403, - "name": "Baixio" - }, - "230185": { - "latitude": -5.262204677, - "longitude": -38.90364431, - "name": "Banabuiú" - }, - "230190": { - "latitude": -7.403744916, - "longitude": -39.34457006, - "name": "Barbalha" - }, - "230195": { - "latitude": -4.32214345, - "longitude": -38.62048157, - "name": "Barreira" - }, - "230200": { - "latitude": -7.125540799, - "longitude": -38.79391423, - "name": "Barro" - }, - "230205": { - "latitude": -2.9706248, - "longitude": -41.17363899, - "name": "Barroquinha" - }, - "230210": { - "latitude": -4.383357423, - "longitude": -38.85100171, - "name": "Baturité" - }, - "230220": { - "latitude": -4.401730562, - "longitude": -38.11290706, - "name": "Beberibe" - }, - "230230": { - "latitude": -3.053460239, - "longitude": -40.30800191, - "name": "Bela Cruz" - }, - "230240": { - "latitude": -5.08782289, - "longitude": -39.80790918, - "name": "Boa Viagem" - }, - "230250": { - "latitude": -7.555740083, - "longitude": -38.92125763, - "name": "Brejo Santo" - }, - "230260": { - "latitude": -2.949806803, - "longitude": -40.8008912, - "name": "Camocim" - }, - "230270": { - "latitude": -6.936725344, - "longitude": -40.27133195, - "name": "Campos Sales" - }, - "230280": { - "latitude": -4.402118968, - "longitude": -39.4303521, - "name": "Canindé" - }, - "230290": { - "latitude": -4.46782088, - "longitude": -38.90794837, - "name": "Capistrano" - }, - "230300": { - "latitude": -4.203797968, - "longitude": -39.10989591, - "name": "Caridade" - }, - "230310": { - "latitude": -3.951874315, - "longitude": -40.52168838, - "name": "Cariré" - }, - "230320": { - "latitude": -7.021812977, - "longitude": -39.27487989, - "name": "Caririaçu" - }, - "230330": { - "latitude": -6.642002657, - "longitude": -39.46411006, - "name": "Cariús" - }, - "230340": { - "latitude": -4.130120318, - "longitude": -41.01020943, - "name": "Carnaubal" - }, - "230350": { - "latitude": -4.239086703, - "longitude": -38.29708706, - "name": "Cascavel" - }, - "230360": { - "latitude": -6.252786618, - "longitude": -39.90966244, - "name": "Catarina" - }, - "230365": { - "latitude": -4.629580352, - "longitude": -40.17501571, - "name": "Catunda" - }, - "230370": { - "latitude": -3.783590266, - "longitude": -38.80969126, - "name": "Caucaia" - }, - "230380": { - "latitude": -6.569747439, - "longitude": -39.09319233, - "name": "Cedro" - }, - "230390": { - "latitude": -3.092644552, - "longitude": -41.2325632, - "name": "Chaval" - }, - "230393": { - "latitude": -4.772315671, - "longitude": -39.19108453, - "name": "Choró" - }, - "230395": { - "latitude": -4.302326437, - "longitude": -38.46833824, - "name": "Chorozinho" - }, - "230400": { - "latitude": -3.64152006, - "longitude": -40.72636339, - "name": "Coreaú" - }, - "230410": { - "latitude": -5.199324834, - "longitude": -40.71957747, - "name": "Crateús" - }, - "230420": { - "latitude": -7.235646754, - "longitude": -39.48993687, - "name": "Crato" - }, - "230423": { - "latitude": -4.387728652, - "longitude": -40.97510839, - "name": "Croatá" - }, - "230425": { - "latitude": -2.896534165, - "longitude": -40.32328777, - "name": "Cruz" - }, - "230426": { - "latitude": -5.887034728, - "longitude": -39.26616582, - "name": "Deputado Irapuan Pinheiro" - }, - "230427": { - "latitude": -5.985014136, - "longitude": -38.31203119, - "name": "Ereré" - }, - "230428": { - "latitude": -3.875981166, - "longitude": -38.45759892, - "name": "Eusébio" - }, - "230430": { - "latitude": -6.909455021, - "longitude": -39.5490683, - "name": "Farias Brito" - }, - "230435": { - "latitude": -3.822354025, - "longitude": -40.22547308, - "name": "Forquilha" - }, - "230440": { - "latitude": -3.785832855, - "longitude": -38.52800065, - "name": "Fortaleza" - }, - "230445": { - "latitude": -4.464396268, - "longitude": -37.87370424, - "name": "Fortim" - }, - "230450": { - "latitude": -3.710811569, - "longitude": -40.82276505, - "name": "Frecheirinha" - }, - "230460": { - "latitude": -4.063921093, - "longitude": -39.45111788, - "name": "General Sampaio" - }, - "230465": { - "latitude": -4.045702131, - "longitude": -40.77399389, - "name": "Graça" - }, - "230470": { - "latitude": -3.23060961, - "longitude": -41.00170421, - "name": "Granja" - }, - "230480": { - "latitude": -6.911689218, - "longitude": -39.25218338, - "name": "Granjeiro" - }, - "230490": { - "latitude": -3.912350782, - "longitude": -40.3653075, - "name": "Groaíras" - }, - "230495": { - "latitude": -4.102253246, - "longitude": -38.66984969, - "name": "Guaiúba" - }, - "230500": { - "latitude": -4.232768075, - "longitude": -40.91540936, - "name": "Guaraciaba do Norte" - }, - "230510": { - "latitude": -4.246612321, - "longitude": -38.95658735, - "name": "Guaramiranga" - }, - "230520": { - "latitude": -4.432557573, - "longitude": -40.40505745, - "name": "Hidrolândia" - }, - "230523": { - "latitude": -4.102181587, - "longitude": -38.46501369, - "name": "Horizonte" - }, - "230526": { - "latitude": -4.78003816, - "longitude": -38.72480161, - "name": "Ibaretama" - }, - "230530": { - "latitude": -3.951121291, - "longitude": -41.00620379, - "name": "Ibiapina" - }, - "230533": { - "latitude": -4.974579176, - "longitude": -38.55687885, - "name": "Ibicuitinga" - }, - "230535": { - "latitude": -4.73861058, - "longitude": -37.41059624, - "name": "Icapuí" - }, - "230540": { - "latitude": -6.389048183, - "longitude": -38.78341008, - "name": "Icó" - }, - "230550": { - "latitude": -6.358481229, - "longitude": -39.28186468, - "name": "Iguatu" - }, - "230560": { - "latitude": -5.47378176, - "longitude": -40.34128841, - "name": "Independência" - }, - "230565": { - "latitude": -4.909680649, - "longitude": -40.80420361, - "name": "Ipaporanga" - }, - "230570": { - "latitude": -6.809178021, - "longitude": -38.74304794, - "name": "Ipaumirim" - }, - "230580": { - "latitude": -4.369675207, - "longitude": -40.66914445, - "name": "Ipu" - }, - "230590": { - "latitude": -4.572800272, - "longitude": -40.87688598, - "name": "Ipueiras" - }, - "230600": { - "latitude": -5.777911086, - "longitude": -38.33823995, - "name": "Iracema" - }, - "230610": { - "latitude": -3.865776989, - "longitude": -39.81759953, - "name": "Irauçuba" - }, - "230620": { - "latitude": -4.717555708, - "longitude": -37.84717906, - "name": "Itaiçaba" - }, - "230625": { - "latitude": -3.998037174, - "longitude": -38.54996282, - "name": "Itaitinga" - }, - "230630": { - "latitude": -3.732781003, - "longitude": -39.57503511, - "name": "Itapajé" - }, - "230640": { - "latitude": -3.395225546, - "longitude": -39.59830099, - "name": "Itapipoca" - }, - "230650": { - "latitude": -4.595515247, - "longitude": -38.95206609, - "name": "Itapiúna" - }, - "230655": { - "latitude": -3.049830811, - "longitude": -39.88905807, - "name": "Itarema" - }, - "230660": { - "latitude": -4.625518371, - "longitude": -39.57828201, - "name": "Itatira" - }, - "230670": { - "latitude": -5.491775935, - "longitude": -38.74794435, - "name": "Jaguaretama" - }, - "230680": { - "latitude": -5.610998984, - "longitude": -38.52502428, - "name": "Jaguaribara" - }, - "230690": { - "latitude": -5.961295557, - "longitude": -38.70500294, - "name": "Jaguaribe" - }, - "230700": { - "latitude": -4.865694208, - "longitude": -37.74665203, - "name": "Jaguaruana" - }, - "230710": { - "latitude": -7.59033192, - "longitude": -39.24803502, - "name": "Jardim" - }, - "230720": { - "latitude": -7.691957456, - "longitude": -38.99233992, - "name": "Jati" - }, - "230725": { - "latitude": -2.877760507, - "longitude": -40.49529474, - "name": "Jijoca de Jericoacoara" - }, - "230730": { - "latitude": -7.1828142, - "longitude": -39.28616477, - "name": "Juazeiro do Norte" - }, - "230740": { - "latitude": -6.458016275, - "longitude": -39.60725839, - "name": "Jucás" - }, - "230750": { - "latitude": -6.777985439, - "longitude": -38.99455822, - "name": "Lavras da Mangabeira" - }, - "230760": { - "latitude": -5.158106431, - "longitude": -38.04609856, - "name": "Limoeiro do Norte" - }, - "230763": { - "latitude": -4.857932634, - "longitude": -39.5089577, - "name": "Madalena" - }, - "230765": { - "latitude": -3.874530695, - "longitude": -38.6271343, - "name": "Maracanaú" - }, - "230770": { - "latitude": -4.006665303, - "longitude": -38.81214238, - "name": "Maranguape" - }, - "230780": { - "latitude": -3.189572509, - "longitude": -40.26178303, - "name": "Marco" - }, - "230790": { - "latitude": -3.169641831, - "longitude": -40.64877701, - "name": "Martinópole" - }, - "230800": { - "latitude": -3.484267528, - "longitude": -40.38759956, - "name": "Massapê" - }, - "230810": { - "latitude": -7.397703263, - "longitude": -38.71738808, - "name": "Mauriti" - }, - "230820": { - "latitude": -3.57859328, - "longitude": -40.45085154, - "name": "Meruoca" - }, - "230830": { - "latitude": -7.272055608, - "longitude": -38.94294201, - "name": "Milagres" - }, - "230835": { - "latitude": -5.640820797, - "longitude": -39.17113664, - "name": "Milhã" - }, - "230837": { - "latitude": -3.560570727, - "longitude": -39.90862396, - "name": "Miraíma" - }, - "230840": { - "latitude": -7.306450182, - "longitude": -39.15287814, - "name": "Missão Velha" - }, - "230850": { - "latitude": -5.788103475, - "longitude": -39.7484546, - "name": "Mombaça" - }, - "230860": { - "latitude": -4.914672954, - "longitude": -40.04458855, - "name": "Monsenhor Tabosa" - }, - "230870": { - "latitude": -5.034793186, - "longitude": -38.43291397, - "name": "Morada Nova" - }, - "230880": { - "latitude": -3.461105571, - "longitude": -40.67953455, - "name": "Moraújo" - }, - "230890": { - "latitude": -3.284053459, - "longitude": -40.08915662, - "name": "Morrinhos" - }, - "230900": { - "latitude": -3.897805894, - "longitude": -40.75590389, - "name": "Mucambo" - }, - "230910": { - "latitude": -4.319446354, - "longitude": -38.9931955, - "name": "Mulungu" - }, - "230920": { - "latitude": -7.093139021, - "longitude": -39.665085, - "name": "Nova Olinda" - }, - "230930": { - "latitude": -4.679855966, - "longitude": -40.52877784, - "name": "Nova Russas" - }, - "230940": { - "latitude": -5.592640959, - "longitude": -40.77085967, - "name": "Novo Oriente" - }, - "230945": { - "latitude": -4.52646364, - "longitude": -38.50733393, - "name": "Ocara" - }, - "230950": { - "latitude": -6.244245204, - "longitude": -38.94478948, - "name": "Orós" - }, - "230960": { - "latitude": -4.183823404, - "longitude": -38.49832673, - "name": "Pacajus" - }, - "230970": { - "latitude": -3.952312068, - "longitude": -38.59716646, - "name": "Pacatuba" - }, - "230980": { - "latitude": -4.198899723, - "longitude": -38.90210778, - "name": "Pacoti" - }, - "230990": { - "latitude": -4.005895809, - "longitude": -40.68558897, - "name": "Pacujá" - }, - "231000": { - "latitude": -4.708398443, - "longitude": -38.02809875, - "name": "Palhano" - }, - "231010": { - "latitude": -4.125778035, - "longitude": -38.84202171, - "name": "Palmácia" - }, - "231020": { - "latitude": -3.480785834, - "longitude": -39.03878989, - "name": "Paracuru" - }, - "231025": { - "latitude": -3.422271321, - "longitude": -39.17929702, - "name": "Paraipaba" - }, - "231030": { - "latitude": -6.304045066, - "longitude": -40.62765016, - "name": "Parambu" - }, - "231040": { - "latitude": -4.159828243, - "longitude": -39.37708841, - "name": "Paramoti" - }, - "231050": { - "latitude": -5.496999427, - "longitude": -39.84683976, - "name": "Pedra Branca" - }, - "231060": { - "latitude": -7.780403478, - "longitude": -39.05395773, - "name": "Penaforte" - }, - "231070": { - "latitude": -3.853844609, - "longitude": -39.14603047, - "name": "Pentecoste" - }, - "231080": { - "latitude": -6.040833209, - "longitude": -38.48865189, - "name": "Pereiro" - }, - "231085": { - "latitude": -4.054624313, - "longitude": -38.30533582, - "name": "Pindoretama" - }, - "231090": { - "latitude": -5.86296229, - "longitude": -39.45168146, - "name": "Piquet Carneiro" - }, - "231095": { - "latitude": -4.259147156, - "longitude": -40.58425158, - "name": "Pires Ferreira" - }, - "231100": { - "latitude": -4.799487213, - "longitude": -41.0774369, - "name": "Poranga" - }, - "231110": { - "latitude": -7.541965675, - "longitude": -39.10683147, - "name": "Porteiras" - }, - "231120": { - "latitude": -7.072667026, - "longitude": -40.03639966, - "name": "Potengi" - }, - "231123": { - "latitude": -5.749557569, - "longitude": -38.16761061, - "name": "Potiretama" - }, - "231126": { - "latitude": -5.871539643, - "longitude": -40.76088489, - "name": "Quiterianópolis" - }, - "231130": { - "latitude": -4.95448083, - "longitude": -38.94703256, - "name": "Quixadá" - }, - "231135": { - "latitude": -6.175435676, - "longitude": -39.12066213, - "name": "Quixelô" - }, - "231140": { - "latitude": -5.245547304, - "longitude": -39.33320929, - "name": "Quixeramobim" - }, - "231150": { - "latitude": -5.088171066, - "longitude": -37.8623925, - "name": "Quixeré" - }, - "231160": { - "latitude": -4.245595239, - "longitude": -38.76236207, - "name": "Redenção" - }, - "231170": { - "latitude": -4.120857456, - "longitude": -40.6132765, - "name": "Reriutaba" - }, - "231180": { - "latitude": -4.843813811, - "longitude": -38.14825428, - "name": "Russas" - }, - "231190": { - "latitude": -6.484326905, - "longitude": -39.88860974, - "name": "Saboeiro" - }, - "231195": { - "latitude": -7.20480289, - "longitude": -40.36635308, - "name": "Salitre" - }, - "231200": { - "latitude": -3.461024846, - "longitude": -40.16469161, - "name": "Santana do Acaraú" - }, - "231210": { - "latitude": -7.221916606, - "longitude": -39.75653042, - "name": "Santana do Cariri" - }, - "231220": { - "latitude": -4.340706768, - "longitude": -40.04191314, - "name": "Santa Quitéria" - }, - "231230": { - "latitude": -4.040847908, - "longitude": -40.96950856, - "name": "São Benedito" - }, - "231240": { - "latitude": -3.60055166, - "longitude": -39.0605593, - "name": "São Gonçalo do Amarante" - }, - "231250": { - "latitude": -5.325953219, - "longitude": -38.27333739, - "name": "São João do Jaguaribe" - }, - "231260": { - "latitude": -3.646297139, - "longitude": -39.26447807, - "name": "São Luís do Curu" - }, - "231270": { - "latitude": -5.587669344, - "longitude": -39.43363505, - "name": "Senador Pompeu" - }, - "231280": { - "latitude": -3.270057348, - "longitude": -40.46103822, - "name": "Senador Sá" - }, - "231290": { - "latitude": -3.811040804, - "longitude": -40.22786986, - "name": "Sobral" - }, - "231300": { - "latitude": -5.776468296, - "longitude": -39.00243374, - "name": "Solonópole" - }, - "231310": { - "latitude": -5.324033547, - "longitude": -38.04423782, - "name": "Tabuleiro do Norte" - }, - "231320": { - "latitude": -4.919984187, - "longitude": -40.3358415, - "name": "Tamboril" - }, - "231325": { - "latitude": -6.730170574, - "longitude": -39.7377901, - "name": "Tarrafas" - }, - "231330": { - "latitude": -5.936782611, - "longitude": -40.25894983, - "name": "Tauá" - }, - "231335": { - "latitude": -3.932003553, - "longitude": -39.58334265, - "name": "Tejuçuoca" - }, - "231340": { - "latitude": -3.736148876, - "longitude": -41.05499091, - "name": "Tianguá" - }, - "231350": { - "latitude": -3.337434709, - "longitude": -39.35359381, - "name": "Trairi" - }, - "231355": { - "latitude": -3.551096658, - "longitude": -39.40572578, - "name": "Tururu" - }, - "231360": { - "latitude": -3.86656211, - "longitude": -41.00451313, - "name": "Ubajara" - }, - "231370": { - "latitude": -6.623326922, - "longitude": -38.73027734, - "name": "Umari" - }, - "231375": { - "latitude": -3.68697681, - "longitude": -39.38467991, - "name": "Umirim" - }, - "231380": { - "latitude": -3.621277658, - "longitude": -39.51453825, - "name": "Uruburetama" - }, - "231390": { - "latitude": -3.320912355, - "longitude": -40.68035175, - "name": "Uruoca" - }, - "231395": { - "latitude": -4.167851203, - "longitude": -40.49393669, - "name": "Varjota" - }, - "231400": { - "latitude": -6.771792877, - "longitude": -39.29785033, - "name": "Várzea Alegre" - }, - "231410": { - "latitude": -3.546199626, - "longitude": -41.13606008, - "name": "Viçosa do Ceará" - }, - "240010": { - "latitude": -6.409361677, - "longitude": -36.65011515, - "name": "Acari" - }, - "240020": { - "latitude": -5.52664793, - "longitude": -37.01411462, - "name": "Açu" - }, - "240030": { - "latitude": -5.471434554, - "longitude": -36.59989402, - "name": "Afonso Bezerra" - }, - "240040": { - "latitude": -6.208624611, - "longitude": -38.3086438, - "name": "Água Nova" - }, - "240050": { - "latitude": -6.364493407, - "longitude": -37.98919515, - "name": "Alexandria" - }, - "240060": { - "latitude": -6.154489862, - "longitude": -37.76297314, - "name": "Almino Afonso" - }, - "240070": { - "latitude": -5.362329356, - "longitude": -36.72362051, - "name": "Alto do Rodrigues" - }, - "240080": { - "latitude": -5.646298349, - "longitude": -36.55723378, - "name": "Angicos" - }, - "240090": { - "latitude": -6.21961654, - "longitude": -37.92478302, - "name": "Antônio Martins" - }, - "240100": { - "latitude": -5.628279635, - "longitude": -37.83566911, - "name": "Apodi" - }, - "240110": { - "latitude": -5.001190743, - "longitude": -37.04625377, - "name": "Areia Branca" - }, - "240120": { - "latitude": -6.193686704, - "longitude": -35.2081756, - "name": "Arês" - }, - "240130": { - "latitude": -5.881225573, - "longitude": -37.32460277, - "name": "Campo Grande" - }, - "240140": { - "latitude": -6.434734815, - "longitude": -35.04489243, - "name": "Baía Formosa" - }, - "240145": { - "latitude": -5.092796755, - "longitude": -37.61833887, - "name": "Baraúna" - }, - "240150": { - "latitude": -5.961099011, - "longitude": -35.92202294, - "name": "Barcelona" - }, - "240160": { - "latitude": -5.675909267, - "longitude": -35.81187397, - "name": "Bento Fernandes" - }, - "240165": { - "latitude": -5.962905013, - "longitude": -36.44174301, - "name": "Bodó" - }, - "240170": { - "latitude": -6.000815605, - "longitude": -35.59079391, - "name": "Bom Jesus" - }, - "240180": { - "latitude": -6.2181735, - "longitude": -35.38358705, - "name": "Brejinho" - }, - "240185": { - "latitude": -5.19184042, - "longitude": -36.08329555, - "name": "Caiçara do Norte" - }, - "240190": { - "latitude": -5.76608759, - "longitude": -36.02646186, - "name": "Caiçara do Rio do Vento" - }, - "240200": { - "latitude": -6.467561846, - "longitude": -37.03794348, - "name": "Caicó" - }, - "240210": { - "latitude": -6.23770679, - "longitude": -36.20889465, - "name": "Campo Redondo" - }, - "240220": { - "latitude": -6.395087553, - "longitude": -35.14845998, - "name": "Canguaretama" - }, - "240230": { - "latitude": -5.767242493, - "longitude": -37.58376601, - "name": "Caraúbas" - }, - "240240": { - "latitude": -6.553298651, - "longitude": -36.54880303, - "name": "Carnaúba dos Dantas" - }, - "240250": { - "latitude": -5.264080737, - "longitude": -36.85729202, - "name": "Carnaubais" - }, - "240260": { - "latitude": -5.595470347, - "longitude": -35.39522142, - "name": "Ceará-Mirim" - }, - "240270": { - "latitude": -5.989356386, - "longitude": -36.32715319, - "name": "Cerro Corá" - }, - "240280": { - "latitude": -6.35719618, - "longitude": -36.19590466, - "name": "Coronel Ezequiel" - }, - "240290": { - "latitude": -6.255473132, - "longitude": -38.42281287, - "name": "Coronel João Pessoa" - }, - "240300": { - "latitude": -6.355927599, - "longitude": -36.82498949, - "name": "Cruzeta" - }, - "240310": { - "latitude": -6.22356479, - "longitude": -36.44355381, - "name": "Currais Novos" - }, - "240320": { - "latitude": -6.115372713, - "longitude": -38.40137272, - "name": "Doutor Severiano" - }, - "240325": { - "latitude": -5.9143268, - "longitude": -35.23012059, - "name": "Parnamirim" - }, - "240330": { - "latitude": -6.134223583, - "longitude": -38.30635306, - "name": "Encanto" - }, - "240340": { - "latitude": -6.88201131, - "longitude": -36.66614853, - "name": "Equador" - }, - "240350": { - "latitude": -6.305650401, - "longitude": -35.30448468, - "name": "Espírito Santo" - }, - "240360": { - "latitude": -5.680969343, - "longitude": -35.26866558, - "name": "Extremoz" - }, - "240370": { - "latitude": -5.53981286, - "longitude": -37.6558875, - "name": "Felipe Guerra" - }, - "240375": { - "latitude": -5.760500129, - "longitude": -36.3921052, - "name": "Fernando Pedroza" - }, - "240380": { - "latitude": -6.169716732, - "longitude": -36.81838265, - "name": "Florânia" - }, - "240390": { - "latitude": -6.053006341, - "longitude": -38.10863442, - "name": "Francisco Dantas" - }, - "240400": { - "latitude": -6.161016719, - "longitude": -37.83904378, - "name": "Frutuoso Gomes" - }, - "240410": { - "latitude": -5.175724053, - "longitude": -36.20799253, - "name": "Galinhos" - }, - "240420": { - "latitude": -6.287828872, - "longitude": -35.21383817, - "name": "Goianinha" - }, - "240430": { - "latitude": -5.395073823, - "longitude": -37.53675419, - "name": "Governador Dix-Sept Rosado" - }, - "240440": { - "latitude": -4.947555007, - "longitude": -37.21047016, - "name": "Grossos" - }, - "240450": { - "latitude": -5.1747613, - "longitude": -36.34394908, - "name": "Guamaré" - }, - "240460": { - "latitude": -5.784137157, - "longitude": -35.55043135, - "name": "Ielmo Marinho" - }, - "240470": { - "latitude": -5.538200391, - "longitude": -36.80268397, - "name": "Ipanguaçu" - }, - "240480": { - "latitude": -6.774159983, - "longitude": -37.18635112, - "name": "Ipueira" - }, - "240485": { - "latitude": -5.689978491, - "longitude": -36.80803092, - "name": "Itajá" - }, - "240490": { - "latitude": -5.818459493, - "longitude": -37.91650302, - "name": "Itaú" - }, - "240500": { - "latitude": -6.410928059, - "longitude": -36.21456059, - "name": "Jaçanã" - }, - "240510": { - "latitude": -5.356993095, - "longitude": -36.13824473, - "name": "Jandaíra" - }, - "240520": { - "latitude": -5.996914282, - "longitude": -37.47479221, - "name": "Janduís" - }, - "240530": { - "latitude": -6.151909869, - "longitude": -35.60054978, - "name": "Januário Cicco" - }, - "240540": { - "latitude": -6.432822054, - "longitude": -35.89910712, - "name": "Japi" - }, - "240550": { - "latitude": -5.613696365, - "longitude": -35.98676842, - "name": "Jardim de Angicos" - }, - "240560": { - "latitude": -6.334491418, - "longitude": -37.2858854, - "name": "Jardim de Piranhas" - }, - "240570": { - "latitude": -6.587739301, - "longitude": -36.80657357, - "name": "Jardim do Seridó" - }, - "240580": { - "latitude": -5.47535801, - "longitude": -35.87392974, - "name": "João Câmara" - }, - "240590": { - "latitude": -6.287878244, - "longitude": -37.83789878, - "name": "João Dias" - }, - "240600": { - "latitude": -6.34058008, - "longitude": -38.28305012, - "name": "José da Penha" - }, - "240610": { - "latitude": -6.058002229, - "longitude": -37.02139332, - "name": "Jucurutu" - }, - "240615": { - "latitude": -6.256318875, - "longitude": -35.34036136, - "name": "Jundiá" - }, - "240620": { - "latitude": -6.384763146, - "longitude": -35.62622592, - "name": "Lagoa d'Anta" - }, - "240630": { - "latitude": -6.192435211, - "longitude": -35.45083511, - "name": "Lagoa de Pedras" - }, - "240640": { - "latitude": -6.010493517, - "longitude": -35.84438783, - "name": "Lagoa de Velhos" - }, - "240650": { - "latitude": -6.092457714, - "longitude": -36.519115, - "name": "Lagoa Nova" - }, - "240660": { - "latitude": -6.147192589, - "longitude": -35.50504146, - "name": "Lagoa Salgada" - }, - "240670": { - "latitude": -5.698166913, - "longitude": -36.18059707, - "name": "Lajes" - }, - "240680": { - "latitude": -6.14806424, - "longitude": -36.13422162, - "name": "Lajes Pintadas" - }, - "240690": { - "latitude": -6.103579446, - "longitude": -37.8243726, - "name": "Lucrécia" - }, - "240700": { - "latitude": -6.373367606, - "longitude": -38.40263103, - "name": "Luís Gomes" - }, - "240710": { - "latitude": -5.926858523, - "longitude": -35.42876574, - "name": "Macaíba" - }, - "240720": { - "latitude": -5.195953918, - "longitude": -36.52346, - "name": "Macau" - }, - "240725": { - "latitude": -6.40510761, - "longitude": -38.31764476, - "name": "Major Sales" - }, - "240730": { - "latitude": -6.280315711, - "longitude": -38.15733578, - "name": "Marcelino Vieira" - }, - "240740": { - "latitude": -6.080223816, - "longitude": -37.9059021, - "name": "Martins" - }, - "240750": { - "latitude": -5.45158317, - "longitude": -35.35449441, - "name": "Maxaranguape" - }, - "240760": { - "latitude": -6.092651789, - "longitude": -37.48538795, - "name": "Messias Targino" - }, - "240770": { - "latitude": -6.504924305, - "longitude": -35.29092415, - "name": "Montanhas" - }, - "240780": { - "latitude": -6.09875859, - "longitude": -35.4050648, - "name": "Monte Alegre" - }, - "240790": { - "latitude": -6.42987767, - "longitude": -35.80903222, - "name": "Monte das Gameleiras" - }, - "240800": { - "latitude": -5.17581018, - "longitude": -37.32552954, - "name": "Mossoró" - }, - "240810": { - "latitude": -5.803174653, - "longitude": -35.22884144, - "name": "Natal" - }, - "240820": { - "latitude": -6.05491996, - "longitude": -35.17322315, - "name": "Nísia Floresta" - }, - "240830": { - "latitude": -6.448645514, - "longitude": -35.42895334, - "name": "Nova Cruz" - }, - "240840": { - "latitude": -5.978935054, - "longitude": -37.71018781, - "name": "Olho d'Água do Borges" - }, - "240850": { - "latitude": -6.683530982, - "longitude": -36.92106541, - "name": "Ouro Branco" - }, - "240860": { - "latitude": -6.451044018, - "longitude": -38.28420371, - "name": "Paraná" - }, - "240870": { - "latitude": -5.784387074, - "longitude": -37.11055691, - "name": "Paraú" - }, - "240880": { - "latitude": -5.285830147, - "longitude": -35.93619334, - "name": "Parazinho" - }, - "240890": { - "latitude": -6.713842547, - "longitude": -36.61948006, - "name": "Parelhas" - }, - "240895": { - "latitude": -5.377270812, - "longitude": -35.39997791, - "name": "Rio do Fogo" - }, - "240910": { - "latitude": -6.442741345, - "longitude": -35.61453894, - "name": "Passa e Fica" - }, - "240920": { - "latitude": -6.283823018, - "longitude": -35.39571112, - "name": "Passagem" - }, - "240930": { - "latitude": -6.08688574, - "longitude": -37.62133738, - "name": "Patu" - }, - "240933": { - "latitude": -5.788922939, - "longitude": -35.72048052, - "name": "Santa Maria" - }, - "240940": { - "latitude": -6.117405627, - "longitude": -38.16975122, - "name": "Pau dos Ferros" - }, - "240950": { - "latitude": -5.146043649, - "longitude": -35.87350605, - "name": "Pedra Grande" - }, - "240960": { - "latitude": -5.524527222, - "longitude": -36.07952375, - "name": "Pedra Preta" - }, - "240970": { - "latitude": -5.475022337, - "longitude": -36.33162552, - "name": "Pedro Avelino" - }, - "240980": { - "latitude": -6.465247842, - "longitude": -35.22451816, - "name": "Pedro Velho" - }, - "240990": { - "latitude": -5.29290364, - "longitude": -36.62398987, - "name": "Pendências" - }, - "241000": { - "latitude": -6.286596436, - "longitude": -38.02921661, - "name": "Pilões" - }, - "241010": { - "latitude": -5.571509281, - "longitude": -35.69435279, - "name": "Poço Branco" - }, - "241020": { - "latitude": -6.032873786, - "longitude": -38.01498386, - "name": "Portalegre" - }, - "241025": { - "latitude": -5.088328549, - "longitude": -36.84151642, - "name": "Porto do Mangue" - }, - "241030": { - "latitude": -6.109225593, - "longitude": -35.72353015, - "name": "Serra Caiada" - }, - "241040": { - "latitude": -5.407292814, - "longitude": -35.5821443, - "name": "Pureza" - }, - "241050": { - "latitude": -6.196812536, - "longitude": -38.22374206, - "name": "Rafael Fernandes" - }, - "241060": { - "latitude": -6.069075937, - "longitude": -37.73022135, - "name": "Rafael Godeiro" - }, - "241070": { - "latitude": -5.923590281, - "longitude": -37.96643219, - "name": "Riacho da Cruz" - }, - "241080": { - "latitude": -6.277003297, - "longitude": -38.33612424, - "name": "Riacho de Santana" - }, - "241090": { - "latitude": -5.798436299, - "longitude": -35.84958978, - "name": "Riachuelo" - }, - "241100": { - "latitude": -5.858491459, - "longitude": -38.08092666, - "name": "Rodolfo Fernandes" - }, - "241105": { - "latitude": -4.888372863, - "longitude": -37.32098745, - "name": "Tibau" - }, - "241110": { - "latitude": -5.856860882, - "longitude": -35.9405179, - "name": "Ruy Barbosa" - }, - "241120": { - "latitude": -6.248246334, - "longitude": -36.00648924, - "name": "Santa Cruz" - }, - "241140": { - "latitude": -5.904346754, - "longitude": -36.63461842, - "name": "Santana do Matos" - }, - "241142": { - "latitude": -6.732237306, - "longitude": -36.76513076, - "name": "Santana do Seridó" - }, - "241150": { - "latitude": -6.339476759, - "longitude": -35.50540466, - "name": "Santo Antônio" - }, - "241160": { - "latitude": -5.144125123, - "longitude": -35.98906179, - "name": "São Bento do Norte" - }, - "241170": { - "latitude": -6.383215265, - "longitude": -36.04847051, - "name": "São Bento do Trairí" - }, - "241180": { - "latitude": -6.321347228, - "longitude": -37.1511561, - "name": "São Fernando" - }, - "241190": { - "latitude": -5.985177339, - "longitude": -38.18379002, - "name": "São Francisco do Oeste" - }, - "241200": { - "latitude": -5.787741434, - "longitude": -35.36480745, - "name": "São Gonçalo do Amarante" - }, - "241210": { - "latitude": -6.690416672, - "longitude": -37.18850772, - "name": "São João do Sabugi" - }, - "241220": { - "latitude": -6.063997788, - "longitude": -35.28941624, - "name": "São José de Mipibu" - }, - "241230": { - "latitude": -6.301116037, - "longitude": -35.7401717, - "name": "São José do Campestre" - }, - "241240": { - "latitude": -6.486637124, - "longitude": -36.85850384, - "name": "São José do Seridó" - }, - "241250": { - "latitude": -6.214360342, - "longitude": -38.47428244, - "name": "São Miguel" - }, - "241255": { - "latitude": -5.193997785, - "longitude": -35.73719738, - "name": "São Miguel do Gostoso" - }, - "241260": { - "latitude": -5.934039454, - "longitude": -35.7544306, - "name": "São Paulo do Potengi" - }, - "241270": { - "latitude": -5.892560614, - "longitude": -35.63033271, - "name": "São Pedro" - }, - "241280": { - "latitude": -5.837394396, - "longitude": -36.87851073, - "name": "São Rafael" - }, - "241290": { - "latitude": -5.98820189, - "longitude": -36.12856982, - "name": "São Tomé" - }, - "241300": { - "latitude": -6.207680446, - "longitude": -36.65981649, - "name": "São Vicente" - }, - "241310": { - "latitude": -6.041263798, - "longitude": -35.68249313, - "name": "Senador Elói de Souza" - }, - "241320": { - "latitude": -6.157871322, - "longitude": -35.12140559, - "name": "Senador Georgino Avelino" - }, - "241330": { - "latitude": -6.428639546, - "longitude": -35.71893347, - "name": "Serra de São Bento" - }, - "241335": { - "latitude": -5.171279543, - "longitude": -37.02422238, - "name": "Serra do Mel" - }, - "241340": { - "latitude": -6.587370556, - "longitude": -37.36002423, - "name": "Serra Negra do Norte" - }, - "241350": { - "latitude": -6.255126669, - "longitude": -35.57436015, - "name": "Serrinha" - }, - "241355": { - "latitude": -6.144493356, - "longitude": -37.99306862, - "name": "Serrinha dos Pintos" - }, - "241360": { - "latitude": -5.769195137, - "longitude": -37.97270711, - "name": "Severiano Melo" - }, - "241370": { - "latitude": -6.087965598, - "longitude": -35.92730349, - "name": "Sítio Novo" - }, - "241380": { - "latitude": -5.935838063, - "longitude": -38.05115143, - "name": "Taboleiro Grande" - }, - "241390": { - "latitude": -5.596702251, - "longitude": -35.58520577, - "name": "Taipu" - }, - "241400": { - "latitude": -6.216973771, - "longitude": -35.83529183, - "name": "Tangará" - }, - "241410": { - "latitude": -6.440614146, - "longitude": -38.1638891, - "name": "Tenente Ananias" - }, - "241415": { - "latitude": -6.159083246, - "longitude": -36.72269539, - "name": "Tenente Laurentino Cruz" - }, - "241420": { - "latitude": -6.241687726, - "longitude": -35.09981752, - "name": "Tibau do Sul" - }, - "241430": { - "latitude": -6.477690659, - "longitude": -37.2472074, - "name": "Timbaúba dos Batistas" - }, - "241440": { - "latitude": -5.281010739, - "longitude": -35.60796965, - "name": "Touros" - }, - "241445": { - "latitude": -5.918392823, - "longitude": -37.15155256, - "name": "Triunfo Potiguar" - }, - "241450": { - "latitude": -5.991980206, - "longitude": -37.83261093, - "name": "Umarizal" - }, - "241460": { - "latitude": -5.610093542, - "longitude": -37.29196537, - "name": "Upanema" - }, - "241470": { - "latitude": -6.351456226, - "longitude": -35.36839197, - "name": "Várzea" - }, - "241475": { - "latitude": -6.320718577, - "longitude": -38.52677978, - "name": "Venha-Ver" - }, - "241480": { - "latitude": -6.037194738, - "longitude": -35.43552772, - "name": "Vera Cruz" - }, - "241490": { - "latitude": -5.98705615, - "longitude": -37.95502441, - "name": "Viçosa" - }, - "241500": { - "latitude": -6.302818393, - "longitude": -35.08706228, - "name": "Vila Flor" - }, - "250010": { - "latitude": -7.470487717, - "longitude": -37.66262188, - "name": "Água Branca" - }, - "250020": { - "latitude": -7.074081794, - "longitude": -38.21377922, - "name": "Aguiar" - }, - "250030": { - "latitude": -7.059072019, - "longitude": -35.60284229, - "name": "Alagoa Grande" - }, - "250040": { - "latitude": -7.061643372, - "longitude": -35.7669174, - "name": "Alagoa Nova" - }, - "250050": { - "latitude": -6.961968168, - "longitude": -35.52221373, - "name": "Alagoinha" - }, - "250053": { - "latitude": -7.689910352, - "longitude": -36.04671161, - "name": "Alcantil" - }, - "250057": { - "latitude": -6.887931864, - "longitude": -35.97225351, - "name": "Algodão de Jandaíra" - }, - "250060": { - "latitude": -7.348619714, - "longitude": -34.93332316, - "name": "Alhandra" - }, - "250070": { - "latitude": -6.732738515, - "longitude": -38.41784944, - "name": "São João do Rio do Peixe" - }, - "250073": { - "latitude": -7.56065008, - "longitude": -37.03935555, - "name": "Amparo" - }, - "250077": { - "latitude": -6.789340183, - "longitude": -38.06795564, - "name": "Aparecida" - }, - "250080": { - "latitude": -6.861220926, - "longitude": -35.35445823, - "name": "Araçagi" - }, - "250090": { - "latitude": -6.858067694, - "longitude": -35.73129771, - "name": "Arara" - }, - "250100": { - "latitude": -6.524236201, - "longitude": -35.7550639, - "name": "Araruna" - }, - "250110": { - "latitude": -6.950344409, - "longitude": -35.70535992, - "name": "Areia" - }, - "250115": { - "latitude": -7.111875413, - "longitude": -36.96187546, - "name": "Areia de Baraúnas" - }, - "250120": { - "latitude": -7.049226586, - "longitude": -35.93148018, - "name": "Areial" - }, - "250130": { - "latitude": -7.535584229, - "longitude": -35.69092637, - "name": "Aroeiras" - }, - "250135": { - "latitude": -7.07361146, - "longitude": -36.71028397, - "name": "Assunção" - }, - "250140": { - "latitude": -6.663119841, - "longitude": -34.98879933, - "name": "Baía da Traição" - }, - "250150": { - "latitude": -6.700177006, - "longitude": -35.59626702, - "name": "Bananeiras" - }, - "250153": { - "latitude": -6.620581247, - "longitude": -36.26139826, - "name": "Baraúna" - }, - "250157": { - "latitude": -7.564837062, - "longitude": -35.96606752, - "name": "Barra de Santana" - }, - "250160": { - "latitude": -6.791168924, - "longitude": -36.07601555, - "name": "Barra de Santa Rosa" - }, - "250170": { - "latitude": -7.700355934, - "longitude": -36.28657437, - "name": "Barra de São Miguel" - }, - "250180": { - "latitude": -7.131734548, - "longitude": -34.92194664, - "name": "Bayeux" - }, - "250190": { - "latitude": -6.705303333, - "longitude": -35.4982338, - "name": "Belém" - }, - "250200": { - "latitude": -6.148981294, - "longitude": -37.36591731, - "name": "Belém do Brejo do Cruz" - }, - "250205": { - "latitude": -6.481063847, - "longitude": -38.5557676, - "name": "Bernardino Batista" - }, - "250210": { - "latitude": -7.431062613, - "longitude": -38.18828267, - "name": "Boa Ventura" - }, - "250215": { - "latitude": -7.271665015, - "longitude": -36.21868141, - "name": "Boa Vista" - }, - "250220": { - "latitude": -6.822779476, - "longitude": -38.63020674, - "name": "Bom Jesus" - }, - "250230": { - "latitude": -6.474820967, - "longitude": -37.94778522, - "name": "Bom Sucesso" - }, - "250240": { - "latitude": -7.289281938, - "longitude": -38.47818971, - "name": "Bonito de Santa Fé" - }, - "250250": { - "latitude": -7.506596296, - "longitude": -36.14987405, - "name": "Boqueirão" - }, - "250260": { - "latitude": -7.155206978, - "longitude": -38.12457511, - "name": "Igaracy" - }, - "250270": { - "latitude": -6.794074483, - "longitude": -35.60123386, - "name": "Borborema" - }, - "250280": { - "latitude": -6.329716141, - "longitude": -37.49700409, - "name": "Brejo do Cruz" - }, - "250290": { - "latitude": -6.398442119, - "longitude": -37.84655476, - "name": "Brejo dos Santos" - }, - "250300": { - "latitude": -7.486769261, - "longitude": -34.9189397, - "name": "Caaporã" - }, - "250310": { - "latitude": -7.451007364, - "longitude": -36.2988961, - "name": "Cabaceiras" - }, - "250320": { - "latitude": -7.035913969, - "longitude": -34.84502992, - "name": "Cabedelo" - }, - "250330": { - "latitude": -6.946006404, - "longitude": -38.69565278, - "name": "Cachoeira dos Índios" - }, - "250340": { - "latitude": -7.138734206, - "longitude": -37.17362144, - "name": "Cacimba de Areia" - }, - "250350": { - "latitude": -6.624581774, - "longitude": -35.81368324, - "name": "Cacimba de Dentro" - }, - "250355": { - "latitude": -7.209450797, - "longitude": -37.09041095, - "name": "Cacimbas" - }, - "250360": { - "latitude": -6.606275566, - "longitude": -35.41172487, - "name": "Caiçara" - }, - "250370": { - "latitude": -6.919851657, - "longitude": -38.54098917, - "name": "Cajazeiras" - }, - "250375": { - "latitude": -6.95897661, - "longitude": -37.80341695, - "name": "Cajazeirinhas" - }, - "250380": { - "latitude": -7.121062796, - "longitude": -35.33921975, - "name": "Caldas Brandão" - }, - "250390": { - "latitude": -7.899845339, - "longitude": -36.79717024, - "name": "Camalaú" - }, - "250400": { - "latitude": -7.263553431, - "longitude": -35.96565887, - "name": "Campina Grande" - }, - "250403": { - "latitude": -6.900766495, - "longitude": -35.16865014, - "name": "Capim" - }, - "250407": { - "latitude": -7.774098303, - "longitude": -36.50248321, - "name": "Caraúbas" - }, - "250410": { - "latitude": -7.044461345, - "longitude": -38.33753939, - "name": "Carrapateira" - }, - "250415": { - "latitude": -6.755035068, - "longitude": -35.8431727, - "name": "Casserengue" - }, - "250420": { - "latitude": -7.138490066, - "longitude": -37.59077297, - "name": "Catingueira" - }, - "250430": { - "latitude": -6.321104291, - "longitude": -37.70446933, - "name": "Catolé do Rocha" - }, - "250435": { - "latitude": -7.415963683, - "longitude": -36.05770232, - "name": "Caturité" - }, - "250440": { - "latitude": -7.503763284, - "longitude": -38.52832057, - "name": "Conceição" - }, - "250450": { - "latitude": -6.904953869, - "longitude": -37.61546719, - "name": "Condado" - }, - "250460": { - "latitude": -7.282026344, - "longitude": -34.86065682, - "name": "Conde" - }, - "250470": { - "latitude": -7.795037497, - "longitude": -36.64653182, - "name": "Congo" - }, - "250480": { - "latitude": -7.050476335, - "longitude": -37.97530737, - "name": "Coremas" - }, - "250485": { - "latitude": -7.645249922, - "longitude": -36.63416314, - "name": "Coxixola" - }, - "250490": { - "latitude": -7.148971061, - "longitude": -35.10274801, - "name": "Cruz do Espírito Santo" - }, - "250500": { - "latitude": -6.860507642, - "longitude": -36.32665813, - "name": "Cubati" - }, - "250510": { - "latitude": -6.548612996, - "longitude": -36.07830582, - "name": "Cuité" - }, - "250520": { - "latitude": -6.89919121, - "longitude": -35.52280727, - "name": "Cuitegi" - }, - "250523": { - "latitude": -6.905991373, - "longitude": -35.25207676, - "name": "Cuité de Mamanguape" - }, - "250527": { - "latitude": -6.733838081, - "longitude": -35.28474586, - "name": "Curral de Cima" - }, - "250530": { - "latitude": -7.537773664, - "longitude": -38.16792359, - "name": "Curral Velho" - }, - "250535": { - "latitude": -6.643331996, - "longitude": -35.93008684, - "name": "Damião" - }, - "250540": { - "latitude": -7.300092199, - "longitude": -37.09289849, - "name": "Desterro" - }, - "250550": { - "latitude": -6.757044452, - "longitude": -37.57546482, - "name": "Vista Serrana" - }, - "250560": { - "latitude": -7.423745042, - "longitude": -38.31554237, - "name": "Diamante" - }, - "250570": { - "latitude": -6.609426223, - "longitude": -35.64825074, - "name": "Dona Inês" - }, - "250580": { - "latitude": -6.720807549, - "longitude": -35.39561177, - "name": "Duas Estradas" - }, - "250590": { - "latitude": -7.086601521, - "longitude": -37.7450448, - "name": "Emas" - }, - "250600": { - "latitude": -6.998173965, - "longitude": -35.89031755, - "name": "Esperança" - }, - "250610": { - "latitude": -7.391235825, - "longitude": -35.78007091, - "name": "Fagundes" - }, - "250620": { - "latitude": -6.414501569, - "longitude": -36.44971344, - "name": "Frei Martinho" - }, - "250625": { - "latitude": -7.589765677, - "longitude": -35.81242029, - "name": "Gado Bravo" - }, - "250630": { - "latitude": -6.877847965, - "longitude": -35.44801522, - "name": "Guarabira" - }, - "250640": { - "latitude": -7.149610112, - "longitude": -35.43589324, - "name": "Gurinhém" - }, - "250650": { - "latitude": -7.261493771, - "longitude": -36.45781304, - "name": "Gurjão" - }, - "250660": { - "latitude": -7.491924652, - "longitude": -38.403903, - "name": "Ibiara" - }, - "250670": { - "latitude": -7.370861411, - "longitude": -37.55816474, - "name": "Imaculada" - }, - "250680": { - "latitude": -7.278502004, - "longitude": -35.62106389, - "name": "Ingá" - }, - "250690": { - "latitude": -7.348409875, - "longitude": -35.35426731, - "name": "Itabaiana" - }, - "250700": { - "latitude": -7.286483552, - "longitude": -38.18641932, - "name": "Itaporanga" - }, - "250710": { - "latitude": -6.810156153, - "longitude": -35.25711162, - "name": "Itapororoca" - }, - "250720": { - "latitude": -7.405064552, - "longitude": -35.64713996, - "name": "Itatuba" - }, - "250730": { - "latitude": -6.595755052, - "longitude": -35.26828059, - "name": "Jacaraú" - }, - "250740": { - "latitude": -6.508703411, - "longitude": -37.81721504, - "name": "Jericó" - }, - "250750": { - "latitude": -7.165465402, - "longitude": -34.86953143, - "name": "João Pessoa" - }, - "250760": { - "latitude": -7.159223572, - "longitude": -35.57058781, - "name": "Juarez Távora" - }, - "250770": { - "latitude": -7.054930278, - "longitude": -36.55847271, - "name": "Juazeirinho" - }, - "250780": { - "latitude": -6.991289383, - "longitude": -36.77447681, - "name": "Junco do Seridó" - }, - "250790": { - "latitude": -7.355000237, - "longitude": -35.21364568, - "name": "Juripiranga" - }, - "250800": { - "latitude": -7.501794056, - "longitude": -37.80316519, - "name": "Juru" - }, - "250810": { - "latitude": -6.587554638, - "longitude": -37.8881646, - "name": "Lagoa" - }, - "250820": { - "latitude": -6.678903774, - "longitude": -35.36130508, - "name": "Lagoa de Dentro" - }, - "250830": { - "latitude": -7.146247068, - "longitude": -35.86632472, - "name": "Lagoa Seca" - }, - "250840": { - "latitude": -6.552575475, - "longitude": -38.18004752, - "name": "Lastro" - }, - "250850": { - "latitude": -7.340579136, - "longitude": -36.93103909, - "name": "Livramento" - }, - "250855": { - "latitude": -6.554377978, - "longitude": -35.42724897, - "name": "Logradouro" - }, - "250860": { - "latitude": -6.918883187, - "longitude": -34.91224272, - "name": "Lucena" - }, - "250870": { - "latitude": -7.248132974, - "longitude": -37.43989651, - "name": "Mãe d'Água" - }, - "250880": { - "latitude": -6.883698075, - "longitude": -37.53010284, - "name": "Malta" - }, - "250890": { - "latitude": -6.720742615, - "longitude": -35.15589098, - "name": "Mamanguape" - }, - "250900": { - "latitude": -7.724913274, - "longitude": -38.20484992, - "name": "Manaíra" - }, - "250905": { - "latitude": -6.747510333, - "longitude": -35.00564831, - "name": "Marcação" - }, - "250910": { - "latitude": -7.037548774, - "longitude": -35.30589146, - "name": "Mari" - }, - "250915": { - "latitude": -6.821596981, - "longitude": -38.33666895, - "name": "Marizópolis" - }, - "250920": { - "latitude": -7.20075848, - "longitude": -35.75596296, - "name": "Massaranduba" - }, - "250930": { - "latitude": -6.556319957, - "longitude": -35.04392104, - "name": "Mataraca" - }, - "250933": { - "latitude": -7.118376721, - "longitude": -35.77167746, - "name": "Matinhas" - }, - "250937": { - "latitude": -6.548059775, - "longitude": -37.73730085, - "name": "Mato Grosso" - }, - "250939": { - "latitude": -7.2843005, - "longitude": -37.3587974, - "name": "Maturéia" - }, - "250940": { - "latitude": -7.294807879, - "longitude": -35.49706565, - "name": "Mogeiro" - }, - "250950": { - "latitude": -7.090295604, - "longitude": -35.94345917, - "name": "Montadas" - }, - "250960": { - "latitude": -7.206276033, - "longitude": -38.53767191, - "name": "Monte Horebe" - }, - "250970": { - "latitude": -7.907756893, - "longitude": -37.09171628, - "name": "Monteiro" - }, - "250980": { - "latitude": -6.9994351, - "longitude": -35.42087556, - "name": "Mulungu" - }, - "250990": { - "latitude": -7.560172, - "longitude": -35.56293926, - "name": "Natuba" - }, - "251000": { - "latitude": -6.95097582, - "longitude": -38.32664445, - "name": "Nazarezinho" - }, - "251010": { - "latitude": -6.476428347, - "longitude": -36.20623796, - "name": "Nova Floresta" - }, - "251020": { - "latitude": -7.473533915, - "longitude": -38.01845655, - "name": "Nova Olinda" - }, - "251030": { - "latitude": -6.676194693, - "longitude": -36.42642161, - "name": "Nova Palmeira" - }, - "251040": { - "latitude": -7.284425012, - "longitude": -37.75398625, - "name": "Olho d'Água" - }, - "251050": { - "latitude": -6.977120732, - "longitude": -36.24907529, - "name": "Olivedos" - }, - "251060": { - "latitude": -7.609807269, - "longitude": -37.1380746, - "name": "Ouro Velho" - }, - "251065": { - "latitude": -7.32725492, - "longitude": -36.66883362, - "name": "Parari" - }, - "251070": { - "latitude": -7.118260613, - "longitude": -37.04124752, - "name": "Passagem" - }, - "251080": { - "latitude": -6.995486041, - "longitude": -37.31688882, - "name": "Patos" - }, - "251090": { - "latitude": -6.626993834, - "longitude": -37.60884339, - "name": "Paulista" - }, - "251100": { - "latitude": -7.458595338, - "longitude": -38.0808111, - "name": "Pedra Branca" - }, - "251110": { - "latitude": -6.772900436, - "longitude": -36.38790421, - "name": "Pedra Lavrada" - }, - "251120": { - "latitude": -7.336155078, - "longitude": -35.07455104, - "name": "Pedras de Fogo" - }, - "251130": { - "latitude": -7.201296641, - "longitude": -37.94218782, - "name": "Piancó" - }, - "251140": { - "latitude": -6.493063738, - "longitude": -36.33707133, - "name": "Picuí" - }, - "251150": { - "latitude": -7.278912405, - "longitude": -35.2666822, - "name": "Pilar" - }, - "251160": { - "latitude": -6.883192199, - "longitude": -35.60840828, - "name": "Pilões" - }, - "251170": { - "latitude": -6.846176774, - "longitude": -35.54896966, - "name": "Pilõezinhos" - }, - "251180": { - "latitude": -6.790742802, - "longitude": -35.49588025, - "name": "Pirpirituba" - }, - "251190": { - "latitude": -7.430893671, - "longitude": -34.84176281, - "name": "Pitimbu" - }, - "251200": { - "latitude": -7.062660205, - "longitude": -36.09365795, - "name": "Pocinhos" - }, - "251203": { - "latitude": -6.389743895, - "longitude": -38.51985162, - "name": "Poço Dantas" - }, - "251207": { - "latitude": -6.593667948, - "longitude": -38.49893756, - "name": "Poço de José de Moura" - }, - "251210": { - "latitude": -6.772539542, - "longitude": -37.85094173, - "name": "Pombal" - }, - "251220": { - "latitude": -7.69472719, - "longitude": -37.08579213, - "name": "Prata" - }, - "251230": { - "latitude": -7.65373143, - "longitude": -38.00498681, - "name": "Princesa Isabel" - }, - "251240": { - "latitude": -7.148750188, - "longitude": -35.96163998, - "name": "Puxinanã" - }, - "251250": { - "latitude": -7.399421312, - "longitude": -35.91370272, - "name": "Queimadas" - }, - "251260": { - "latitude": -7.040681621, - "longitude": -37.13550479, - "name": "Quixaba" - }, - "251270": { - "latitude": -6.9268421, - "longitude": -35.84880129, - "name": "Remígio" - }, - "251272": { - "latitude": -6.668127934, - "longitude": -35.29109651, - "name": "Pedro Régis" - }, - "251274": { - "latitude": -6.541761225, - "longitude": -35.64742472, - "name": "Riachão" - }, - "251275": { - "latitude": -7.239640699, - "longitude": -35.669232, - "name": "Riachão do Bacamarte" - }, - "251276": { - "latitude": -7.154948405, - "longitude": -35.28987278, - "name": "Riachão do Poço" - }, - "251278": { - "latitude": -7.682907518, - "longitude": -36.13775311, - "name": "Riacho de Santo Antônio" - }, - "251280": { - "latitude": -6.478190633, - "longitude": -37.6355123, - "name": "Riacho dos Cavalos" - }, - "251290": { - "latitude": -6.796876391, - "longitude": -35.0361412, - "name": "Rio Tinto" - }, - "251300": { - "latitude": -7.098730421, - "longitude": -36.84213787, - "name": "Salgadinho" - }, - "251310": { - "latitude": -7.41472751, - "longitude": -35.46359685, - "name": "Salgado de São Félix" - }, - "251315": { - "latitude": -7.728940448, - "longitude": -35.92154827, - "name": "Santa Cecília" - }, - "251320": { - "latitude": -6.548844237, - "longitude": -38.05281505, - "name": "Santa Cruz" - }, - "251330": { - "latitude": -6.730481306, - "longitude": -38.58411921, - "name": "Santa Helena" - }, - "251335": { - "latitude": -7.66637177, - "longitude": -38.57737456, - "name": "Santa Inês" - }, - "251340": { - "latitude": -6.917185332, - "longitude": -36.90652666, - "name": "Santa Luzia" - }, - "251350": { - "latitude": -7.62820521, - "longitude": -38.33098296, - "name": "Santana de Mangueira" - }, - "251360": { - "latitude": -7.387851622, - "longitude": -37.96004982, - "name": "Santana dos Garrotes" - }, - "251365": { - "latitude": -6.477103342, - "longitude": -38.48093825, - "name": "Joca Claudino" - }, - "251370": { - "latitude": -7.067297613, - "longitude": -35.00006839, - "name": "Santa Rita" - }, - "251380": { - "latitude": -7.091142055, - "longitude": -37.44539105, - "name": "Santa Teresinha" - }, - "251385": { - "latitude": -7.221077232, - "longitude": -36.61465698, - "name": "Santo André" - }, - "251390": { - "latitude": -6.458873924, - "longitude": -37.47132235, - "name": "São Bento" - }, - "251392": { - "latitude": -6.873778709, - "longitude": -37.70717495, - "name": "São Bentinho" - }, - "251394": { - "latitude": -7.588135787, - "longitude": -36.40479997, - "name": "São Domingos do Cariri" - }, - "251396": { - "latitude": -6.803967071, - "longitude": -37.95077327, - "name": "São Domingos" - }, - "251398": { - "latitude": -6.635169985, - "longitude": -38.05966074, - "name": "São Francisco" - }, - "251400": { - "latitude": -7.451276977, - "longitude": -36.49404331, - "name": "São João do Cariri" - }, - "251410": { - "latitude": -8.088917657, - "longitude": -36.78743882, - "name": "São João do Tigre" - }, - "251420": { - "latitude": -6.941339196, - "longitude": -38.13958073, - "name": "São José da Lagoa Tapada" - }, - "251430": { - "latitude": -7.26056797, - "longitude": -38.32662248, - "name": "São José de Caiana" - }, - "251440": { - "latitude": -6.813827258, - "longitude": -37.37977224, - "name": "São José de Espinharas" - }, - "251445": { - "latitude": -7.241891209, - "longitude": -35.34637761, - "name": "São José dos Ramos" - }, - "251450": { - "latitude": -7.100730983, - "longitude": -38.49210439, - "name": "São José de Piranhas" - }, - "251455": { - "latitude": -7.702546875, - "longitude": -38.09636034, - "name": "São José de Princesa" - }, - "251460": { - "latitude": -7.14926663, - "longitude": -37.30087187, - "name": "São José do Bonfim" - }, - "251465": { - "latitude": -6.235422131, - "longitude": -37.35814824, - "name": "São José do Brejo do Cruz" - }, - "251470": { - "latitude": -6.817189203, - "longitude": -36.82344868, - "name": "São José do Sabugi" - }, - "251480": { - "latitude": -7.429061562, - "longitude": -36.8624099, - "name": "São José dos Cordeiros" - }, - "251490": { - "latitude": -6.927676851, - "longitude": -37.08481526, - "name": "São Mamede" - }, - "251500": { - "latitude": -7.240667049, - "longitude": -35.19875179, - "name": "São Miguel de Taipu" - }, - "251510": { - "latitude": -7.089178171, - "longitude": -35.85393525, - "name": "São Sebastião de Lagoa de Roça" - }, - "251520": { - "latitude": -8.158186304, - "longitude": -37.01500277, - "name": "São Sebastião do Umbuzeiro" - }, - "251530": { - "latitude": -7.055393502, - "longitude": -35.19712848, - "name": "Sapé" - }, - "251540": { - "latitude": -6.909000407, - "longitude": -36.45033787, - "name": "São Vicente do Seridó" - }, - "251550": { - "latitude": -7.535296587, - "longitude": -36.70789195, - "name": "Serra Branca" - }, - "251560": { - "latitude": -6.705197573, - "longitude": -35.45281431, - "name": "Serra da Raiz" - }, - "251570": { - "latitude": -7.229240475, - "longitude": -38.37950986, - "name": "Serra Grande" - }, - "251580": { - "latitude": -7.171541675, - "longitude": -35.66326918, - "name": "Serra Redonda" - }, - "251590": { - "latitude": -6.833174543, - "longitude": -35.64414332, - "name": "Serraria" - }, - "251593": { - "latitude": -6.742393087, - "longitude": -35.42141647, - "name": "Sertãozinho" - }, - "251597": { - "latitude": -7.17979935, - "longitude": -35.25598651, - "name": "Sobrado" - }, - "251600": { - "latitude": -6.752228208, - "longitude": -35.7248723, - "name": "Solânea" - }, - "251610": { - "latitude": -7.100386024, - "longitude": -36.37060088, - "name": "Soledade" - }, - "251615": { - "latitude": -6.723735339, - "longitude": -36.20991401, - "name": "Sossêgo" - }, - "251620": { - "latitude": -6.739736341, - "longitude": -38.22521643, - "name": "Sousa" - }, - "251630": { - "latitude": -7.67837288, - "longitude": -36.90061814, - "name": "Sumé" - }, - "251640": { - "latitude": -6.537822732, - "longitude": -35.51822727, - "name": "Tacima" - }, - "251650": { - "latitude": -7.220844639, - "longitude": -36.8307005, - "name": "Taperoá" - }, - "251660": { - "latitude": -7.59982913, - "longitude": -37.89210225, - "name": "Tavares" - }, - "251670": { - "latitude": -7.245538809, - "longitude": -37.24032453, - "name": "Teixeira" - }, - "251675": { - "latitude": -6.961254999, - "longitude": -36.6264828, - "name": "Tenório" - }, - "251680": { - "latitude": -6.605603403, - "longitude": -38.57225929, - "name": "Triunfo" - }, - "251690": { - "latitude": -6.510847096, - "longitude": -38.39163785, - "name": "Uiraúna" - }, - "251700": { - "latitude": -7.680852634, - "longitude": -35.73783554, - "name": "Umbuzeiro" - }, - "251710": { - "latitude": -6.788524915, - "longitude": -37.03142196, - "name": "Várzea" - }, - "251720": { - "latitude": -6.560229762, - "longitude": -38.26823581, - "name": "Vieirópolis" - }, - "251740": { - "latitude": -8.07661145, - "longitude": -37.09625181, - "name": "Zabelê" - }, - "260005": { - "latitude": -7.879660791, - "longitude": -35.01914463, - "name": "Abreu e Lima" - }, - "260010": { - "latitude": -7.737103509, - "longitude": -37.6200038, - "name": "Afogados da Ingazeira" - }, - "260020": { - "latitude": -8.618929099, - "longitude": -41.0053953, - "name": "Afrânio" - }, - "260030": { - "latitude": -8.456613768, - "longitude": -35.94524501, - "name": "Agrestina" - }, - "260040": { - "latitude": -8.728814426, - "longitude": -35.48177607, - "name": "Água Preta" - }, - "260050": { - "latitude": -9.087044538, - "longitude": -37.03864805, - "name": "Águas Belas" - }, - "260060": { - "latitude": -8.493978319, - "longitude": -36.75542978, - "name": "Alagoinha" - }, - "260070": { - "latitude": -7.602575947, - "longitude": -35.19303895, - "name": "Aliança" - }, - "260080": { - "latitude": -8.490502613, - "longitude": -36.09897157, - "name": "Altinho" - }, - "260090": { - "latitude": -8.365380154, - "longitude": -35.46573675, - "name": "Amaraji" - }, - "260100": { - "latitude": -8.891541851, - "longitude": -36.27674373, - "name": "Angelim" - }, - "260105": { - "latitude": -7.79323413, - "longitude": -35.07612419, - "name": "Araçoiaba" - }, - "260110": { - "latitude": -7.60794842, - "longitude": -40.4848041, - "name": "Araripina" - }, - "260120": { - "latitude": -8.384842217, - "longitude": -37.01033093, - "name": "Arcoverde" - }, - "260130": { - "latitude": -8.416389471, - "longitude": -35.63206143, - "name": "Barra de Guabiraba" - }, - "260140": { - "latitude": -8.820186158, - "longitude": -35.25859969, - "name": "Barreiros" - }, - "260150": { - "latitude": -8.605059349, - "longitude": -35.81505948, - "name": "Belém de Maria" - }, - "260160": { - "latitude": -8.583564105, - "longitude": -38.98193985, - "name": "Belém do São Francisco" - }, - "260170": { - "latitude": -8.258927993, - "longitude": -36.4051833, - "name": "Belo Jardim" - }, - "260180": { - "latitude": -8.265292407, - "longitude": -37.98765295, - "name": "Betânia" - }, - "260190": { - "latitude": -8.218033238, - "longitude": -35.78215414, - "name": "Bezerros" - }, - "260200": { - "latitude": -7.656367911, - "longitude": -39.96512485, - "name": "Bodocó" - }, - "260210": { - "latitude": -9.202697516, - "longitude": -36.68403806, - "name": "Bom Conselho" - }, - "260220": { - "latitude": -7.786781539, - "longitude": -35.58852037, - "name": "Bom Jardim" - }, - "260230": { - "latitude": -8.495485222, - "longitude": -35.70752214, - "name": "Bonito" - }, - "260240": { - "latitude": -9.026748182, - "longitude": -36.52986983, - "name": "Brejão" - }, - "260250": { - "latitude": -7.33655481, - "longitude": -37.32074716, - "name": "Brejinho" - }, - "260260": { - "latitude": -8.075643258, - "longitude": -36.28141295, - "name": "Brejo da Madre de Deus" - }, - "260270": { - "latitude": -7.737919264, - "longitude": -35.34723933, - "name": "Buenos Aires" - }, - "260280": { - "latitude": -8.649040299, - "longitude": -37.12086886, - "name": "Buíque" - }, - "260290": { - "latitude": -8.269227976, - "longitude": -35.08590676, - "name": "Cabo de Santo Agostinho" - }, - "260300": { - "latitude": -8.386470359, - "longitude": -39.32942805, - "name": "Cabrobó" - }, - "260310": { - "latitude": -8.48492815, - "longitude": -36.2909447, - "name": "Cachoeirinha" - }, - "260320": { - "latitude": -8.80395078, - "longitude": -36.65918714, - "name": "Caetés" - }, - "260330": { - "latitude": -8.750575446, - "longitude": -36.32175397, - "name": "Calçado" - }, - "260340": { - "latitude": -8.003915855, - "longitude": -38.07868287, - "name": "Calumbi" - }, - "260345": { - "latitude": -7.986775522, - "longitude": -34.99581178, - "name": "Camaragibe" - }, - "260350": { - "latitude": -8.349985837, - "longitude": -35.77207018, - "name": "Camocim de São Félix" - }, - "260360": { - "latitude": -7.433911062, - "longitude": -35.29918672, - "name": "Camutanga" - }, - "260370": { - "latitude": -8.893225855, - "longitude": -36.17690414, - "name": "Canhotinho" - }, - "260380": { - "latitude": -8.687048527, - "longitude": -36.59906361, - "name": "Capoeiras" - }, - "260390": { - "latitude": -7.796230227, - "longitude": -37.72716028, - "name": "Carnaíba" - }, - "260392": { - "latitude": -8.409193736, - "longitude": -38.7215319, - "name": "Carnaubeira da Penha" - }, - "260400": { - "latitude": -7.819468556, - "longitude": -35.30591607, - "name": "Carpina" - }, - "260410": { - "latitude": -8.18052296, - "longitude": -36.01663484, - "name": "Caruaru" - }, - "260415": { - "latitude": -7.756380606, - "longitude": -35.72138272, - "name": "Casinhas" - }, - "260420": { - "latitude": -8.675857876, - "longitude": -35.73048093, - "name": "Catende" - }, - "260430": { - "latitude": -7.743823255, - "longitude": -39.20373798, - "name": "Cedro" - }, - "260440": { - "latitude": -7.999041325, - "longitude": -35.22208743, - "name": "Chã de Alegria" - }, - "260450": { - "latitude": -8.229523354, - "longitude": -35.47397906, - "name": "Chã Grande" - }, - "260460": { - "latitude": -7.596312954, - "longitude": -35.09867744, - "name": "Condado" - }, - "260470": { - "latitude": -9.114711895, - "longitude": -36.33867926, - "name": "Correntes" - }, - "260480": { - "latitude": -8.433013942, - "longitude": -35.53075966, - "name": "Cortês" - }, - "260490": { - "latitude": -8.03995267, - "longitude": -35.72077208, - "name": "Cumaru" - }, - "260500": { - "latitude": -8.58301017, - "longitude": -35.93137602, - "name": "Cupira" - }, - "260510": { - "latitude": -8.17384218, - "longitude": -37.68155456, - "name": "Custódia" - }, - "260515": { - "latitude": -8.496155344, - "longitude": -40.62007263, - "name": "Dormentes" - }, - "260520": { - "latitude": -8.369817286, - "longitude": -35.26450188, - "name": "Escada" - }, - "260530": { - "latitude": -7.516023, - "longitude": -39.74823186, - "name": "Exu" - }, - "260540": { - "latitude": -7.952893393, - "longitude": -35.38324072, - "name": "Feira Nova" - }, - "260545": { - "latitude": -3.856971142, - "longitude": -32.42652468, - "name": "Fernando de Noronha" - }, - "260550": { - "latitude": -7.478456677, - "longitude": -35.24458837, - "name": "Ferreiros" - }, - "260560": { - "latitude": -7.939923176, - "longitude": -37.89476409, - "name": "Flores" - }, - "260570": { - "latitude": -8.566579336, - "longitude": -38.30582209, - "name": "Floresta" - }, - "260580": { - "latitude": -7.935086561, - "longitude": -35.88499625, - "name": "Frei Miguelinho" - }, - "260590": { - "latitude": -8.612930371, - "longitude": -35.39260892, - "name": "Gameleira" - }, - "260600": { - "latitude": -8.929088285, - "longitude": -36.50113558, - "name": "Garanhuns" - }, - "260610": { - "latitude": -8.012522663, - "longitude": -35.3384146, - "name": "Glória do Goitá" - }, - "260620": { - "latitude": -7.596875765, - "longitude": -34.94249516, - "name": "Goiana" - }, - "260630": { - "latitude": -7.788463617, - "longitude": -39.6943375, - "name": "Granito" - }, - "260640": { - "latitude": -8.198351714, - "longitude": -35.56355045, - "name": "Gravatá" - }, - "260650": { - "latitude": -9.143470859, - "longitude": -36.90105653, - "name": "Iati" - }, - "260660": { - "latitude": -8.592468496, - "longitude": -37.60784979, - "name": "Ibimirim" - }, - "260670": { - "latitude": -8.613398171, - "longitude": -36.20142021, - "name": "Ibirajuba" - }, - "260680": { - "latitude": -7.817509646, - "longitude": -34.9603202, - "name": "Igarassu" - }, - "260690": { - "latitude": -7.845560777, - "longitude": -37.4031371, - "name": "Iguaracy" - }, - "260700": { - "latitude": -8.808238821, - "longitude": -37.84643741, - "name": "Inajá" - }, - "260710": { - "latitude": -7.713886859, - "longitude": -37.41613652, - "name": "Ingazeira" - }, - "260720": { - "latitude": -8.437349609, - "longitude": -35.08931898, - "name": "Ipojuca" - }, - "260730": { - "latitude": -7.49786027, - "longitude": -40.21739762, - "name": "Ipubi" - }, - "260740": { - "latitude": -8.749276949, - "longitude": -38.72856272, - "name": "Itacuruba" - }, - "260750": { - "latitude": -8.984327688, - "longitude": -37.29581859, - "name": "Itaíba" - }, - "260760": { - "latitude": -7.759529583, - "longitude": -34.85441639, - "name": "Ilha de Itamaracá" - }, - "260765": { - "latitude": -7.449903329, - "longitude": -35.13426654, - "name": "Itambé" - }, - "260770": { - "latitude": -7.397544476, - "longitude": -37.1432364, - "name": "Itapetim" - }, - "260775": { - "latitude": -7.745149803, - "longitude": -34.90679815, - "name": "Itapissuma" - }, - "260780": { - "latitude": -7.686384287, - "longitude": -35.03256148, - "name": "Itaquitinga" - }, - "260790": { - "latitude": -8.152158991, - "longitude": -35.00334988, - "name": "Jaboatão dos Guararapes" - }, - "260795": { - "latitude": -8.743310254, - "longitude": -35.80782903, - "name": "Jaqueira" - }, - "260800": { - "latitude": -8.055209105, - "longitude": -36.53386304, - "name": "Jataúba" - }, - "260805": { - "latitude": -9.207754881, - "longitude": -38.21378818, - "name": "Jatobá" - }, - "260810": { - "latitude": -7.860986487, - "longitude": -35.59238521, - "name": "João Alfredo" - }, - "260820": { - "latitude": -8.561888681, - "longitude": -35.54446074, - "name": "Joaquim Nabuco" - }, - "260825": { - "latitude": -8.744066623, - "longitude": -36.45955668, - "name": "Jucati" - }, - "260830": { - "latitude": -8.715471625, - "longitude": -36.39397032, - "name": "Jupi" - }, - "260840": { - "latitude": -8.755428686, - "longitude": -36.14274668, - "name": "Jurema" - }, - "260845": { - "latitude": -7.85258845, - "longitude": -35.33672416, - "name": "Lagoa do Carro" - }, - "260850": { - "latitude": -7.909240936, - "longitude": -35.29484428, - "name": "Lagoa de Itaenga" - }, - "260860": { - "latitude": -9.162191791, - "longitude": -36.46516169, - "name": "Lagoa do Ouro" - }, - "260870": { - "latitude": -8.682365727, - "longitude": -35.89558359, - "name": "Lagoa dos Gatos" - }, - "260875": { - "latitude": -8.777204707, - "longitude": -40.22303087, - "name": "Lagoa Grande" - }, - "260880": { - "latitude": -8.677954099, - "longitude": -36.28629394, - "name": "Lajedo" - }, - "260890": { - "latitude": -7.847740358, - "longitude": -35.44786991, - "name": "Limoeiro" - }, - "260900": { - "latitude": -7.527665458, - "longitude": -35.45021055, - "name": "Macaparana" - }, - "260910": { - "latitude": -7.704600929, - "longitude": -35.5002633, - "name": "Machados" - }, - "260915": { - "latitude": -8.892923572, - "longitude": -37.55422327, - "name": "Manari" - }, - "260920": { - "latitude": -8.834209065, - "longitude": -35.76171056, - "name": "Maraial" - }, - "260930": { - "latitude": -8.157508353, - "longitude": -38.73606325, - "name": "Mirandiba" - }, - "260940": { - "latitude": -8.143838058, - "longitude": -35.14690589, - "name": "Moreno" - }, - "260950": { - "latitude": -7.737195643, - "longitude": -35.2331686, - "name": "Nazaré da Mata" - }, - "260960": { - "latitude": -7.993100441, - "longitude": -34.86636518, - "name": "Olinda" - }, - "260970": { - "latitude": -7.705821619, - "longitude": -35.59859946, - "name": "Orobó" - }, - "260980": { - "latitude": -8.472115126, - "longitude": -39.59107318, - "name": "Orocó" - }, - "260990": { - "latitude": -7.965979233, - "longitude": -40.16447098, - "name": "Ouricuri" - }, - "261000": { - "latitude": -8.656562864, - "longitude": -35.62994562, - "name": "Palmares" - }, - "261010": { - "latitude": -9.01141337, - "longitude": -36.27785215, - "name": "Palmeirina" - }, - "261020": { - "latitude": -8.665102276, - "longitude": -36.04914116, - "name": "Panelas" - }, - "261030": { - "latitude": -8.893941481, - "longitude": -36.70711207, - "name": "Paranatama" - }, - "261040": { - "latitude": -8.160028907, - "longitude": -39.7700263, - "name": "Parnamirim" - }, - "261050": { - "latitude": -8.012385952, - "longitude": -35.54646068, - "name": "Passira" - }, - "261060": { - "latitude": -7.905582823, - "longitude": -35.15507241, - "name": "Paudalho" - }, - "261070": { - "latitude": -7.928155126, - "longitude": -34.8834102, - "name": "Paulista" - }, - "261080": { - "latitude": -8.697386526, - "longitude": -36.89993231, - "name": "Pedra" - }, - "261090": { - "latitude": -8.390752597, - "longitude": -36.7394675, - "name": "Pesqueira" - }, - "261100": { - "latitude": -8.899329825, - "longitude": -38.30789394, - "name": "Petrolândia" - }, - "261110": { - "latitude": -9.019794469, - "longitude": -40.57235906, - "name": "Petrolina" - }, - "261120": { - "latitude": -8.22477333, - "longitude": -36.71171618, - "name": "Poção" - }, - "261130": { - "latitude": -8.18168204, - "longitude": -35.38729534, - "name": "Pombos" - }, - "261140": { - "latitude": -8.326944237, - "longitude": -35.39093518, - "name": "Primavera" - }, - "261150": { - "latitude": -8.836064519, - "longitude": -36.02867956, - "name": "Quipapá" - }, - "261153": { - "latitude": -7.717609896, - "longitude": -37.84907388, - "name": "Quixaba" - }, - "261160": { - "latitude": -8.039344937, - "longitude": -34.93308627, - "name": "Recife" - }, - "261170": { - "latitude": -8.081950815, - "longitude": -35.88289962, - "name": "Riacho das Almas" - }, - "261180": { - "latitude": -8.504610596, - "longitude": -35.3665139, - "name": "Ribeirão" - }, - "261190": { - "latitude": -8.67506896, - "longitude": -35.21815017, - "name": "Rio Formoso" - }, - "261200": { - "latitude": -8.302739443, - "longitude": -35.68447446, - "name": "Sairé" - }, - "261210": { - "latitude": -7.916144946, - "longitude": -35.59381844, - "name": "Salgadinho" - }, - "261220": { - "latitude": -8.129180805, - "longitude": -39.08981493, - "name": "Salgueiro" - }, - "261230": { - "latitude": -8.991600001, - "longitude": -36.73894574, - "name": "Saloá" - }, - "261240": { - "latitude": -8.365310163, - "longitude": -36.54956848, - "name": "Sanharó" - }, - "261245": { - "latitude": -8.291218561, - "longitude": -40.30230352, - "name": "Santa Cruz" - }, - "261247": { - "latitude": -7.849491554, - "longitude": -38.17571193, - "name": "Santa Cruz da Baixa Verde" - }, - "261250": { - "latitude": -7.889567565, - "longitude": -36.3252947, - "name": "Santa Cruz do Capibaribe" - }, - "261255": { - "latitude": -8.223650607, - "longitude": -40.57147768, - "name": "Santa Filomena" - }, - "261260": { - "latitude": -8.629740254, - "longitude": -39.91431785, - "name": "Santa Maria da Boa Vista" - }, - "261270": { - "latitude": -7.824747914, - "longitude": -35.88289695, - "name": "Santa Maria do Cambucá" - }, - "261280": { - "latitude": -7.430442167, - "longitude": -37.4365167, - "name": "Santa Terezinha" - }, - "261290": { - "latitude": -8.809267053, - "longitude": -35.90670754, - "name": "São Benedito do Sul" - }, - "261300": { - "latitude": -8.535920025, - "longitude": -36.45063797, - "name": "São Bento do Una" - }, - "261310": { - "latitude": -8.328833699, - "longitude": -36.14800371, - "name": "São Caitano" - }, - "261320": { - "latitude": -8.879958593, - "longitude": -36.37758276, - "name": "São João" - }, - "261330": { - "latitude": -8.455071703, - "longitude": -35.84273142, - "name": "São Joaquim do Monte" - }, - "261340": { - "latitude": -8.865498534, - "longitude": -35.18518921, - "name": "São José da Coroa Grande" - }, - "261350": { - "latitude": -7.865761522, - "longitude": -38.74566702, - "name": "São José do Belmonte" - }, - "261360": { - "latitude": -7.526018955, - "longitude": -37.27289282, - "name": "São José do Egito" - }, - "261370": { - "latitude": -8.023093629, - "longitude": -35.10408435, - "name": "São Lourenço da Mata" - }, - "261380": { - "latitude": -7.606153309, - "longitude": -35.48995502, - "name": "São Vicente Férrer" - }, - "261390": { - "latitude": -8.036099955, - "longitude": -38.3697281, - "name": "Serra Talhada" - }, - "261400": { - "latitude": -7.850019546, - "longitude": -39.38156934, - "name": "Serrita" - }, - "261410": { - "latitude": -8.210559736, - "longitude": -37.33708244, - "name": "Sertânia" - }, - "261420": { - "latitude": -8.571871871, - "longitude": -35.17216385, - "name": "Sirinhaém" - }, - "261430": { - "latitude": -7.618140826, - "longitude": -39.52255094, - "name": "Moreilândia" - }, - "261440": { - "latitude": -7.584851002, - "longitude": -37.65132911, - "name": "Solidão" - }, - "261450": { - "latitude": -7.891853868, - "longitude": -35.75451481, - "name": "Surubim" - }, - "261460": { - "latitude": -7.577637435, - "longitude": -37.51316021, - "name": "Tabira" - }, - "261470": { - "latitude": -8.347996112, - "longitude": -36.27015716, - "name": "Tacaimbó" - }, - "261480": { - "latitude": -8.956799059, - "longitude": -38.0764915, - "name": "Tacaratu" - }, - "261485": { - "latitude": -8.745744511, - "longitude": -35.23002846, - "name": "Tamandaré" - }, - "261500": { - "latitude": -7.869437856, - "longitude": -36.13045511, - "name": "Taquaritinga do Norte" - }, - "261510": { - "latitude": -9.077555618, - "longitude": -36.63084087, - "name": "Terezinha" - }, - "261520": { - "latitude": -8.157690423, - "longitude": -39.39746218, - "name": "Terra Nova" - }, - "261530": { - "latitude": -7.534549843, - "longitude": -35.34153933, - "name": "Timbaúba" - }, - "261540": { - "latitude": -7.999021594, - "longitude": -36.05572539, - "name": "Toritama" - }, - "261550": { - "latitude": -7.759842206, - "longitude": -35.1611121, - "name": "Tracunhaém" - }, - "261560": { - "latitude": -7.727799174, - "longitude": -40.29500469, - "name": "Trindade" - }, - "261570": { - "latitude": -7.849853702, - "longitude": -38.06662863, - "name": "Triunfo" - }, - "261580": { - "latitude": -8.683871998, - "longitude": -37.28027862, - "name": "Tupanatinga" - }, - "261590": { - "latitude": -7.686344149, - "longitude": -37.26339096, - "name": "Tuparetama" - }, - "261600": { - "latitude": -8.615014034, - "longitude": -36.8053194, - "name": "Venturosa" - }, - "261610": { - "latitude": -7.975860462, - "longitude": -38.9890859, - "name": "Verdejante" - }, - "261618": { - "latitude": -7.777649097, - "longitude": -35.81546826, - "name": "Vertente do Lério" - }, - "261620": { - "latitude": -7.890059281, - "longitude": -35.98229928, - "name": "Vertentes" - }, - "261630": { - "latitude": -7.659525992, - "longitude": -35.35722375, - "name": "Vicência" - }, - "261640": { - "latitude": -8.150021346, - "longitude": -35.28763195, - "name": "Vitória de Santo Antão" - }, - "261650": { - "latitude": -8.836205674, - "longitude": -35.65330536, - "name": "Xexéu" - }, - "270010": { - "latitude": -9.266550877, - "longitude": -37.89857807, - "name": "Água Branca" - }, - "270020": { - "latitude": -9.66296831, - "longitude": -36.31351625, - "name": "Anadia" - }, - "270030": { - "latitude": -9.749289103, - "longitude": -36.64100714, - "name": "Arapiraca" - }, - "270040": { - "latitude": -9.504744827, - "longitude": -36.07248763, - "name": "Atalaia" - }, - "270050": { - "latitude": -9.381973755, - "longitude": -35.5646428, - "name": "Barra de Santo Antônio" - }, - "270060": { - "latitude": -9.812369748, - "longitude": -35.94677871, - "name": "Barra de São Miguel" - }, - "270070": { - "latitude": -9.706704001, - "longitude": -37.10089871, - "name": "Batalha" - }, - "270080": { - "latitude": -9.557429322, - "longitude": -36.49177557, - "name": "Belém" - }, - "270090": { - "latitude": -9.817205114, - "longitude": -37.18889043, - "name": "Belo Monte" - }, - "270100": { - "latitude": -9.668907927, - "longitude": -36.17823239, - "name": "Boca da Mata" - }, - "270110": { - "latitude": -9.223020738, - "longitude": -36.04193806, - "name": "Branquinha" - }, - "270120": { - "latitude": -9.446871283, - "longitude": -36.9218127, - "name": "Cacimbinhas" - }, - "270130": { - "latitude": -9.393304673, - "longitude": -36.16021628, - "name": "Cajueiro" - }, - "270135": { - "latitude": -8.893551981, - "longitude": -35.54048927, - "name": "Campestre" - }, - "270140": { - "latitude": -9.814854049, - "longitude": -36.28292735, - "name": "Campo Alegre" - }, - "270150": { - "latitude": -9.967200022, - "longitude": -36.74632622, - "name": "Campo Grande" - }, - "270160": { - "latitude": -9.125406399, - "longitude": -37.5284525, - "name": "Canapi" - }, - "270170": { - "latitude": -9.345912136, - "longitude": -36.09327781, - "name": "Capela" - }, - "270180": { - "latitude": -9.462881377, - "longitude": -37.3680294, - "name": "Carneiros" - }, - "270190": { - "latitude": -9.242403446, - "longitude": -36.28178476, - "name": "Chã Preta" - }, - "270200": { - "latitude": -9.629878623, - "longitude": -36.58223885, - "name": "Coité do Nóia" - }, - "270210": { - "latitude": -8.941846705, - "longitude": -35.76003511, - "name": "Colônia Leopoldina" - }, - "270220": { - "latitude": -9.642261802, - "longitude": -35.80873987, - "name": "Coqueiro Seco" - }, - "270230": { - "latitude": -10.08243035, - "longitude": -36.23060933, - "name": "Coruripe" - }, - "270235": { - "latitude": -9.629529994, - "longitude": -36.78811403, - "name": "Craíbas" - }, - "270240": { - "latitude": -9.397584492, - "longitude": -38.04712398, - "name": "Delmiro Gouveia" - }, - "270250": { - "latitude": -9.383661687, - "longitude": -37.07019281, - "name": "Dois Riachos" - }, - "270255": { - "latitude": -9.393441655, - "longitude": -36.77027273, - "name": "Estrela de Alagoas" - }, - "270260": { - "latitude": -9.889320971, - "longitude": -36.66288859, - "name": "Feira Grande" - }, - "270270": { - "latitude": -10.28333181, - "longitude": -36.33591394, - "name": "Feliz Deserto" - }, - "270280": { - "latitude": -9.245142389, - "longitude": -35.76388723, - "name": "Flexeiras" - }, - "270290": { - "latitude": -9.793317402, - "longitude": -36.85010435, - "name": "Girau do Ponciano" - }, - "270300": { - "latitude": -8.954206348, - "longitude": -35.89616567, - "name": "Ibateguara" - }, - "270310": { - "latitude": -9.543371766, - "longitude": -36.68197892, - "name": "Igaci" - }, - "270320": { - "latitude": -10.13970531, - "longitude": -36.62003826, - "name": "Igreja Nova" - }, - "270330": { - "latitude": -9.271784815, - "longitude": -37.69219494, - "name": "Inhapi" - }, - "270340": { - "latitude": -9.652151386, - "longitude": -37.22799883, - "name": "Jacaré dos Homens" - }, - "270350": { - "latitude": -8.883654247, - "longitude": -35.44713465, - "name": "Jacuípe" - }, - "270360": { - "latitude": -9.083372038, - "longitude": -35.29816848, - "name": "Japaratinga" - }, - "270370": { - "latitude": -9.657897185, - "longitude": -36.99376072, - "name": "Jaramataia" - }, - "270375": { - "latitude": -9.92148073, - "longitude": -36.09725484, - "name": "Jequiá da Praia" - }, - "270380": { - "latitude": -9.079378143, - "longitude": -35.7784439, - "name": "Joaquim Gomes" - }, - "270390": { - "latitude": -8.962339264, - "longitude": -35.53669605, - "name": "Jundiá" - }, - "270400": { - "latitude": -9.856499688, - "longitude": -36.44071687, - "name": "Junqueiro" - }, - "270410": { - "latitude": -9.799927722, - "longitude": -36.73597351, - "name": "Lagoa da Canoa" - }, - "270420": { - "latitude": -9.732386381, - "longitude": -36.46773136, - "name": "Limoeiro de Anadia" - }, - "270430": { - "latitude": -9.522391672, - "longitude": -35.71138973, - "name": "Maceió" - }, - "270440": { - "latitude": -9.54269788, - "longitude": -37.01063094, - "name": "Major Isidoro" - }, - "270450": { - "latitude": -8.951747098, - "longitude": -35.26922203, - "name": "Maragogi" - }, - "270460": { - "latitude": -9.244010242, - "longitude": -37.39902349, - "name": "Maravilha" - }, - "270470": { - "latitude": -9.715297638, - "longitude": -35.90962404, - "name": "Marechal Deodoro" - }, - "270480": { - "latitude": -9.559322912, - "longitude": -36.29558547, - "name": "Maribondo" - }, - "270490": { - "latitude": -9.472869319, - "longitude": -36.40314705, - "name": "Mar Vermelho" - }, - "270500": { - "latitude": -9.052114653, - "longitude": -37.75662226, - "name": "Mata Grande" - }, - "270510": { - "latitude": -9.104497983, - "longitude": -35.58159877, - "name": "Matriz de Camaragibe" - }, - "270520": { - "latitude": -9.343608004, - "longitude": -35.8123511, - "name": "Messias" - }, - "270530": { - "latitude": -9.336913153, - "longitude": -36.86353785, - "name": "Minador do Negrão" - }, - "270540": { - "latitude": -9.600611731, - "longitude": -37.29612665, - "name": "Monteirópolis" - }, - "270550": { - "latitude": -9.290862778, - "longitude": -35.92395872, - "name": "Murici" - }, - "270560": { - "latitude": -8.963029229, - "longitude": -35.62905538, - "name": "Novo Lino" - }, - "270570": { - "latitude": -9.532036958, - "longitude": -37.25877962, - "name": "Olho d'Água das Flores" - }, - "270580": { - "latitude": -9.43579421, - "longitude": -37.81309279, - "name": "Olho d'Água do Casado" - }, - "270590": { - "latitude": -10.05618504, - "longitude": -36.79343531, - "name": "Olho d'Água Grande" - }, - "270600": { - "latitude": -9.489271005, - "longitude": -37.17758266, - "name": "Olivença" - }, - "270610": { - "latitude": -9.127797649, - "longitude": -37.3637644, - "name": "Ouro Branco" - }, - "270620": { - "latitude": -9.689340528, - "longitude": -37.30250829, - "name": "Palestina" - }, - "270630": { - "latitude": -9.418242935, - "longitude": -36.60570916, - "name": "Palmeira dos Índios" - }, - "270640": { - "latitude": -9.670581974, - "longitude": -37.4855254, - "name": "Pão de Açúcar" - }, - "270642": { - "latitude": -9.24050531, - "longitude": -38.04752038, - "name": "Pariconha" - }, - "270644": { - "latitude": -9.435541207, - "longitude": -35.59368118, - "name": "Paripueira" - }, - "270650": { - "latitude": -9.256026268, - "longitude": -35.499935, - "name": "Passo de Camaragibe" - }, - "270660": { - "latitude": -9.377625797, - "longitude": -36.40941421, - "name": "Paulo Jacinto" - }, - "270670": { - "latitude": -10.23132916, - "longitude": -36.48231219, - "name": "Penedo" - }, - "270680": { - "latitude": -10.38693757, - "longitude": -36.40173346, - "name": "Piaçabuçu" - }, - "270690": { - "latitude": -9.615316656, - "longitude": -36.00463459, - "name": "Pilar" - }, - "270700": { - "latitude": -9.475982551, - "longitude": -36.28564443, - "name": "Pindoba" - }, - "270710": { - "latitude": -9.52610472, - "longitude": -37.72506215, - "name": "Piranhas" - }, - "270720": { - "latitude": -9.298757386, - "longitude": -37.32029472, - "name": "Poço das Trincheiras" - }, - "270730": { - "latitude": -9.025992863, - "longitude": -35.42683899, - "name": "Porto Calvo" - }, - "270740": { - "latitude": -9.14359659, - "longitude": -35.40676451, - "name": "Porto de Pedras" - }, - "270750": { - "latitude": -10.119959, - "longitude": -36.73625677, - "name": "Porto Real do Colégio" - }, - "270760": { - "latitude": -9.303267906, - "longitude": -36.46122937, - "name": "Quebrangulo" - }, - "270770": { - "latitude": -9.480041032, - "longitude": -35.86443876, - "name": "Rio Largo" - }, - "270780": { - "latitude": -9.868715085, - "longitude": -35.98044553, - "name": "Roteiro" - }, - "270790": { - "latitude": -9.612073632, - "longitude": -35.82989927, - "name": "Santa Luzia do Norte" - }, - "270800": { - "latitude": -9.358371674, - "longitude": -37.21087661, - "name": "Santana do Ipanema" - }, - "270810": { - "latitude": -9.130975067, - "longitude": -36.19133614, - "name": "Santana do Mundaú" - }, - "270820": { - "latitude": -10.10860513, - "longitude": -36.86185622, - "name": "São Brás" - }, - "270830": { - "latitude": -8.987487377, - "longitude": -36.03999999, - "name": "São José da Laje" - }, - "270840": { - "latitude": -9.53299861, - "longitude": -37.48968582, - "name": "São José da Tapera" - }, - "270850": { - "latitude": -9.249743492, - "longitude": -35.63418363, - "name": "São Luís do Quitunde" - }, - "270860": { - "latitude": -9.772806763, - "longitude": -36.10078157, - "name": "São Miguel dos Campos" - }, - "270870": { - "latitude": -9.230756556, - "longitude": -35.40687103, - "name": "São Miguel dos Milagres" - }, - "270880": { - "latitude": -9.963364853, - "longitude": -36.55034963, - "name": "São Sebastião" - }, - "270890": { - "latitude": -9.578140201, - "longitude": -35.84547245, - "name": "Satuba" - }, - "270895": { - "latitude": -9.391053085, - "longitude": -37.5112363, - "name": "Senador Rui Palmeira" - }, - "270900": { - "latitude": -9.557709428, - "longitude": -36.42289668, - "name": "Tanque d'Arca" - }, - "270910": { - "latitude": -9.624658118, - "longitude": -36.49530761, - "name": "Taquarana" - }, - "270915": { - "latitude": -9.964701574, - "longitude": -36.37150216, - "name": "Teotônio Vilela" - }, - "270920": { - "latitude": -9.896577254, - "longitude": -36.96924013, - "name": "Traipu" - }, - "270930": { - "latitude": -9.120411508, - "longitude": -36.01443912, - "name": "União dos Palmares" - }, - "270940": { - "latitude": -9.359239646, - "longitude": -36.26510179, - "name": "Viçosa" - }, - "280010": { - "latitude": -10.16563925, - "longitude": -36.92146865, - "name": "Amparo do São Francisco" - }, - "280020": { - "latitude": -10.26081229, - "longitude": -37.06414549, - "name": "Aquidabã" - }, - "280030": { - "latitude": -10.99420227, - "longitude": -37.09491352, - "name": "Aracaju" - }, - "280040": { - "latitude": -11.26037421, - "longitude": -37.58973062, - "name": "Arauá" - }, - "280050": { - "latitude": -10.78720021, - "longitude": -37.33145684, - "name": "Areia Branca" - }, - "280060": { - "latitude": -10.85111971, - "longitude": -36.96942191, - "name": "Barra dos Coqueiros" - }, - "280067": { - "latitude": -11.12042864, - "longitude": -37.59699284, - "name": "Boquim" - }, - "280070": { - "latitude": -10.47727739, - "longitude": -36.47393318, - "name": "Brejo Grande" - }, - "280100": { - "latitude": -10.76633407, - "longitude": -37.50065236, - "name": "Campo do Brito" - }, - "280110": { - "latitude": -10.14839271, - "longitude": -37.00073757, - "name": "Canhoba" - }, - "280120": { - "latitude": -9.709207368, - "longitude": -37.91799031, - "name": "Canindé de São Francisco" - }, - "280130": { - "latitude": -10.46875117, - "longitude": -37.03634426, - "name": "Capela" - }, - "280140": { - "latitude": -10.36376328, - "longitude": -37.71055762, - "name": "Carira" - }, - "280150": { - "latitude": -10.66460162, - "longitude": -36.96607068, - "name": "Carmópolis" - }, - "280160": { - "latitude": -10.2664863, - "longitude": -36.8991766, - "name": "Cedro de São João" - }, - "280170": { - "latitude": -11.48198067, - "longitude": -37.73292845, - "name": "Cristinápolis" - }, - "280190": { - "latitude": -10.3483747, - "longitude": -37.19579209, - "name": "Cumbe" - }, - "280200": { - "latitude": -10.67595668, - "longitude": -37.15674905, - "name": "Divina Pastora" - }, - "280210": { - "latitude": -11.24950605, - "longitude": -37.39794191, - "name": "Estância" - }, - "280220": { - "latitude": -10.28256596, - "longitude": -37.3297252, - "name": "Feira Nova" - }, - "280230": { - "latitude": -10.52248472, - "longitude": -37.58988403, - "name": "Frei Paulo" - }, - "280240": { - "latitude": -10.02699786, - "longitude": -37.20340061, - "name": "Gararu" - }, - "280250": { - "latitude": -10.69302839, - "longitude": -36.97108196, - "name": "General Maynard" - }, - "280260": { - "latitude": -10.22256776, - "longitude": -37.21876416, - "name": "Gracho Cardoso" - }, - "280270": { - "latitude": -10.45662389, - "longitude": -36.55511538, - "name": "Ilha das Flores" - }, - "280280": { - "latitude": -11.47549138, - "longitude": -37.528868, - "name": "Indiaroba" - }, - "280290": { - "latitude": -10.68559151, - "longitude": -37.42163007, - "name": "Itabaiana" - }, - "280300": { - "latitude": -11.25873612, - "longitude": -37.77918544, - "name": "Itabaianinha" - }, - "280310": { - "latitude": -10.10587959, - "longitude": -37.14385229, - "name": "Itabi" - }, - "280320": { - "latitude": -11.05770225, - "longitude": -37.31823915, - "name": "Itaporanga d'Ajuda" - }, - "280330": { - "latitude": -10.55324626, - "longitude": -36.90298952, - "name": "Japaratuba" - }, - "280340": { - "latitude": -10.43607922, - "longitude": -36.78868886, - "name": "Japoatã" - }, - "280350": { - "latitude": -10.90270483, - "longitude": -37.66443696, - "name": "Lagarto" - }, - "280360": { - "latitude": -10.8045421, - "longitude": -37.18616725, - "name": "Laranjeiras" - }, - "280370": { - "latitude": -10.66004922, - "longitude": -37.59684704, - "name": "Macambira" - }, - "280380": { - "latitude": -10.32922219, - "longitude": -36.94441911, - "name": "Malhada dos Bois" - }, - "280390": { - "latitude": -10.67289106, - "longitude": -37.28779188, - "name": "Malhador" - }, - "280400": { - "latitude": -10.7304051, - "longitude": -37.10523198, - "name": "Maruim" - }, - "280410": { - "latitude": -10.59359093, - "longitude": -37.34042379, - "name": "Moita Bonita" - }, - "280420": { - "latitude": -10.06447858, - "longitude": -37.6160695, - "name": "Monte Alegre de Sergipe" - }, - "280430": { - "latitude": -10.38403554, - "longitude": -36.95902006, - "name": "Muribeca" - }, - "280440": { - "latitude": -10.34830352, - "longitude": -36.66039325, - "name": "Neópolis" - }, - "280445": { - "latitude": -10.35806647, - "longitude": -37.5049236, - "name": "Nossa Senhora Aparecida" - }, - "280450": { - "latitude": -10.17764124, - "longitude": -37.52837225, - "name": "Nossa Senhora da Glória" - }, - "280460": { - "latitude": -10.46659629, - "longitude": -37.2403908, - "name": "Nossa Senhora das Dores" - }, - "280470": { - "latitude": -10.07678895, - "longitude": -37.01448396, - "name": "Nossa Senhora de Lourdes" - }, - "280480": { - "latitude": -10.86383804, - "longitude": -37.14555356, - "name": "Nossa Senhora do Socorro" - }, - "280490": { - "latitude": -10.51913745, - "longitude": -36.64696595, - "name": "Pacatuba" - }, - "280500": { - "latitude": -10.62481255, - "longitude": -37.68011906, - "name": "Pedra Mole" - }, - "280510": { - "latitude": -11.20443787, - "longitude": -37.65841906, - "name": "Pedrinhas" - }, - "280520": { - "latitude": -10.56334711, - "longitude": -37.75809544, - "name": "Pinhão" - }, - "280530": { - "latitude": -10.65389081, - "longitude": -36.80503697, - "name": "Pirambu" - }, - "280540": { - "latitude": -9.850101078, - "longitude": -37.70868447, - "name": "Poço Redondo" - }, - "280550": { - "latitude": -10.8007106, - "longitude": -38.12708238, - "name": "Poço Verde" - }, - "280560": { - "latitude": -9.913709167, - "longitude": -37.42243645, - "name": "Porto da Folha" - }, - "280570": { - "latitude": -10.24491828, - "longitude": -36.80311547, - "name": "Propriá" - }, - "280580": { - "latitude": -11.0339804, - "longitude": -37.80044334, - "name": "Riachão do Dantas" - }, - "280590": { - "latitude": -10.73062341, - "longitude": -37.2252849, - "name": "Riachuelo" - }, - "280600": { - "latitude": -10.50399853, - "longitude": -37.42938334, - "name": "Ribeirópolis" - }, - "280610": { - "latitude": -10.68241472, - "longitude": -37.03553237, - "name": "Rosário do Catete" - }, - "280620": { - "latitude": -11.0626734, - "longitude": -37.48056362, - "name": "Salgado" - }, - "280630": { - "latitude": -11.3616335, - "longitude": -37.50664008, - "name": "Santa Luzia do Itanhy" - }, - "280640": { - "latitude": -10.28695073, - "longitude": -36.63670562, - "name": "Santana do São Francisco" - }, - "280650": { - "latitude": -10.63204233, - "longitude": -37.23608132, - "name": "Santa Rosa de Lima" - }, - "280660": { - "latitude": -10.77365145, - "longitude": -36.9826057, - "name": "Santo Amaro das Brotas" - }, - "280670": { - "latitude": -10.96221643, - "longitude": -37.22043099, - "name": "São Cristóvão" - }, - "280680": { - "latitude": -10.78237929, - "longitude": -37.57475578, - "name": "São Domingos" - }, - "280690": { - "latitude": -10.3352352, - "longitude": -36.86692489, - "name": "São Francisco" - }, - "280700": { - "latitude": -10.39943685, - "longitude": -37.36349701, - "name": "São Miguel do Aleixo" - }, - "280710": { - "latitude": -10.7564527, - "longitude": -37.82831663, - "name": "Simão Dias" - }, - "280720": { - "latitude": -10.574932, - "longitude": -37.1252274, - "name": "Siriri" - }, - "280730": { - "latitude": -10.19312807, - "longitude": -36.88951579, - "name": "Telha" - }, - "280740": { - "latitude": -11.04228492, - "longitude": -38.00315157, - "name": "Tobias Barreto" - }, - "280750": { - "latitude": -11.36992085, - "longitude": -37.8751741, - "name": "Tomar do Geru" - }, - "280760": { - "latitude": -11.39993594, - "longitude": -37.66243958, - "name": "Umbaúba" - }, - "290010": { - "latitude": -13.29656899, - "longitude": -41.74289387, - "name": "Abaíra" - }, - "290020": { - "latitude": -8.83354043, - "longitude": -39.31769286, - "name": "Abaré" - }, - "290030": { - "latitude": -11.66317176, - "longitude": -38.000531, - "name": "Acajutiba" - }, - "290035": { - "latitude": -10.56227218, - "longitude": -38.03763668, - "name": "Adustina" - }, - "290040": { - "latitude": -11.82317841, - "longitude": -38.71046599, - "name": "Água Fria" - }, - "290050": { - "latitude": -13.40021475, - "longitude": -42.06732084, - "name": "Érico Cardoso" - }, - "290060": { - "latitude": -14.09181854, - "longitude": -39.88086172, - "name": "Aiquara" - }, - "290070": { - "latitude": -12.11312569, - "longitude": -38.40223523, - "name": "Alagoinhas" - }, - "290080": { - "latitude": -17.46923112, - "longitude": -39.40955626, - "name": "Alcobaça" - }, - "290090": { - "latitude": -14.701273, - "longitude": -39.66409283, - "name": "Almadina" - }, - "290100": { - "latitude": -13.04085223, - "longitude": -39.62632107, - "name": "Amargosa" - }, - "290110": { - "latitude": -12.42118426, - "longitude": -38.72048269, - "name": "Amélia Rodrigues" - }, - "290115": { - "latitude": -11.40619624, - "longitude": -41.52292272, - "name": "América Dourada" - }, - "290120": { - "latitude": -14.58989996, - "longitude": -40.92771676, - "name": "Anagé" - }, - "290130": { - "latitude": -12.73362926, - "longitude": -41.21509181, - "name": "Andaraí" - }, - "290135": { - "latitude": -10.28076219, - "longitude": -39.87190117, - "name": "Andorinha" - }, - "290140": { - "latitude": -11.99663943, - "longitude": -44.64772391, - "name": "Angical" - }, - "290150": { - "latitude": -12.18297387, - "longitude": -39.19283199, - "name": "Anguera" - }, - "290160": { - "latitude": -10.40712293, - "longitude": -38.294125, - "name": "Antas" - }, - "290170": { - "latitude": -12.37979547, - "longitude": -39.14705133, - "name": "Antônio Cardoso" - }, - "290180": { - "latitude": -10.60150946, - "longitude": -40.36236502, - "name": "Antônio Gonçalves" - }, - "290190": { - "latitude": -11.73156542, - "longitude": -38.19380316, - "name": "Aporá" - }, - "290195": { - "latitude": -13.82003382, - "longitude": -39.75157033, - "name": "Apuarema" - }, - "290200": { - "latitude": -14.37122569, - "longitude": -41.37454841, - "name": "Aracatu" - }, - "290205": { - "latitude": -12.17294681, - "longitude": -38.21254419, - "name": "Araçás" - }, - "290210": { - "latitude": -11.21247151, - "longitude": -39.0644638, - "name": "Araci" - }, - "290220": { - "latitude": -12.05072216, - "longitude": -38.5249854, - "name": "Aramari" - }, - "290225": { - "latitude": -15.2432753, - "longitude": -39.41217951, - "name": "Arataca" - }, - "290230": { - "latitude": -13.08462982, - "longitude": -39.06942926, - "name": "Aratuípe" - }, - "290240": { - "latitude": -14.36213414, - "longitude": -39.47826312, - "name": "Aurelino Leal" - }, - "290250": { - "latitude": -12.65712475, - "longitude": -44.44023038, - "name": "Baianópolis" - }, - "290260": { - "latitude": -11.96475032, - "longitude": -40.15277461, - "name": "Baixa Grande" - }, - "290265": { - "latitude": -10.61647181, - "longitude": -38.65434373, - "name": "Banzaê" - }, - "290270": { - "latitude": -11.0305657, - "longitude": -43.36605212, - "name": "Barra" - }, - "290280": { - "latitude": -13.65048521, - "longitude": -41.09809246, - "name": "Barra da Estiva" - }, - "290290": { - "latitude": -14.91305446, - "longitude": -40.58126985, - "name": "Barra do Choça" - }, - "290300": { - "latitude": -11.96709034, - "longitude": -42.11440367, - "name": "Barra do Mendes" - }, - "290310": { - "latitude": -14.1024804, - "longitude": -39.58794938, - "name": "Barra do Rocha" - }, - "290320": { - "latitude": -12.01302235, - "longitude": -45.5423787, - "name": "Barreiras" - }, - "290323": { - "latitude": -11.84799168, - "longitude": -41.83678643, - "name": "Barro Alto" - }, - "290327": { - "latitude": -11.53804149, - "longitude": -39.09492028, - "name": "Barrocas" - }, - "290330": { - "latitude": -14.77586228, - "longitude": -39.44472832, - "name": "Barro Preto" - }, - "290340": { - "latitude": -15.93541651, - "longitude": -39.17727284, - "name": "Belmonte" - }, - "290350": { - "latitude": -14.99851377, - "longitude": -41.20384008, - "name": "Belo Campo" - }, - "290360": { - "latitude": -11.5853235, - "longitude": -38.79263329, - "name": "Biritinga" - }, - "290370": { - "latitude": -14.36023438, - "longitude": -40.23011496, - "name": "Boa Nova" - }, - "290380": { - "latitude": -12.77016767, - "longitude": -40.67022723, - "name": "Boa Vista do Tupim" - }, - "290390": { - "latitude": -13.27714722, - "longitude": -43.29338744, - "name": "Bom Jesus da Lapa" - }, - "290395": { - "latitude": -14.38987925, - "longitude": -40.57736116, - "name": "Bom Jesus da Serra" - }, - "290400": { - "latitude": -12.77667258, - "longitude": -41.80249757, - "name": "Boninal" - }, - "290405": { - "latitude": -11.96927807, - "longitude": -41.32041377, - "name": "Bonito" - }, - "290410": { - "latitude": -12.74111971, - "longitude": -42.72228871, - "name": "Boquira" - }, - "290420": { - "latitude": -13.32623012, - "longitude": -42.53470605, - "name": "Botuporã" - }, - "290430": { - "latitude": -13.07537393, - "longitude": -39.8507835, - "name": "Brejões" - }, - "290440": { - "latitude": -12.4993738, - "longitude": -43.82476379, - "name": "Brejolândia" - }, - "290450": { - "latitude": -12.08668871, - "longitude": -42.46516023, - "name": "Brotas de Macaúbas" - }, - "290460": { - "latitude": -14.16794297, - "longitude": -41.68907666, - "name": "Brumado" - }, - "290470": { - "latitude": -14.99644316, - "longitude": -39.26957772, - "name": "Buerarema" - }, - "290475": { - "latitude": -10.58812601, - "longitude": -43.66762972, - "name": "Buritirama" - }, - "290480": { - "latitude": -14.99580249, - "longitude": -40.36410746, - "name": "Caatiba" - }, - "290485": { - "latitude": -12.56427444, - "longitude": -39.19248459, - "name": "Cabaceiras do Paraguaçu" - }, - "290490": { - "latitude": -12.64670691, - "longitude": -38.88487618, - "name": "Cachoeira" - }, - "290500": { - "latitude": -14.48288984, - "longitude": -42.28504993, - "name": "Caculé" - }, - "290510": { - "latitude": -11.14306663, - "longitude": -40.29110414, - "name": "Caém" - }, - "290515": { - "latitude": -14.31366873, - "longitude": -40.92674899, - "name": "Caetanos" - }, - "290520": { - "latitude": -13.94796778, - "longitude": -42.4766375, - "name": "Caetité" - }, - "290530": { - "latitude": -11.73382193, - "longitude": -41.50144873, - "name": "Cafarnaum" - }, - "290540": { - "latitude": -13.50686222, - "longitude": -38.98343421, - "name": "Cairu" - }, - "290550": { - "latitude": -11.03985948, - "longitude": -40.22183035, - "name": "Caldeirão Grande" - }, - "290560": { - "latitude": -15.4443734, - "longitude": -39.51867656, - "name": "Camacan" - }, - "290570": { - "latitude": -12.66602887, - "longitude": -38.20631178, - "name": "Camaçari" - }, - "290580": { - "latitude": -14.01257274, - "longitude": -39.16421274, - "name": "Camamu" - }, - "290590": { - "latitude": -9.561568613, - "longitude": -43.15886903, - "name": "Campo Alegre de Lourdes" - }, - "290600": { - "latitude": -10.25106259, - "longitude": -40.72893646, - "name": "Campo Formoso" - }, - "290610": { - "latitude": -13.09659214, - "longitude": -44.20355996, - "name": "Canápolis" - }, - "290620": { - "latitude": -11.75294875, - "longitude": -41.69962948, - "name": "Canarana" - }, - "290630": { - "latitude": -15.65153876, - "longitude": -39.10882501, - "name": "Canavieiras" - }, - "290640": { - "latitude": -11.87111953, - "longitude": -39.19075804, - "name": "Candeal" - }, - "290650": { - "latitude": -12.67847893, - "longitude": -38.48116113, - "name": "Candeias" - }, - "290660": { - "latitude": -14.40420193, - "longitude": -42.8317402, - "name": "Candiba" - }, - "290670": { - "latitude": -15.35508238, - "longitude": -41.269495, - "name": "Cândido Sales" - }, - "290680": { - "latitude": -10.726929, - "longitude": -39.47271962, - "name": "Cansanção" - }, - "290682": { - "latitude": -10.00593112, - "longitude": -38.99451682, - "name": "Canudos" - }, - "290685": { - "latitude": -11.67226332, - "longitude": -39.82496385, - "name": "Capela do Alto Alegre" - }, - "290687": { - "latitude": -11.30628839, - "longitude": -39.99590007, - "name": "Capim Grosso" - }, - "290689": { - "latitude": -14.62557042, - "longitude": -41.28371574, - "name": "Caraíbas" - }, - "290690": { - "latitude": -17.6573845, - "longitude": -39.68933174, - "name": "Caravelas" - }, - "290700": { - "latitude": -12.0430371, - "longitude": -37.93842595, - "name": "Cardeal da Silva" - }, - "290710": { - "latitude": -14.02054082, - "longitude": -43.84896979, - "name": "Carinhanha" - }, - "290720": { - "latitude": -9.240251463, - "longitude": -41.33648205, - "name": "Casa Nova" - }, - "290730": { - "latitude": -12.73162557, - "longitude": -39.36399699, - "name": "Castro Alves" - }, - "290740": { - "latitude": -12.27343972, - "longitude": -44.69706752, - "name": "Catolândia" - }, - "290750": { - "latitude": -12.33056944, - "longitude": -38.41290041, - "name": "Catu" - }, - "290755": { - "latitude": -13.23346242, - "longitude": -42.31941727, - "name": "Caturama" - }, - "290760": { - "latitude": -11.15129145, - "longitude": -42.1124267, - "name": "Central" - }, - "290770": { - "latitude": -9.27170712, - "longitude": -39.18911024, - "name": "Chorrochó" - }, - "290780": { - "latitude": -10.50694399, - "longitude": -38.45418011, - "name": "Cícero Dantas" - }, - "290790": { - "latitude": -11.10777135, - "longitude": -38.52309312, - "name": "Cipó" - }, - "290800": { - "latitude": -14.63182694, - "longitude": -39.59319097, - "name": "Coaraci" - }, - "290810": { - "latitude": -14.49692852, - "longitude": -45.21994459, - "name": "Cocos" - }, - "290820": { - "latitude": -12.5048627, - "longitude": -38.99976045, - "name": "Conceição da Feira" - }, - "290830": { - "latitude": -12.85990168, - "longitude": -39.24560126, - "name": "Conceição do Almeida" - }, - "290840": { - "latitude": -11.52412314, - "longitude": -39.24981985, - "name": "Conceição do Coité" - }, - "290850": { - "latitude": -12.33719249, - "longitude": -38.74218571, - "name": "Conceição do Jacuípe" - }, - "290860": { - "latitude": -11.82773648, - "longitude": -37.67759526, - "name": "Conde" - }, - "290870": { - "latitude": -14.92149388, - "longitude": -42.05108284, - "name": "Condeúba" - }, - "290880": { - "latitude": -13.83834605, - "longitude": -41.09365167, - "name": "Contendas do Sincorá" - }, - "290890": { - "latitude": -12.21064906, - "longitude": -38.78310818, - "name": "Coração de Maria" - }, - "290900": { - "latitude": -15.04097054, - "longitude": -41.90824456, - "name": "Cordeiros" - }, - "290910": { - "latitude": -13.8143404, - "longitude": -44.37629362, - "name": "Coribe" - }, - "290920": { - "latitude": -10.28018443, - "longitude": -37.93631178, - "name": "Coronel João Sá" - }, - "290930": { - "latitude": -13.46723542, - "longitude": -45.39586283, - "name": "Correntina" - }, - "290940": { - "latitude": -11.71111546, - "longitude": -44.32799587, - "name": "Cotegipe" - }, - "290950": { - "latitude": -13.42400344, - "longitude": -39.78446238, - "name": "Cravolândia" - }, - "290960": { - "latitude": -11.51807095, - "longitude": -38.1725791, - "name": "Crisópolis" - }, - "290970": { - "latitude": -12.19399492, - "longitude": -44.25884542, - "name": "Cristópolis" - }, - "290980": { - "latitude": -12.68303521, - "longitude": -39.11791154, - "name": "Cruz das Almas" - }, - "290990": { - "latitude": -9.22248169, - "longitude": -39.65145851, - "name": "Curaçá" - }, - "291000": { - "latitude": -14.40498107, - "longitude": -39.98800646, - "name": "Dário Meira" - }, - "291005": { - "latitude": -12.60126274, - "longitude": -38.28239526, - "name": "Dias d'Ávila" - }, - "291010": { - "latitude": -13.85631758, - "longitude": -41.71223455, - "name": "Dom Basílio" - }, - "291020": { - "latitude": -12.91235529, - "longitude": -39.17395974, - "name": "Dom Macedo Costa" - }, - "291030": { - "latitude": -12.93487239, - "longitude": -39.52633542, - "name": "Elísio Medrado" - }, - "291040": { - "latitude": -15.59491174, - "longitude": -40.99991226, - "name": "Encruzilhada" - }, - "291050": { - "latitude": -12.06356943, - "longitude": -38.0482751, - "name": "Entre Rios" - }, - "291060": { - "latitude": -11.93124644, - "longitude": -37.88534008, - "name": "Esplanada" - }, - "291070": { - "latitude": -10.46420006, - "longitude": -38.915141, - "name": "Euclides da Cunha" - }, - "291072": { - "latitude": -16.29875172, - "longitude": -39.60611861, - "name": "Eunápolis" - }, - "291075": { - "latitude": -10.59519197, - "longitude": -38.20210952, - "name": "Fátima" - }, - "291077": { - "latitude": -14.13174043, - "longitude": -44.23221879, - "name": "Feira da Mata" - }, - "291080": { - "latitude": -12.19307644, - "longitude": -39.03398953, - "name": "Feira de Santana" - }, - "291085": { - "latitude": -10.72320979, - "longitude": -40.13691488, - "name": "Filadélfia" - }, - "291090": { - "latitude": -14.93081995, - "longitude": -39.91131317, - "name": "Firmino Alves" - }, - "291100": { - "latitude": -14.84185151, - "longitude": -39.7174699, - "name": "Floresta Azul" - }, - "291110": { - "latitude": -11.01421291, - "longitude": -45.74529016, - "name": "Formosa do Rio Preto" - }, - "291120": { - "latitude": -13.78868538, - "longitude": -39.48269121, - "name": "Gandu" - }, - "291125": { - "latitude": -11.50888412, - "longitude": -39.75733962, - "name": "Gavião" - }, - "291130": { - "latitude": -11.41024752, - "longitude": -42.60520848, - "name": "Gentio do Ouro" - }, - "291140": { - "latitude": -9.229365825, - "longitude": -38.44476151, - "name": "Glória" - }, - "291150": { - "latitude": -14.2805892, - "longitude": -39.58189988, - "name": "Gongogi" - }, - "291160": { - "latitude": -12.58336289, - "longitude": -39.07235135, - "name": "Governador Mangabeira" - }, - "291165": { - "latitude": -14.55896943, - "longitude": -41.98643212, - "name": "Guajeru" - }, - "291170": { - "latitude": -14.20395685, - "longitude": -42.82003594, - "name": "Guanambi" - }, - "291180": { - "latitude": -16.55319083, - "longitude": -39.93768893, - "name": "Guaratinga" - }, - "291185": { - "latitude": -10.74994983, - "longitude": -38.30876246, - "name": "Heliópolis" - }, - "291190": { - "latitude": -12.81353437, - "longitude": -40.11309452, - "name": "Iaçu" - }, - "291200": { - "latitude": -14.29153125, - "longitude": -42.30537867, - "name": "Ibiassucê" - }, - "291210": { - "latitude": -14.84876849, - "longitude": -39.56845328, - "name": "Ibicaraí" - }, - "291220": { - "latitude": -13.38099123, - "longitude": -41.3278931, - "name": "Ibicoara" - }, - "291230": { - "latitude": -14.64189445, - "longitude": -39.86378532, - "name": "Ibicuí" - }, - "291240": { - "latitude": -11.57074846, - "longitude": -42.18177015, - "name": "Ibipeba" - }, - "291250": { - "latitude": -12.85934656, - "longitude": -42.35969331, - "name": "Ibipitanga" - }, - "291260": { - "latitude": -12.60319131, - "longitude": -40.88478219, - "name": "Ibiquera" - }, - "291270": { - "latitude": -14.06070422, - "longitude": -39.43569612, - "name": "Ibirapitanga" - }, - "291280": { - "latitude": -17.74301383, - "longitude": -40.01279524, - "name": "Ibirapuã" - }, - "291290": { - "latitude": -13.97598115, - "longitude": -39.62616749, - "name": "Ibirataia" - }, - "291300": { - "latitude": -12.57588532, - "longitude": -42.28269422, - "name": "Ibitiara" - }, - "291310": { - "latitude": -11.57904949, - "longitude": -41.91512496, - "name": "Ibititá" - }, - "291320": { - "latitude": -12.03855631, - "longitude": -43.20476457, - "name": "Ibotirama" - }, - "291330": { - "latitude": -11.73151105, - "longitude": -39.15234071, - "name": "Ichu" - }, - "291340": { - "latitude": -13.86306615, - "longitude": -42.70414562, - "name": "Igaporã" - }, - "291345": { - "latitude": -13.8709505, - "longitude": -39.20552819, - "name": "Igrapiúna" - }, - "291350": { - "latitude": -14.6323653, - "longitude": -40.06587008, - "name": "Iguaí" - }, - "291360": { - "latitude": -14.75274024, - "longitude": -39.19180729, - "name": "Ilhéus" - }, - "291370": { - "latitude": -11.80511593, - "longitude": -38.40381474, - "name": "Inhambupe" - }, - "291380": { - "latitude": -12.30741901, - "longitude": -39.32698552, - "name": "Ipecaetá" - }, - "291390": { - "latitude": -14.05487323, - "longitude": -39.72650468, - "name": "Ipiaú" - }, - "291400": { - "latitude": -12.21124248, - "longitude": -39.77714283, - "name": "Ipirá" - }, - "291410": { - "latitude": -11.83587291, - "longitude": -42.50184265, - "name": "Ipupiara" - }, - "291420": { - "latitude": -13.23071872, - "longitude": -40.05229494, - "name": "Irajuba" - }, - "291430": { - "latitude": -13.46863883, - "longitude": -40.9208222, - "name": "Iramaia" - }, - "291440": { - "latitude": -12.24834054, - "longitude": -41.58309537, - "name": "Iraquara" - }, - "291450": { - "latitude": -12.04642856, - "longitude": -38.75389483, - "name": "Irará" - }, - "291460": { - "latitude": -11.30944942, - "longitude": -41.83896927, - "name": "Irecê" - }, - "291465": { - "latitude": -16.66290085, - "longitude": -39.55133755, - "name": "Itabela" - }, - "291470": { - "latitude": -12.4990965, - "longitude": -40.26226357, - "name": "Itaberaba" - }, - "291480": { - "latitude": -14.85164821, - "longitude": -39.3128072, - "name": "Itabuna" - }, - "291490": { - "latitude": -14.36209357, - "longitude": -39.15779481, - "name": "Itacaré" - }, - "291500": { - "latitude": -13.09175721, - "longitude": -41.04041818, - "name": "Itaeté" - }, - "291510": { - "latitude": -14.16226402, - "longitude": -40.02485105, - "name": "Itagi" - }, - "291520": { - "latitude": -14.25256694, - "longitude": -39.83045415, - "name": "Itagibá" - }, - "291530": { - "latitude": -16.09633589, - "longitude": -39.73798513, - "name": "Itagimirim" - }, - "291535": { - "latitude": -10.76972381, - "longitude": -42.23898667, - "name": "Itaguaçu da Bahia" - }, - "291540": { - "latitude": -15.14833634, - "longitude": -39.73165248, - "name": "Itaju do Colônia" - }, - "291550": { - "latitude": -14.67151751, - "longitude": -39.44489991, - "name": "Itajuípe" - }, - "291560": { - "latitude": -17.00875697, - "longitude": -39.76482038, - "name": "Itamaraju" - }, - "291570": { - "latitude": -13.76658417, - "longitude": -39.66705413, - "name": "Itamari" - }, - "291580": { - "latitude": -15.15818097, - "longitude": -40.46223502, - "name": "Itambé" - }, - "291590": { - "latitude": -12.31534609, - "longitude": -38.04259252, - "name": "Itanagra" - }, - "291600": { - "latitude": -17.11540796, - "longitude": -40.37835158, - "name": "Itanhém" - }, - "291610": { - "latitude": -12.89223129, - "longitude": -38.65496428, - "name": "Itaparica" - }, - "291620": { - "latitude": -14.95437784, - "longitude": -39.49590349, - "name": "Itapé" - }, - "291630": { - "latitude": -15.91210988, - "longitude": -39.65315287, - "name": "Itapebi" - }, - "291640": { - "latitude": -15.29927981, - "longitude": -40.057515, - "name": "Itapetinga" - }, - "291650": { - "latitude": -11.19202124, - "longitude": -38.19422552, - "name": "Itapicuru" - }, - "291660": { - "latitude": -14.47290653, - "longitude": -39.61995846, - "name": "Itapitanga" - }, - "291670": { - "latitude": -13.4488914, - "longitude": -39.89845799, - "name": "Itaquara" - }, - "291680": { - "latitude": -15.69773761, - "longitude": -40.0491472, - "name": "Itarantim" - }, - "291685": { - "latitude": -12.71284016, - "longitude": -39.73469225, - "name": "Itatim" - }, - "291690": { - "latitude": -13.48764133, - "longitude": -40.15303744, - "name": "Itiruçu" - }, - "291700": { - "latitude": -10.73137398, - "longitude": -39.84535824, - "name": "Itiúba" - }, - "291710": { - "latitude": -15.04882746, - "longitude": -40.00713157, - "name": "Itororó" - }, - "291720": { - "latitude": -13.83710097, - "longitude": -41.39000695, - "name": "Ituaçu" - }, - "291730": { - "latitude": -13.74933484, - "longitude": -39.1529503, - "name": "Ituberá" - }, - "291733": { - "latitude": -14.46626081, - "longitude": -43.54294332, - "name": "Iuiu" - }, - "291735": { - "latitude": -14.03188974, - "longitude": -45.4404492, - "name": "Jaborandi" - }, - "291740": { - "latitude": -14.78484881, - "longitude": -42.32228583, - "name": "Jacaraci" - }, - "291750": { - "latitude": -11.13492022, - "longitude": -40.56854551, - "name": "Jacobina" - }, - "291760": { - "latitude": -13.55385427, - "longitude": -39.9570022, - "name": "Jaguaquara" - }, - "291770": { - "latitude": -10.04262096, - "longitude": -40.06834812, - "name": "Jaguarari" - }, - "291780": { - "latitude": -13.12129818, - "longitude": -38.9865597, - "name": "Jaguaripe" - }, - "291790": { - "latitude": -11.59839964, - "longitude": -37.59524603, - "name": "Jandaíra" - }, - "291800": { - "latitude": -13.87760672, - "longitude": -40.14613045, - "name": "Jequié" - }, - "291810": { - "latitude": -9.981424, - "longitude": -38.49929863, - "name": "Jeremoabo" - }, - "291820": { - "latitude": -13.32453798, - "longitude": -39.58465623, - "name": "Jiquiriçá" - }, - "291830": { - "latitude": -13.95797229, - "longitude": -39.86666005, - "name": "Jitaúna" - }, - "291835": { - "latitude": -11.22016923, - "longitude": -41.56721355, - "name": "João Dourado" - }, - "291840": { - "latitude": -9.556879956, - "longitude": -40.27465964, - "name": "Juazeiro" - }, - "291845": { - "latitude": -16.84556758, - "longitude": -40.10075358, - "name": "Jucuruçu" - }, - "291850": { - "latitude": -10.92553346, - "longitude": -41.88030218, - "name": "Jussara" - }, - "291855": { - "latitude": -15.13664176, - "longitude": -39.49802207, - "name": "Jussari" - }, - "291860": { - "latitude": -13.51131082, - "longitude": -41.59887642, - "name": "Jussiape" - }, - "291870": { - "latitude": -13.6415881, - "longitude": -40.29257791, - "name": "Lafaiete Coutinho" - }, - "291875": { - "latitude": -14.04729455, - "longitude": -42.21960301, - "name": "Lagoa Real" - }, - "291880": { - "latitude": -13.16698408, - "longitude": -39.34641786, - "name": "Laje" - }, - "291890": { - "latitude": -17.5595866, - "longitude": -40.30982732, - "name": "Lajedão" - }, - "291900": { - "latitude": -12.38097353, - "longitude": -40.96344604, - "name": "Lajedinho" - }, - "291905": { - "latitude": -13.46022489, - "longitude": -40.28225862, - "name": "Lajedo do Tabocal" - }, - "291910": { - "latitude": -11.78590885, - "longitude": -38.909962, - "name": "Lamarão" - }, - "291915": { - "latitude": -11.50128661, - "longitude": -41.77669031, - "name": "Lapão" - }, - "291920": { - "latitude": -12.86347932, - "longitude": -38.32729946, - "name": "Lauro de Freitas" - }, - "291930": { - "latitude": -12.4249888, - "longitude": -41.33729261, - "name": "Lençóis" - }, - "291940": { - "latitude": -14.58602121, - "longitude": -42.47010119, - "name": "Licínio de Almeida" - }, - "291950": { - "latitude": -13.81065557, - "longitude": -41.99092727, - "name": "Livramento de Nossa Senhora" - }, - "291955": { - "latitude": -12.19839274, - "longitude": -46.02035683, - "name": "Luís Eduardo Magalhães" - }, - "291960": { - "latitude": -12.1292958, - "longitude": -40.26225606, - "name": "Macajuba" - }, - "291970": { - "latitude": -15.54581789, - "longitude": -40.40096824, - "name": "Macarani" - }, - "291980": { - "latitude": -13.10813784, - "longitude": -42.69291769, - "name": "Macaúbas" - }, - "291990": { - "latitude": -9.291077601, - "longitude": -38.89672855, - "name": "Macururé" - }, - "291992": { - "latitude": -12.74111358, - "longitude": -38.64273215, - "name": "Madre de Deus" - }, - "291995": { - "latitude": -14.65559425, - "longitude": -41.51622073, - "name": "Maetinga" - }, - "292000": { - "latitude": -15.67400003, - "longitude": -40.26910251, - "name": "Maiquinique" - }, - "292010": { - "latitude": -11.73168373, - "longitude": -40.1806334, - "name": "Mairi" - }, - "292020": { - "latitude": -14.21636456, - "longitude": -43.64600022, - "name": "Malhada" - }, - "292030": { - "latitude": -14.35243082, - "longitude": -41.84522536, - "name": "Malhada de Pedras" - }, - "292040": { - "latitude": -14.05087476, - "longitude": -40.54759819, - "name": "Manoel Vitorino" - }, - "292045": { - "latitude": -11.12809046, - "longitude": -44.10836633, - "name": "Mansidão" - }, - "292050": { - "latitude": -13.49518199, - "longitude": -40.55523305, - "name": "Maracás" - }, - "292060": { - "latitude": -12.82300582, - "longitude": -38.93826963, - "name": "Maragogipe" - }, - "292070": { - "latitude": -14.15571317, - "longitude": -39.15051768, - "name": "Maraú" - }, - "292080": { - "latitude": -13.14005173, - "longitude": -40.6753211, - "name": "Marcionílio Souza" - }, - "292090": { - "latitude": -15.66608505, - "longitude": -39.42051347, - "name": "Mascote" - }, - "292100": { - "latitude": -12.48398189, - "longitude": -38.14888444, - "name": "Mata de São João" - }, - "292105": { - "latitude": -13.84884447, - "longitude": -42.94006795, - "name": "Matina" - }, - "292110": { - "latitude": -17.36129757, - "longitude": -40.28563323, - "name": "Medeiros Neto" - }, - "292120": { - "latitude": -11.42063441, - "longitude": -40.62421682, - "name": "Miguel Calmon" - }, - "292130": { - "latitude": -12.89994597, - "longitude": -39.79758595, - "name": "Milagres" - }, - "292140": { - "latitude": -10.77698497, - "longitude": -40.7145088, - "name": "Mirangaba" - }, - "292145": { - "latitude": -14.16782072, - "longitude": -40.76408745, - "name": "Mirante" - }, - "292150": { - "latitude": -10.38298759, - "longitude": -39.4542019, - "name": "Monte Santo" - }, - "292160": { - "latitude": -11.75079016, - "longitude": -43.0398183, - "name": "Morpará" - }, - "292170": { - "latitude": -11.46487496, - "longitude": -41.16705974, - "name": "Morro do Chapéu" - }, - "292180": { - "latitude": -14.97264124, - "longitude": -42.32029145, - "name": "Mortugaba" - }, - "292190": { - "latitude": -13.06509877, - "longitude": -41.47490843, - "name": "Mucugê" - }, - "292200": { - "latitude": -18.05917522, - "longitude": -39.86701231, - "name": "Mucuri" - }, - "292205": { - "latitude": -11.97776617, - "longitude": -41.52393859, - "name": "Mulungu do Morro" - }, - "292210": { - "latitude": -11.95282253, - "longitude": -40.55936465, - "name": "Mundo Novo" - }, - "292220": { - "latitude": -13.00248725, - "longitude": -39.08769263, - "name": "Muniz Ferreira" - }, - "292225": { - "latitude": -12.21179747, - "longitude": -43.49867862, - "name": "Muquém do São Francisco" - }, - "292230": { - "latitude": -12.62175283, - "longitude": -39.08628774, - "name": "Muritiba" - }, - "292240": { - "latitude": -13.31189393, - "longitude": -39.50662944, - "name": "Mutuípe" - }, - "292250": { - "latitude": -12.95368348, - "longitude": -38.98086727, - "name": "Nazaré" - }, - "292260": { - "latitude": -13.66014312, - "longitude": -39.17409245, - "name": "Nilo Peçanha" - }, - "292265": { - "latitude": -10.87309359, - "longitude": -39.45141082, - "name": "Nordestina" - }, - "292270": { - "latitude": -14.85751797, - "longitude": -40.18032836, - "name": "Nova Canaã" - }, - "292273": { - "latitude": -11.62135818, - "longitude": -39.63561865, - "name": "Nova Fátima" - }, - "292275": { - "latitude": -13.82499438, - "longitude": -39.58280928, - "name": "Nova Ibiá" - }, - "292280": { - "latitude": -13.04649491, - "longitude": -40.03457928, - "name": "Nova Itarana" - }, - "292285": { - "latitude": -12.80011596, - "longitude": -41.09123506, - "name": "Nova Redenção" - }, - "292290": { - "latitude": -11.3119502, - "longitude": -38.55480952, - "name": "Nova Soure" - }, - "292300": { - "latitude": -17.89966432, - "longitude": -39.71541487, - "name": "Nova Viçosa" - }, - "292303": { - "latitude": -12.8408726, - "longitude": -42.12866431, - "name": "Novo Horizonte" - }, - "292305": { - "latitude": -10.36133589, - "longitude": -38.4564416, - "name": "Novo Triunfo" - }, - "292310": { - "latitude": -11.43491138, - "longitude": -38.35479155, - "name": "Olindina" - }, - "292320": { - "latitude": -12.28335507, - "longitude": -42.734881, - "name": "Oliveira dos Brejinhos" - }, - "292330": { - "latitude": -12.00933564, - "longitude": -38.65367334, - "name": "Ouriçangas" - }, - "292335": { - "latitude": -10.84791064, - "longitude": -41.13709066, - "name": "Ourolândia" - }, - "292340": { - "latitude": -14.17521623, - "longitude": -43.21760646, - "name": "Palmas de Monte Alto" - }, - "292350": { - "latitude": -12.55242901, - "longitude": -41.55392193, - "name": "Palmeiras" - }, - "292360": { - "latitude": -13.51965642, - "longitude": -42.24035943, - "name": "Paramirim" - }, - "292370": { - "latitude": -12.69066926, - "longitude": -43.06449553, - "name": "Paratinga" - }, - "292380": { - "latitude": -10.61427372, - "longitude": -37.89916066, - "name": "Paripiranga" - }, - "292390": { - "latitude": -15.46828485, - "longitude": -39.69047435, - "name": "Pau Brasil" - }, - "292400": { - "latitude": -9.539578661, - "longitude": -38.29368433, - "name": "Paulo Afonso" - }, - "292405": { - "latitude": -11.87203537, - "longitude": -39.60967731, - "name": "Pé de Serra" - }, - "292410": { - "latitude": -12.12957033, - "longitude": -38.64054449, - "name": "Pedrão" - }, - "292420": { - "latitude": -10.06217983, - "longitude": -37.94067998, - "name": "Pedro Alexandre" - }, - "292430": { - "latitude": -13.04604016, - "longitude": -41.877448, - "name": "Piatã" - }, - "292440": { - "latitude": -10.0077734, - "longitude": -43.11516909, - "name": "Pilão Arcado" - }, - "292450": { - "latitude": -14.47161768, - "longitude": -42.67856768, - "name": "Pindaí" - }, - "292460": { - "latitude": -10.72387021, - "longitude": -40.34097083, - "name": "Pindobaçu" - }, - "292465": { - "latitude": -11.86887424, - "longitude": -39.89797874, - "name": "Pintadas" - }, - "292467": { - "latitude": -13.80544455, - "longitude": -39.37685129, - "name": "Piraí do Norte" - }, - "292470": { - "latitude": -15.00390153, - "longitude": -41.71610691, - "name": "Piripá" - }, - "292480": { - "latitude": -11.69495559, - "longitude": -40.60537818, - "name": "Piritiba" - }, - "292490": { - "latitude": -13.18648612, - "longitude": -40.30319834, - "name": "Planaltino" - }, - "292500": { - "latitude": -14.70857849, - "longitude": -40.45738666, - "name": "Planalto" - }, - "292510": { - "latitude": -14.53648318, - "longitude": -40.38261383, - "name": "Poções" - }, - "292520": { - "latitude": -12.36173422, - "longitude": -38.25296367, - "name": "Pojuca" - }, - "292525": { - "latitude": -10.95892461, - "longitude": -40.1057109, - "name": "Ponto Novo" - }, - "292530": { - "latitude": -16.625013, - "longitude": -39.27910146, - "name": "Porto Seguro" - }, - "292540": { - "latitude": -15.68122286, - "longitude": -39.77207614, - "name": "Potiraguá" - }, - "292550": { - "latitude": -17.13035288, - "longitude": -39.35171897, - "name": "Prado" - }, - "292560": { - "latitude": -11.30339912, - "longitude": -41.99530965, - "name": "Presidente Dutra" - }, - "292570": { - "latitude": -14.69662893, - "longitude": -41.72586543, - "name": "Presidente Jânio Quadros" - }, - "292575": { - "latitude": -13.44922187, - "longitude": -39.41764655, - "name": "Presidente Tancredo Neves" - }, - "292580": { - "latitude": -11.05672418, - "longitude": -39.75245186, - "name": "Queimadas" - }, - "292590": { - "latitude": -10.7780788, - "longitude": -39.04978297, - "name": "Quijingue" - }, - "292593": { - "latitude": -11.39251489, - "longitude": -40.11861381, - "name": "Quixabeira" - }, - "292595": { - "latitude": -12.47873794, - "longitude": -39.57407858, - "name": "Rafael Jambeiro" - }, - "292600": { - "latitude": -9.594796245, - "longitude": -42.24525012, - "name": "Remanso" - }, - "292610": { - "latitude": -11.50304212, - "longitude": -39.41669533, - "name": "Retirolândia" - }, - "292620": { - "latitude": -11.62303999, - "longitude": -45.21763544, - "name": "Riachão das Neves" - }, - "292630": { - "latitude": -11.80101109, - "longitude": -39.42347462, - "name": "Riachão do Jacuípe" - }, - "292640": { - "latitude": -13.63317632, - "longitude": -43.0496938, - "name": "Riacho de Santana" - }, - "292650": { - "latitude": -10.9718215, - "longitude": -38.37912033, - "name": "Ribeira do Amparo" - }, - "292660": { - "latitude": -10.79192505, - "longitude": -38.54378035, - "name": "Ribeira do Pombal" - }, - "292665": { - "latitude": -15.42722405, - "longitude": -40.65184654, - "name": "Ribeirão do Largo" - }, - "292670": { - "latitude": -13.58161178, - "longitude": -41.74657659, - "name": "Rio de Contas" - }, - "292680": { - "latitude": -14.31025486, - "longitude": -42.08413646, - "name": "Rio do Antônio" - }, - "292690": { - "latitude": -13.1347555, - "longitude": -42.14771183, - "name": "Rio do Pires" - }, - "292700": { - "latitude": -11.54772952, - "longitude": -37.91273071, - "name": "Rio Real" - }, - "292710": { - "latitude": -9.183932981, - "longitude": -38.69246413, - "name": "Rodelas" - }, - "292720": { - "latitude": -12.24354929, - "longitude": -40.62965222, - "name": "Ruy Barbosa" - }, - "292730": { - "latitude": -12.88592769, - "longitude": -38.75911468, - "name": "Salinas da Margarida" - }, - "292740": { - "latitude": -12.87349062, - "longitude": -38.51471977, - "name": "Salvador" - }, - "292750": { - "latitude": -11.93943087, - "longitude": -38.98230902, - "name": "Santa Bárbara" - }, - "292760": { - "latitude": -9.769364812, - "longitude": -38.16941023, - "name": "Santa Brígida" - }, - "292770": { - "latitude": -16.2291785, - "longitude": -39.20095757, - "name": "Santa Cruz Cabrália" - }, - "292780": { - "latitude": -14.89168753, - "longitude": -39.81477291, - "name": "Santa Cruz da Vitória" - }, - "292790": { - "latitude": -13.28470631, - "longitude": -39.84880616, - "name": "Santa Inês" - }, - "292800": { - "latitude": -11.2202356, - "longitude": -39.48523546, - "name": "Santaluz" - }, - "292805": { - "latitude": -15.44821443, - "longitude": -39.244959, - "name": "Santa Luzia" - }, - "292810": { - "latitude": -13.21835034, - "longitude": -44.37997897, - "name": "Santa Maria da Vitória" - }, - "292820": { - "latitude": -13.06565684, - "longitude": -43.94238278, - "name": "Santana" - }, - "292830": { - "latitude": -11.97517244, - "longitude": -38.8622593, - "name": "Santanópolis" - }, - "292840": { - "latitude": -11.0079869, - "longitude": -44.55580923, - "name": "Santa Rita de Cássia" - }, - "292850": { - "latitude": -12.73416201, - "longitude": -39.57174127, - "name": "Santa Terezinha" - }, - "292860": { - "latitude": -12.56182477, - "longitude": -38.76439117, - "name": "Santo Amaro" - }, - "292870": { - "latitude": -13.00829662, - "longitude": -39.2266213, - "name": "Santo Antônio de Jesus" - }, - "292880": { - "latitude": -12.46833554, - "longitude": -39.2690115, - "name": "Santo Estêvão" - }, - "292890": { - "latitude": -12.80236281, - "longitude": -45.49257917, - "name": "São Desidério" - }, - "292895": { - "latitude": -11.45435514, - "longitude": -39.58038849, - "name": "São Domingos" - }, - "292900": { - "latitude": -12.67504217, - "longitude": -38.99902623, - "name": "São Félix" - }, - "292905": { - "latitude": -13.55160442, - "longitude": -44.02978533, - "name": "São Félix do Coribe" - }, - "292910": { - "latitude": -12.84531178, - "longitude": -39.09466166, - "name": "São Felipe" - }, - "292920": { - "latitude": -12.65083599, - "longitude": -38.63197513, - "name": "São Francisco do Conde" - }, - "292925": { - "latitude": -11.06644806, - "longitude": -41.69825347, - "name": "São Gabriel" - }, - "292930": { - "latitude": -12.41717748, - "longitude": -38.94137439, - "name": "São Gonçalo dos Campos" - }, - "292935": { - "latitude": -15.07344826, - "longitude": -39.35379492, - "name": "São José da Vitória" - }, - "292937": { - "latitude": -11.44004917, - "longitude": -39.91034103, - "name": "São José do Jacuípe" - }, - "292940": { - "latitude": -13.05413278, - "longitude": -39.42333852, - "name": "São Miguel das Matas" - }, - "292950": { - "latitude": -12.5171792, - "longitude": -38.49824802, - "name": "São Sebastião do Passé" - }, - "292960": { - "latitude": -12.7258944, - "longitude": -39.21286938, - "name": "Sapeaçu" - }, - "292970": { - "latitude": -11.57252172, - "longitude": -38.59006282, - "name": "Sátiro Dias" - }, - "292975": { - "latitude": -12.77537389, - "longitude": -38.76932783, - "name": "Saubara" - }, - "292980": { - "latitude": -10.91253407, - "longitude": -40.381343, - "name": "Saúde" - }, - "292990": { - "latitude": -12.41769789, - "longitude": -41.88475528, - "name": "Seabra" - }, - "293000": { - "latitude": -14.57340935, - "longitude": -43.12728489, - "name": "Sebastião Laranjeiras" - }, - "293010": { - "latitude": -10.48416316, - "longitude": -40.11524319, - "name": "Senhor do Bonfim" - }, - "293015": { - "latitude": -13.48419466, - "longitude": -43.67633848, - "name": "Serra do Ramalho" - }, - "293020": { - "latitude": -10.10805556, - "longitude": -41.64882716, - "name": "Sento Sé" - }, - "293030": { - "latitude": -12.80626877, - "longitude": -43.79759104, - "name": "Serra Dourada" - }, - "293040": { - "latitude": -12.09538317, - "longitude": -39.37858678, - "name": "Serra Preta" - }, - "293050": { - "latitude": -11.66566746, - "longitude": -38.99379046, - "name": "Serrinha" - }, - "293060": { - "latitude": -11.42902229, - "longitude": -40.26088298, - "name": "Serrolândia" - }, - "293070": { - "latitude": -12.76767325, - "longitude": -38.40069069, - "name": "Simões Filho" - }, - "293075": { - "latitude": -12.85522033, - "longitude": -43.47499493, - "name": "Sítio do Mato" - }, - "293076": { - "latitude": -10.32972935, - "longitude": -38.15162696, - "name": "Sítio do Quinto" - }, - "293077": { - "latitude": -9.656993265, - "longitude": -40.88325451, - "name": "Sobradinho" - }, - "293080": { - "latitude": -12.02761999, - "longitude": -41.78961447, - "name": "Souto Soares" - }, - "293090": { - "latitude": -12.47985519, - "longitude": -44.15564841, - "name": "Tabocas do Brejo Velho" - }, - "293100": { - "latitude": -14.14596446, - "longitude": -41.19541233, - "name": "Tanhaçu" - }, - "293105": { - "latitude": -13.55604247, - "longitude": -42.53753605, - "name": "Tanque Novo" - }, - "293110": { - "latitude": -11.95834022, - "longitude": -39.09425523, - "name": "Tanquinho" - }, - "293120": { - "latitude": -13.57293433, - "longitude": -39.22780651, - "name": "Taperoá" - }, - "293130": { - "latitude": -11.87617004, - "longitude": -40.79136235, - "name": "Tapiramutá" - }, - "293135": { - "latitude": -17.42409816, - "longitude": -39.78688071, - "name": "Teixeira de Freitas" - }, - "293140": { - "latitude": -12.26730167, - "longitude": -38.61512545, - "name": "Teodoro Sampaio" - }, - "293150": { - "latitude": -11.47075133, - "longitude": -38.95098864, - "name": "Teofilândia" - }, - "293160": { - "latitude": -13.55443287, - "longitude": -39.49748273, - "name": "Teolândia" - }, - "293170": { - "latitude": -12.39642008, - "longitude": -38.60232322, - "name": "Terra Nova" - }, - "293180": { - "latitude": -15.05355957, - "longitude": -41.47196649, - "name": "Tremedal" - }, - "293190": { - "latitude": -11.0349832, - "longitude": -38.81148252, - "name": "Tucano" - }, - "293200": { - "latitude": -9.906222748, - "longitude": -39.46225595, - "name": "Uauá" - }, - "293210": { - "latitude": -13.27597712, - "longitude": -39.67932012, - "name": "Ubaíra" - }, - "293220": { - "latitude": -14.26753825, - "longitude": -39.42181067, - "name": "Ubaitaba" - }, - "293230": { - "latitude": -14.09641608, - "longitude": -39.52185273, - "name": "Ubatã" - }, - "293240": { - "latitude": -11.37992798, - "longitude": -42.10398786, - "name": "Uibaí" - }, - "293245": { - "latitude": -10.57584912, - "longitude": -41.24686304, - "name": "Umburanas" - }, - "293250": { - "latitude": -15.21914489, - "longitude": -39.15139518, - "name": "Una" - }, - "293260": { - "latitude": -14.73656167, - "longitude": -42.68400783, - "name": "Urandi" - }, - "293270": { - "latitude": -14.5274078, - "longitude": -39.23158103, - "name": "Uruçuca" - }, - "293280": { - "latitude": -12.05217312, - "longitude": -41.06896884, - "name": "Utinga" - }, - "293290": { - "latitude": -13.34744324, - "longitude": -39.1939508, - "name": "Valença" - }, - "293300": { - "latitude": -11.37675418, - "longitude": -39.44969313, - "name": "Valente" - }, - "293305": { - "latitude": -11.59845477, - "longitude": -40.06670327, - "name": "Várzea da Roça" - }, - "293310": { - "latitude": -11.54110283, - "longitude": -40.31568249, - "name": "Várzea do Poço" - }, - "293315": { - "latitude": -11.1230512, - "longitude": -41.01991831, - "name": "Várzea Nova" - }, - "293317": { - "latitude": -12.95656884, - "longitude": -39.39175441, - "name": "Varzedo" - }, - "293320": { - "latitude": -13.00714862, - "longitude": -38.69696624, - "name": "Vera Cruz" - }, - "293325": { - "latitude": -17.18912992, - "longitude": -39.9601021, - "name": "Vereda" - }, - "293330": { - "latitude": -15.02228444, - "longitude": -40.91316377, - "name": "Vitória da Conquista" - }, - "293340": { - "latitude": -12.23138204, - "longitude": -41.14597386, - "name": "Wagner" - }, - "293345": { - "latitude": -11.80892295, - "longitude": -43.90674193, - "name": "Wanderley" - }, - "293350": { - "latitude": -13.62855047, - "longitude": -39.61925394, - "name": "Wenceslau Guimarães" - }, - "293360": { - "latitude": -10.98426178, - "longitude": -42.78013269, - "name": "Xique-Xique" - }, - "310010": { - "latitude": -18.35331215, - "longitude": -47.45899744, - "name": "Abadia dos Dourados" - }, - "310020": { - "latitude": -19.1027485, - "longitude": -45.35867496, - "name": "Abaeté" - }, - "310030": { - "latitude": -20.27317185, - "longitude": -42.44263431, - "name": "Abre Campo" - }, - "310040": { - "latitude": -20.39983201, - "longitude": -43.10120204, - "name": "Acaiaca" - }, - "310050": { - "latitude": -19.05263503, - "longitude": -42.45074355, - "name": "Açucena" - }, - "310060": { - "latitude": -18.02726478, - "longitude": -42.27593246, - "name": "Água Boa" - }, - "310070": { - "latitude": -20.00544892, - "longitude": -48.08420561, - "name": "Água Comprida" - }, - "310080": { - "latitude": -20.97377893, - "longitude": -45.42202415, - "name": "Aguanil" - }, - "310090": { - "latitude": -17.04164348, - "longitude": -40.97390488, - "name": "Águas Formosas" - }, - "310100": { - "latitude": -15.68315504, - "longitude": -41.52151132, - "name": "Águas Vermelhas" - }, - "310110": { - "latitude": -19.62517584, - "longitude": -41.21394044, - "name": "Aimorés" - }, - "310120": { - "latitude": -21.95461207, - "longitude": -44.64758707, - "name": "Aiuruoca" - }, - "310130": { - "latitude": -22.18662002, - "longitude": -44.66063442, - "name": "Alagoa" - }, - "310140": { - "latitude": -22.19853993, - "longitude": -46.61370278, - "name": "Albertina" - }, - "310150": { - "latitude": -21.82644874, - "longitude": -42.74646414, - "name": "Além Paraíba" - }, - "310160": { - "latitude": -21.38868871, - "longitude": -45.96625034, - "name": "Alfenas" - }, - "310163": { - "latitude": -21.13904298, - "longitude": -43.71250984, - "name": "Alfredo Vasconcelos" - }, - "310170": { - "latitude": -16.09108043, - "longitude": -40.7237755, - "name": "Almenara" - }, - "310180": { - "latitude": -18.98374295, - "longitude": -42.01920398, - "name": "Alpercata" - }, - "310190": { - "latitude": -20.85952852, - "longitude": -46.37615822, - "name": "Alpinópolis" - }, - "310200": { - "latitude": -21.22521457, - "longitude": -46.15360471, - "name": "Alterosa" - }, - "310205": { - "latitude": -20.45842502, - "longitude": -41.86489564, - "name": "Alto Caparaó" - }, - "310210": { - "latitude": -21.0357605, - "longitude": -43.40339854, - "name": "Alto Rio Doce" - }, - "310220": { - "latitude": -19.41994518, - "longitude": -41.69543537, - "name": "Alvarenga" - }, - "310230": { - "latitude": -20.11181054, - "longitude": -43.15250858, - "name": "Alvinópolis" - }, - "310240": { - "latitude": -18.77901915, - "longitude": -43.36759913, - "name": "Alvorada de Minas" - }, - "310250": { - "latitude": -20.52818166, - "longitude": -42.80493421, - "name": "Amparo do Serra" - }, - "310260": { - "latitude": -22.0757692, - "longitude": -46.55475276, - "name": "Andradas" - }, - "310270": { - "latitude": -15.96851178, - "longitude": -41.49800141, - "name": "Cachoeira de Pajeú" - }, - "310280": { - "latitude": -21.7388562, - "longitude": -44.26970225, - "name": "Andrelândia" - }, - "310285": { - "latitude": -17.70324051, - "longitude": -42.28283508, - "name": "Angelândia" - }, - "310290": { - "latitude": -21.41058701, - "longitude": -43.76633244, - "name": "Antônio Carlos" - }, - "310300": { - "latitude": -19.56706586, - "longitude": -42.87635743, - "name": "Antônio Dias" - }, - "310310": { - "latitude": -21.02254298, - "longitude": -42.1520211, - "name": "Antônio Prado de Minas" - }, - "310320": { - "latitude": -19.23484196, - "longitude": -44.21844392, - "name": "Araçaí" - }, - "310330": { - "latitude": -21.3503348, - "longitude": -43.4037571, - "name": "Aracitaba" - }, - "310340": { - "latitude": -16.93078159, - "longitude": -41.99317481, - "name": "Araçuaí" - }, - "310350": { - "latitude": -18.57711347, - "longitude": -48.2220474, - "name": "Araguari" - }, - "310360": { - "latitude": -21.89692724, - "longitude": -44.2271778, - "name": "Arantina" - }, - "310370": { - "latitude": -20.66279187, - "longitude": -42.49884974, - "name": "Araponga" - }, - "310375": { - "latitude": -18.47737567, - "longitude": -49.12724679, - "name": "Araporã" - }, - "310380": { - "latitude": -19.04145236, - "longitude": -46.11529046, - "name": "Arapuá" - }, - "310390": { - "latitude": -19.88641289, - "longitude": -45.18096748, - "name": "Araújos" - }, - "310400": { - "latitude": -19.63639708, - "longitude": -46.97214598, - "name": "Araxá" - }, - "310410": { - "latitude": -21.35947079, - "longitude": -46.9419397, - "name": "Arceburgo" - }, - "310420": { - "latitude": -20.25971347, - "longitude": -45.54724573, - "name": "Arcos" - }, - "310430": { - "latitude": -21.35601965, - "longitude": -46.14227248, - "name": "Areado" - }, - "310440": { - "latitude": -21.63531775, - "longitude": -42.83259046, - "name": "Argirita" - }, - "310445": { - "latitude": -17.88110372, - "longitude": -42.60556237, - "name": "Aricanduva" - }, - "310450": { - "latitude": -15.75068603, - "longitude": -45.98857487, - "name": "Arinos" - }, - "310460": { - "latitude": -21.31549407, - "longitude": -42.87931946, - "name": "Astolfo Dutra" - }, - "310470": { - "latitude": -18.16337431, - "longitude": -41.15148761, - "name": "Ataléia" - }, - "310480": { - "latitude": -18.10883966, - "longitude": -44.19805732, - "name": "Augusto de Lima" - }, - "310490": { - "latitude": -22.01683618, - "longitude": -44.82211664, - "name": "Baependi" - }, - "310500": { - "latitude": -19.26293632, - "longitude": -43.86341575, - "name": "Baldim" - }, - "310510": { - "latitude": -20.11095463, - "longitude": -45.99887601, - "name": "Bambuí" - }, - "310520": { - "latitude": -15.87767718, - "longitude": -40.58096904, - "name": "Bandeira" - }, - "310530": { - "latitude": -21.72413285, - "longitude": -46.38489757, - "name": "Bandeira do Sul" - }, - "310540": { - "latitude": -19.89166106, - "longitude": -43.49552309, - "name": "Barão de Cocais" - }, - "310550": { - "latitude": -21.26478717, - "longitude": -42.27843294, - "name": "Barão de Monte Alto" - }, - "310560": { - "latitude": -21.25151403, - "longitude": -43.800626, - "name": "Barbacena" - }, - "310570": { - "latitude": -20.27563487, - "longitude": -43.06620083, - "name": "Barra Longa" - }, - "310590": { - "latitude": -21.18322906, - "longitude": -43.95781717, - "name": "Barroso" - }, - "310600": { - "latitude": -19.79803628, - "longitude": -43.10558763, - "name": "Bela Vista de Minas" - }, - "310610": { - "latitude": -21.98580525, - "longitude": -43.46873335, - "name": "Belmiro Braga" - }, - "310620": { - "latitude": -19.90268448, - "longitude": -43.95998317, - "name": "Belo Horizonte" - }, - "310630": { - "latitude": -19.25941639, - "longitude": -42.45041745, - "name": "Belo Oriente" - }, - "310640": { - "latitude": -20.42473845, - "longitude": -44.05998862, - "name": "Belo Vale" - }, - "310650": { - "latitude": -16.86237593, - "longitude": -42.49428875, - "name": "Berilo" - }, - "310660": { - "latitude": -16.97453023, - "longitude": -40.57424382, - "name": "Bertópolis" - }, - "310665": { - "latitude": -15.68411639, - "longitude": -41.7617582, - "name": "Berizal" - }, - "310670": { - "latitude": -19.94746525, - "longitude": -44.19911369, - "name": "Betim" - }, - "310680": { - "latitude": -21.62469089, - "longitude": -43.77367424, - "name": "Bias Fortes" - }, - "310690": { - "latitude": -21.73151177, - "longitude": -43.10480191, - "name": "Bicas" - }, - "310700": { - "latitude": -18.75714435, - "longitude": -45.53951324, - "name": "Biquinhas" - }, - "310710": { - "latitude": -21.04856081, - "longitude": -45.62114648, - "name": "Boa Esperança" - }, - "310720": { - "latitude": -22.21571649, - "longitude": -44.48275882, - "name": "Bocaina de Minas" - }, - "310730": { - "latitude": -17.289724, - "longitude": -43.68653789, - "name": "Bocaiúva" - }, - "310740": { - "latitude": -19.68451879, - "longitude": -45.28611537, - "name": "Bom Despacho" - }, - "310750": { - "latitude": -21.95006149, - "longitude": -44.12696424, - "name": "Bom Jardim de Minas" - }, - "310760": { - "latitude": -21.01376369, - "longitude": -46.52905405, - "name": "Bom Jesus da Penha" - }, - "310770": { - "latitude": -19.71766745, - "longitude": -43.46864167, - "name": "Bom Jesus do Amparo" - }, - "310780": { - "latitude": -19.74230905, - "longitude": -42.35104109, - "name": "Bom Jesus do Galho" - }, - "310790": { - "latitude": -22.44580949, - "longitude": -46.18439035, - "name": "Bom Repouso" - }, - "310800": { - "latitude": -21.02636225, - "longitude": -44.78417614, - "name": "Bom Sucesso" - }, - "310810": { - "latitude": -20.32145029, - "longitude": -44.21475916, - "name": "Bonfim" - }, - "310820": { - "latitude": -16.48635199, - "longitude": -46.19038948, - "name": "Bonfinópolis de Minas" - }, - "310825": { - "latitude": -14.99276502, - "longitude": -44.89675539, - "name": "Bonito de Minas" - }, - "310830": { - "latitude": -22.25655405, - "longitude": -46.15178475, - "name": "Borda da Mata" - }, - "310840": { - "latitude": -21.63637397, - "longitude": -46.41944725, - "name": "Botelhos" - }, - "310850": { - "latitude": -16.93784935, - "longitude": -43.00563895, - "name": "Botumirim" - }, - "310855": { - "latitude": -16.9569834, - "longitude": -45.90247806, - "name": "Brasilândia de Minas" - }, - "310860": { - "latitude": -16.24270599, - "longitude": -44.43912083, - "name": "Brasília de Minas" - }, - "310870": { - "latitude": -20.87512416, - "longitude": -43.22745051, - "name": "Brás Pires" - }, - "310880": { - "latitude": -19.0257255, - "longitude": -42.7164296, - "name": "Braúnas" - }, - "310890": { - "latitude": -22.49116963, - "longitude": -45.62792745, - "name": "Brazópolis" - }, - "310900": { - "latitude": -20.17782602, - "longitude": -44.12267573, - "name": "Brumadinho" - }, - "310910": { - "latitude": -22.48608808, - "longitude": -46.35525244, - "name": "Bueno Brandão" - }, - "310920": { - "latitude": -17.88052016, - "longitude": -44.04138025, - "name": "Buenópolis" - }, - "310925": { - "latitude": -19.35767301, - "longitude": -42.31099999, - "name": "Bugre" - }, - "310930": { - "latitude": -15.45317171, - "longitude": -46.60436827, - "name": "Buritis" - }, - "310940": { - "latitude": -17.28605334, - "longitude": -45.19181003, - "name": "Buritizeiro" - }, - "310945": { - "latitude": -16.07619318, - "longitude": -47.1236982, - "name": "Cabeceira Grande" - }, - "310950": { - "latitude": -21.48156601, - "longitude": -46.39149019, - "name": "Cabo Verde" - }, - "310960": { - "latitude": -19.51697946, - "longitude": -44.47200805, - "name": "Cachoeira da Prata" - }, - "310970": { - "latitude": -22.36245025, - "longitude": -45.79280071, - "name": "Cachoeira de Minas" - }, - "310980": { - "latitude": -18.60733105, - "longitude": -49.47892003, - "name": "Cachoeira Dourada" - }, - "310990": { - "latitude": -19.34251063, - "longitude": -44.40344058, - "name": "Caetanópolis" - }, - "311000": { - "latitude": -19.86777188, - "longitude": -43.63688708, - "name": "Caeté" - }, - "311010": { - "latitude": -20.72531025, - "longitude": -41.90841545, - "name": "Caiana" - }, - "311020": { - "latitude": -20.78530735, - "longitude": -42.76415307, - "name": "Cajuri" - }, - "311030": { - "latitude": -21.89080254, - "longitude": -46.36371071, - "name": "Caldas" - }, - "311040": { - "latitude": -20.64084112, - "longitude": -45.132175, - "name": "Camacho" - }, - "311050": { - "latitude": -22.78686667, - "longitude": -46.07478095, - "name": "Camanducaia" - }, - "311060": { - "latitude": -22.58271051, - "longitude": -46.07833463, - "name": "Cambuí" - }, - "311070": { - "latitude": -21.85895443, - "longitude": -45.26183495, - "name": "Cambuquira" - }, - "311080": { - "latitude": -18.28396853, - "longitude": -41.73441831, - "name": "Campanário" - }, - "311090": { - "latitude": -21.84390633, - "longitude": -45.40845081, - "name": "Campanha" - }, - "311100": { - "latitude": -21.71040437, - "longitude": -46.22148744, - "name": "Campestre" - }, - "311110": { - "latitude": -19.47913007, - "longitude": -49.81000646, - "name": "Campina Verde" - }, - "311115": { - "latitude": -16.50875053, - "longitude": -44.76332142, - "name": "Campo Azul" - }, - "311120": { - "latitude": -20.91968015, - "longitude": -45.2559007, - "name": "Campo Belo" - }, - "311130": { - "latitude": -21.11360312, - "longitude": -45.84963809, - "name": "Campo do Meio" - }, - "311140": { - "latitude": -19.71341321, - "longitude": -48.64783662, - "name": "Campo Florido" - }, - "311150": { - "latitude": -19.6048577, - "longitude": -46.19705127, - "name": "Campos Altos" - }, - "311160": { - "latitude": -21.25884828, - "longitude": -45.75358675, - "name": "Campos Gerais" - }, - "311170": { - "latitude": -20.66679958, - "longitude": -42.62183372, - "name": "Canaã" - }, - "311180": { - "latitude": -18.75789783, - "longitude": -49.27187534, - "name": "Canápolis" - }, - "311190": { - "latitude": -21.03311089, - "longitude": -45.1857072, - "name": "Cana Verde" - }, - "311200": { - "latitude": -20.74849574, - "longitude": -45.27957827, - "name": "Candeias" - }, - "311205": { - "latitude": -18.51613227, - "longitude": -42.64869706, - "name": "Cantagalo" - }, - "311210": { - "latitude": -20.52721419, - "longitude": -41.94950688, - "name": "Caparaó" - }, - "311220": { - "latitude": -20.91733486, - "longitude": -43.60860993, - "name": "Capela Nova" - }, - "311230": { - "latitude": -17.69287311, - "longitude": -42.49195886, - "name": "Capelinha" - }, - "311240": { - "latitude": -20.65729404, - "longitude": -47.03178981, - "name": "Capetinga" - }, - "311250": { - "latitude": -19.57006402, - "longitude": -44.16769927, - "name": "Capim Branco" - }, - "311260": { - "latitude": -18.68722867, - "longitude": -49.58158883, - "name": "Capinópolis" - }, - "311265": { - "latitude": -19.05119749, - "longitude": -41.82215918, - "name": "Capitão Andrade" - }, - "311270": { - "latitude": -16.13624218, - "longitude": -43.66465968, - "name": "Capitão Enéas" - }, - "311280": { - "latitude": -20.61265686, - "longitude": -46.1441918, - "name": "Capitólio" - }, - "311290": { - "latitude": -20.17647885, - "longitude": -42.25230996, - "name": "Caputira" - }, - "311300": { - "latitude": -17.17358061, - "longitude": -41.58352186, - "name": "Caraí" - }, - "311310": { - "latitude": -20.89121068, - "longitude": -43.72070321, - "name": "Caranaíba" - }, - "311320": { - "latitude": -20.99668155, - "longitude": -43.84434061, - "name": "Carandaí" - }, - "311330": { - "latitude": -20.70265764, - "longitude": -42.08752183, - "name": "Carangola" - }, - "311340": { - "latitude": -19.71213003, - "longitude": -42.10195601, - "name": "Caratinga" - }, - "311350": { - "latitude": -17.49413005, - "longitude": -43.05771165, - "name": "Carbonita" - }, - "311360": { - "latitude": -22.07861996, - "longitude": -45.66441935, - "name": "Careaçu" - }, - "311370": { - "latitude": -17.67417994, - "longitude": -40.84200604, - "name": "Carlos Chagas" - }, - "311380": { - "latitude": -19.0603465, - "longitude": -43.17444067, - "name": "Carmésia" - }, - "311390": { - "latitude": -21.45396371, - "longitude": -45.19643413, - "name": "Carmo da Cachoeira" - }, - "311400": { - "latitude": -20.55967194, - "longitude": -44.8918238, - "name": "Carmo da Mata" - }, - "311410": { - "latitude": -22.09199828, - "longitude": -45.16150913, - "name": "Carmo de Minas" - }, - "311420": { - "latitude": -20.19647649, - "longitude": -44.70114995, - "name": "Carmo do Cajuru" - }, - "311430": { - "latitude": -18.90766144, - "longitude": -46.1851847, - "name": "Carmo do Paranaíba" - }, - "311440": { - "latitude": -20.97210382, - "longitude": -46.09910124, - "name": "Carmo do Rio Claro" - }, - "311450": { - "latitude": -20.5619105, - "longitude": -44.64785665, - "name": "Carmópolis de Minas" - }, - "311455": { - "latitude": -19.75024021, - "longitude": -50.82981828, - "name": "Carneirinho" - }, - "311460": { - "latitude": -21.49635338, - "longitude": -44.61208272, - "name": "Carrancas" - }, - "311470": { - "latitude": -21.77281833, - "longitude": -45.83051427, - "name": "Carvalhópolis" - }, - "311480": { - "latitude": -22.02256039, - "longitude": -44.48860863, - "name": "Carvalhos" - }, - "311490": { - "latitude": -20.8361857, - "longitude": -43.93801736, - "name": "Casa Grande" - }, - "311500": { - "latitude": -18.56864457, - "longitude": -47.87695546, - "name": "Cascalho Rico" - }, - "311510": { - "latitude": -20.5425925, - "longitude": -46.92900699, - "name": "Cássia" - }, - "311520": { - "latitude": -21.14510267, - "longitude": -44.49307409, - "name": "Conceição da Barra de Minas" - }, - "311530": { - "latitude": -21.34241486, - "longitude": -42.67405707, - "name": "Cataguases" - }, - "311535": { - "latitude": -20.07548972, - "longitude": -43.40778711, - "name": "Catas Altas" - }, - "311540": { - "latitude": -20.66958476, - "longitude": -43.49997697, - "name": "Catas Altas da Noruega" - }, - "311545": { - "latitude": -17.37174716, - "longitude": -41.49847714, - "name": "Catuji" - }, - "311547": { - "latitude": -15.33564624, - "longitude": -43.09741108, - "name": "Catuti" - }, - "311550": { - "latitude": -21.97763184, - "longitude": -44.94728568, - "name": "Caxambu" - }, - "311560": { - "latitude": -19.12089521, - "longitude": -45.69862622, - "name": "Cedro do Abaeté" - }, - "311570": { - "latitude": -18.76843419, - "longitude": -41.29486248, - "name": "Central de Minas" - }, - "311580": { - "latitude": -18.63254451, - "longitude": -49.16251488, - "name": "Centralina" - }, - "311590": { - "latitude": -21.68663877, - "longitude": -43.21321474, - "name": "Chácara" - }, - "311600": { - "latitude": -20.03097781, - "longitude": -41.65978352, - "name": "Chalé" - }, - "311610": { - "latitude": -17.14736476, - "longitude": -42.41215628, - "name": "Chapada do Norte" - }, - "311615": { - "latitude": -15.46937968, - "longitude": -45.45857052, - "name": "Chapada Gaúcha" - }, - "311620": { - "latitude": -22.00299174, - "longitude": -43.02965711, - "name": "Chiador" - }, - "311630": { - "latitude": -20.92398834, - "longitude": -43.35816488, - "name": "Cipotânea" - }, - "311640": { - "latitude": -20.36937887, - "longitude": -47.23949729, - "name": "Claraval" - }, - "311650": { - "latitude": -17.06871303, - "longitude": -44.22812729, - "name": "Claro dos Poções" - }, - "311660": { - "latitude": -20.39739801, - "longitude": -44.77594199, - "name": "Cláudio" - }, - "311670": { - "latitude": -20.84383047, - "longitude": -42.79149284, - "name": "Coimbra" - }, - "311680": { - "latitude": -18.24800166, - "longitude": -42.8393951, - "name": "Coluna" - }, - "311690": { - "latitude": -19.67218342, - "longitude": -49.07093063, - "name": "Comendador Gomes" - }, - "311700": { - "latitude": -16.28500788, - "longitude": -41.76749624, - "name": "Comercinho" - }, - "311710": { - "latitude": -21.09695833, - "longitude": -46.22593566, - "name": "Conceição da Aparecida" - }, - "311720": { - "latitude": -22.14698613, - "longitude": -45.42518181, - "name": "Conceição das Pedras" - }, - "311730": { - "latitude": -19.95975804, - "longitude": -48.36147835, - "name": "Conceição das Alagoas" - }, - "311740": { - "latitude": -19.91352043, - "longitude": -41.68672727, - "name": "Conceição de Ipanema" - }, - "311750": { - "latitude": -18.93696328, - "longitude": -43.50788958, - "name": "Conceição do Mato Dentro" - }, - "311760": { - "latitude": -19.78566483, - "longitude": -44.87173355, - "name": "Conceição do Pará" - }, - "311770": { - "latitude": -21.89732309, - "longitude": -45.09082316, - "name": "Conceição do Rio Verde" - }, - "311780": { - "latitude": -22.44773567, - "longitude": -45.77507096, - "name": "Conceição dos Ouros" - }, - "311783": { - "latitude": -14.98468851, - "longitude": -44.59639603, - "name": "Cônego Marinho" - }, - "311787": { - "latitude": -19.64212663, - "longitude": -43.97496043, - "name": "Confins" - }, - "311790": { - "latitude": -22.14338119, - "longitude": -46.04137599, - "name": "Congonhal" - }, - "311800": { - "latitude": -20.51610695, - "longitude": -43.86162577, - "name": "Congonhas" - }, - "311810": { - "latitude": -18.86335684, - "longitude": -43.68716724, - "name": "Congonhas do Norte" - }, - "311820": { - "latitude": -19.88357759, - "longitude": -47.6238897, - "name": "Conquista" - }, - "311830": { - "latitude": -20.66600844, - "longitude": -43.7886568, - "name": "Conselheiro Lafaiete" - }, - "311840": { - "latitude": -19.17019813, - "longitude": -41.45671796, - "name": "Conselheiro Pena" - }, - "311850": { - "latitude": -22.53645928, - "longitude": -45.91554507, - "name": "Consolação" - }, - "311860": { - "latitude": -19.88717723, - "longitude": -44.08400013, - "name": "Contagem" - }, - "311870": { - "latitude": -21.16904403, - "longitude": -45.41533764, - "name": "Coqueiral" - }, - "311880": { - "latitude": -16.61317065, - "longitude": -44.37875019, - "name": "Coração de Jesus" - }, - "311890": { - "latitude": -19.09209909, - "longitude": -44.20501817, - "name": "Cordisburgo" - }, - "311900": { - "latitude": -21.78193689, - "longitude": -45.66211206, - "name": "Cordislândia" - }, - "311910": { - "latitude": -18.33549067, - "longitude": -44.61752373, - "name": "Corinto" - }, - "311920": { - "latitude": -18.61693127, - "longitude": -42.26861135, - "name": "Coroaci" - }, - "311930": { - "latitude": -18.41308416, - "longitude": -47.13682198, - "name": "Coromandel" - }, - "311940": { - "latitude": -19.45858748, - "longitude": -42.68992505, - "name": "Coronel Fabriciano" - }, - "311950": { - "latitude": -16.59128437, - "longitude": -42.17630353, - "name": "Coronel Murta" - }, - "311960": { - "latitude": -21.60466821, - "longitude": -43.29309553, - "name": "Coronel Pacheco" - }, - "311970": { - "latitude": -21.0246633, - "longitude": -44.19662415, - "name": "Coronel Xavier Chaves" - }, - "311980": { - "latitude": -19.78158456, - "longitude": -45.98288237, - "name": "Córrego Danta" - }, - "311990": { - "latitude": -22.63445638, - "longitude": -45.99317402, - "name": "Córrego do Bom Jesus" - }, - "311995": { - "latitude": -20.45082015, - "longitude": -45.53212927, - "name": "Córrego Fundo" - }, - "312000": { - "latitude": -19.83049884, - "longitude": -42.44572049, - "name": "Córrego Novo" - }, - "312010": { - "latitude": -18.08448575, - "longitude": -43.43981668, - "name": "Couto de Magalhães de Minas" - }, - "312015": { - "latitude": -17.24010187, - "longitude": -40.96148323, - "name": "Crisólita" - }, - "312020": { - "latitude": -20.81107772, - "longitude": -45.55739329, - "name": "Cristais" - }, - "312030": { - "latitude": -16.71863477, - "longitude": -42.82101616, - "name": "Cristália" - }, - "312040": { - "latitude": -20.83549154, - "longitude": -43.82689382, - "name": "Cristiano Otoni" - }, - "312050": { - "latitude": -22.20566515, - "longitude": -45.2894051, - "name": "Cristina" - }, - "312060": { - "latitude": -20.4040571, - "longitude": -44.35977107, - "name": "Crucilândia" - }, - "312070": { - "latitude": -18.97224646, - "longitude": -46.67617235, - "name": "Cruzeiro da Fortaleza" - }, - "312080": { - "latitude": -21.73068325, - "longitude": -44.79782459, - "name": "Cruzília" - }, - "312083": { - "latitude": -19.00929313, - "longitude": -41.12930981, - "name": "Cuparaque" - }, - "312087": { - "latitude": -15.86178304, - "longitude": -41.76481219, - "name": "Curral de Dentro" - }, - "312090": { - "latitude": -18.81990816, - "longitude": -44.44788539, - "name": "Curvelo" - }, - "312100": { - "latitude": -18.471115, - "longitude": -43.64766821, - "name": "Datas" - }, - "312110": { - "latitude": -22.5070725, - "longitude": -45.28780186, - "name": "Delfim Moreira" - }, - "312120": { - "latitude": -20.35671801, - "longitude": -46.77278206, - "name": "Delfinópolis" - }, - "312125": { - "latitude": -19.93607599, - "longitude": -47.80970733, - "name": "Delta" - }, - "312130": { - "latitude": -21.44676323, - "longitude": -42.96351124, - "name": "Descoberto" - }, - "312140": { - "latitude": -20.62973046, - "longitude": -44.2713486, - "name": "Desterro de Entre Rios" - }, - "312150": { - "latitude": -21.15065038, - "longitude": -43.51975664, - "name": "Desterro do Melo" - }, - "312160": { - "latitude": -17.99379131, - "longitude": -43.61079601, - "name": "Diamantina" - }, - "312170": { - "latitude": -20.48132367, - "longitude": -43.18388387, - "name": "Diogo de Vasconcelos" - }, - "312180": { - "latitude": -19.83681638, - "longitude": -42.67908808, - "name": "Dionísio" - }, - "312190": { - "latitude": -20.98791588, - "longitude": -42.99806116, - "name": "Divinésia" - }, - "312200": { - "latitude": -20.58999053, - "longitude": -42.17542423, - "name": "Divino" - }, - "312210": { - "latitude": -18.71245298, - "longitude": -41.50698845, - "name": "Divino das Laranjeiras" - }, - "312220": { - "latitude": -18.78226805, - "longitude": -42.57342224, - "name": "Divinolândia de Minas" - }, - "312230": { - "latitude": -20.12371589, - "longitude": -44.93069165, - "name": "Divinópolis" - }, - "312235": { - "latitude": -15.698673, - "longitude": -41.37406781, - "name": "Divisa Alegre" - }, - "312240": { - "latitude": -21.51791305, - "longitude": -46.24508203, - "name": "Divisa Nova" - }, - "312245": { - "latitude": -15.76288251, - "longitude": -40.9123119, - "name": "Divisópolis" - }, - "312247": { - "latitude": -16.74031808, - "longitude": -46.28992032, - "name": "Dom Bosco" - }, - "312250": { - "latitude": -19.38597153, - "longitude": -42.09123261, - "name": "Dom Cavati" - }, - "312260": { - "latitude": -18.9282841, - "longitude": -43.25924847, - "name": "Dom Joaquim" - }, - "312270": { - "latitude": -20.13464147, - "longitude": -42.94623027, - "name": "Dom Silvério" - }, - "312280": { - "latitude": -22.22856581, - "longitude": -45.14282641, - "name": "Dom Viçoso" - }, - "312290": { - "latitude": -21.33145158, - "longitude": -42.80105571, - "name": "Dona Euzébia" - }, - "312300": { - "latitude": -21.1001428, - "longitude": -43.98961393, - "name": "Dores de Campos" - }, - "312310": { - "latitude": -19.05401683, - "longitude": -42.93110947, - "name": "Dores de Guanhães" - }, - "312320": { - "latitude": -19.48965312, - "longitude": -45.5473282, - "name": "Dores do Indaiá" - }, - "312330": { - "latitude": -21.02391254, - "longitude": -43.1672163, - "name": "Dores do Turvo" - }, - "312340": { - "latitude": -20.29167909, - "longitude": -45.88705042, - "name": "Doresópolis" - }, - "312350": { - "latitude": -18.43736751, - "longitude": -47.60439265, - "name": "Douradoquara" - }, - "312352": { - "latitude": -20.14726564, - "longitude": -41.7954319, - "name": "Durandé" - }, - "312360": { - "latitude": -21.61236642, - "longitude": -45.5973298, - "name": "Elói Mendes" - }, - "312370": { - "latitude": -19.12801947, - "longitude": -42.01925614, - "name": "Engenheiro Caldas" - }, - "312380": { - "latitude": -17.29649082, - "longitude": -44.01403892, - "name": "Engenheiro Navarro" - }, - "312385": { - "latitude": -19.65521241, - "longitude": -42.24163135, - "name": "Entre Folhas" - }, - "312390": { - "latitude": -20.70515572, - "longitude": -44.09482344, - "name": "Entre Rios de Minas" - }, - "312400": { - "latitude": -20.84897319, - "longitude": -42.60063823, - "name": "Ervália" - }, - "312410": { - "latitude": -19.73299937, - "longitude": -44.30751902, - "name": "Esmeraldas" - }, - "312420": { - "latitude": -20.59728807, - "longitude": -41.92993748, - "name": "Espera Feliz" - }, - "312430": { - "latitude": -14.85902455, - "longitude": -42.965811, - "name": "Espinosa" - }, - "312440": { - "latitude": -22.00897266, - "longitude": -45.98677399, - "name": "Espírito Santo do Dourado" - }, - "312450": { - "latitude": -22.45827726, - "longitude": -46.01397647, - "name": "Estiva" - }, - "312460": { - "latitude": -21.70650292, - "longitude": -42.46708542, - "name": "Estrela Dalva" - }, - "312470": { - "latitude": -19.59187829, - "longitude": -45.8083171, - "name": "Estrela do Indaiá" - }, - "312480": { - "latitude": -18.71512952, - "longitude": -47.72642266, - "name": "Estrela do Sul" - }, - "312490": { - "latitude": -21.01402159, - "longitude": -42.22327997, - "name": "Eugenópolis" - }, - "312500": { - "latitude": -21.57505029, - "longitude": -43.5605499, - "name": "Ewbank da Câmara" - }, - "312510": { - "latitude": -22.82523246, - "longitude": -46.28965556, - "name": "Extrema" - }, - "312520": { - "latitude": -21.4652652, - "longitude": -45.81416879, - "name": "Fama" - }, - "312530": { - "latitude": -20.78117438, - "longitude": -42.03565526, - "name": "Faria Lemos" - }, - "312540": { - "latitude": -18.1331754, - "longitude": -43.23891924, - "name": "Felício dos Santos" - }, - "312550": { - "latitude": -18.07634488, - "longitude": -43.35850326, - "name": "São Gonçalo do Rio Preto" - }, - "312560": { - "latitude": -16.63606085, - "longitude": -40.73312735, - "name": "Felisburgo" - }, - "312570": { - "latitude": -18.70308887, - "longitude": -44.95819234, - "name": "Felixlândia" - }, - "312580": { - "latitude": -19.10190269, - "longitude": -42.09654813, - "name": "Fernandes Tourinho" - }, - "312590": { - "latitude": -19.24552492, - "longitude": -42.94015692, - "name": "Ferros" - }, - "312595": { - "latitude": -20.68071987, - "longitude": -42.34690421, - "name": "Fervedouro" - }, - "312600": { - "latitude": -19.86849195, - "longitude": -44.4421137, - "name": "Florestal" - }, - "312610": { - "latitude": -20.55368219, - "longitude": -45.51642844, - "name": "Formiga" - }, - "312620": { - "latitude": -15.12970035, - "longitude": -46.15848159, - "name": "Formoso" - }, - "312630": { - "latitude": -20.88788708, - "longitude": -46.77134317, - "name": "Fortaleza de Minas" - }, - "312640": { - "latitude": -19.55758007, - "longitude": -44.50424114, - "name": "Fortuna de Minas" - }, - "312650": { - "latitude": -16.97763084, - "longitude": -42.30984726, - "name": "Francisco Badaró" - }, - "312660": { - "latitude": -17.46980826, - "longitude": -44.26986007, - "name": "Francisco Dumont" - }, - "312670": { - "latitude": -16.39370032, - "longitude": -43.47896155, - "name": "Francisco Sá" - }, - "312675": { - "latitude": -17.99333487, - "longitude": -41.9679346, - "name": "Franciscópolis" - }, - "312680": { - "latitude": -18.13969207, - "longitude": -41.51067687, - "name": "Frei Gaspar" - }, - "312690": { - "latitude": -18.5197278, - "longitude": -41.87919047, - "name": "Frei Inocêncio" - }, - "312695": { - "latitude": -18.14340329, - "longitude": -42.75587253, - "name": "Frei Lagonegro" - }, - "312700": { - "latitude": -20.2285322, - "longitude": -49.15886485, - "name": "Fronteira" - }, - "312705": { - "latitude": -16.89386723, - "longitude": -40.83540982, - "name": "Fronteira dos Vales" - }, - "312707": { - "latitude": -16.12559625, - "longitude": -42.51994539, - "name": "Fruta de Leite" - }, - "312710": { - "latitude": -20.03572189, - "longitude": -49.0004596, - "name": "Frutal" - }, - "312720": { - "latitude": -19.36105131, - "longitude": -44.07410416, - "name": "Funilândia" - }, - "312730": { - "latitude": -18.88023097, - "longitude": -41.54514757, - "name": "Galiléia" - }, - "312733": { - "latitude": -14.97103278, - "longitude": -43.2596806, - "name": "Gameleiras" - }, - "312735": { - "latitude": -16.9038625, - "longitude": -43.6392749, - "name": "Glaucilândia" - }, - "312737": { - "latitude": -19.02193789, - "longitude": -41.23606638, - "name": "Goiabeira" - }, - "312738": { - "latitude": -21.5555475, - "longitude": -43.18927983, - "name": "Goianá" - }, - "312740": { - "latitude": -22.67302826, - "longitude": -45.82493666, - "name": "Gonçalves" - }, - "312750": { - "latitude": -18.87387061, - "longitude": -42.50509502, - "name": "Gonzaga" - }, - "312760": { - "latitude": -18.52352325, - "longitude": -43.83349413, - "name": "Gouveia" - }, - "312770": { - "latitude": -18.7834261, - "longitude": -41.96356024, - "name": "Governador Valadares" - }, - "312780": { - "latitude": -16.46390251, - "longitude": -42.99400417, - "name": "Grão Mogol" - }, - "312790": { - "latitude": -18.48813238, - "longitude": -47.76039947, - "name": "Grupiara" - }, - "312800": { - "latitude": -18.833671, - "longitude": -42.85318248, - "name": "Guanhães" - }, - "312810": { - "latitude": -20.76425905, - "longitude": -45.92098103, - "name": "Guapé" - }, - "312820": { - "latitude": -20.55517519, - "longitude": -43.02070717, - "name": "Guaraciaba" - }, - "312825": { - "latitude": -17.07852223, - "longitude": -43.62061464, - "name": "Guaraciama" - }, - "312830": { - "latitude": -21.27744673, - "longitude": -46.80730099, - "name": "Guaranésia" - }, - "312840": { - "latitude": -21.35697456, - "longitude": -43.05766939, - "name": "Guarani" - }, - "312850": { - "latitude": -21.75471706, - "longitude": -43.02206402, - "name": "Guarará" - }, - "312860": { - "latitude": -17.73183086, - "longitude": -47.12615251, - "name": "Guarda-Mor" - }, - "312870": { - "latitude": -21.29059729, - "longitude": -46.68293043, - "name": "Guaxupé" - }, - "312880": { - "latitude": -21.16680016, - "longitude": -42.78566929, - "name": "Guidoval" - }, - "312890": { - "latitude": -18.81604498, - "longitude": -46.75293647, - "name": "Guimarânia" - }, - "312900": { - "latitude": -21.01490293, - "longitude": -42.69968155, - "name": "Guiricema" - }, - "312910": { - "latitude": -19.09836477, - "longitude": -49.87009124, - "name": "Gurinhatã" - }, - "312920": { - "latitude": -22.04913055, - "longitude": -45.54064551, - "name": "Heliodora" - }, - "312930": { - "latitude": -19.34713904, - "longitude": -42.24276579, - "name": "Iapu" - }, - "312940": { - "latitude": -21.44968796, - "longitude": -43.95901106, - "name": "Ibertioga" - }, - "312950": { - "latitude": -19.55786857, - "longitude": -46.59575667, - "name": "Ibiá" - }, - "312960": { - "latitude": -16.82878001, - "longitude": -44.79024471, - "name": "Ibiaí" - }, - "312965": { - "latitude": -15.69685408, - "longitude": -44.14493124, - "name": "Ibiracatu" - }, - "312970": { - "latitude": -20.39329159, - "longitude": -47.11162288, - "name": "Ibiraci" - }, - "312980": { - "latitude": -20.02358272, - "longitude": -44.06849853, - "name": "Ibirité" - }, - "312990": { - "latitude": -22.06736482, - "longitude": -46.40765652, - "name": "Ibitiúra de Minas" - }, - "313000": { - "latitude": -21.16714198, - "longitude": -44.78295269, - "name": "Ibituruna" - }, - "313005": { - "latitude": -16.2251268, - "longitude": -44.91639306, - "name": "Icaraí de Minas" - }, - "313010": { - "latitude": -20.05934856, - "longitude": -44.32196755, - "name": "Igarapé" - }, - "313020": { - "latitude": -19.95105336, - "longitude": -44.71835817, - "name": "Igaratinga" - }, - "313030": { - "latitude": -20.15618723, - "longitude": -45.7527263, - "name": "Iguatama" - }, - "313040": { - "latitude": -21.17816269, - "longitude": -44.93384307, - "name": "Ijaci" - }, - "313050": { - "latitude": -20.93145674, - "longitude": -45.80164219, - "name": "Ilicínea" - }, - "313055": { - "latitude": -19.61864528, - "longitude": -41.96770319, - "name": "Imbé de Minas" - }, - "313060": { - "latitude": -22.33657624, - "longitude": -46.28169174, - "name": "Inconfidentes" - }, - "313065": { - "latitude": -15.5621963, - "longitude": -42.14295988, - "name": "Indaiabira" - }, - "313070": { - "latitude": -18.95229931, - "longitude": -47.84964569, - "name": "Indianópolis" - }, - "313080": { - "latitude": -21.41059069, - "longitude": -44.92464531, - "name": "Ingaí" - }, - "313090": { - "latitude": -19.49863065, - "longitude": -41.96691426, - "name": "Inhapim" - }, - "313100": { - "latitude": -19.49794392, - "longitude": -44.40912887, - "name": "Inhaúma" - }, - "313110": { - "latitude": -18.73025899, - "longitude": -44.29191754, - "name": "Inimutaba" - }, - "313115": { - "latitude": -19.40884139, - "longitude": -42.37079773, - "name": "Ipaba" - }, - "313120": { - "latitude": -19.75779997, - "longitude": -41.74935519, - "name": "Ipanema" - }, - "313130": { - "latitude": -19.43897275, - "longitude": -42.60092198, - "name": "Ipatinga" - }, - "313140": { - "latitude": -18.69822291, - "longitude": -49.93211917, - "name": "Ipiaçu" - }, - "313150": { - "latitude": -22.028001, - "longitude": -46.13056724, - "name": "Ipuiúna" - }, - "313160": { - "latitude": -19.04393278, - "longitude": -47.45750934, - "name": "Iraí de Minas" - }, - "313170": { - "latitude": -19.6006084, - "longitude": -43.29991272, - "name": "Itabira" - }, - "313180": { - "latitude": -18.54919339, - "longitude": -41.24461905, - "name": "Itabirinha" - }, - "313190": { - "latitude": -20.25315308, - "longitude": -43.80947452, - "name": "Itabirito" - }, - "313200": { - "latitude": -16.93500558, - "longitude": -43.32881742, - "name": "Itacambira" - }, - "313210": { - "latitude": -15.17726824, - "longitude": -44.12500813, - "name": "Itacarambi" - }, - "313220": { - "latitude": -20.37192584, - "longitude": -44.53181458, - "name": "Itaguara" - }, - "313230": { - "latitude": -17.40937298, - "longitude": -41.6593673, - "name": "Itaipé" - }, - "313240": { - "latitude": -22.42196253, - "longitude": -45.41440328, - "name": "Itajubá" - }, - "313250": { - "latitude": -17.85646085, - "longitude": -42.87704317, - "name": "Itamarandiba" - }, - "313260": { - "latitude": -21.42404525, - "longitude": -42.84785514, - "name": "Itamarati de Minas" - }, - "313270": { - "latitude": -18.15912513, - "longitude": -41.84620686, - "name": "Itambacuri" - }, - "313280": { - "latitude": -19.39635253, - "longitude": -43.35126565, - "name": "Itambé do Mato Dentro" - }, - "313290": { - "latitude": -21.07423198, - "longitude": -47.05013059, - "name": "Itamogi" - }, - "313300": { - "latitude": -22.28927182, - "longitude": -44.75768744, - "name": "Itamonte" - }, - "313310": { - "latitude": -22.3200977, - "longitude": -44.92104709, - "name": "Itanhandu" - }, - "313320": { - "latitude": -19.16095689, - "longitude": -41.8203323, - "name": "Itanhomi" - }, - "313330": { - "latitude": -16.58304247, - "longitude": -41.53437343, - "name": "Itaobim" - }, - "313340": { - "latitude": -19.79485304, - "longitude": -49.42345466, - "name": "Itapagipe" - }, - "313350": { - "latitude": -20.45849051, - "longitude": -45.10791746, - "name": "Itapecerica" - }, - "313360": { - "latitude": -22.69978328, - "longitude": -46.20978619, - "name": "Itapeva" - }, - "313370": { - "latitude": -20.20918022, - "longitude": -44.45288626, - "name": "Itatiaiuçu" - }, - "313375": { - "latitude": -20.73688621, - "longitude": -46.77162275, - "name": "Itaú de Minas" - }, - "313380": { - "latitude": -20.07809006, - "longitude": -44.58885131, - "name": "Itaúna" - }, - "313390": { - "latitude": -20.68522684, - "longitude": -43.61289975, - "name": "Itaverava" - }, - "313400": { - "latitude": -16.58658542, - "longitude": -41.83552811, - "name": "Itinga" - }, - "313410": { - "latitude": -19.37269607, - "longitude": -41.10385323, - "name": "Itueta" - }, - "313420": { - "latitude": -18.99264382, - "longitude": -49.54420845, - "name": "Ituiutaba" - }, - "313430": { - "latitude": -21.28978428, - "longitude": -44.82407795, - "name": "Itumirim" - }, - "313440": { - "latitude": -19.71632951, - "longitude": -50.34499901, - "name": "Iturama" - }, - "313450": { - "latitude": -21.35128528, - "longitude": -44.7102431, - "name": "Itutinga" - }, - "313460": { - "latitude": -19.44075813, - "longitude": -43.71816234, - "name": "Jaboticatubas" - }, - "313470": { - "latitude": -16.18245895, - "longitude": -40.31372888, - "name": "Jacinto" - }, - "313480": { - "latitude": -21.02443288, - "longitude": -46.73562412, - "name": "Jacuí" - }, - "313490": { - "latitude": -22.28775494, - "longitude": -46.60098855, - "name": "Jacutinga" - }, - "313500": { - "latitude": -19.6375805, - "longitude": -42.71818829, - "name": "Jaguaraçu" - }, - "313505": { - "latitude": -15.2326491, - "longitude": -43.67589443, - "name": "Jaíba" - }, - "313507": { - "latitude": -18.46400601, - "longitude": -41.74031805, - "name": "Jampruca" - }, - "313510": { - "latitude": -15.79901928, - "longitude": -43.39671321, - "name": "Janaúba" - }, - "313520": { - "latitude": -15.31996062, - "longitude": -44.84947872, - "name": "Januária" - }, - "313530": { - "latitude": -20.13278244, - "longitude": -45.52912578, - "name": "Japaraíba" - }, - "313535": { - "latitude": -15.94449819, - "longitude": -44.32925664, - "name": "Japonvar" - }, - "313540": { - "latitude": -20.55242963, - "longitude": -44.04708386, - "name": "Jeceaba" - }, - "313545": { - "latitude": -17.16826311, - "longitude": -42.215292, - "name": "Jenipapo de Minas" - }, - "313550": { - "latitude": -20.4741665, - "longitude": -42.61961533, - "name": "Jequeri" - }, - "313560": { - "latitude": -17.20989968, - "longitude": -44.47583821, - "name": "Jequitaí" - }, - "313570": { - "latitude": -19.21157977, - "longitude": -44.0011927, - "name": "Jequitibá" - }, - "313580": { - "latitude": -16.38883103, - "longitude": -41.08297329, - "name": "Jequitinhonha" - }, - "313590": { - "latitude": -22.00993262, - "longitude": -45.27537654, - "name": "Jesuânia" - }, - "313600": { - "latitude": -16.77072667, - "longitude": -41.01537947, - "name": "Joaíma" - }, - "313610": { - "latitude": -19.20962364, - "longitude": -42.70436718, - "name": "Joanésia" - }, - "313620": { - "latitude": -19.8379412, - "longitude": -43.16148613, - "name": "João Monlevade" - }, - "313630": { - "latitude": -17.60492987, - "longitude": -45.93427088, - "name": "João Pinheiro" - }, - "313640": { - "latitude": -17.67604636, - "longitude": -44.11158224, - "name": "Joaquim Felício" - }, - "313650": { - "latitude": -15.88330279, - "longitude": -40.3138904, - "name": "Jordânia" - }, - "313652": { - "latitude": -16.90018741, - "longitude": -42.65613461, - "name": "José Gonçalves de Minas" - }, - "313655": { - "latitude": -18.24717357, - "longitude": -42.4801439, - "name": "José Raydan" - }, - "313657": { - "latitude": -16.54165097, - "longitude": -42.5506971, - "name": "Josenópolis" - }, - "313660": { - "latitude": -19.63533892, - "longitude": -43.57203978, - "name": "Nova União" - }, - "313665": { - "latitude": -19.95631803, - "longitude": -44.35423474, - "name": "Juatuba" - }, - "313670": { - "latitude": -21.74549947, - "longitude": -43.46473273, - "name": "Juiz de Fora" - }, - "313680": { - "latitude": -16.8401167, - "longitude": -43.56448908, - "name": "Juramento" - }, - "313690": { - "latitude": -21.22084331, - "longitude": -46.52651928, - "name": "Juruaia" - }, - "313695": { - "latitude": -14.38566547, - "longitude": -44.08413449, - "name": "Juvenília" - }, - "313700": { - "latitude": -17.62640282, - "longitude": -41.82255324, - "name": "Ladainha" - }, - "313710": { - "latitude": -18.10354236, - "longitude": -46.73462187, - "name": "Lagamar" - }, - "313720": { - "latitude": -20.01101133, - "longitude": -45.49399889, - "name": "Lagoa da Prata" - }, - "313730": { - "latitude": -17.00781454, - "longitude": -44.64636317, - "name": "Lagoa dos Patos" - }, - "313740": { - "latitude": -20.89225372, - "longitude": -44.07468088, - "name": "Lagoa Dourada" - }, - "313750": { - "latitude": -18.76953385, - "longitude": -46.33677692, - "name": "Lagoa Formosa" - }, - "313753": { - "latitude": -17.76637024, - "longitude": -46.50160746, - "name": "Lagoa Grande" - }, - "313760": { - "latitude": -19.62840701, - "longitude": -43.88581181, - "name": "Lagoa Santa" - }, - "313770": { - "latitude": -20.14369358, - "longitude": -41.58790259, - "name": "Lajinha" - }, - "313780": { - "latitude": -22.00092626, - "longitude": -45.37769653, - "name": "Lambari" - }, - "313790": { - "latitude": -20.77972481, - "longitude": -43.47453887, - "name": "Lamim" - }, - "313800": { - "latitude": -21.35663494, - "longitude": -42.45076274, - "name": "Laranjal" - }, - "313810": { - "latitude": -17.88081538, - "longitude": -44.69555229, - "name": "Lassance" - }, - "313820": { - "latitude": -21.26467582, - "longitude": -45.03848724, - "name": "Lavras" - }, - "313830": { - "latitude": -19.67951227, - "longitude": -45.04082454, - "name": "Leandro Ferreira" - }, - "313835": { - "latitude": -17.06980902, - "longitude": -42.74454892, - "name": "Leme do Prado" - }, - "313840": { - "latitude": -21.54864843, - "longitude": -42.64409656, - "name": "Leopoldina" - }, - "313850": { - "latitude": -22.01581964, - "longitude": -44.33306704, - "name": "Liberdade" - }, - "313860": { - "latitude": -21.7994034, - "longitude": -43.8869163, - "name": "Lima Duarte" - }, - "313862": { - "latitude": -19.40737839, - "longitude": -50.64764278, - "name": "Limeira do Oeste" - }, - "313865": { - "latitude": -15.85634919, - "longitude": -44.26961993, - "name": "Lontra" - }, - "313867": { - "latitude": -20.43628952, - "longitude": -42.07445985, - "name": "Luisburgo" - }, - "313868": { - "latitude": -16.19626954, - "longitude": -44.59648667, - "name": "Luislândia" - }, - "313870": { - "latitude": -21.53797788, - "longitude": -44.92314486, - "name": "Luminárias" - }, - "313880": { - "latitude": -19.82734072, - "longitude": -45.67881942, - "name": "Luz" - }, - "313890": { - "latitude": -17.08385675, - "longitude": -40.71972567, - "name": "Machacalis" - }, - "313900": { - "latitude": -21.66593507, - "longitude": -45.9201209, - "name": "Machado" - }, - "313910": { - "latitude": -21.48497651, - "longitude": -44.33214689, - "name": "Madre de Deus de Minas" - }, - "313920": { - "latitude": -17.84336007, - "longitude": -42.11022668, - "name": "Malacacheta" - }, - "313925": { - "latitude": -15.01283283, - "longitude": -42.9539133, - "name": "Mamonas" - }, - "313930": { - "latitude": -14.64810022, - "longitude": -44.09254593, - "name": "Manga" - }, - "313940": { - "latitude": -20.19532503, - "longitude": -42.10683463, - "name": "Manhuaçu" - }, - "313950": { - "latitude": -20.34732079, - "longitude": -41.9394022, - "name": "Manhumirim" - }, - "313960": { - "latitude": -18.68491874, - "longitude": -41.08086941, - "name": "Mantena" - }, - "313970": { - "latitude": -19.5011921, - "longitude": -44.67125183, - "name": "Maravilhas" - }, - "313980": { - "latitude": -21.87768051, - "longitude": -43.01857334, - "name": "Mar de Espanha" - }, - "313990": { - "latitude": -22.32247045, - "longitude": -45.31353949, - "name": "Maria da Fé" - }, - "314000": { - "latitude": -20.3291025, - "longitude": -43.33133404, - "name": "Mariana" - }, - "314010": { - "latitude": -18.49397892, - "longitude": -42.07404806, - "name": "Marilac" - }, - "314015": { - "latitude": -20.07667492, - "longitude": -44.17607312, - "name": "Mário Campos" - }, - "314020": { - "latitude": -21.69430316, - "longitude": -42.95654604, - "name": "Maripá de Minas" - }, - "314030": { - "latitude": -19.70578592, - "longitude": -42.61480248, - "name": "Marliéria" - }, - "314040": { - "latitude": -22.46362253, - "longitude": -45.17223167, - "name": "Marmelópolis" - }, - "314050": { - "latitude": -19.41227917, - "longitude": -45.19047872, - "name": "Martinho Campos" - }, - "314053": { - "latitude": -20.25888499, - "longitude": -41.84266799, - "name": "Martins Soares" - }, - "314055": { - "latitude": -15.76145342, - "longitude": -40.7023425, - "name": "Mata Verde" - }, - "314060": { - "latitude": -18.46126481, - "longitude": -43.04687909, - "name": "Materlândia" - }, - "314070": { - "latitude": -20.02728315, - "longitude": -44.43749832, - "name": "Mateus Leme" - }, - "314080": { - "latitude": -21.87102862, - "longitude": -43.30800299, - "name": "Matias Barbosa" - }, - "314085": { - "latitude": -14.90282619, - "longitude": -43.76095819, - "name": "Matias Cardoso" - }, - "314090": { - "latitude": -20.30847644, - "longitude": -42.31568779, - "name": "Matipó" - }, - "314100": { - "latitude": -15.42530131, - "longitude": -42.86416405, - "name": "Mato Verde" - }, - "314110": { - "latitude": -19.5238471, - "longitude": -44.05153209, - "name": "Matozinhos" - }, - "314120": { - "latitude": -19.19362332, - "longitude": -45.99553786, - "name": "Matutina" - }, - "314130": { - "latitude": -19.9891515, - "longitude": -46.3397258, - "name": "Medeiros" - }, - "314140": { - "latitude": -16.27052046, - "longitude": -41.51006633, - "name": "Medina" - }, - "314150": { - "latitude": -18.62931594, - "longitude": -41.35583434, - "name": "Mendes Pimentel" - }, - "314160": { - "latitude": -21.18826784, - "longitude": -43.33284269, - "name": "Mercês" - }, - "314170": { - "latitude": -19.24795062, - "longitude": -42.61213212, - "name": "Mesquita" - }, - "314180": { - "latitude": -17.36146482, - "longitude": -42.43598849, - "name": "Minas Novas" - }, - "314190": { - "latitude": -21.67492391, - "longitude": -44.61394309, - "name": "Minduri" - }, - "314200": { - "latitude": -16.25939572, - "longitude": -44.15769932, - "name": "Mirabela" - }, - "314210": { - "latitude": -20.84952793, - "longitude": -42.39967108, - "name": "Miradouro" - }, - "314220": { - "latitude": -21.15007482, - "longitude": -42.61789042, - "name": "Miraí" - }, - "314225": { - "latitude": -14.75296432, - "longitude": -44.42159957, - "name": "Miravânia" - }, - "314230": { - "latitude": -20.33010777, - "longitude": -43.99211542, - "name": "Moeda" - }, - "314240": { - "latitude": -19.84123627, - "longitude": -45.40720426, - "name": "Moema" - }, - "314250": { - "latitude": -18.38791726, - "longitude": -44.02312009, - "name": "Monjolos" - }, - "314260": { - "latitude": -21.73314195, - "longitude": -45.48189995, - "name": "Monsenhor Paulo" - }, - "314270": { - "latitude": -14.47319095, - "longitude": -44.50153477, - "name": "Montalvânia" - }, - "314280": { - "latitude": -18.84453457, - "longitude": -48.88676747, - "name": "Monte Alegre de Minas" - }, - "314290": { - "latitude": -15.20674825, - "longitude": -42.96873736, - "name": "Monte Azul" - }, - "314300": { - "latitude": -21.31476104, - "longitude": -46.32638286, - "name": "Monte Belo" - }, - "314310": { - "latitude": -18.70919022, - "longitude": -47.46095011, - "name": "Monte Carmelo" - }, - "314315": { - "latitude": -16.8773651, - "longitude": -41.26628704, - "name": "Monte Formoso" - }, - "314320": { - "latitude": -21.18839582, - "longitude": -46.9466791, - "name": "Monte Santo de Minas" - }, - "314330": { - "latitude": -16.62071806, - "longitude": -43.92881683, - "name": "Montes Claros" - }, - "314340": { - "latitude": -22.42028273, - "longitude": -46.51931728, - "name": "Monte Sião" - }, - "314345": { - "latitude": -15.19126818, - "longitude": -42.46949506, - "name": "Montezuma" - }, - "314350": { - "latitude": -18.57821351, - "longitude": -45.40251415, - "name": "Morada Nova de Minas" - }, - "314360": { - "latitude": -18.62999358, - "longitude": -44.63314746, - "name": "Morro da Garça" - }, - "314370": { - "latitude": -19.23510361, - "longitude": -43.40250181, - "name": "Morro do Pilar" - }, - "314380": { - "latitude": -22.63195578, - "longitude": -46.30429972, - "name": "Munhoz" - }, - "314390": { - "latitude": -21.09137195, - "longitude": -42.42145797, - "name": "Muriaé" - }, - "314400": { - "latitude": -19.91923262, - "longitude": -41.44691428, - "name": "Mutum" - }, - "314410": { - "latitude": -21.35564722, - "longitude": -46.51651403, - "name": "Muzambinho" - }, - "314420": { - "latitude": -18.48062321, - "longitude": -42.1879751, - "name": "Nacip Raydan" - }, - "314430": { - "latitude": -17.77928786, - "longitude": -40.49694378, - "name": "Nanuque" - }, - "314435": { - "latitude": -19.18109845, - "longitude": -42.32444933, - "name": "Naque" - }, - "314437": { - "latitude": -16.54517472, - "longitude": -46.47475807, - "name": "Natalândia" - }, - "314440": { - "latitude": -22.13009206, - "longitude": -45.51214147, - "name": "Natércia" - }, - "314450": { - "latitude": -21.2042005, - "longitude": -44.61508828, - "name": "Nazareno" - }, - "314460": { - "latitude": -21.22755837, - "longitude": -45.26079084, - "name": "Nepomuceno" - }, - "314465": { - "latitude": -15.36810999, - "longitude": -41.65985705, - "name": "Ninheira" - }, - "314467": { - "latitude": -18.48816987, - "longitude": -41.10203671, - "name": "Nova Belém" - }, - "314470": { - "latitude": -19.71882027, - "longitude": -43.01374738, - "name": "Nova Era" - }, - "314480": { - "latitude": -20.07414253, - "longitude": -43.9040257, - "name": "Nova Lima" - }, - "314490": { - "latitude": -18.45255971, - "longitude": -41.5224086, - "name": "Nova Módica" - }, - "314500": { - "latitude": -19.26120292, - "longitude": -47.70687431, - "name": "Nova Ponte" - }, - "314505": { - "latitude": -15.73457455, - "longitude": -43.27504046, - "name": "Nova Porteirinha" - }, - "314510": { - "latitude": -21.09795535, - "longitude": -46.41564476, - "name": "Nova Resende" - }, - "314520": { - "latitude": -19.85234265, - "longitude": -44.97395474, - "name": "Nova Serrana" - }, - "314530": { - "latitude": -17.37076875, - "longitude": -41.95517036, - "name": "Novo Cruzeiro" - }, - "314535": { - "latitude": -17.22923838, - "longitude": -41.22761131, - "name": "Novo Oriente de Minas" - }, - "314537": { - "latitude": -16.01102388, - "longitude": -42.39768486, - "name": "Novorizonte" - }, - "314540": { - "latitude": -21.90710045, - "longitude": -43.96607005, - "name": "Olaria" - }, - "314545": { - "latitude": -17.47803481, - "longitude": -43.59491473, - "name": "Olhos-d'Água" - }, - "314550": { - "latitude": -22.09053084, - "longitude": -45.28537674, - "name": "Olímpio Noronha" - }, - "314560": { - "latitude": -20.74980844, - "longitude": -44.73597586, - "name": "Oliveira" - }, - "314570": { - "latitude": -21.33581916, - "longitude": -43.51491777, - "name": "Oliveira Fortes" - }, - "314580": { - "latitude": -19.7082309, - "longitude": -44.73553424, - "name": "Onça de Pitangui" - }, - "314585": { - "latitude": -20.42644574, - "longitude": -42.79374279, - "name": "Oratórios" - }, - "314587": { - "latitude": -20.51457785, - "longitude": -42.21284617, - "name": "Orizânia" - }, - "314590": { - "latitude": -20.52465954, - "longitude": -43.67533733, - "name": "Ouro Branco" - }, - "314600": { - "latitude": -22.25478613, - "longitude": -46.38398371, - "name": "Ouro Fino" - }, - "314610": { - "latitude": -20.39110386, - "longitude": -43.61038774, - "name": "Ouro Preto" - }, - "314620": { - "latitude": -18.04852212, - "longitude": -41.29631938, - "name": "Ouro Verde de Minas" - }, - "314625": { - "latitude": -16.30124729, - "longitude": -42.58629061, - "name": "Padre Carvalho" - }, - "314630": { - "latitude": -17.03799233, - "longitude": -41.55201705, - "name": "Padre Paraíso" - }, - "314640": { - "latitude": -18.91883928, - "longitude": -45.49103541, - "name": "Paineiras" - }, - "314650": { - "latitude": -20.3815446, - "longitude": -45.69391676, - "name": "Pains" - }, - "314655": { - "latitude": -15.41912326, - "longitude": -43.1495887, - "name": "Pai Pedro" - }, - "314660": { - "latitude": -21.28675497, - "longitude": -43.42387199, - "name": "Paiva" - }, - "314670": { - "latitude": -21.41907709, - "longitude": -42.32888153, - "name": "Palma" - }, - "314675": { - "latitude": -16.78854279, - "longitude": -40.37108283, - "name": "Palmópolis" - }, - "314690": { - "latitude": -19.37647811, - "longitude": -44.69133236, - "name": "Papagaios" - }, - "314700": { - "latitude": -17.17298806, - "longitude": -46.88424414, - "name": "Paracatu" - }, - "314710": { - "latitude": -19.83425542, - "longitude": -44.60786254, - "name": "Pará de Minas" - }, - "314720": { - "latitude": -21.56680759, - "longitude": -45.74991663, - "name": "Paraguaçu" - }, - "314730": { - "latitude": -22.57149048, - "longitude": -45.81699935, - "name": "Paraisópolis" - }, - "314740": { - "latitude": -19.2721964, - "longitude": -44.45266387, - "name": "Paraopeba" - }, - "314750": { - "latitude": -19.36028741, - "longitude": -43.17529984, - "name": "Passabém" - }, - "314760": { - "latitude": -22.4057815, - "longitude": -44.96833988, - "name": "Passa Quatro" - }, - "314770": { - "latitude": -20.6489344, - "longitude": -44.49109899, - "name": "Passa Tempo" - }, - "314780": { - "latitude": -22.18292312, - "longitude": -44.26150666, - "name": "Passa Vinte" - }, - "314790": { - "latitude": -20.71858015, - "longitude": -46.62199346, - "name": "Passos" - }, - "314795": { - "latitude": -16.08063702, - "longitude": -44.10141723, - "name": "Patis" - }, - "314800": { - "latitude": -18.59704233, - "longitude": -46.50772705, - "name": "Patos de Minas" - }, - "314810": { - "latitude": -18.9705156, - "longitude": -47.05125488, - "name": "Patrocínio" - }, - "314820": { - "latitude": -21.16715283, - "longitude": -42.2529864, - "name": "Patrocínio do Muriaé" - }, - "314830": { - "latitude": -20.85588021, - "longitude": -42.98497619, - "name": "Paula Cândido" - }, - "314840": { - "latitude": -18.45820138, - "longitude": -42.8652727, - "name": "Paulistas" - }, - "314850": { - "latitude": -17.47151954, - "longitude": -41.06162372, - "name": "Pavão" - }, - "314860": { - "latitude": -18.5570604, - "longitude": -42.51036294, - "name": "Peçanha" - }, - "314870": { - "latitude": -15.95506899, - "longitude": -41.18423425, - "name": "Pedra Azul" - }, - "314875": { - "latitude": -20.47664306, - "longitude": -42.37530185, - "name": "Pedra Bonita" - }, - "314880": { - "latitude": -20.59297501, - "longitude": -42.72132498, - "name": "Pedra do Anta" - }, - "314890": { - "latitude": -20.28687951, - "longitude": -45.22931171, - "name": "Pedra do Indaiá" - }, - "314900": { - "latitude": -20.82769383, - "longitude": -42.15490575, - "name": "Pedra Dourada" - }, - "314910": { - "latitude": -22.24961241, - "longitude": -45.45389296, - "name": "Pedralva" - }, - "314915": { - "latitude": -15.62573216, - "longitude": -44.3236318, - "name": "Pedras de Maria da Cruz" - }, - "314920": { - "latitude": -19.19225344, - "longitude": -47.51027681, - "name": "Pedrinópolis" - }, - "314930": { - "latitude": -19.63986931, - "longitude": -44.0527439, - "name": "Pedro Leopoldo" - }, - "314940": { - "latitude": -21.72528113, - "longitude": -43.72911706, - "name": "Pedro Teixeira" - }, - "314950": { - "latitude": -21.82587312, - "longitude": -43.13209847, - "name": "Pequeri" - }, - "314960": { - "latitude": -19.60475715, - "longitude": -44.63578743, - "name": "Pequi" - }, - "314970": { - "latitude": -19.94023972, - "longitude": -45.05790206, - "name": "Perdigão" - }, - "314980": { - "latitude": -19.40015088, - "longitude": -47.19599173, - "name": "Perdizes" - }, - "314990": { - "latitude": -21.07592724, - "longitude": -45.06477691, - "name": "Perdões" - }, - "314995": { - "latitude": -19.08423151, - "longitude": -42.23182597, - "name": "Periquito" - }, - "315000": { - "latitude": -18.33113239, - "longitude": -41.56006761, - "name": "Pescador" - }, - "315010": { - "latitude": -21.50238394, - "longitude": -43.31674429, - "name": "Piau" - }, - "315015": { - "latitude": -19.76302678, - "longitude": -42.04471368, - "name": "Piedade de Caratinga" - }, - "315020": { - "latitude": -20.24171004, - "longitude": -42.71806662, - "name": "Piedade de Ponte Nova" - }, - "315030": { - "latitude": -21.48403559, - "longitude": -44.15547593, - "name": "Piedade do Rio Grande" - }, - "315040": { - "latitude": -20.47405244, - "longitude": -44.24643948, - "name": "Piedade dos Gerais" - }, - "315050": { - "latitude": -20.53049186, - "longitude": -45.83130997, - "name": "Pimenta" - }, - "315053": { - "latitude": -19.74340557, - "longitude": -42.42184426, - "name": "Pingo-d'Água" - }, - "315057": { - "latitude": -16.04938115, - "longitude": -45.24724731, - "name": "Pintópolis" - }, - "315060": { - "latitude": -20.52224118, - "longitude": -44.42270985, - "name": "Piracema" - }, - "315070": { - "latitude": -19.94025449, - "longitude": -48.65776018, - "name": "Pirajuba" - }, - "315080": { - "latitude": -20.63325457, - "longitude": -43.29901622, - "name": "Piranga" - }, - "315090": { - "latitude": -22.55663883, - "longitude": -45.51546947, - "name": "Piranguçu" - }, - "315100": { - "latitude": -22.36297713, - "longitude": -45.58655243, - "name": "Piranguinho" - }, - "315110": { - "latitude": -21.67908667, - "longitude": -42.36393178, - "name": "Pirapetinga" - }, - "315120": { - "latitude": -17.39334671, - "longitude": -44.86744749, - "name": "Pirapora" - }, - "315130": { - "latitude": -21.26377868, - "longitude": -43.02969511, - "name": "Piraúba" - }, - "315140": { - "latitude": -19.58779042, - "longitude": -44.88645242, - "name": "Pitangui" - }, - "315150": { - "latitude": -20.44144107, - "longitude": -46.05040395, - "name": "Piumhi" - }, - "315160": { - "latitude": -20.08125053, - "longitude": -48.6462636, - "name": "Planura" - }, - "315170": { - "latitude": -21.80626876, - "longitude": -45.99332726, - "name": "Poço Fundo" - }, - "315180": { - "latitude": -21.80806949, - "longitude": -46.56326764, - "name": "Poços de Caldas" - }, - "315190": { - "latitude": -19.58494968, - "longitude": -41.55715127, - "name": "Pocrane" - }, - "315200": { - "latitude": -19.13114163, - "longitude": -44.92358471, - "name": "Pompéu" - }, - "315210": { - "latitude": -20.41214921, - "longitude": -42.91738704, - "name": "Ponte Nova" - }, - "315213": { - "latitude": -16.60880486, - "longitude": -44.97361643, - "name": "Ponto Chique" - }, - "315217": { - "latitude": -16.83422811, - "longitude": -41.47442694, - "name": "Ponto dos Volantes" - }, - "315220": { - "latitude": -15.71660014, - "longitude": -43.07582311, - "name": "Porteirinha" - }, - "315230": { - "latitude": -20.66358475, - "longitude": -43.08036598, - "name": "Porto Firme" - }, - "315240": { - "latitude": -17.81497526, - "longitude": -41.7693441, - "name": "Poté" - }, - "315250": { - "latitude": -22.26491609, - "longitude": -45.9400082, - "name": "Pouso Alegre" - }, - "315260": { - "latitude": -22.17542322, - "longitude": -44.93256164, - "name": "Pouso Alto" - }, - "315270": { - "latitude": -21.09858759, - "longitude": -44.06346336, - "name": "Prados" - }, - "315280": { - "latitude": -19.32987575, - "longitude": -48.95419714, - "name": "Prata" - }, - "315290": { - "latitude": -20.78733653, - "longitude": -46.86271768, - "name": "Pratápolis" - }, - "315300": { - "latitude": -19.75976356, - "longitude": -46.40256973, - "name": "Pratinha" - }, - "315310": { - "latitude": -20.77043966, - "longitude": -43.15477548, - "name": "Presidente Bernardes" - }, - "315320": { - "latitude": -18.72605521, - "longitude": -44.08325885, - "name": "Presidente Juscelino" - }, - "315330": { - "latitude": -18.63391662, - "longitude": -43.578097, - "name": "Presidente Kubitschek" - }, - "315340": { - "latitude": -18.23919374, - "longitude": -46.33618114, - "name": "Presidente Olegário" - }, - "315350": { - "latitude": -20.43724831, - "longitude": -41.94884697, - "name": "Alto Jequitibá" - }, - "315360": { - "latitude": -19.46445517, - "longitude": -44.11144234, - "name": "Prudente de Morais" - }, - "315370": { - "latitude": -19.27976937, - "longitude": -45.6030728, - "name": "Quartel Geral" - }, - "315380": { - "latitude": -20.73210733, - "longitude": -43.89075927, - "name": "Queluzito" - }, - "315390": { - "latitude": -19.98093106, - "longitude": -43.78315959, - "name": "Raposos" - }, - "315400": { - "latitude": -20.01318244, - "longitude": -42.3902047, - "name": "Raul Soares" - }, - "315410": { - "latitude": -21.51977743, - "longitude": -42.43784995, - "name": "Recreio" - }, - "315415": { - "latitude": -20.23780999, - "longitude": -41.94029533, - "name": "Reduto" - }, - "315420": { - "latitude": -20.837451, - "longitude": -44.29203651, - "name": "Resende Costa" - }, - "315430": { - "latitude": -19.21193393, - "longitude": -41.15308862, - "name": "Resplendor" - }, - "315440": { - "latitude": -21.08541199, - "longitude": -43.7531974, - "name": "Ressaquinha" - }, - "315445": { - "latitude": -16.27669087, - "longitude": -45.92794267, - "name": "Riachinho" - }, - "315450": { - "latitude": -16.05447914, - "longitude": -42.99342073, - "name": "Riacho dos Machados" - }, - "315460": { - "latitude": -19.77952774, - "longitude": -44.07191091, - "name": "Ribeirão das Neves" - }, - "315470": { - "latitude": -21.14788739, - "longitude": -45.07306309, - "name": "Ribeirão Vermelho" - }, - "315480": { - "latitude": -20.10580625, - "longitude": -43.772908, - "name": "Rio Acima" - }, - "315490": { - "latitude": -20.14093997, - "longitude": -42.66061548, - "name": "Rio Casca" - }, - "315500": { - "latitude": -20.21559349, - "longitude": -42.90652632, - "name": "Rio Doce" - }, - "315510": { - "latitude": -16.67656903, - "longitude": -40.55579211, - "name": "Rio do Prado" - }, - "315520": { - "latitude": -20.86788167, - "longitude": -43.49207734, - "name": "Rio Espera" - }, - "315530": { - "latitude": -20.26705371, - "longitude": -44.34496053, - "name": "Rio Manso" - }, - "315540": { - "latitude": -21.4685709, - "longitude": -43.14390984, - "name": "Rio Novo" - }, - "315550": { - "latitude": -19.24000478, - "longitude": -46.29891958, - "name": "Rio Paranaíba" - }, - "315560": { - "latitude": -15.7089618, - "longitude": -42.55136372, - "name": "Rio Pardo de Minas" - }, - "315570": { - "latitude": -19.97081459, - "longitude": -43.14920067, - "name": "Rio Piracicaba" - }, - "315580": { - "latitude": -21.24837991, - "longitude": -43.17180043, - "name": "Rio Pomba" - }, - "315590": { - "latitude": -22.04102675, - "longitude": -43.87862171, - "name": "Rio Preto" - }, - "315600": { - "latitude": -18.25466671, - "longitude": -43.05505962, - "name": "Rio Vermelho" - }, - "315610": { - "latitude": -20.98228921, - "longitude": -44.37640059, - "name": "Ritápolis" - }, - "315620": { - "latitude": -21.64101389, - "longitude": -43.02856451, - "name": "Rochedo de Minas" - }, - "315630": { - "latitude": -21.21068243, - "longitude": -42.84131286, - "name": "Rodeiro" - }, - "315640": { - "latitude": -18.90353242, - "longitude": -47.56255697, - "name": "Romaria" - }, - "315645": { - "latitude": -20.97937384, - "longitude": -42.51141074, - "name": "Rosário da Limeira" - }, - "315650": { - "latitude": -16.36765872, - "longitude": -42.23396442, - "name": "Rubelita" - }, - "315660": { - "latitude": -16.46387558, - "longitude": -40.49423805, - "name": "Rubim" - }, - "315670": { - "latitude": -19.85131458, - "longitude": -43.77917336, - "name": "Sabará" - }, - "315680": { - "latitude": -18.65089753, - "longitude": -43.06351642, - "name": "Sabinópolis" - }, - "315690": { - "latitude": -19.90448786, - "longitude": -47.26637887, - "name": "Sacramento" - }, - "315700": { - "latitude": -16.11113852, - "longitude": -42.15206908, - "name": "Salinas" - }, - "315710": { - "latitude": -16.1104733, - "longitude": -40.02923085, - "name": "Salto da Divisa" - }, - "315720": { - "latitude": -20.02890177, - "longitude": -43.47513477, - "name": "Santa Bárbara" - }, - "315725": { - "latitude": -19.94513866, - "longitude": -42.10660424, - "name": "Santa Bárbara do Leste" - }, - "315727": { - "latitude": -21.96394146, - "longitude": -43.69446875, - "name": "Santa Bárbara do Monte Verde" - }, - "315730": { - "latitude": -21.24507751, - "longitude": -43.53150338, - "name": "Santa Bárbara do Tugúrio" - }, - "315733": { - "latitude": -21.12030934, - "longitude": -44.21729707, - "name": "Santa Cruz de Minas" - }, - "315737": { - "latitude": -16.05073852, - "longitude": -41.78986126, - "name": "Santa Cruz de Salinas" - }, - "315740": { - "latitude": -20.23061211, - "longitude": -42.81400755, - "name": "Santa Cruz do Escalvado" - }, - "315750": { - "latitude": -18.86283414, - "longitude": -42.40433959, - "name": "Santa Efigênia de Minas" - }, - "315760": { - "latitude": -16.70146997, - "longitude": -45.55707206, - "name": "Santa Fé de Minas" - }, - "315765": { - "latitude": -16.90197841, - "longitude": -40.65883578, - "name": "Santa Helena de Minas" - }, - "315770": { - "latitude": -19.38027458, - "longitude": -47.50910181, - "name": "Santa Juliana" - }, - "315780": { - "latitude": -19.74483793, - "longitude": -43.8366447, - "name": "Santa Luzia" - }, - "315790": { - "latitude": -20.42813772, - "longitude": -42.26616176, - "name": "Santa Margarida" - }, - "315800": { - "latitude": -19.43529342, - "longitude": -43.04492693, - "name": "Santa Maria de Itabira" - }, - "315810": { - "latitude": -16.30734324, - "longitude": -40.11635391, - "name": "Santa Maria do Salto" - }, - "315820": { - "latitude": -18.25848273, - "longitude": -42.32434784, - "name": "Santa Maria do Suaçuí" - }, - "315830": { - "latitude": -21.2705752, - "longitude": -45.5053551, - "name": "Santana da Vargem" - }, - "315840": { - "latitude": -21.28211469, - "longitude": -42.55614563, - "name": "Santana de Cataguases" - }, - "315850": { - "latitude": -18.91576837, - "longitude": -43.90112224, - "name": "Santana de Pirapama" - }, - "315860": { - "latitude": -21.94597057, - "longitude": -43.18280561, - "name": "Santana do Deserto" - }, - "315870": { - "latitude": -21.6369254, - "longitude": -44.0661183, - "name": "Santana do Garambéu" - }, - "315880": { - "latitude": -20.88310972, - "longitude": -45.06207595, - "name": "Santana do Jacaré" - }, - "315890": { - "latitude": -20.05595771, - "longitude": -41.89231107, - "name": "Santana do Manhuaçu" - }, - "315895": { - "latitude": -19.38506966, - "longitude": -42.52047449, - "name": "Santana do Paraíso" - }, - "315900": { - "latitude": -19.18868108, - "longitude": -43.64467483, - "name": "Santana do Riacho" - }, - "315910": { - "latitude": -20.79686172, - "longitude": -43.6698143, - "name": "Santana dos Montes" - }, - "315920": { - "latitude": -22.02371959, - "longitude": -46.27139469, - "name": "Santa Rita de Caldas" - }, - "315930": { - "latitude": -22.10153097, - "longitude": -44.0918494, - "name": "Santa Rita de Jacutinga" - }, - "315935": { - "latitude": -19.8750368, - "longitude": -42.12326466, - "name": "Santa Rita de Minas" - }, - "315940": { - "latitude": -21.57721782, - "longitude": -43.93020098, - "name": "Santa Rita de Ibitipoca" - }, - "315950": { - "latitude": -19.41280761, - "longitude": -41.38868579, - "name": "Santa Rita do Itueto" - }, - "315960": { - "latitude": -22.23703951, - "longitude": -45.68275715, - "name": "Santa Rita do Sapucaí" - }, - "315970": { - "latitude": -19.5620437, - "longitude": -45.99976812, - "name": "Santa Rosa da Serra" - }, - "315980": { - "latitude": -18.98946996, - "longitude": -50.27524546, - "name": "Santa Vitória" - }, - "315990": { - "latitude": -20.91622377, - "longitude": -44.94278723, - "name": "Santo Antônio do Amparo" - }, - "316000": { - "latitude": -21.75144427, - "longitude": -42.81152473, - "name": "Santo Antônio do Aventureiro" - }, - "316010": { - "latitude": -20.32217731, - "longitude": -42.60392555, - "name": "Santo Antônio do Grama" - }, - "316020": { - "latitude": -18.47840851, - "longitude": -43.26674302, - "name": "Santo Antônio do Itambé" - }, - "316030": { - "latitude": -16.50364929, - "longitude": -40.27747605, - "name": "Santo Antônio do Jacinto" - }, - "316040": { - "latitude": -20.08304901, - "longitude": -45.29226857, - "name": "Santo Antônio do Monte" - }, - "316045": { - "latitude": -15.28814603, - "longitude": -42.66099524, - "name": "Santo Antônio do Retiro" - }, - "316050": { - "latitude": -19.24140311, - "longitude": -43.24904863, - "name": "Santo Antônio do Rio Abaixo" - }, - "316060": { - "latitude": -18.39020427, - "longitude": -44.17239113, - "name": "Santo Hipólito" - }, - "316070": { - "latitude": -21.45772706, - "longitude": -43.52571926, - "name": "Santos Dumont" - }, - "316080": { - "latitude": -21.57005695, - "longitude": -45.07232651, - "name": "São Bento Abade" - }, - "316090": { - "latitude": -20.62749529, - "longitude": -43.97240168, - "name": "São Brás do Suaçuí" - }, - "316095": { - "latitude": -19.52460689, - "longitude": -42.03086389, - "name": "São Domingos das Dores" - }, - "316100": { - "latitude": -19.90304492, - "longitude": -42.90322995, - "name": "São Domingos do Prata" - }, - "316105": { - "latitude": -18.56862308, - "longitude": -41.44855962, - "name": "São Félix de Minas" - }, - "316110": { - "latitude": -15.89646916, - "longitude": -44.86128929, - "name": "São Francisco" - }, - "316120": { - "latitude": -20.71654883, - "longitude": -44.99540002, - "name": "São Francisco de Paula" - }, - "316130": { - "latitude": -19.79675184, - "longitude": -49.85942639, - "name": "São Francisco de Sales" - }, - "316140": { - "latitude": -20.79191627, - "longitude": -42.28227608, - "name": "São Francisco do Glória" - }, - "316150": { - "latitude": -20.9106004, - "longitude": -42.82910875, - "name": "São Geraldo" - }, - "316160": { - "latitude": -18.89632877, - "longitude": -42.31036206, - "name": "São Geraldo da Piedade" - }, - "316165": { - "latitude": -18.91680775, - "longitude": -41.36686355, - "name": "São Geraldo do Baixio" - }, - "316170": { - "latitude": -18.17669732, - "longitude": -45.54592655, - "name": "São Gonçalo do Abaeté" - }, - "316180": { - "latitude": -19.98387235, - "longitude": -44.82843823, - "name": "São Gonçalo do Pará" - }, - "316190": { - "latitude": -19.81715278, - "longitude": -43.32136776, - "name": "São Gonçalo do Rio Abaixo" - }, - "316200": { - "latitude": -21.91101062, - "longitude": -45.59435018, - "name": "São Gonçalo do Sapucaí" - }, - "316210": { - "latitude": -19.35991962, - "longitude": -45.99948419, - "name": "São Gotardo" - }, - "316220": { - "latitude": -20.57715489, - "longitude": -46.43862571, - "name": "São João Batista do Glória" - }, - "316225": { - "latitude": -16.85978261, - "longitude": -44.33476507, - "name": "São João da Lagoa" - }, - "316230": { - "latitude": -21.94258774, - "longitude": -45.92319134, - "name": "São João da Mata" - }, - "316240": { - "latitude": -15.90844915, - "longitude": -43.8952683, - "name": "São João da Ponte" - }, - "316245": { - "latitude": -14.89189318, - "longitude": -44.22771973, - "name": "São João das Missões" - }, - "316250": { - "latitude": -21.26314726, - "longitude": -44.27442924, - "name": "São João del Rei" - }, - "316255": { - "latitude": -20.36999289, - "longitude": -42.15348084, - "name": "São João do Manhuaçu" - }, - "316257": { - "latitude": -18.75262031, - "longitude": -41.16435831, - "name": "São João do Manteninha" - }, - "316260": { - "latitude": -19.35395865, - "longitude": -42.17033798, - "name": "São João do Oriente" - }, - "316265": { - "latitude": -16.5553204, - "longitude": -44.52436462, - "name": "São João do Pacuí" - }, - "316270": { - "latitude": -15.34281338, - "longitude": -41.97688525, - "name": "São João do Paraíso" - }, - "316280": { - "latitude": -18.51362647, - "longitude": -42.7755988, - "name": "São João Evangelista" - }, - "316290": { - "latitude": -21.58302088, - "longitude": -43.00324742, - "name": "São João Nepomuceno" - }, - "316292": { - "latitude": -20.07085022, - "longitude": -44.24900087, - "name": "São Joaquim de Bicas" - }, - "316294": { - "latitude": -20.74740609, - "longitude": -46.24373979, - "name": "São José da Barra" - }, - "316295": { - "latitude": -19.69689065, - "longitude": -43.99039926, - "name": "São José da Lapa" - }, - "316300": { - "latitude": -18.31751182, - "longitude": -42.12335251, - "name": "São José da Safira" - }, - "316310": { - "latitude": -19.69607575, - "longitude": -44.5615102, - "name": "São José da Varginha" - }, - "316320": { - "latitude": -22.33038258, - "longitude": -45.51779199, - "name": "São José do Alegre" - }, - "316330": { - "latitude": -18.39828018, - "longitude": -41.37597978, - "name": "São José do Divino" - }, - "316340": { - "latitude": -19.93122235, - "longitude": -42.69331135, - "name": "São José do Goiabal" - }, - "316350": { - "latitude": -18.24286802, - "longitude": -42.66827121, - "name": "São José do Jacuri" - }, - "316360": { - "latitude": -20.02012678, - "longitude": -41.77004241, - "name": "São José do Mantimento" - }, - "316370": { - "latitude": -22.11714912, - "longitude": -45.03428478, - "name": "São Lourenço" - }, - "316380": { - "latitude": -20.72682357, - "longitude": -42.71083393, - "name": "São Miguel do Anta" - }, - "316390": { - "latitude": -21.12683156, - "longitude": -46.64194742, - "name": "São Pedro da União" - }, - "316400": { - "latitude": -20.05419101, - "longitude": -42.56984369, - "name": "São Pedro dos Ferros" - }, - "316410": { - "latitude": -18.34788965, - "longitude": -42.59262874, - "name": "São Pedro do Suaçuí" - }, - "316420": { - "latitude": -16.38944928, - "longitude": -45.40629995, - "name": "São Romão" - }, - "316430": { - "latitude": -20.1870401, - "longitude": -46.5135491, - "name": "São Roque de Minas" - }, - "316440": { - "latitude": -22.16126913, - "longitude": -45.77594858, - "name": "São Sebastião da Bela Vista" - }, - "316443": { - "latitude": -21.02425624, - "longitude": -42.59923409, - "name": "São Sebastião da Vargem Alegre" - }, - "316447": { - "latitude": -19.50723578, - "longitude": -41.95731615, - "name": "São Sebastião do Anta" - }, - "316450": { - "latitude": -18.05973218, - "longitude": -42.54118292, - "name": "São Sebastião do Maranhão" - }, - "316460": { - "latitude": -20.2515848, - "longitude": -45.04423274, - "name": "São Sebastião do Oeste" - }, - "316470": { - "latitude": -20.92241574, - "longitude": -47.0064094, - "name": "São Sebastião do Paraíso" - }, - "316480": { - "latitude": -19.30050421, - "longitude": -43.21948315, - "name": "São Sebastião do Rio Preto" - }, - "316490": { - "latitude": -22.21943778, - "longitude": -45.02482228, - "name": "São Sebastião do Rio Verde" - }, - "316500": { - "latitude": -20.93853563, - "longitude": -44.56035485, - "name": "São Tiago" - }, - "316510": { - "latitude": -20.78616552, - "longitude": -47.12722476, - "name": "São Tomás de Aquino" - }, - "316520": { - "latitude": -21.73334064, - "longitude": -44.96379422, - "name": "São Tomé das Letras" - }, - "316530": { - "latitude": -21.66705282, - "longitude": -44.47432143, - "name": "São Vicente de Minas" - }, - "316540": { - "latitude": -22.7862987, - "longitude": -45.84855703, - "name": "Sapucaí-Mirim" - }, - "316550": { - "latitude": -18.77548051, - "longitude": -42.40704803, - "name": "Sardoá" - }, - "316553": { - "latitude": -20.05914463, - "longitude": -44.1210433, - "name": "Sarzedo" - }, - "316555": { - "latitude": -17.62249968, - "longitude": -42.15682231, - "name": "Setubinha" - }, - "316556": { - "latitude": -20.08005184, - "longitude": -42.82512097, - "name": "Sem-Peixe" - }, - "316557": { - "latitude": -22.55766392, - "longitude": -46.21712821, - "name": "Senador Amaral" - }, - "316560": { - "latitude": -21.77043843, - "longitude": -42.90918866, - "name": "Senador Cortes" - }, - "316570": { - "latitude": -20.90427273, - "longitude": -43.10449, - "name": "Senador Firmino" - }, - "316580": { - "latitude": -22.15676365, - "longitude": -46.14107671, - "name": "Senador José Bento" - }, - "316590": { - "latitude": -17.85524517, - "longitude": -43.24095092, - "name": "Senador Modestino Gonçalves" - }, - "316600": { - "latitude": -20.80099994, - "longitude": -43.34944902, - "name": "Senhora de Oliveira" - }, - "316610": { - "latitude": -18.91320626, - "longitude": -43.08052706, - "name": "Senhora do Porto" - }, - "316620": { - "latitude": -21.03124379, - "longitude": -43.60022259, - "name": "Senhora dos Remédios" - }, - "316630": { - "latitude": -20.49231939, - "longitude": -42.45872272, - "name": "Sericita" - }, - "316640": { - "latitude": -21.91652019, - "longitude": -44.45959954, - "name": "Seritinga" - }, - "316650": { - "latitude": -18.39064808, - "longitude": -43.20727793, - "name": "Serra Azul de Minas" - }, - "316660": { - "latitude": -19.38554692, - "longitude": -45.77724721, - "name": "Serra da Saudade" - }, - "316670": { - "latitude": -17.78409014, - "longitude": -40.26443194, - "name": "Serra dos Aimorés" - }, - "316680": { - "latitude": -19.15914062, - "longitude": -46.65452743, - "name": "Serra do Salitre" - }, - "316690": { - "latitude": -21.55401934, - "longitude": -46.09280783, - "name": "Serrania" - }, - "316695": { - "latitude": -15.85682472, - "longitude": -42.86092405, - "name": "Serranópolis de Minas" - }, - "316700": { - "latitude": -21.83099056, - "longitude": -44.53689042, - "name": "Serranos" - }, - "316710": { - "latitude": -18.53642378, - "longitude": -43.40178129, - "name": "Serro" - }, - "316720": { - "latitude": -19.43725218, - "longitude": -44.25345983, - "name": "Sete Lagoas" - }, - "316730": { - "latitude": -21.14336806, - "longitude": -43.20304396, - "name": "Silveirânia" - }, - "316740": { - "latitude": -22.03689594, - "longitude": -45.80558377, - "name": "Silvianópolis" - }, - "316750": { - "latitude": -21.96422919, - "longitude": -43.29298281, - "name": "Simão Pereira" - }, - "316760": { - "latitude": -19.99895563, - "longitude": -41.98726073, - "name": "Simonésia" - }, - "316770": { - "latitude": -19.21822988, - "longitude": -42.14585822, - "name": "Sobrália" - }, - "316780": { - "latitude": -22.02695691, - "longitude": -45.02760925, - "name": "Soledade de Minas" - }, - "316790": { - "latitude": -21.36335471, - "longitude": -43.25617168, - "name": "Tabuleiro" - }, - "316800": { - "latitude": -15.82449478, - "longitude": -42.05610783, - "name": "Taiobeiras" - }, - "316805": { - "latitude": -19.73861414, - "longitude": -41.61156014, - "name": "Taparuba" - }, - "316810": { - "latitude": -19.91584298, - "longitude": -46.86828231, - "name": "Tapira" - }, - "316820": { - "latitude": -19.8761986, - "longitude": -46.16067984, - "name": "Tapiraí" - }, - "316830": { - "latitude": -19.63401096, - "longitude": -43.68562097, - "name": "Taquaraçu de Minas" - }, - "316840": { - "latitude": -19.30146634, - "longitude": -41.90191696, - "name": "Tarumirim" - }, - "316850": { - "latitude": -20.63212469, - "longitude": -42.86246372, - "name": "Teixeiras" - }, - "316860": { - "latitude": -17.71460333, - "longitude": -41.38365537, - "name": "Teófilo Otoni" - }, - "316870": { - "latitude": -19.55800708, - "longitude": -42.60263004, - "name": "Timóteo" - }, - "316880": { - "latitude": -21.116425, - "longitude": -44.15461789, - "name": "Tiradentes" - }, - "316890": { - "latitude": -18.86005733, - "longitude": -45.82407744, - "name": "Tiros" - }, - "316900": { - "latitude": -21.17747487, - "longitude": -43.02647799, - "name": "Tocantins" - }, - "316905": { - "latitude": -22.35869291, - "longitude": -46.14649157, - "name": "Tocos do Moji" - }, - "316910": { - "latitude": -22.70571204, - "longitude": -46.38321676, - "name": "Toledo" - }, - "316920": { - "latitude": -20.88190063, - "longitude": -42.06417179, - "name": "Tombos" - }, - "316930": { - "latitude": -21.68640606, - "longitude": -45.20489322, - "name": "Três Corações" - }, - "316935": { - "latitude": -18.29784088, - "longitude": -45.06915714, - "name": "Três Marias" - }, - "316940": { - "latitude": -21.39354485, - "longitude": -45.49816061, - "name": "Três Pontas" - }, - "316950": { - "latitude": -19.01500411, - "longitude": -41.70549729, - "name": "Tumiritinga" - }, - "316960": { - "latitude": -18.53501057, - "longitude": -48.75528701, - "name": "Tupaciguara" - }, - "316970": { - "latitude": -17.2444663, - "longitude": -42.83994222, - "name": "Turmalina" - }, - "316980": { - "latitude": -21.88497569, - "longitude": -45.79967815, - "name": "Turvolândia" - }, - "316990": { - "latitude": -21.10532865, - "longitude": -42.96527372, - "name": "Ubá" - }, - "317000": { - "latitude": -16.36402551, - "longitude": -44.84768199, - "name": "Ubaí" - }, - "317005": { - "latitude": -19.66052238, - "longitude": -42.06994195, - "name": "Ubaporanga" - }, - "317010": { - "latitude": -19.5809313, - "longitude": -47.97716208, - "name": "Uberaba" - }, - "317020": { - "latitude": -19.02777147, - "longitude": -48.33173702, - "name": "Uberlândia" - }, - "317030": { - "latitude": -17.2723866, - "longitude": -40.66690718, - "name": "Umburatiba" - }, - "317040": { - "latitude": -16.37577332, - "longitude": -46.8195583, - "name": "Unaí" - }, - "317043": { - "latitude": -19.4084365, - "longitude": -50.34295175, - "name": "União de Minas" - }, - "317047": { - "latitude": -16.09258694, - "longitude": -46.31961372, - "name": "Uruana de Minas" - }, - "317050": { - "latitude": -20.32531358, - "longitude": -42.72979189, - "name": "Urucânia" - }, - "317052": { - "latitude": -16.02863919, - "longitude": -45.57287863, - "name": "Urucuia" - }, - "317057": { - "latitude": -19.60367971, - "longitude": -42.32129642, - "name": "Vargem Alegre" - }, - "317060": { - "latitude": -20.43127715, - "longitude": -46.33615102, - "name": "Vargem Bonita" - }, - "317065": { - "latitude": -15.34066382, - "longitude": -42.29893994, - "name": "Vargem Grande do Rio Pardo" - }, - "317070": { - "latitude": -21.55748445, - "longitude": -45.40910838, - "name": "Varginha" - }, - "317075": { - "latitude": -18.46656672, - "longitude": -45.93517509, - "name": "Varjão de Minas" - }, - "317080": { - "latitude": -17.49573999, - "longitude": -44.7272687, - "name": "Várzea da Palma" - }, - "317090": { - "latitude": -15.64147585, - "longitude": -43.93443005, - "name": "Varzelândia" - }, - "317100": { - "latitude": -17.86915228, - "longitude": -46.86762428, - "name": "Vazante" - }, - "317103": { - "latitude": -15.54018973, - "longitude": -43.62829997, - "name": "Verdelândia" - }, - "317107": { - "latitude": -17.48766482, - "longitude": -42.72524988, - "name": "Veredinha" - }, - "317110": { - "latitude": -19.60246728, - "longitude": -48.34091478, - "name": "Veríssimo" - }, - "317115": { - "latitude": -20.03398534, - "longitude": -42.25429873, - "name": "Vermelho Novo" - }, - "317120": { - "latitude": -19.73094054, - "longitude": -43.94484551, - "name": "Vespasiano" - }, - "317130": { - "latitude": -20.74042, - "longitude": -42.88551271, - "name": "Viçosa" - }, - "317140": { - "latitude": -20.91264489, - "longitude": -42.28198572, - "name": "Vieiras" - }, - "317150": { - "latitude": -18.61113431, - "longitude": -41.92718238, - "name": "Mathias Lobato" - }, - "317160": { - "latitude": -16.71547053, - "longitude": -42.33962489, - "name": "Virgem da Lapa" - }, - "317170": { - "latitude": -22.3419406, - "longitude": -45.1085133, - "name": "Virgínia" - }, - "317180": { - "latitude": -18.79188107, - "longitude": -42.6702908, - "name": "Virginópolis" - }, - "317190": { - "latitude": -18.45166969, - "longitude": -42.31754594, - "name": "Virgolândia" - }, - "317200": { - "latitude": -21.0115773, - "longitude": -42.83996502, - "name": "Visconde do Rio Branco" - }, - "317210": { - "latitude": -21.75802234, - "longitude": -42.55735645, - "name": "Volta Grande" - }, - "317220": { - "latitude": -22.55468339, - "longitude": -45.40136954, - "name": "Wenceslau Braz" - }, - "320010": { - "latitude": -20.08942674, - "longitude": -41.1265138, - "name": "Afonso Cláudio" - }, - "320013": { - "latitude": -18.97033425, - "longitude": -40.74950605, - "name": "Águia Branca" - }, - "320016": { - "latitude": -18.51664896, - "longitude": -40.99675854, - "name": "Água Doce do Norte" - }, - "320020": { - "latitude": -20.71949619, - "longitude": -41.51493531, - "name": "Alegre" - }, - "320030": { - "latitude": -20.56390036, - "longitude": -40.82705623, - "name": "Alfredo Chaves" - }, - "320035": { - "latitude": -19.02210777, - "longitude": -40.98720025, - "name": "Alto Rio Novo" - }, - "320040": { - "latitude": -20.71867017, - "longitude": -40.68627956, - "name": "Anchieta" - }, - "320050": { - "latitude": -21.07213402, - "longitude": -41.55414229, - "name": "Apiacá" - }, - "320060": { - "latitude": -19.76562166, - "longitude": -40.1761416, - "name": "Aracruz" - }, - "320070": { - "latitude": -20.96220803, - "longitude": -41.18399021, - "name": "Atílio Vivácqua" - }, - "320080": { - "latitude": -19.57239024, - "longitude": -40.9837811, - "name": "Baixo Guandu" - }, - "320090": { - "latitude": -18.66610605, - "longitude": -40.83116655, - "name": "Barra de São Francisco" - }, - "320100": { - "latitude": -18.48475046, - "longitude": -40.32913278, - "name": "Boa Esperança" - }, - "320110": { - "latitude": -21.08446272, - "longitude": -41.63384048, - "name": "Bom Jesus do Norte" - }, - "320115": { - "latitude": -20.12537391, - "longitude": -41.29693939, - "name": "Brejetuba" - }, - "320120": { - "latitude": -20.76611125, - "longitude": -41.19099668, - "name": "Cachoeiro de Itapemirim" - }, - "320130": { - "latitude": -20.290687, - "longitude": -40.44204913, - "name": "Cariacica" - }, - "320140": { - "latitude": -20.55172691, - "longitude": -41.20397257, - "name": "Castelo" - }, - "320150": { - "latitude": -19.48820286, - "longitude": -40.65679155, - "name": "Colatina" - }, - "320160": { - "latitude": -18.44513692, - "longitude": -39.8333677, - "name": "Conceição da Barra" - }, - "320170": { - "latitude": -20.37085162, - "longitude": -41.26590753, - "name": "Conceição do Castelo" - }, - "320180": { - "latitude": -20.58679624, - "longitude": -41.72446215, - "name": "Divino de São Lourenço" - }, - "320190": { - "latitude": -20.30777794, - "longitude": -40.84897404, - "name": "Domingos Martins" - }, - "320200": { - "latitude": -20.6350076, - "longitude": -41.81211084, - "name": "Dores do Rio Preto" - }, - "320210": { - "latitude": -18.26558387, - "longitude": -40.80769335, - "name": "Ecoporanga" - }, - "320220": { - "latitude": -19.96830494, - "longitude": -40.35679728, - "name": "Fundão" - }, - "320225": { - "latitude": -19.20536828, - "longitude": -40.500016, - "name": "Governador Lindenberg" - }, - "320230": { - "latitude": -20.76342081, - "longitude": -41.70522869, - "name": "Guaçuí" - }, - "320240": { - "latitude": -20.58505223, - "longitude": -40.54626087, - "name": "Guarapari" - }, - "320245": { - "latitude": -20.25073084, - "longitude": -41.55016837, - "name": "Ibatiba" - }, - "320250": { - "latitude": -19.83479886, - "longitude": -40.41786716, - "name": "Ibiraçu" - }, - "320255": { - "latitude": -20.48595604, - "longitude": -41.69262257, - "name": "Ibitirama" - }, - "320260": { - "latitude": -20.75493562, - "longitude": -40.85746796, - "name": "Iconha" - }, - "320265": { - "latitude": -20.3311523, - "longitude": -41.63680633, - "name": "Irupi" - }, - "320270": { - "latitude": -19.72856206, - "longitude": -40.86462507, - "name": "Itaguaçu" - }, - "320280": { - "latitude": -20.96577058, - "longitude": -40.94472451, - "name": "Itapemirim" - }, - "320290": { - "latitude": -19.9499749, - "longitude": -40.88893186, - "name": "Itarana" - }, - "320300": { - "latitude": -20.34848051, - "longitude": -41.65649959, - "name": "Iúna" - }, - "320305": { - "latitude": -18.94965066, - "longitude": -40.00410148, - "name": "Jaguaré" - }, - "320310": { - "latitude": -20.80460968, - "longitude": -41.3922181, - "name": "Jerônimo Monteiro" - }, - "320313": { - "latitude": -19.7153766, - "longitude": -40.436886, - "name": "João Neiva" - }, - "320316": { - "latitude": -19.87258116, - "longitude": -41.05772535, - "name": "Laranja da Terra" - }, - "320320": { - "latitude": -19.38267673, - "longitude": -40.02937459, - "name": "Linhares" - }, - "320330": { - "latitude": -18.87642357, - "longitude": -41.07172373, - "name": "Mantenópolis" - }, - "320332": { - "latitude": -21.10005832, - "longitude": -40.89363659, - "name": "Marataízes" - }, - "320334": { - "latitude": -20.4312685, - "longitude": -40.77390296, - "name": "Marechal Floriano" - }, - "320335": { - "latitude": -19.42974181, - "longitude": -40.52068141, - "name": "Marilândia" - }, - "320340": { - "latitude": -21.08861153, - "longitude": -41.37677022, - "name": "Mimoso do Sul" - }, - "320350": { - "latitude": -18.13886733, - "longitude": -40.27515034, - "name": "Montanha" - }, - "320360": { - "latitude": -18.01480164, - "longitude": -40.51253295, - "name": "Mucurici" - }, - "320370": { - "latitude": -20.42677923, - "longitude": -41.43497276, - "name": "Muniz Freire" - }, - "320380": { - "latitude": -20.93829925, - "longitude": -41.34392389, - "name": "Muqui" - }, - "320390": { - "latitude": -18.69842653, - "longitude": -40.52243448, - "name": "Nova Venécia" - }, - "320400": { - "latitude": -19.1468103, - "longitude": -40.8177779, - "name": "Pancas" - }, - "320405": { - "latitude": -18.18243861, - "longitude": -40.03710136, - "name": "Pedro Canário" - }, - "320410": { - "latitude": -18.36989373, - "longitude": -40.19820088, - "name": "Pinheiros" - }, - "320420": { - "latitude": -20.83774563, - "longitude": -40.7725011, - "name": "Piúma" - }, - "320425": { - "latitude": -18.25079632, - "longitude": -40.51425738, - "name": "Ponto Belo" - }, - "320430": { - "latitude": -21.14073468, - "longitude": -41.07207337, - "name": "Presidente Kennedy" - }, - "320435": { - "latitude": -19.23048714, - "longitude": -40.30821832, - "name": "Rio Bananal" - }, - "320440": { - "latitude": -20.81808983, - "longitude": -40.91872138, - "name": "Rio Novo do Sul" - }, - "320450": { - "latitude": -20.12315856, - "longitude": -40.53925799, - "name": "Santa Leopoldina" - }, - "320455": { - "latitude": -20.08509931, - "longitude": -40.80638902, - "name": "Santa Maria de Jetibá" - }, - "320460": { - "latitude": -19.87920465, - "longitude": -40.63485382, - "name": "Santa Teresa" - }, - "320465": { - "latitude": -19.12243838, - "longitude": -40.56668089, - "name": "São Domingos do Norte" - }, - "320470": { - "latitude": -18.9527172, - "longitude": -40.50846445, - "name": "São Gabriel da Palha" - }, - "320480": { - "latitude": -20.98280742, - "longitude": -41.65566741, - "name": "São José do Calçado" - }, - "320490": { - "latitude": -18.74957885, - "longitude": -40.02030192, - "name": "São Mateus" - }, - "320495": { - "latitude": -19.71971274, - "longitude": -40.67948866, - "name": "São Roque do Canaã" - }, - "320500": { - "latitude": -20.12811892, - "longitude": -40.30162039, - "name": "Serra" - }, - "320501": { - "latitude": -19.07264154, - "longitude": -40.14662065, - "name": "Sooretama" - }, - "320503": { - "latitude": -20.64712373, - "longitude": -41.00492912, - "name": "Vargem Alta" - }, - "320506": { - "latitude": -20.37042902, - "longitude": -41.14021991, - "name": "Venda Nova do Imigrante" - }, - "320510": { - "latitude": -20.40105388, - "longitude": -40.5127422, - "name": "Viana" - }, - "320515": { - "latitude": -18.61424128, - "longitude": -40.62715548, - "name": "Vila Pavão" - }, - "320517": { - "latitude": -18.9665938, - "longitude": -40.32950592, - "name": "Vila Valério" - }, - "320520": { - "latitude": -20.4341759, - "longitude": -40.37838541, - "name": "Vila Velha" - }, - "320530": { - "latitude": -20.27872925, - "longitude": -40.29731412, - "name": "Vitória" - }, - "330010": { - "latitude": -22.9364358, - "longitude": -44.38555995, - "name": "Angra dos Reis" - }, - "330015": { - "latitude": -21.65229197, - "longitude": -42.13466556, - "name": "Aperibé" - }, - "330020": { - "latitude": -22.75534707, - "longitude": -42.29290939, - "name": "Araruama" - }, - "330022": { - "latitude": -22.23539946, - "longitude": -43.12153804, - "name": "Areal" - }, - "330023": { - "latitude": -22.77642639, - "longitude": -41.95068356, - "name": "Armação dos Búzios" - }, - "330025": { - "latitude": -22.92150304, - "longitude": -42.16852746, - "name": "Arraial do Cabo" - }, - "330030": { - "latitude": -22.42566198, - "longitude": -43.9129587, - "name": "Barra do Piraí" - }, - "330040": { - "latitude": -22.50578278, - "longitude": -44.18830626, - "name": "Barra Mansa" - }, - "330045": { - "latitude": -22.72872849, - "longitude": -43.37756526, - "name": "Belford Roxo" - }, - "330050": { - "latitude": -22.19974809, - "longitude": -42.37172629, - "name": "Bom Jardim" - }, - "330060": { - "latitude": -21.12346253, - "longitude": -41.68320076, - "name": "Bom Jesus do Itabapoana" - }, - "330070": { - "latitude": -22.71075622, - "longitude": -42.05771634, - "name": "Cabo Frio" - }, - "330080": { - "latitude": -22.51612063, - "longitude": -42.7284108, - "name": "Cachoeiras de Macacu" - }, - "330090": { - "latitude": -21.49691714, - "longitude": -41.91465189, - "name": "Cambuci" - }, - "330093": { - "latitude": -22.19595297, - "longitude": -41.65090367, - "name": "Carapebus" - }, - "330095": { - "latitude": -22.04377102, - "longitude": -43.25573982, - "name": "Comendador Levy Gasparian" - }, - "330100": { - "latitude": -21.7476612, - "longitude": -41.40409225, - "name": "Campos dos Goytacazes" - }, - "330110": { - "latitude": -21.86835482, - "longitude": -42.3338868, - "name": "Cantagalo" - }, - "330115": { - "latitude": -21.52545359, - "longitude": -41.50029654, - "name": "Cardoso Moreira" - }, - "330120": { - "latitude": -21.89542013, - "longitude": -42.56641216, - "name": "Carmo" - }, - "330130": { - "latitude": -22.48186185, - "longitude": -42.14424125, - "name": "Casimiro de Abreu" - }, - "330140": { - "latitude": -22.13661266, - "longitude": -41.84657981, - "name": "Conceição de Macabu" - }, - "330150": { - "latitude": -22.05880366, - "longitude": -42.34222062, - "name": "Cordeiro" - }, - "330160": { - "latitude": -22.05560886, - "longitude": -42.49804432, - "name": "Duas Barras" - }, - "330170": { - "latitude": -22.63249169, - "longitude": -43.29960647, - "name": "Duque de Caxias" - }, - "330180": { - "latitude": -22.50828593, - "longitude": -43.63609937, - "name": "Engenheiro Paulo de Frontin" - }, - "330185": { - "latitude": -22.58350396, - "longitude": -42.96401562, - "name": "Guapimirim" - }, - "330187": { - "latitude": -22.82748307, - "longitude": -42.21801086, - "name": "Iguaba Grande" - }, - "330190": { - "latitude": -22.75002491, - "longitude": -42.85425341, - "name": "Itaboraí" - }, - "330200": { - "latitude": -22.83005063, - "longitude": -43.81334862, - "name": "Itaguaí" - }, - "330205": { - "latitude": -21.42390854, - "longitude": -41.65383101, - "name": "Italva" - }, - "330210": { - "latitude": -21.72689, - "longitude": -42.08224211, - "name": "Itaocara" - }, - "330220": { - "latitude": -21.22509754, - "longitude": -41.89402489, - "name": "Itaperuna" - }, - "330225": { - "latitude": -22.44166282, - "longitude": -44.58784163, - "name": "Itatiaia" - }, - "330227": { - "latitude": -22.66192467, - "longitude": -43.60575612, - "name": "Japeri" - }, - "330230": { - "latitude": -21.25010224, - "longitude": -42.13511873, - "name": "Laje do Muriaé" - }, - "330240": { - "latitude": -22.29562281, - "longitude": -41.97709702, - "name": "Macaé" - }, - "330245": { - "latitude": -22.02400141, - "longitude": -42.2735346, - "name": "Macuco" - }, - "330250": { - "latitude": -22.61261672, - "longitude": -43.11302623, - "name": "Magé" - }, - "330260": { - "latitude": -22.93075836, - "longitude": -44.06440822, - "name": "Mangaratiba" - }, - "330270": { - "latitude": -22.91519333, - "longitude": -42.81684742, - "name": "Maricá" - }, - "330280": { - "latitude": -22.52152775, - "longitude": -43.73976196, - "name": "Mendes" - }, - "330285": { - "latitude": -22.79931349, - "longitude": -43.45231513, - "name": "Mesquita" - }, - "330290": { - "latitude": -22.50649127, - "longitude": -43.4692409, - "name": "Miguel Pereira" - }, - "330300": { - "latitude": -21.39558315, - "longitude": -42.15220001, - "name": "Miracema" - }, - "330310": { - "latitude": -21.04164989, - "longitude": -41.93126327, - "name": "Natividade" - }, - "330320": { - "latitude": -22.82106727, - "longitude": -43.42895125, - "name": "Nilópolis" - }, - "330330": { - "latitude": -22.91509691, - "longitude": -43.05466061, - "name": "Niterói" - }, - "330340": { - "latitude": -22.31912047, - "longitude": -42.5010344, - "name": "Nova Friburgo" - }, - "330350": { - "latitude": -22.68676081, - "longitude": -43.5018375, - "name": "Nova Iguaçu" - }, - "330360": { - "latitude": -22.61789788, - "longitude": -43.72151837, - "name": "Paracambi" - }, - "330370": { - "latitude": -22.18195772, - "longitude": -43.30432902, - "name": "Paraíba do Sul" - }, - "330380": { - "latitude": -23.14806579, - "longitude": -44.70700675, - "name": "Paraty" - }, - "330385": { - "latitude": -22.36702489, - "longitude": -43.40397486, - "name": "Paty do Alferes" - }, - "330390": { - "latitude": -22.39795664, - "longitude": -43.15683235, - "name": "Petrópolis" - }, - "330395": { - "latitude": -22.54332565, - "longitude": -43.99754675, - "name": "Pinheiral" - }, - "330400": { - "latitude": -22.63358811, - "longitude": -43.90171374, - "name": "Piraí" - }, - "330410": { - "latitude": -20.90656427, - "longitude": -41.96958324, - "name": "Porciúncula" - }, - "330411": { - "latitude": -22.44111664, - "longitude": -44.32604119, - "name": "Porto Real" - }, - "330412": { - "latitude": -22.35515151, - "longitude": -44.23710291, - "name": "Quatis" - }, - "330414": { - "latitude": -22.72541512, - "longitude": -43.58492244, - "name": "Queimados" - }, - "330415": { - "latitude": -22.10479908, - "longitude": -41.44440496, - "name": "Quissamã" - }, - "330420": { - "latitude": -22.44064134, - "longitude": -44.48525771, - "name": "Resende" - }, - "330430": { - "latitude": -22.73501518, - "longitude": -42.58806702, - "name": "Rio Bonito" - }, - "330440": { - "latitude": -22.78048167, - "longitude": -44.07837787, - "name": "Rio Claro" - }, - "330450": { - "latitude": -22.1598948, - "longitude": -43.53865962, - "name": "Rio das Flores" - }, - "330452": { - "latitude": -22.45421566, - "longitude": -41.94651879, - "name": "Rio das Ostras" - }, - "330455": { - "latitude": -22.9254789, - "longitude": -43.45804266, - "name": "Rio de Janeiro" - }, - "330460": { - "latitude": -21.96963447, - "longitude": -41.91347796, - "name": "Santa Maria Madalena" - }, - "330470": { - "latitude": -21.55561576, - "longitude": -42.19287913, - "name": "Santo Antônio de Pádua" - }, - "330475": { - "latitude": -21.41665158, - "longitude": -41.13568215, - "name": "São Francisco de Itabapoana" - }, - "330480": { - "latitude": -21.65990189, - "longitude": -41.78698199, - "name": "São Fidélis" - }, - "330490": { - "latitude": -22.82559181, - "longitude": -42.99649518, - "name": "São Gonçalo" - }, - "330500": { - "latitude": -21.78225608, - "longitude": -41.08082478, - "name": "São João da Barra" - }, - "330510": { - "latitude": -22.78514839, - "longitude": -43.36530438, - "name": "São João de Meriti" - }, - "330513": { - "latitude": -21.37081803, - "longitude": -41.94926454, - "name": "São José de Ubá" - }, - "330515": { - "latitude": -22.16972648, - "longitude": -42.93252261, - "name": "São José do Vale do Rio Preto" - }, - "330520": { - "latitude": -22.7883641, - "longitude": -42.12606726, - "name": "São Pedro da Aldeia" - }, - "330530": { - "latitude": -21.88335547, - "longitude": -42.10224299, - "name": "São Sebastião do Alto" - }, - "330540": { - "latitude": -22.02412432, - "longitude": -42.82281689, - "name": "Sapucaia" - }, - "330550": { - "latitude": -22.8781407, - "longitude": -42.51884179, - "name": "Saquarema" - }, - "330555": { - "latitude": -22.75553796, - "longitude": -43.6985684, - "name": "Seropédica" - }, - "330560": { - "latitude": -22.56757803, - "longitude": -42.41335467, - "name": "Silva Jardim" - }, - "330570": { - "latitude": -22.10707832, - "longitude": -42.66419694, - "name": "Sumidouro" - }, - "330575": { - "latitude": -22.78218743, - "longitude": -42.7254485, - "name": "Tanguá" - }, - "330580": { - "latitude": -22.31407125, - "longitude": -42.87337676, - "name": "Teresópolis" - }, - "330590": { - "latitude": -22.12974965, - "longitude": -42.15496291, - "name": "Trajano de Moraes" - }, - "330600": { - "latitude": -22.12473148, - "longitude": -43.11215154, - "name": "Três Rios" - }, - "330610": { - "latitude": -22.2342245, - "longitude": -43.85752635, - "name": "Valença" - }, - "330615": { - "latitude": -20.89292654, - "longitude": -41.82970967, - "name": "Varre-Sai" - }, - "330620": { - "latitude": -22.35855817, - "longitude": -43.56972987, - "name": "Vassouras" - }, - "330630": { - "latitude": -22.49092322, - "longitude": -44.08893111, - "name": "Volta Redonda" - }, - "350010": { - "latitude": -21.57668221, - "longitude": -51.05680236, - "name": "Adamantina" - }, - "350020": { - "latitude": -21.2886851, - "longitude": -49.65328344, - "name": "Adolfo" - }, - "350030": { - "latitude": -22.0499563, - "longitude": -47.0403199, - "name": "Aguaí" - }, - "350040": { - "latitude": -21.91371032, - "longitude": -46.69167761, - "name": "Águas da Prata" - }, - "350050": { - "latitude": -22.47482317, - "longitude": -46.60367208, - "name": "Águas de Lindóia" - }, - "350055": { - "latitude": -22.85795484, - "longitude": -49.26103703, - "name": "Águas de Santa Bárbara" - }, - "350060": { - "latitude": -22.59864968, - "longitude": -47.87608966, - "name": "Águas de São Pedro" - }, - "350070": { - "latitude": -22.57193421, - "longitude": -49.10876754, - "name": "Agudos" - }, - "350075": { - "latitude": -23.54892703, - "longitude": -47.86905506, - "name": "Alambari" - }, - "350080": { - "latitude": -21.93497295, - "longitude": -51.39565497, - "name": "Alfredo Marcondes" - }, - "350090": { - "latitude": -20.53333779, - "longitude": -49.09386082, - "name": "Altair" - }, - "350100": { - "latitude": -21.01804725, - "longitude": -47.3862483, - "name": "Altinópolis" - }, - "350110": { - "latitude": -21.61253978, - "longitude": -50.19211677, - "name": "Alto Alegre" - }, - "350115": { - "latitude": -23.53302116, - "longitude": -47.28125922, - "name": "Alumínio" - }, - "350120": { - "latitude": -20.28955443, - "longitude": -49.92025146, - "name": "Álvares Florence" - }, - "350130": { - "latitude": -22.13150467, - "longitude": -51.51492033, - "name": "Álvares Machado" - }, - "350140": { - "latitude": -22.08652416, - "longitude": -49.73398938, - "name": "Álvaro de Carvalho" - }, - "350150": { - "latitude": -22.45255221, - "longitude": -49.75853065, - "name": "Alvinlândia" - }, - "350160": { - "latitude": -22.72324294, - "longitude": -47.28911885, - "name": "Americana" - }, - "350170": { - "latitude": -21.7223278, - "longitude": -48.03237735, - "name": "Américo Brasiliense" - }, - "350180": { - "latitude": -20.28938611, - "longitude": -49.76801795, - "name": "Américo de Campos" - }, - "350190": { - "latitude": -22.69912878, - "longitude": -46.79872856, - "name": "Amparo" - }, - "350200": { - "latitude": -22.12108462, - "longitude": -47.67795535, - "name": "Analândia" - }, - "350210": { - "latitude": -20.83560018, - "longitude": -51.32971778, - "name": "Andradina" - }, - "350220": { - "latitude": -23.43684187, - "longitude": -48.45933417, - "name": "Angatuba" - }, - "350230": { - "latitude": -22.80006736, - "longitude": -48.17473112, - "name": "Anhembi" - }, - "350240": { - "latitude": -22.36202429, - "longitude": -51.42777945, - "name": "Anhumas" - }, - "350250": { - "latitude": -22.91420605, - "longitude": -45.23721922, - "name": "Aparecida" - }, - "350260": { - "latitude": -20.47880339, - "longitude": -50.92197726, - "name": "Aparecida d'Oeste" - }, - "350270": { - "latitude": -24.42147033, - "longitude": -48.81735731, - "name": "Apiaí" - }, - "350275": { - "latitude": -23.43443388, - "longitude": -47.07237502, - "name": "Araçariguama" - }, - "350280": { - "latitude": -21.11385786, - "longitude": -50.57449809, - "name": "Araçatuba" - }, - "350290": { - "latitude": -23.54386507, - "longitude": -47.65152717, - "name": "Araçoiaba da Serra" - }, - "350300": { - "latitude": -20.14504603, - "longitude": -47.82064377, - "name": "Aramina" - }, - "350310": { - "latitude": -23.17769654, - "longitude": -49.06403336, - "name": "Arandu" - }, - "350315": { - "latitude": -22.67291126, - "longitude": -44.43858939, - "name": "Arapeí" - }, - "350320": { - "latitude": -21.7916497, - "longitude": -48.18132249, - "name": "Araraquara" - }, - "350330": { - "latitude": -22.34615892, - "longitude": -47.32385601, - "name": "Araras" - }, - "350335": { - "latitude": -21.76633948, - "longitude": -50.43094277, - "name": "Arco-Íris" - }, - "350340": { - "latitude": -22.07629657, - "longitude": -48.98189311, - "name": "Arealva" - }, - "350350": { - "latitude": -22.67313148, - "longitude": -44.71235363, - "name": "Areias" - }, - "350360": { - "latitude": -22.63182022, - "longitude": -48.65284536, - "name": "Areiópolis" - }, - "350370": { - "latitude": -21.1856654, - "longitude": -48.7792126, - "name": "Ariranha" - }, - "350380": { - "latitude": -22.56119767, - "longitude": -47.13215277, - "name": "Artur Nogueira" - }, - "350390": { - "latitude": -23.38601842, - "longitude": -46.31905102, - "name": "Arujá" - }, - "350395": { - "latitude": -20.18355893, - "longitude": -50.72803037, - "name": "Aspásia" - }, - "350400": { - "latitude": -22.60174122, - "longitude": -50.42076274, - "name": "Assis" - }, - "350410": { - "latitude": -23.123262, - "longitude": -46.58678741, - "name": "Atibaia" - }, - "350420": { - "latitude": -20.64414216, - "longitude": -50.57995994, - "name": "Auriflama" - }, - "350430": { - "latitude": -22.18718593, - "longitude": -49.31621175, - "name": "Avaí" - }, - "350440": { - "latitude": -21.46054124, - "longitude": -49.94735221, - "name": "Avanhandava" - }, - "350450": { - "latitude": -23.07519007, - "longitude": -48.89401493, - "name": "Avaré" - }, - "350460": { - "latitude": -20.93153512, - "longitude": -49.43761997, - "name": "Bady Bassitt" - }, - "350470": { - "latitude": -21.89241208, - "longitude": -49.33308238, - "name": "Balbinos" - }, - "350480": { - "latitude": -20.7095649, - "longitude": -49.55180191, - "name": "Bálsamo" - }, - "350490": { - "latitude": -22.73383412, - "longitude": -44.33451923, - "name": "Bananal" - }, - "350500": { - "latitude": -23.5829147, - "longitude": -49.57195843, - "name": "Barão de Antonina" - }, - "350510": { - "latitude": -21.29065872, - "longitude": -49.92216751, - "name": "Barbosa" - }, - "350520": { - "latitude": -22.06680669, - "longitude": -48.71883763, - "name": "Bariri" - }, - "350530": { - "latitude": -22.47947843, - "longitude": -48.54174728, - "name": "Barra Bonita" - }, - "350535": { - "latitude": -24.44377661, - "longitude": -49.08527978, - "name": "Barra do Chapéu" - }, - "350540": { - "latitude": -24.88874209, - "longitude": -48.42697368, - "name": "Barra do Turvo" - }, - "350550": { - "latitude": -20.51416496, - "longitude": -48.65194948, - "name": "Barretos" - }, - "350560": { - "latitude": -21.23254842, - "longitude": -48.09505531, - "name": "Barrinha" - }, - "350570": { - "latitude": -23.50527916, - "longitude": -46.87724966, - "name": "Barueri" - }, - "350580": { - "latitude": -21.95021801, - "longitude": -50.74399732, - "name": "Bastos" - }, - "350590": { - "latitude": -20.86779896, - "longitude": -47.57477373, - "name": "Batatais" - }, - "350600": { - "latitude": -22.25399189, - "longitude": -49.12613468, - "name": "Bauru" - }, - "350610": { - "latitude": -20.94045112, - "longitude": -48.5107488, - "name": "Bebedouro" - }, - "350620": { - "latitude": -21.33175515, - "longitude": -50.86196145, - "name": "Bento de Abreu" - }, - "350630": { - "latitude": -23.03076953, - "longitude": -49.49189826, - "name": "Bernardino de Campos" - }, - "350635": { - "latitude": -23.759762, - "longitude": -46.03002178, - "name": "Bertioga" - }, - "350640": { - "latitude": -21.42778975, - "longitude": -50.47926665, - "name": "Bilac" - }, - "350650": { - "latitude": -21.26160627, - "longitude": -50.35097258, - "name": "Birigui" - }, - "350660": { - "latitude": -23.62416535, - "longitude": -46.02132279, - "name": "Biritiba Mirim" - }, - "350670": { - "latitude": -21.93501157, - "longitude": -48.46359199, - "name": "Boa Esperança do Sul" - }, - "350680": { - "latitude": -22.10543031, - "longitude": -48.52905088, - "name": "Bocaina" - }, - "350690": { - "latitude": -23.12896965, - "longitude": -48.28587148, - "name": "Bofete" - }, - "350700": { - "latitude": -23.28758396, - "longitude": -47.67496125, - "name": "Boituva" - }, - "350710": { - "latitude": -23.17251999, - "longitude": -46.47897887, - "name": "Bom Jesus dos Perdões" - }, - "350715": { - "latitude": -24.31593615, - "longitude": -49.16457959, - "name": "Bom Sucesso de Itararé" - }, - "350720": { - "latitude": -22.24421699, - "longitude": -50.50212706, - "name": "Borá" - }, - "350730": { - "latitude": -22.17014734, - "longitude": -48.78833118, - "name": "Boracéia" - }, - "350740": { - "latitude": -21.61077697, - "longitude": -49.07199113, - "name": "Borborema" - }, - "350745": { - "latitude": -22.68066749, - "longitude": -48.99231978, - "name": "Borebi" - }, - "350750": { - "latitude": -22.86344219, - "longitude": -48.46832193, - "name": "Botucatu" - }, - "350760": { - "latitude": -22.93835379, - "longitude": -46.55594757, - "name": "Bragança Paulista" - }, - "350770": { - "latitude": -21.55310702, - "longitude": -50.33939249, - "name": "Braúna" - }, - "350775": { - "latitude": -21.17655375, - "longitude": -50.2097806, - "name": "Brejo Alegre" - }, - "350780": { - "latitude": -21.04953509, - "longitude": -47.62777221, - "name": "Brodowski" - }, - "350790": { - "latitude": -22.2732907, - "longitude": -48.08122541, - "name": "Brotas" - }, - "350800": { - "latitude": -23.75202961, - "longitude": -48.57531134, - "name": "Buri" - }, - "350810": { - "latitude": -21.04911355, - "longitude": -50.20022091, - "name": "Buritama" - }, - "350820": { - "latitude": -20.20931774, - "longitude": -47.69293417, - "name": "Buritizal" - }, - "350830": { - "latitude": -22.48945124, - "longitude": -49.37299065, - "name": "Cabrália Paulista" - }, - "350840": { - "latitude": -23.30130622, - "longitude": -47.08020583, - "name": "Cabreúva" - }, - "350850": { - "latitude": -23.10372758, - "longitude": -45.71330737, - "name": "Caçapava" - }, - "350860": { - "latitude": -22.70237625, - "longitude": -44.99166993, - "name": "Cachoeira Paulista" - }, - "350870": { - "latitude": -21.53951446, - "longitude": -46.61703823, - "name": "Caconde" - }, - "350880": { - "latitude": -21.73114582, - "longitude": -49.54868443, - "name": "Cafelândia" - }, - "350890": { - "latitude": -21.94976423, - "longitude": -51.22388872, - "name": "Caiabu" - }, - "350900": { - "latitude": -23.37593181, - "longitude": -46.74522651, - "name": "Caieiras" - }, - "350910": { - "latitude": -21.80145657, - "longitude": -51.98663846, - "name": "Caiuá" - }, - "350920": { - "latitude": -23.35143171, - "longitude": -46.87203499, - "name": "Cajamar" - }, - "350925": { - "latitude": -24.77204504, - "longitude": -48.19503007, - "name": "Cajati" - }, - "350930": { - "latitude": -20.87367605, - "longitude": -48.83876505, - "name": "Cajobi" - }, - "350940": { - "latitude": -21.27595798, - "longitude": -47.31029385, - "name": "Cajuru" - }, - "350945": { - "latitude": -23.60682527, - "longitude": -48.44203461, - "name": "Campina do Monte Alegre" - }, - "350950": { - "latitude": -22.88376008, - "longitude": -47.04379961, - "name": "Campinas" - }, - "350960": { - "latitude": -23.21791798, - "longitude": -46.76005648, - "name": "Campo Limpo Paulista" - }, - "350970": { - "latitude": -22.70162802, - "longitude": -45.53306905, - "name": "Campos do Jordão" - }, - "350980": { - "latitude": -22.61086749, - "longitude": -50.01028193, - "name": "Campos Novos Paulista" - }, - "350990": { - "latitude": -25.01830382, - "longitude": -48.00872104, - "name": "Cananéia" - }, - "350995": { - "latitude": -22.73007028, - "longitude": -45.04135637, - "name": "Canas" - }, - "351000": { - "latitude": -22.80868462, - "longitude": -50.42167475, - "name": "Cândido Mota" - }, - "351010": { - "latitude": -21.34283279, - "longitude": -48.628624, - "name": "Cândido Rodrigues" - }, - "351015": { - "latitude": -23.01872703, - "longitude": -49.7918745, - "name": "Canitar" - }, - "351020": { - "latitude": -24.03920153, - "longitude": -48.28984093, - "name": "Capão Bonito" - }, - "351030": { - "latitude": -23.46738786, - "longitude": -47.73098869, - "name": "Capela do Alto" - }, - "351040": { - "latitude": -22.98072949, - "longitude": -47.4780188, - "name": "Capivari" - }, - "351050": { - "latitude": -23.63975999, - "longitude": -45.48857415, - "name": "Caraguatatuba" - }, - "351060": { - "latitude": -23.55004064, - "longitude": -46.84192849, - "name": "Carapicuíba" - }, - "351070": { - "latitude": -20.06719289, - "longitude": -49.94758953, - "name": "Cardoso" - }, - "351080": { - "latitude": -21.80054759, - "longitude": -47.08812716, - "name": "Casa Branca" - }, - "351090": { - "latitude": -21.26327901, - "longitude": -47.14409074, - "name": "Cássia dos Coqueiros" - }, - "351100": { - "latitude": -20.89761044, - "longitude": -51.57025186, - "name": "Castilho" - }, - "351110": { - "latitude": -21.13376424, - "longitude": -48.96368836, - "name": "Catanduva" - }, - "351120": { - "latitude": -21.06284358, - "longitude": -49.05280114, - "name": "Catiguá" - }, - "351130": { - "latitude": -20.91388728, - "longitude": -49.26390574, - "name": "Cedral" - }, - "351140": { - "latitude": -23.05934199, - "longitude": -49.14382031, - "name": "Cerqueira César" - }, - "351150": { - "latitude": -23.1871234, - "longitude": -47.75713329, - "name": "Cerquilho" - }, - "351160": { - "latitude": -23.21651101, - "longitude": -47.90389785, - "name": "Cesário Lange" - }, - "351170": { - "latitude": -22.5301758, - "longitude": -47.74619664, - "name": "Charqueada" - }, - "351190": { - "latitude": -21.57032918, - "longitude": -50.46006991, - "name": "Clementina" - }, - "351200": { - "latitude": -20.74616861, - "longitude": -48.58886475, - "name": "Colina" - }, - "351210": { - "latitude": -20.26687371, - "longitude": -48.72174396, - "name": "Colômbia" - }, - "351220": { - "latitude": -22.36931507, - "longitude": -47.14113444, - "name": "Conchal" - }, - "351230": { - "latitude": -22.96563303, - "longitude": -48.0471039, - "name": "Conchas" - }, - "351240": { - "latitude": -22.47955268, - "longitude": -47.41467349, - "name": "Cordeirópolis" - }, - "351250": { - "latitude": -21.37560623, - "longitude": -50.30340341, - "name": "Coroados" - }, - "351260": { - "latitude": -23.63012, - "longitude": -49.30686245, - "name": "Coronel Macedo" - }, - "351270": { - "latitude": -22.23640508, - "longitude": -47.61107634, - "name": "Corumbataí" - }, - "351280": { - "latitude": -22.65163901, - "longitude": -47.18636361, - "name": "Cosmópolis" - }, - "351290": { - "latitude": -20.44252896, - "longitude": -49.77462181, - "name": "Cosmorama" - }, - "351300": { - "latitude": -23.6751544, - "longitude": -46.96051233, - "name": "Cotia" - }, - "351310": { - "latitude": -21.33965422, - "longitude": -47.74457743, - "name": "Cravinhos" - }, - "351320": { - "latitude": -20.37132268, - "longitude": -47.4009092, - "name": "Cristais Paulista" - }, - "351330": { - "latitude": -22.73798401, - "longitude": -50.76906059, - "name": "Cruzália" - }, - "351340": { - "latitude": -22.55143065, - "longitude": -45.006301, - "name": "Cruzeiro" - }, - "351350": { - "latitude": -23.86590386, - "longitude": -46.40819604, - "name": "Cubatão" - }, - "351360": { - "latitude": -23.05287344, - "longitude": -44.94213819, - "name": "Cunha" - }, - "351370": { - "latitude": -21.88121408, - "longitude": -47.65459942, - "name": "Descalvado" - }, - "351380": { - "latitude": -23.69721428, - "longitude": -46.61142844, - "name": "Diadema" - }, - "351385": { - "latitude": -20.44845226, - "longitude": -50.62812552, - "name": "Dirce Reis" - }, - "351390": { - "latitude": -21.66167904, - "longitude": -46.69740817, - "name": "Divinolândia" - }, - "351400": { - "latitude": -21.516123, - "longitude": -48.35732371, - "name": "Dobrada" - }, - "351410": { - "latitude": -22.39590783, - "longitude": -48.34050113, - "name": "Dois Córregos" - }, - "351420": { - "latitude": -20.11724149, - "longitude": -50.52828473, - "name": "Dolcinópolis" - }, - "351430": { - "latitude": -22.11729367, - "longitude": -48.3335255, - "name": "Dourado" - }, - "351440": { - "latitude": -21.55671192, - "longitude": -51.58404855, - "name": "Dracena" - }, - "351450": { - "latitude": -22.39328731, - "longitude": -49.41337334, - "name": "Duartina" - }, - "351460": { - "latitude": -21.24709066, - "longitude": -47.97980925, - "name": "Dumont" - }, - "351470": { - "latitude": -22.4482324, - "longitude": -50.20062077, - "name": "Echaporã" - }, - "351480": { - "latitude": -24.49501635, - "longitude": -48.23362504, - "name": "Eldorado" - }, - "351490": { - "latitude": -23.07064018, - "longitude": -47.37065548, - "name": "Elias Fausto" - }, - "351492": { - "latitude": -21.16129504, - "longitude": -49.09208155, - "name": "Elisiário" - }, - "351495": { - "latitude": -20.95288846, - "longitude": -48.84754076, - "name": "Embaúba" - }, - "351500": { - "latitude": -23.65133322, - "longitude": -46.85151214, - "name": "Embu das Artes" - }, - "351510": { - "latitude": -23.85430117, - "longitude": -46.8306526, - "name": "Embu-Guaçu" - }, - "351512": { - "latitude": -21.80097461, - "longitude": -51.47215593, - "name": "Emilianópolis" - }, - "351515": { - "latitude": -22.48709266, - "longitude": -47.17479242, - "name": "Engenheiro Coelho" - }, - "351518": { - "latitude": -22.1924882, - "longitude": -46.79331842, - "name": "Espírito Santo do Pinhal" - }, - "351519": { - "latitude": -22.67089361, - "longitude": -49.43294825, - "name": "Espírito Santo do Turvo" - }, - "351520": { - "latitude": -20.2657427, - "longitude": -50.41146792, - "name": "Estrela d'Oeste" - }, - "351530": { - "latitude": -22.48561124, - "longitude": -51.66907299, - "name": "Estrela do Norte" - }, - "351535": { - "latitude": -22.51896735, - "longitude": -52.58860455, - "name": "Euclides da Cunha Paulista" - }, - "351540": { - "latitude": -23.39017477, - "longitude": -49.51968702, - "name": "Fartura" - }, - "351550": { - "latitude": -20.27177384, - "longitude": -50.28301906, - "name": "Fernandópolis" - }, - "351560": { - "latitude": -21.31027523, - "longitude": -48.69566791, - "name": "Fernando Prestes" - }, - "351565": { - "latitude": -22.36578943, - "longitude": -49.54236306, - "name": "Fernão" - }, - "351570": { - "latitude": -23.56106696, - "longitude": -46.37393393, - "name": "Ferraz de Vasconcelos" - }, - "351580": { - "latitude": -21.69844471, - "longitude": -51.37427586, - "name": "Flora Rica" - }, - "351590": { - "latitude": -20.66959197, - "longitude": -50.15481183, - "name": "Floreal" - }, - "351600": { - "latitude": -21.53996214, - "longitude": -51.1706532, - "name": "Flórida Paulista" - }, - "351610": { - "latitude": -22.88120873, - "longitude": -50.69531229, - "name": "Florínea" - }, - "351620": { - "latitude": -20.55522364, - "longitude": -47.38111227, - "name": "Franca" - }, - "351630": { - "latitude": -23.27370802, - "longitude": -46.72350844, - "name": "Francisco Morato" - }, - "351640": { - "latitude": -23.31417073, - "longitude": -46.73575038, - "name": "Franco da Rocha" - }, - "351650": { - "latitude": -21.49959041, - "longitude": -50.56474743, - "name": "Gabriel Monteiro" - }, - "351660": { - "latitude": -22.32047998, - "longitude": -49.57777019, - "name": "Gália" - }, - "351670": { - "latitude": -22.231042, - "longitude": -49.68963546, - "name": "Garça" - }, - "351680": { - "latitude": -20.80428657, - "longitude": -50.2027829, - "name": "Gastão Vidigal" - }, - "351685": { - "latitude": -21.79160368, - "longitude": -48.44793039, - "name": "Gavião Peixoto" - }, - "351690": { - "latitude": -20.638273, - "longitude": -50.41577184, - "name": "General Salgado" - }, - "351700": { - "latitude": -21.7832763, - "longitude": -50.0279157, - "name": "Getulina" - }, - "351710": { - "latitude": -21.34026055, - "longitude": -50.19888086, - "name": "Glicério" - }, - "351720": { - "latitude": -21.56950271, - "longitude": -49.76275075, - "name": "Guaiçara" - }, - "351730": { - "latitude": -21.87850506, - "longitude": -49.86064113, - "name": "Guaimbê" - }, - "351740": { - "latitude": -20.31403748, - "longitude": -48.3641371, - "name": "Guaíra" - }, - "351750": { - "latitude": -20.74285346, - "longitude": -49.18991328, - "name": "Guapiaçu" - }, - "351760": { - "latitude": -24.21254188, - "longitude": -48.55584364, - "name": "Guapiara" - }, - "351770": { - "latitude": -20.48258275, - "longitude": -47.77524698, - "name": "Guará" - }, - "351780": { - "latitude": -21.08642288, - "longitude": -51.27945835, - "name": "Guaraçaí" - }, - "351790": { - "latitude": -20.37477109, - "longitude": -49.00271967, - "name": "Guaraci" - }, - "351800": { - "latitude": -20.06683361, - "longitude": -50.34460807, - "name": "Guarani d'Oeste" - }, - "351810": { - "latitude": -21.91613667, - "longitude": -49.58841478, - "name": "Guarantã" - }, - "351820": { - "latitude": -21.28521878, - "longitude": -50.6951411, - "name": "Guararapes" - }, - "351830": { - "latitude": -23.4275701, - "longitude": -46.05856188, - "name": "Guararema" - }, - "351840": { - "latitude": -22.79350279, - "longitude": -45.23284726, - "name": "Guaratinguetá" - }, - "351850": { - "latitude": -23.37048679, - "longitude": -48.21911866, - "name": "Guareí" - }, - "351860": { - "latitude": -21.39594409, - "longitude": -48.2265579, - "name": "Guariba" - }, - "351870": { - "latitude": -23.95102847, - "longitude": -46.23525891, - "name": "Guarujá" - }, - "351880": { - "latitude": -23.40269396, - "longitude": -46.45487601, - "name": "Guarulhos" - }, - "351885": { - "latitude": -21.45329201, - "longitude": -47.97990819, - "name": "Guatapará" - }, - "351890": { - "latitude": -20.62849428, - "longitude": -50.71364042, - "name": "Guzolândia" - }, - "351900": { - "latitude": -21.96232141, - "longitude": -50.37312667, - "name": "Herculândia" - }, - "351905": { - "latitude": -22.63029617, - "longitude": -47.0650312, - "name": "Holambra" - }, - "351907": { - "latitude": -22.87842666, - "longitude": -47.20772094, - "name": "Hortolândia" - }, - "351910": { - "latitude": -21.89090793, - "longitude": -49.03963112, - "name": "Iacanga" - }, - "351920": { - "latitude": -21.79986725, - "longitude": -50.61945855, - "name": "Iacri" - }, - "351925": { - "latitude": -22.81913996, - "longitude": -49.10683602, - "name": "Iaras" - }, - "351930": { - "latitude": -21.9509052, - "longitude": -48.02728509, - "name": "Ibaté" - }, - "351940": { - "latitude": -21.07471962, - "longitude": -49.22034311, - "name": "Ibirá" - }, - "351950": { - "latitude": -22.81333475, - "longitude": -50.07692476, - "name": "Ibirarema" - }, - "351960": { - "latitude": -21.7929413, - "longitude": -48.8478247, - "name": "Ibitinga" - }, - "351970": { - "latitude": -23.80238121, - "longitude": -47.21524546, - "name": "Ibiúna" - }, - "351980": { - "latitude": -20.36724432, - "longitude": -49.18529266, - "name": "Icém" - }, - "351990": { - "latitude": -22.64862897, - "longitude": -51.05719203, - "name": "Iepê" - }, - "352000": { - "latitude": -22.54173819, - "longitude": -48.57455099, - "name": "Igaraçu do Tietê" - }, - "352010": { - "latitude": -20.06367834, - "longitude": -47.68245666, - "name": "Igarapava" - }, - "352020": { - "latitude": -23.13483332, - "longitude": -46.15035659, - "name": "Igaratá" - }, - "352030": { - "latitude": -24.54953827, - "longitude": -47.47440283, - "name": "Iguape" - }, - "352040": { - "latitude": -23.85011014, - "longitude": -45.32923043, - "name": "Ilhabela" - }, - "352042": { - "latitude": -24.85902956, - "longitude": -47.71543787, - "name": "Ilha Comprida" - }, - "352044": { - "latitude": -20.43142852, - "longitude": -51.25897864, - "name": "Ilha Solteira" - }, - "352050": { - "latitude": -23.1060699, - "longitude": -47.20250049, - "name": "Indaiatuba" - }, - "352060": { - "latitude": -22.13324394, - "longitude": -51.2625518, - "name": "Indiana" - }, - "352070": { - "latitude": -19.94792611, - "longitude": -50.2636697, - "name": "Indiaporã" - }, - "352080": { - "latitude": -21.73901742, - "longitude": -50.95741713, - "name": "Inúbia Paulista" - }, - "352090": { - "latitude": -23.06513375, - "longitude": -49.60812293, - "name": "Ipaussu" - }, - "352100": { - "latitude": -23.40448147, - "longitude": -47.62910587, - "name": "Iperó" - }, - "352110": { - "latitude": -22.4239076, - "longitude": -47.71602505, - "name": "Ipeúna" - }, - "352115": { - "latitude": -20.64798693, - "longitude": -49.40352989, - "name": "Ipiguá" - }, - "352120": { - "latitude": -24.51270709, - "longitude": -48.54634995, - "name": "Iporanga" - }, - "352130": { - "latitude": -20.41748265, - "longitude": -48.06648971, - "name": "Ipuã" - }, - "352140": { - "latitude": -22.59369086, - "longitude": -47.52422942, - "name": "Iracemápolis" - }, - "352150": { - "latitude": -21.26769873, - "longitude": -49.39743606, - "name": "Irapuã" - }, - "352160": { - "latitude": -21.48415356, - "longitude": -51.34648223, - "name": "Irapuru" - }, - "352170": { - "latitude": -23.87130789, - "longitude": -49.14248993, - "name": "Itaberá" - }, - "352180": { - "latitude": -23.47149456, - "longitude": -49.0541616, - "name": "Itaí" - }, - "352190": { - "latitude": -21.3555423, - "longitude": -49.05371363, - "name": "Itajobi" - }, - "352200": { - "latitude": -21.95161936, - "longitude": -48.7939534, - "name": "Itaju" - }, - "352210": { - "latitude": -24.09185602, - "longitude": -46.8346994, - "name": "Itanhaém" - }, - "352215": { - "latitude": -24.61788098, - "longitude": -48.83900476, - "name": "Itaoca" - }, - "352220": { - "latitude": -23.7372042, - "longitude": -46.85883324, - "name": "Itapecerica da Serra" - }, - "352230": { - "latitude": -23.64547621, - "longitude": -48.12332508, - "name": "Itapetininga" - }, - "352240": { - "latitude": -23.91406886, - "longitude": -48.87171751, - "name": "Itapeva" - }, - "352250": { - "latitude": -23.55094895, - "longitude": -46.96766826, - "name": "Itapevi" - }, - "352260": { - "latitude": -22.43196185, - "longitude": -46.77210278, - "name": "Itapira" - }, - "352265": { - "latitude": -24.56900305, - "longitude": -49.22293444, - "name": "Itapirapuã Paulista" - }, - "352270": { - "latitude": -21.54810412, - "longitude": -48.81547399, - "name": "Itápolis" - }, - "352280": { - "latitude": -23.67294942, - "longitude": -49.45849135, - "name": "Itaporanga" - }, - "352290": { - "latitude": -22.25082511, - "longitude": -48.70144973, - "name": "Itapuí" - }, - "352300": { - "latitude": -20.59507438, - "longitude": -51.44056805, - "name": "Itapura" - }, - "352310": { - "latitude": -23.46146369, - "longitude": -46.33387993, - "name": "Itaquaquecetuba" - }, - "352320": { - "latitude": -24.08051459, - "longitude": -49.3035483, - "name": "Itararé" - }, - "352330": { - "latitude": -24.2926852, - "longitude": -47.12814011, - "name": "Itariri" - }, - "352340": { - "latitude": -23.00670886, - "longitude": -46.81430831, - "name": "Itatiba" - }, - "352350": { - "latitude": -23.15365227, - "longitude": -48.62937449, - "name": "Itatinga" - }, - "352360": { - "latitude": -22.29460313, - "longitude": -47.83406502, - "name": "Itirapina" - }, - "352370": { - "latitude": -20.65756271, - "longitude": -47.16940312, - "name": "Itirapuã" - }, - "352380": { - "latitude": -21.748974, - "longitude": -46.92198978, - "name": "Itobi" - }, - "352390": { - "latitude": -23.30714473, - "longitude": -47.28461883, - "name": "Itu" - }, - "352400": { - "latitude": -23.14651413, - "longitude": -47.06840309, - "name": "Itupeva" - }, - "352410": { - "latitude": -20.32952853, - "longitude": -47.80959795, - "name": "Ituverava" - }, - "352420": { - "latitude": -20.64999322, - "longitude": -48.4159592, - "name": "Jaborandi" - }, - "352430": { - "latitude": -21.21833569, - "longitude": -48.28793628, - "name": "Jaboticabal" - }, - "352440": { - "latitude": -23.29887746, - "longitude": -45.99050591, - "name": "Jacareí" - }, - "352450": { - "latitude": -20.94504177, - "longitude": -49.58116248, - "name": "Jaci" - }, - "352460": { - "latitude": -24.77735638, - "longitude": -48.05387628, - "name": "Jacupiranga" - }, - "352470": { - "latitude": -22.69198096, - "longitude": -47.01278153, - "name": "Jaguariúna" - }, - "352480": { - "latitude": -20.28581414, - "longitude": -50.55409575, - "name": "Jales" - }, - "352490": { - "latitude": -23.27928799, - "longitude": -45.71060042, - "name": "Jambeiro" - }, - "352500": { - "latitude": -23.54414316, - "longitude": -46.89970419, - "name": "Jandira" - }, - "352510": { - "latitude": -20.9920545, - "longitude": -47.82603058, - "name": "Jardinópolis" - }, - "352520": { - "latitude": -23.11198212, - "longitude": -46.72130659, - "name": "Jarinu" - }, - "352530": { - "latitude": -22.29606998, - "longitude": -48.55603467, - "name": "Jaú" - }, - "352540": { - "latitude": -20.34013683, - "longitude": -47.57419258, - "name": "Jeriquara" - }, - "352550": { - "latitude": -22.93880712, - "longitude": -46.20918591, - "name": "Joanópolis" - }, - "352560": { - "latitude": -22.27792029, - "longitude": -50.79913634, - "name": "João Ramalho" - }, - "352570": { - "latitude": -21.08936882, - "longitude": -49.77931604, - "name": "José Bonifácio" - }, - "352580": { - "latitude": -21.97294956, - "longitude": -49.79335376, - "name": "Júlio Mesquita" - }, - "352585": { - "latitude": -23.09962433, - "longitude": -47.78812999, - "name": "Jumirim" - }, - "352590": { - "latitude": -23.19460166, - "longitude": -46.91301331, - "name": "Jundiaí" - }, - "352600": { - "latitude": -21.44889659, - "longitude": -51.43505159, - "name": "Junqueirópolis" - }, - "352610": { - "latitude": -24.21366692, - "longitude": -47.65226834, - "name": "Juquiá" - }, - "352620": { - "latitude": -23.95519454, - "longitude": -47.0246219, - "name": "Juquitiba" - }, - "352630": { - "latitude": -23.08579963, - "longitude": -45.20677456, - "name": "Lagoinha" - }, - "352640": { - "latitude": -23.01219062, - "longitude": -47.8656725, - "name": "Laranjal Paulista" - }, - "352650": { - "latitude": -21.15079931, - "longitude": -51.03263162, - "name": "Lavínia" - }, - "352660": { - "latitude": -22.52034629, - "longitude": -44.8888563, - "name": "Lavrinhas" - }, - "352670": { - "latitude": -22.17215557, - "longitude": -47.3376152, - "name": "Leme" - }, - "352680": { - "latitude": -22.6761107, - "longitude": -48.82503415, - "name": "Lençóis Paulista" - }, - "352690": { - "latitude": -22.59850899, - "longitude": -47.36371346, - "name": "Limeira" - }, - "352700": { - "latitude": -22.51339215, - "longitude": -46.65502982, - "name": "Lindóia" - }, - "352710": { - "latitude": -21.64976587, - "longitude": -49.68288301, - "name": "Lins" - }, - "352720": { - "latitude": -22.79397297, - "longitude": -45.05998761, - "name": "Lorena" - }, - "352725": { - "latitude": -20.94914849, - "longitude": -50.23403545, - "name": "Lourdes" - }, - "352730": { - "latitude": -23.08417269, - "longitude": -46.93719459, - "name": "Louveira" - }, - "352740": { - "latitude": -21.64414013, - "longitude": -50.99166222, - "name": "Lucélia" - }, - "352750": { - "latitude": -22.47335082, - "longitude": -49.55029516, - "name": "Lucianópolis" - }, - "352760": { - "latitude": -21.55266458, - "longitude": -47.78188634, - "name": "Luís Antônio" - }, - "352770": { - "latitude": -21.67261155, - "longitude": -50.35084928, - "name": "Luiziânia" - }, - "352780": { - "latitude": -22.42722372, - "longitude": -49.81698912, - "name": "Lupércio" - }, - "352790": { - "latitude": -22.32528276, - "longitude": -50.38547536, - "name": "Lutécia" - }, - "352800": { - "latitude": -22.48712867, - "longitude": -48.71938713, - "name": "Macatuba" - }, - "352810": { - "latitude": -20.83792858, - "longitude": -49.97500242, - "name": "Macaubal" - }, - "352820": { - "latitude": -20.098087, - "longitude": -50.18154747, - "name": "Macedônia" - }, - "352830": { - "latitude": -20.5964639, - "longitude": -50.23000541, - "name": "Magda" - }, - "352840": { - "latitude": -23.50796118, - "longitude": -47.22927943, - "name": "Mairinque" - }, - "352850": { - "latitude": -23.3172693, - "longitude": -46.56127474, - "name": "Mairiporã" - }, - "352860": { - "latitude": -23.04699927, - "longitude": -49.30364496, - "name": "Manduri" - }, - "352870": { - "latitude": -22.12769767, - "longitude": -52.056586, - "name": "Marabá Paulista" - }, - "352880": { - "latitude": -22.65227345, - "longitude": -50.7454311, - "name": "Maracaí" - }, - "352885": { - "latitude": -21.2555105, - "longitude": -49.13776026, - "name": "Marapoama" - }, - "352890": { - "latitude": -21.77916404, - "longitude": -51.17179965, - "name": "Mariápolis" - }, - "352900": { - "latitude": -22.17779338, - "longitude": -49.98309253, - "name": "Marília" - }, - "352910": { - "latitude": -20.47987789, - "longitude": -50.83231901, - "name": "Marinópolis" - }, - "352920": { - "latitude": -22.17234144, - "longitude": -51.12343552, - "name": "Martinópolis" - }, - "352930": { - "latitude": -21.61011799, - "longitude": -48.43011847, - "name": "Matão" - }, - "352940": { - "latitude": -23.66614457, - "longitude": -46.4464332, - "name": "Mauá" - }, - "352950": { - "latitude": -21.19399947, - "longitude": -49.57024586, - "name": "Mendonça" - }, - "352960": { - "latitude": -20.39819088, - "longitude": -50.18665764, - "name": "Meridiano" - }, - "352965": { - "latitude": -19.95748479, - "longitude": -50.61539731, - "name": "Mesópolis" - }, - "352970": { - "latitude": -20.18469864, - "longitude": -48.10547953, - "name": "Miguelópolis" - }, - "352980": { - "latitude": -22.46326169, - "longitude": -48.43322339, - "name": "Mineiros do Tietê" - }, - "352990": { - "latitude": -24.1950752, - "longitude": -47.39469449, - "name": "Miracatu" - }, - "353000": { - "latitude": -19.95176173, - "longitude": -50.12430127, - "name": "Mira Estrela" - }, - "353010": { - "latitude": -21.08107125, - "longitude": -51.13052689, - "name": "Mirandópolis" - }, - "353020": { - "latitude": -22.34924551, - "longitude": -51.99796778, - "name": "Mirante do Paranapanema" - }, - "353030": { - "latitude": -20.82767832, - "longitude": -49.50425762, - "name": "Mirassol" - }, - "353040": { - "latitude": -20.59500457, - "longitude": -49.48700555, - "name": "Mirassolândia" - }, - "353050": { - "latitude": -21.44947824, - "longitude": -47.03296778, - "name": "Mococa" - }, - "353060": { - "latitude": -23.56957819, - "longitude": -46.1860719, - "name": "Mogi das Cruzes" - }, - "353070": { - "latitude": -22.23209436, - "longitude": -47.02896652, - "name": "Mogi Guaçu" - }, - "353080": { - "latitude": -22.45134763, - "longitude": -46.98838334, - "name": "Mogi Mirim" - }, - "353090": { - "latitude": -22.9427198, - "longitude": -47.60200574, - "name": "Mombuca" - }, - "353100": { - "latitude": -20.86313601, - "longitude": -50.079458, - "name": "Monções" - }, - "353110": { - "latitude": -24.07010572, - "longitude": -46.66784464, - "name": "Mongaguá" - }, - "353120": { - "latitude": -22.70430218, - "longitude": -46.66765914, - "name": "Monte Alegre do Sul" - }, - "353130": { - "latitude": -21.25931484, - "longitude": -48.53300921, - "name": "Monte Alto" - }, - "353140": { - "latitude": -20.73747436, - "longitude": -49.76584083, - "name": "Monte Aprazível" - }, - "353150": { - "latitude": -20.90888702, - "longitude": -48.68131636, - "name": "Monte Azul Paulista" - }, - "353160": { - "latitude": -21.2548586, - "longitude": -51.57136718, - "name": "Monte Castelo" - }, - "353170": { - "latitude": -22.9365649, - "longitude": -45.80428591, - "name": "Monteiro Lobato" - }, - "353180": { - "latitude": -22.95319592, - "longitude": -47.30732906, - "name": "Monte Mor" - }, - "353190": { - "latitude": -20.68872387, - "longitude": -48.1533268, - "name": "Morro Agudo" - }, - "353200": { - "latitude": -22.8938612, - "longitude": -46.78254442, - "name": "Morungaba" - }, - "353205": { - "latitude": -21.5138067, - "longitude": -48.17032075, - "name": "Motuca" - }, - "353210": { - "latitude": -20.99676205, - "longitude": -51.30144184, - "name": "Murutinga do Sul" - }, - "353215": { - "latitude": -22.59687202, - "longitude": -51.20088981, - "name": "Nantes" - }, - "353220": { - "latitude": -22.56371133, - "longitude": -51.5216787, - "name": "Narandiba" - }, - "353230": { - "latitude": -23.41513123, - "longitude": -45.38144812, - "name": "Natividade da Serra" - }, - "353240": { - "latitude": -23.19142656, - "longitude": -46.36649318, - "name": "Nazaré Paulista" - }, - "353250": { - "latitude": -20.87046747, - "longitude": -49.64650943, - "name": "Neves Paulista" - }, - "353260": { - "latitude": -20.67309948, - "longitude": -50.04681306, - "name": "Nhandeara" - }, - "353270": { - "latitude": -20.89160573, - "longitude": -49.7782439, - "name": "Nipoã" - }, - "353280": { - "latitude": -21.06262075, - "longitude": -49.51597569, - "name": "Nova Aliança" - }, - "353282": { - "latitude": -24.19062212, - "longitude": -48.97291335, - "name": "Nova Campina" - }, - "353284": { - "latitude": -20.372051, - "longitude": -50.91055885, - "name": "Nova Canaã Paulista" - }, - "353286": { - "latitude": -20.77781978, - "longitude": -50.34575348, - "name": "Nova Castilho" - }, - "353290": { - "latitude": -21.77433575, - "longitude": -48.54967124, - "name": "Nova Europa" - }, - "353300": { - "latitude": -20.47600161, - "longitude": -49.33110548, - "name": "Nova Granada" - }, - "353310": { - "latitude": -21.32236356, - "longitude": -51.64544749, - "name": "Nova Guataporanga" - }, - "353320": { - "latitude": -21.13529923, - "longitude": -51.50521336, - "name": "Nova Independência" - }, - "353325": { - "latitude": -20.98856159, - "longitude": -48.91798592, - "name": "Novais" - }, - "353330": { - "latitude": -20.86865722, - "longitude": -50.24936116, - "name": "Nova Luzitânia" - }, - "353340": { - "latitude": -22.7841106, - "longitude": -47.28515757, - "name": "Nova Odessa" - }, - "353350": { - "latitude": -21.46916912, - "longitude": -49.2837969, - "name": "Novo Horizonte" - }, - "353360": { - "latitude": -20.70485706, - "longitude": -47.72906917, - "name": "Nuporanga" - }, - "353370": { - "latitude": -22.43808837, - "longitude": -49.93793853, - "name": "Ocauçu" - }, - "353380": { - "latitude": -22.95366, - "longitude": -49.38304208, - "name": "Óleo" - }, - "353390": { - "latitude": -20.70523944, - "longitude": -48.95961365, - "name": "Olímpia" - }, - "353400": { - "latitude": -20.61743069, - "longitude": -49.24363635, - "name": "Onda Verde" - }, - "353410": { - "latitude": -22.14194758, - "longitude": -50.09372672, - "name": "Oriente" - }, - "353420": { - "latitude": -20.20159711, - "longitude": -49.35548317, - "name": "Orindiúva" - }, - "353430": { - "latitude": -20.69787399, - "longitude": -47.90583264, - "name": "Orlândia" - }, - "353440": { - "latitude": -23.52874927, - "longitude": -46.78926738, - "name": "Osasco" - }, - "353450": { - "latitude": -22.29535316, - "longitude": -50.2573649, - "name": "Oscar Bressane" - }, - "353460": { - "latitude": -21.7327345, - "longitude": -50.87388646, - "name": "Osvaldo Cruz" - }, - "353470": { - "latitude": -22.95268902, - "longitude": -49.85243339, - "name": "Ourinhos" - }, - "353475": { - "latitude": -19.92247554, - "longitude": -50.40195889, - "name": "Ouroeste" - }, - "353480": { - "latitude": -21.51041237, - "longitude": -51.73784682, - "name": "Ouro Verde" - }, - "353490": { - "latitude": -21.49556562, - "longitude": -51.2742136, - "name": "Pacaembu" - }, - "353500": { - "latitude": -20.32115075, - "longitude": -49.49764922, - "name": "Palestina" - }, - "353510": { - "latitude": -21.10471378, - "longitude": -48.82666529, - "name": "Palmares Paulista" - }, - "353520": { - "latitude": -20.43895655, - "longitude": -50.74875292, - "name": "Palmeira d'Oeste" - }, - "353530": { - "latitude": -22.82880501, - "longitude": -50.22093441, - "name": "Palmital" - }, - "353540": { - "latitude": -21.46330612, - "longitude": -51.85806606, - "name": "Panorama" - }, - "353550": { - "latitude": -22.45909905, - "longitude": -50.62658448, - "name": "Paraguaçu Paulista" - }, - "353560": { - "latitude": -23.4783793, - "longitude": -45.64184898, - "name": "Paraibuna" - }, - "353570": { - "latitude": -21.01964487, - "longitude": -48.76466217, - "name": "Paraíso" - }, - "353580": { - "latitude": -23.43848236, - "longitude": -48.79520919, - "name": "Paranapanema" - }, - "353590": { - "latitude": -20.06377096, - "longitude": -50.5940447, - "name": "Paranapuã" - }, - "353600": { - "latitude": -21.85290998, - "longitude": -50.82170639, - "name": "Parapuã" - }, - "353610": { - "latitude": -23.10220959, - "longitude": -48.40179048, - "name": "Pardinho" - }, - "353620": { - "latitude": -24.67826388, - "longitude": -47.85009583, - "name": "Pariquera-Açu" - }, - "353625": { - "latitude": -20.27157696, - "longitude": -50.03738032, - "name": "Parisi" - }, - "353630": { - "latitude": -20.70420619, - "longitude": -47.28941534, - "name": "Patrocínio Paulista" - }, - "353640": { - "latitude": -21.1983434, - "longitude": -51.79072149, - "name": "Paulicéia" - }, - "353650": { - "latitude": -22.74836785, - "longitude": -47.14507367, - "name": "Paulínia" - }, - "353657": { - "latitude": -22.5683879, - "longitude": -49.30556697, - "name": "Paulistânia" - }, - "353660": { - "latitude": -20.06662125, - "longitude": -49.46342142, - "name": "Paulo de Faria" - }, - "353670": { - "latitude": -22.30143249, - "longitude": -48.86105614, - "name": "Pederneiras" - }, - "353680": { - "latitude": -22.77575824, - "longitude": -46.44184791, - "name": "Pedra Bela" - }, - "353690": { - "latitude": -20.21010845, - "longitude": -50.10700819, - "name": "Pedranópolis" - }, - "353700": { - "latitude": -20.2055846, - "longitude": -47.43906246, - "name": "Pedregulho" - }, - "353710": { - "latitude": -22.75474705, - "longitude": -46.88855469, - "name": "Pedreira" - }, - "353715": { - "latitude": -22.81691462, - "longitude": -50.80242449, - "name": "Pedrinhas Paulista" - }, - "353720": { - "latitude": -24.16371279, - "longitude": -47.16352874, - "name": "Pedro de Toledo" - }, - "353730": { - "latitude": -21.40540128, - "longitude": -50.09569237, - "name": "Penápolis" - }, - "353740": { - "latitude": -20.67774753, - "longitude": -51.10647285, - "name": "Pereira Barreto" - }, - "353750": { - "latitude": -23.12047949, - "longitude": -47.97882632, - "name": "Pereiras" - }, - "353760": { - "latitude": -24.27926085, - "longitude": -47.01302801, - "name": "Peruíbe" - }, - "353770": { - "latitude": -21.57133978, - "longitude": -50.64360021, - "name": "Piacatu" - }, - "353780": { - "latitude": -23.78700426, - "longitude": -47.43814269, - "name": "Piedade" - }, - "353790": { - "latitude": -23.85637545, - "longitude": -47.7281286, - "name": "Pilar do Sul" - }, - "353800": { - "latitude": -22.88001891, - "longitude": -45.45925959, - "name": "Pindamonhangaba" - }, - "353810": { - "latitude": -21.20981885, - "longitude": -48.91162933, - "name": "Pindorama" - }, - "353820": { - "latitude": -22.77868788, - "longitude": -46.57342679, - "name": "Pinhalzinho" - }, - "353830": { - "latitude": -21.85266793, - "longitude": -51.73156684, - "name": "Piquerobi" - }, - "353850": { - "latitude": -22.59029918, - "longitude": -45.1737733, - "name": "Piquete" - }, - "353860": { - "latitude": -23.04687187, - "longitude": -46.30225714, - "name": "Piracaia" - }, - "353870": { - "latitude": -22.72646401, - "longitude": -47.78402389, - "name": "Piracicaba" - }, - "353880": { - "latitude": -23.18692093, - "longitude": -49.36607802, - "name": "Piraju" - }, - "353890": { - "latitude": -21.95759337, - "longitude": -49.41361325, - "name": "Pirajuí" - }, - "353900": { - "latitude": -21.09385195, - "longitude": -48.66942116, - "name": "Pirangi" - }, - "353910": { - "latitude": -23.37837298, - "longitude": -46.98491195, - "name": "Pirapora do Bom Jesus" - }, - "353920": { - "latitude": -22.47918339, - "longitude": -51.61979998, - "name": "Pirapozinho" - }, - "353930": { - "latitude": -21.99592281, - "longitude": -47.38987722, - "name": "Pirassununga" - }, - "353940": { - "latitude": -22.42495271, - "longitude": -49.19179708, - "name": "Piratininga" - }, - "353950": { - "latitude": -21.00622198, - "longitude": -48.24935946, - "name": "Pitangueiras" - }, - "353960": { - "latitude": -21.00120272, - "longitude": -49.93599223, - "name": "Planalto" - }, - "353970": { - "latitude": -22.6252237, - "longitude": -50.21273481, - "name": "Platina" - }, - "353980": { - "latitude": -23.53047688, - "longitude": -46.34678328, - "name": "Poá" - }, - "353990": { - "latitude": -20.75246026, - "longitude": -49.81996833, - "name": "Poloni" - }, - "354000": { - "latitude": -22.02918949, - "longitude": -50.18772695, - "name": "Pompéia" - }, - "354010": { - "latitude": -21.7301881, - "longitude": -49.358907, - "name": "Pongaí" - }, - "354020": { - "latitude": -20.98457882, - "longitude": -48.0644212, - "name": "Pontal" - }, - "354025": { - "latitude": -20.45065754, - "longitude": -50.52510619, - "name": "Pontalinda" - }, - "354030": { - "latitude": -20.17482825, - "longitude": -49.75737979, - "name": "Pontes Gestal" - }, - "354040": { - "latitude": -19.90728031, - "longitude": -50.51729468, - "name": "Populina" - }, - "354050": { - "latitude": -23.1738559, - "longitude": -48.11735391, - "name": "Porangaba" - }, - "354060": { - "latitude": -23.23033354, - "longitude": -47.51691631, - "name": "Porto Feliz" - }, - "354070": { - "latitude": -21.84261322, - "longitude": -47.44717508, - "name": "Porto Ferreira" - }, - "354075": { - "latitude": -22.82529445, - "longitude": -45.30315751, - "name": "Potim" - }, - "354080": { - "latitude": -21.07554311, - "longitude": -49.39173063, - "name": "Potirendaba" - }, - "354085": { - "latitude": -21.83752289, - "longitude": -51.07519718, - "name": "Pracinha" - }, - "354090": { - "latitude": -21.34444086, - "longitude": -48.08605736, - "name": "Pradópolis" - }, - "354100": { - "latitude": -24.01548107, - "longitude": -46.52252175, - "name": "Praia Grande" - }, - "354105": { - "latitude": -22.81853168, - "longitude": -48.69689951, - "name": "Pratânia" - }, - "354110": { - "latitude": -22.12217038, - "longitude": -49.43176061, - "name": "Presidente Alves" - }, - "354120": { - "latitude": -22.10727276, - "longitude": -51.62034197, - "name": "Presidente Bernardes" - }, - "354130": { - "latitude": -21.91065793, - "longitude": -52.17491783, - "name": "Presidente Epitácio" - }, - "354140": { - "latitude": -21.99315038, - "longitude": -51.34312547, - "name": "Presidente Prudente" - }, - "354150": { - "latitude": -21.79301334, - "longitude": -51.83833804, - "name": "Presidente Venceslau" - }, - "354160": { - "latitude": -21.52451997, - "longitude": -49.87046506, - "name": "Promissão" - }, - "354165": { - "latitude": -23.30101755, - "longitude": -48.0386169, - "name": "Quadra" - }, - "354170": { - "latitude": -22.20593536, - "longitude": -50.64528519, - "name": "Quatá" - }, - "354180": { - "latitude": -21.80055419, - "longitude": -50.24525944, - "name": "Queiroz" - }, - "354190": { - "latitude": -22.50427829, - "longitude": -44.7852774, - "name": "Queluz" - }, - "354200": { - "latitude": -22.10019502, - "longitude": -50.36927535, - "name": "Quintana" - }, - "354210": { - "latitude": -23.04516353, - "longitude": -47.58377588, - "name": "Rafard" - }, - "354220": { - "latitude": -22.28276358, - "longitude": -50.92833034, - "name": "Rancharia" - }, - "354230": { - "latitude": -23.253656, - "longitude": -45.52614379, - "name": "Redenção da Serra" - }, - "354240": { - "latitude": -22.25253333, - "longitude": -51.29405984, - "name": "Regente Feijó" - }, - "354250": { - "latitude": -21.8831604, - "longitude": -49.18046052, - "name": "Reginópolis" - }, - "354260": { - "latitude": -24.50398904, - "longitude": -47.82075315, - "name": "Registro" - }, - "354270": { - "latitude": -20.64823393, - "longitude": -47.50592793, - "name": "Restinga" - }, - "354280": { - "latitude": -24.60731771, - "longitude": -49.03656332, - "name": "Ribeira" - }, - "354290": { - "latitude": -22.06011563, - "longitude": -48.18532935, - "name": "Ribeirão Bonito" - }, - "354300": { - "latitude": -24.2561679, - "longitude": -48.77814687, - "name": "Ribeirão Branco" - }, - "354310": { - "latitude": -20.44892846, - "longitude": -47.57332531, - "name": "Ribeirão Corrente" - }, - "354320": { - "latitude": -22.7516623, - "longitude": -49.92265032, - "name": "Ribeirão do Sul" - }, - "354323": { - "latitude": -21.78426936, - "longitude": -51.58327801, - "name": "Ribeirão dos Índios" - }, - "354325": { - "latitude": -24.18864981, - "longitude": -48.35882387, - "name": "Ribeirão Grande" - }, - "354330": { - "latitude": -23.70103429, - "longitude": -46.40280468, - "name": "Ribeirão Pires" - }, - "354340": { - "latitude": -21.21084262, - "longitude": -47.82130302, - "name": "Ribeirão Preto" - }, - "354350": { - "latitude": -23.84686938, - "longitude": -49.44780551, - "name": "Riversul" - }, - "354360": { - "latitude": -20.06079969, - "longitude": -47.44089064, - "name": "Rifaina" - }, - "354370": { - "latitude": -21.59387854, - "longitude": -48.03203078, - "name": "Rincão" - }, - "354380": { - "latitude": -21.68116239, - "longitude": -50.71741889, - "name": "Rinópolis" - }, - "354390": { - "latitude": -22.37391757, - "longitude": -47.57989439, - "name": "Rio Claro" - }, - "354400": { - "latitude": -22.85031973, - "longitude": -47.59839142, - "name": "Rio das Pedras" - }, - "354410": { - "latitude": -23.73785846, - "longitude": -46.37945692, - "name": "Rio Grande da Serra" - }, - "354420": { - "latitude": -20.02350702, - "longitude": -49.70915693, - "name": "Riolândia" - }, - "354425": { - "latitude": -22.4891462, - "longitude": -52.83690386, - "name": "Rosana" - }, - "354430": { - "latitude": -22.93304936, - "longitude": -45.30247146, - "name": "Roseira" - }, - "354440": { - "latitude": -21.36085951, - "longitude": -50.78579746, - "name": "Rubiácea" - }, - "354450": { - "latitude": -20.24972775, - "longitude": -51.01831648, - "name": "Rubinéia" - }, - "354460": { - "latitude": -21.47083796, - "longitude": -49.575618, - "name": "Sabino" - }, - "354470": { - "latitude": -21.86779976, - "longitude": -50.99028435, - "name": "Sagres" - }, - "354480": { - "latitude": -21.34720315, - "longitude": -49.50265458, - "name": "Sales" - }, - "354490": { - "latitude": -20.83152475, - "longitude": -47.85460418, - "name": "Sales Oliveira" - }, - "354500": { - "latitude": -23.58019632, - "longitude": -45.84258726, - "name": "Salesópolis" - }, - "354510": { - "latitude": -21.58803886, - "longitude": -50.87629612, - "name": "Salmourão" - }, - "354515": { - "latitude": -22.87121308, - "longitude": -47.73182552, - "name": "Saltinho" - }, - "354520": { - "latitude": -23.18047509, - "longitude": -47.30260036, - "name": "Salto" - }, - "354530": { - "latitude": -23.65274536, - "longitude": -47.58061424, - "name": "Salto de Pirapora" - }, - "354540": { - "latitude": -22.87087966, - "longitude": -49.96076067, - "name": "Salto Grande" - }, - "354550": { - "latitude": -22.47786213, - "longitude": -51.84213397, - "name": "Sandovalina" - }, - "354560": { - "latitude": -21.31779038, - "longitude": -48.8190198, - "name": "Santa Adélia" - }, - "354570": { - "latitude": -20.01415856, - "longitude": -50.72770123, - "name": "Santa Albertina" - }, - "354580": { - "latitude": -22.80062918, - "longitude": -47.42807428, - "name": "Santa Bárbara d'Oeste" - }, - "354600": { - "latitude": -23.42639519, - "longitude": -45.86329816, - "name": "Santa Branca" - }, - "354610": { - "latitude": -20.06689631, - "longitude": -50.90843561, - "name": "Santa Clara d'Oeste" - }, - "354620": { - "latitude": -22.12133904, - "longitude": -47.48559192, - "name": "Santa Cruz da Conceição" - }, - "354625": { - "latitude": -21.27484449, - "longitude": -47.43960525, - "name": "Santa Cruz da Esperança" - }, - "354630": { - "latitude": -21.85549629, - "longitude": -47.25013439, - "name": "Santa Cruz das Palmeiras" - }, - "354640": { - "latitude": -22.80931315, - "longitude": -49.56895435, - "name": "Santa Cruz do Rio Pardo" - }, - "354650": { - "latitude": -21.45254621, - "longitude": -48.36681853, - "name": "Santa Ernestina" - }, - "354660": { - "latitude": -20.24186462, - "longitude": -50.95018167, - "name": "Santa Fé do Sul" - }, - "354670": { - "latitude": -22.47508971, - "longitude": -47.52133961, - "name": "Santa Gertrudes" - }, - "354680": { - "latitude": -23.28894262, - "longitude": -46.24236222, - "name": "Santa Isabel" - }, - "354690": { - "latitude": -21.67076812, - "longitude": -48.05735957, - "name": "Santa Lúcia" - }, - "354700": { - "latitude": -22.56456844, - "longitude": -48.15425653, - "name": "Santa Maria da Serra" - }, - "354710": { - "latitude": -21.31677636, - "longitude": -51.73713191, - "name": "Santa Mercedes" - }, - "354720": { - "latitude": -20.26072586, - "longitude": -50.79709922, - "name": "Santana da Ponte Pensa" - }, - "354730": { - "latitude": -23.44944128, - "longitude": -46.91681387, - "name": "Santana de Parnaíba" - }, - "354740": { - "latitude": -20.09715274, - "longitude": -50.81270154, - "name": "Santa Rita d'Oeste" - }, - "354750": { - "latitude": -21.68249993, - "longitude": -47.50792568, - "name": "Santa Rita do Passa Quatro" - }, - "354760": { - "latitude": -21.50377638, - "longitude": -47.36621743, - "name": "Santa Rosa de Viterbo" - }, - "354765": { - "latitude": -20.25868699, - "longitude": -50.72014992, - "name": "Santa Salete" - }, - "354770": { - "latitude": -22.03765694, - "longitude": -51.72251961, - "name": "Santo Anastácio" - }, - "354780": { - "latitude": -23.72796032, - "longitude": -46.44158655, - "name": "Santo André" - }, - "354790": { - "latitude": -21.09232292, - "longitude": -47.19583208, - "name": "Santo Antônio da Alegria" - }, - "354800": { - "latitude": -22.60327729, - "longitude": -46.94991539, - "name": "Santo Antônio de Posse" - }, - "354805": { - "latitude": -20.8730167, - "longitude": -50.55432245, - "name": "Santo Antônio do Aracanguá" - }, - "354810": { - "latitude": -22.13031799, - "longitude": -46.68348969, - "name": "Santo Antônio do Jardim" - }, - "354820": { - "latitude": -22.83177263, - "longitude": -45.69805003, - "name": "Santo Antônio do Pinhal" - }, - "354830": { - "latitude": -21.82485846, - "longitude": -51.37022137, - "name": "Santo Expedito" - }, - "354840": { - "latitude": -21.6601954, - "longitude": -50.51798477, - "name": "Santópolis do Aguapeí" - }, - "354850": { - "latitude": -23.8688503, - "longitude": -46.29156827, - "name": "Santos" - }, - "354860": { - "latitude": -22.68139732, - "longitude": -45.68680652, - "name": "São Bento do Sapucaí" - }, - "354870": { - "latitude": -23.81298884, - "longitude": -46.5507918, - "name": "São Bernardo do Campo" - }, - "354880": { - "latitude": -23.62614056, - "longitude": -46.56606262, - "name": "São Caetano do Sul" - }, - "354890": { - "latitude": -21.91888677, - "longitude": -47.86717766, - "name": "São Carlos" - }, - "354900": { - "latitude": -20.36579937, - "longitude": -50.6758655, - "name": "São Francisco" - }, - "354910": { - "latitude": -21.97796657, - "longitude": -46.80220267, - "name": "São João da Boa Vista" - }, - "354920": { - "latitude": -20.40840242, - "longitude": -50.3834628, - "name": "São João das Duas Pontes" - }, - "354925": { - "latitude": -20.52079544, - "longitude": -50.35628454, - "name": "São João de Iracema" - }, - "354930": { - "latitude": -21.22344973, - "longitude": -51.67304425, - "name": "São João do Pau d'Alho" - }, - "354940": { - "latitude": -20.55051586, - "longitude": -47.93854919, - "name": "São Joaquim da Barra" - }, - "354950": { - "latitude": -20.58753015, - "longitude": -47.62717366, - "name": "São José da Bela Vista" - }, - "354960": { - "latitude": -22.74889394, - "longitude": -44.58725306, - "name": "São José do Barreiro" - }, - "354970": { - "latitude": -21.60369419, - "longitude": -46.87951028, - "name": "São José do Rio Pardo" - }, - "354980": { - "latitude": -20.79723367, - "longitude": -49.3581065, - "name": "São José do Rio Preto" - }, - "354990": { - "latitude": -23.09056971, - "longitude": -45.92853599, - "name": "São José dos Campos" - }, - "354995": { - "latitude": -23.85241383, - "longitude": -46.93636178, - "name": "São Lourenço da Serra" - }, - "355000": { - "latitude": -23.24010678, - "longitude": -45.25381921, - "name": "São Luiz do Paraitinga" - }, - "355010": { - "latitude": -22.68226, - "longitude": -48.54042668, - "name": "São Manuel" - }, - "355020": { - "latitude": -23.9139481, - "longitude": -47.99334826, - "name": "São Miguel Arcanjo" - }, - "355030": { - "latitude": -23.65008109, - "longitude": -46.64811076, - "name": "São Paulo" - }, - "355040": { - "latitude": -22.55842348, - "longitude": -47.92439592, - "name": "São Pedro" - }, - "355050": { - "latitude": -22.67893994, - "longitude": -49.77231355, - "name": "São Pedro do Turvo" - }, - "355060": { - "latitude": -23.54897455, - "longitude": -47.10955937, - "name": "São Roque" - }, - "355070": { - "latitude": -23.7522379, - "longitude": -45.60561418, - "name": "São Sebastião" - }, - "355080": { - "latitude": -21.75405022, - "longitude": -46.75297804, - "name": "São Sebastião da Grama" - }, - "355090": { - "latitude": -21.46152138, - "longitude": -47.56827317, - "name": "São Simão" - }, - "355100": { - "latitude": -23.95922542, - "longitude": -46.48821399, - "name": "São Vicente" - }, - "355110": { - "latitude": -23.66429818, - "longitude": -47.78577064, - "name": "Sarapuí" - }, - "355120": { - "latitude": -23.25750916, - "longitude": -49.48174796, - "name": "Sarutaiá" - }, - "355130": { - "latitude": -20.62915949, - "longitude": -49.91589979, - "name": "Sebastianópolis do Sul" - }, - "355140": { - "latitude": -21.31605934, - "longitude": -47.54969417, - "name": "Serra Azul" - }, - "355150": { - "latitude": -21.21691875, - "longitude": -47.61233662, - "name": "Serrana" - }, - "355160": { - "latitude": -22.58911476, - "longitude": -46.68728113, - "name": "Serra Negra" - }, - "355170": { - "latitude": -21.12291749, - "longitude": -48.00889991, - "name": "Sertãozinho" - }, - "355180": { - "latitude": -24.27391792, - "longitude": -47.93412304, - "name": "Sete Barras" - }, - "355190": { - "latitude": -20.79313965, - "longitude": -48.79376341, - "name": "Severínia" - }, - "355200": { - "latitude": -22.73465364, - "longitude": -44.84091738, - "name": "Silveiras" - }, - "355210": { - "latitude": -22.61116872, - "longitude": -46.52439861, - "name": "Socorro" - }, - "355220": { - "latitude": -23.46462281, - "longitude": -47.4466632, - "name": "Sorocaba" - }, - "355230": { - "latitude": -20.66758917, - "longitude": -50.90093433, - "name": "Sud Mennucci" - }, - "355240": { - "latitude": -22.84186132, - "longitude": -47.26300046, - "name": "Sumaré" - }, - "355250": { - "latitude": -23.60838804, - "longitude": -46.3104484, - "name": "Suzano" - }, - "355255": { - "latitude": -20.4729175, - "longitude": -51.0756212, - "name": "Suzanápolis" - }, - "355260": { - "latitude": -20.93190574, - "longitude": -49.02889444, - "name": "Tabapuã" - }, - "355270": { - "latitude": -21.71252206, - "longitude": -48.6290596, - "name": "Tabatinga" - }, - "355280": { - "latitude": -23.6205344, - "longitude": -46.78637079, - "name": "Taboão da Serra" - }, - "355290": { - "latitude": -22.50487974, - "longitude": -51.34228679, - "name": "Taciba" - }, - "355300": { - "latitude": -23.47446837, - "longitude": -49.39738014, - "name": "Taguaí" - }, - "355310": { - "latitude": -21.1321831, - "longitude": -48.53029766, - "name": "Taiaçu" - }, - "355320": { - "latitude": -21.13269204, - "longitude": -48.42824964, - "name": "Taiúva" - }, - "355330": { - "latitude": -21.60178331, - "longitude": -47.23902722, - "name": "Tambaú" - }, - "355340": { - "latitude": -20.53123545, - "longitude": -49.64647369, - "name": "Tanabi" - }, - "355350": { - "latitude": -24.00869469, - "longitude": -47.61939169, - "name": "Tapiraí" - }, - "355360": { - "latitude": -21.45077717, - "longitude": -46.74186053, - "name": "Tapiratiba" - }, - "355365": { - "latitude": -21.06926818, - "longitude": -48.39942987, - "name": "Taquaral" - }, - "355370": { - "latitude": -21.42558551, - "longitude": -48.53790145, - "name": "Taquaritinga" - }, - "355380": { - "latitude": -23.53018545, - "longitude": -49.2345719, - "name": "Taquarituba" - }, - "355385": { - "latitude": -23.94330276, - "longitude": -48.68793456, - "name": "Taquarivaí" - }, - "355390": { - "latitude": -22.35797482, - "longitude": -51.62577856, - "name": "Tarabai" - }, - "355395": { - "latitude": -22.76348317, - "longitude": -50.60140753, - "name": "Tarumã" - }, - "355400": { - "latitude": -23.36207888, - "longitude": -47.86951379, - "name": "Tatuí" - }, - "355410": { - "latitude": -23.08711285, - "longitude": -45.50239536, - "name": "Taubaté" - }, - "355420": { - "latitude": -23.34250571, - "longitude": -49.30656751, - "name": "Tejupá" - }, - "355430": { - "latitude": -22.41660691, - "longitude": -52.3740351, - "name": "Teodoro Sampaio" - }, - "355440": { - "latitude": -20.77876705, - "longitude": -48.34577592, - "name": "Terra Roxa" - }, - "355450": { - "latitude": -23.04943624, - "longitude": -47.70765275, - "name": "Tietê" - }, - "355460": { - "latitude": -23.19579055, - "longitude": -49.61038826, - "name": "Timburi" - }, - "355465": { - "latitude": -23.25008666, - "longitude": -48.21268186, - "name": "Torre de Pedra" - }, - "355470": { - "latitude": -22.44458832, - "longitude": -48.16443708, - "name": "Torrinha" - }, - "355475": { - "latitude": -22.0322916, - "longitude": -48.34515091, - "name": "Trabiju" - }, - "355480": { - "latitude": -22.94083364, - "longitude": -45.60424365, - "name": "Tremembé" - }, - "355490": { - "latitude": -20.27374389, - "longitude": -50.86958921, - "name": "Três Fronteiras" - }, - "355495": { - "latitude": -22.83027618, - "longitude": -46.68762359, - "name": "Tuiuti" - }, - "355500": { - "latitude": -21.94729024, - "longitude": -50.53461425, - "name": "Tupã" - }, - "355510": { - "latitude": -21.39039608, - "longitude": -51.58719953, - "name": "Tupi Paulista" - }, - "355520": { - "latitude": -20.9404863, - "longitude": -50.1112661, - "name": "Turiúba" - }, - "355530": { - "latitude": -20.08354682, - "longitude": -50.45676336, - "name": "Turmalina" - }, - "355535": { - "latitude": -21.2197527, - "longitude": -49.74821235, - "name": "Ubarana" - }, - "355540": { - "latitude": -23.37879036, - "longitude": -45.02368116, - "name": "Ubatuba" - }, - "355550": { - "latitude": -22.54431462, - "longitude": -49.66589528, - "name": "Ubirajara" - }, - "355560": { - "latitude": -20.93694124, - "longitude": -49.15770643, - "name": "Uchoa" - }, - "355570": { - "latitude": -20.89053082, - "longitude": -49.88725661, - "name": "União Paulista" - }, - "355580": { - "latitude": -20.20892483, - "longitude": -50.65252811, - "name": "Urânia" - }, - "355590": { - "latitude": -21.76597477, - "longitude": -49.29628814, - "name": "Uru" - }, - "355600": { - "latitude": -21.20520339, - "longitude": -49.26517322, - "name": "Urupês" - }, - "355610": { - "latitude": -20.42053119, - "longitude": -50.10174135, - "name": "Valentim Gentil" - }, - "355620": { - "latitude": -22.97511535, - "longitude": -46.98128441, - "name": "Valinhos" - }, - "355630": { - "latitude": -21.20310358, - "longitude": -50.92386799, - "name": "Valparaíso" - }, - "355635": { - "latitude": -22.89018682, - "longitude": -46.41448092, - "name": "Vargem" - }, - "355640": { - "latitude": -21.86067852, - "longitude": -46.89898366, - "name": "Vargem Grande do Sul" - }, - "355645": { - "latitude": -23.62088713, - "longitude": -47.01470525, - "name": "Vargem Grande Paulista" - }, - "355650": { - "latitude": -23.21927244, - "longitude": -46.82490857, - "name": "Várzea Paulista" - }, - "355660": { - "latitude": -22.2340581, - "longitude": -49.82619492, - "name": "Vera Cruz" - }, - "355670": { - "latitude": -23.04669405, - "longitude": -46.97921813, - "name": "Vinhedo" - }, - "355680": { - "latitude": -20.8843822, - "longitude": -48.30986365, - "name": "Viradouro" - }, - "355690": { - "latitude": -21.176698, - "longitude": -48.64942117, - "name": "Vista Alegre do Alto" - }, - "355695": { - "latitude": -20.19840913, - "longitude": -50.48548747, - "name": "Vitória Brasil" - }, - "355700": { - "latitude": -23.58003188, - "longitude": -47.40661311, - "name": "Votorantim" - }, - "355710": { - "latitude": -20.45781804, - "longitude": -49.98909713, - "name": "Votuporanga" - }, - "355715": { - "latitude": -21.12546725, - "longitude": -50.04941351, - "name": "Zacarias" - }, - "355720": { - "latitude": -23.04633382, - "longitude": -49.72653912, - "name": "Chavantes" - }, - "355730": { - "latitude": -22.23607371, - "longitude": -46.94307833, - "name": "Estiva Gerbi" - }, - "410010": { - "latitude": -23.30715069, - "longitude": -50.30960942, - "name": "Abatiá" - }, - "410020": { - "latitude": -24.78345279, - "longitude": -48.82120865, - "name": "Adrianópolis" - }, - "410030": { - "latitude": -26.02775605, - "longitude": -49.31124609, - "name": "Agudos do Sul" - }, - "410040": { - "latitude": -25.29648311, - "longitude": -49.32365529, - "name": "Almirante Tamandaré" - }, - "410045": { - "latitude": -24.81337656, - "longitude": -52.69230789, - "name": "Altamira do Paraná" - }, - "410050": { - "latitude": -23.90255796, - "longitude": -53.94884372, - "name": "Altônia" - }, - "410060": { - "latitude": -23.07609371, - "longitude": -52.32357741, - "name": "Alto Paraná" - }, - "410070": { - "latitude": -24.09829673, - "longitude": -53.40198245, - "name": "Alto Piquiri" - }, - "410080": { - "latitude": -22.81064463, - "longitude": -51.25506491, - "name": "Alvorada do Sul" - }, - "410090": { - "latitude": -23.12881126, - "longitude": -52.83486056, - "name": "Amaporã" - }, - "410100": { - "latitude": -25.91665367, - "longitude": -53.48322178, - "name": "Ampére" - }, - "410105": { - "latitude": -24.64408457, - "longitude": -53.14376188, - "name": "Anahy" - }, - "410110": { - "latitude": -23.01794613, - "longitude": -50.27155968, - "name": "Andirá" - }, - "410115": { - "latitude": -23.19160311, - "longitude": -51.91826093, - "name": "Ângulo" - }, - "410120": { - "latitude": -25.30514011, - "longitude": -48.72241278, - "name": "Antonina" - }, - "410130": { - "latitude": -25.95997241, - "longitude": -50.12841716, - "name": "Antônio Olinto" - }, - "410140": { - "latitude": -23.57226689, - "longitude": -51.44611926, - "name": "Apucarana" - }, - "410150": { - "latitude": -23.44080337, - "longitude": -51.42824479, - "name": "Arapongas" - }, - "410160": { - "latitude": -24.09248522, - "longitude": -49.97564315, - "name": "Arapoti" - }, - "410165": { - "latitude": -24.34402944, - "longitude": -51.81531071, - "name": "Arapuã" - }, - "410170": { - "latitude": -23.95506535, - "longitude": -52.57657529, - "name": "Araruna" - }, - "410180": { - "latitude": -25.60860599, - "longitude": -49.441488, - "name": "Araucária" - }, - "410185": { - "latitude": -24.37729846, - "longitude": -51.54072437, - "name": "Ariranha do Ivaí" - }, - "410190": { - "latitude": -23.40543008, - "longitude": -50.87555356, - "name": "Assaí" - }, - "410200": { - "latitude": -24.42599375, - "longitude": -53.58458896, - "name": "Assis Chateaubriand" - }, - "410210": { - "latitude": -23.25001355, - "longitude": -51.69971228, - "name": "Astorga" - }, - "410220": { - "latitude": -23.12861054, - "longitude": -52.06493807, - "name": "Atalaia" - }, - "410230": { - "latitude": -25.52180957, - "longitude": -49.68865236, - "name": "Balsa Nova" - }, - "410240": { - "latitude": -23.16088115, - "longitude": -50.34644369, - "name": "Bandeirantes" - }, - "410250": { - "latitude": -24.08235145, - "longitude": -52.0466961, - "name": "Barbosa Ferraz" - }, - "410260": { - "latitude": -26.24599089, - "longitude": -53.52836519, - "name": "Barracão" - }, - "410270": { - "latitude": -23.10578671, - "longitude": -50.15911971, - "name": "Barra do Jacaré" - }, - "410275": { - "latitude": -25.88102503, - "longitude": -53.63425986, - "name": "Bela Vista da Caroba" - }, - "410280": { - "latitude": -23.0050538, - "longitude": -51.2357733, - "name": "Bela Vista do Paraíso" - }, - "410290": { - "latitude": -26.17102638, - "longitude": -51.52746257, - "name": "Bituruna" - }, - "410300": { - "latitude": -24.25686162, - "longitude": -52.75117504, - "name": "Boa Esperança" - }, - "410302": { - "latitude": -25.64016322, - "longitude": -53.22609004, - "name": "Boa Esperança do Iguaçu" - }, - "410304": { - "latitude": -24.8566504, - "longitude": -51.56853611, - "name": "Boa Ventura de São Roque" - }, - "410305": { - "latitude": -25.43492433, - "longitude": -53.42227712, - "name": "Boa Vista da Aparecida" - }, - "410310": { - "latitude": -25.11638617, - "longitude": -48.93654055, - "name": "Bocaiúva do Sul" - }, - "410315": { - "latitude": -26.16238131, - "longitude": -53.55253643, - "name": "Bom Jesus do Sul" - }, - "410320": { - "latitude": -23.7130523, - "longitude": -51.82426759, - "name": "Bom Sucesso" - }, - "410322": { - "latitude": -26.08606592, - "longitude": -52.83882681, - "name": "Bom Sucesso do Sul" - }, - "410330": { - "latitude": -23.93918027, - "longitude": -51.59197926, - "name": "Borrazópolis" - }, - "410335": { - "latitude": -24.80134662, - "longitude": -53.09049473, - "name": "Braganey" - }, - "410337": { - "latitude": -24.16608713, - "longitude": -53.5416962, - "name": "Brasilândia do Sul" - }, - "410340": { - "latitude": -22.81307163, - "longitude": -51.71124788, - "name": "Cafeara" - }, - "410345": { - "latitude": -24.69242704, - "longitude": -53.36391965, - "name": "Cafelândia" - }, - "410347": { - "latitude": -23.9394127, - "longitude": -53.56164166, - "name": "Cafezal do Sul" - }, - "410350": { - "latitude": -23.66878516, - "longitude": -51.33383832, - "name": "Califórnia" - }, - "410360": { - "latitude": -22.99700588, - "longitude": -50.08282674, - "name": "Cambará" - }, - "410370": { - "latitude": -23.17975923, - "longitude": -51.28431523, - "name": "Cambé" - }, - "410380": { - "latitude": -23.63030978, - "longitude": -51.56736001, - "name": "Cambira" - }, - "410390": { - "latitude": -24.61660857, - "longitude": -52.78832143, - "name": "Campina da Lagoa" - }, - "410395": { - "latitude": -25.13083297, - "longitude": -51.78204023, - "name": "Campina do Simão" - }, - "410400": { - "latitude": -25.18649724, - "longitude": -48.84453867, - "name": "Campina Grande do Sul" - }, - "410405": { - "latitude": -24.93124062, - "longitude": -53.01390224, - "name": "Campo Bonito" - }, - "410410": { - "latitude": -25.97784808, - "longitude": -49.65639874, - "name": "Campo do Tenente" - }, - "410420": { - "latitude": -25.2924198, - "longitude": -49.61873755, - "name": "Campo Largo" - }, - "410425": { - "latitude": -25.28967475, - "longitude": -49.46270228, - "name": "Campo Magro" - }, - "410430": { - "latitude": -24.10249406, - "longitude": -52.38070315, - "name": "Campo Mourão" - }, - "410440": { - "latitude": -24.64547083, - "longitude": -51.25326315, - "name": "Cândido de Abreu" - }, - "410442": { - "latitude": -25.52429193, - "longitude": -52.02082301, - "name": "Candói" - }, - "410445": { - "latitude": -25.28715356, - "longitude": -52.13139998, - "name": "Cantagalo" - }, - "410450": { - "latitude": -25.61076833, - "longitude": -53.76312029, - "name": "Capanema" - }, - "410460": { - "latitude": -25.47032129, - "longitude": -53.59298724, - "name": "Capitão Leônidas Marques" - }, - "410465": { - "latitude": -24.89357054, - "longitude": -50.15161874, - "name": "Carambeí" - }, - "410470": { - "latitude": -23.45970219, - "longitude": -49.71277624, - "name": "Carlópolis" - }, - "410480": { - "latitude": -25.0293199, - "longitude": -53.37969931, - "name": "Cascavel" - }, - "410490": { - "latitude": -24.79960869, - "longitude": -49.841672, - "name": "Castro" - }, - "410500": { - "latitude": -25.24171499, - "longitude": -53.15601771, - "name": "Catanduvas" - }, - "410510": { - "latitude": -22.80535669, - "longitude": -51.56059116, - "name": "Centenário do Sul" - }, - "410520": { - "latitude": -24.87536922, - "longitude": -49.27971615, - "name": "Cerro Azul" - }, - "410530": { - "latitude": -25.2462777, - "longitude": -53.76178634, - "name": "Céu Azul" - }, - "410540": { - "latitude": -25.81199395, - "longitude": -52.45099137, - "name": "Chopinzinho" - }, - "410550": { - "latitude": -23.72745877, - "longitude": -52.62698961, - "name": "Cianorte" - }, - "410560": { - "latitude": -23.38283158, - "longitude": -52.95848596, - "name": "Cidade Gaúcha" - }, - "410570": { - "latitude": -26.3446542, - "longitude": -52.35785746, - "name": "Clevelândia" - }, - "410580": { - "latitude": -25.30627292, - "longitude": -49.18848399, - "name": "Colombo" - }, - "410590": { - "latitude": -22.83611225, - "longitude": -51.97177962, - "name": "Colorado" - }, - "410600": { - "latitude": -23.60570627, - "longitude": -50.50387165, - "name": "Congonhinhas" - }, - "410610": { - "latitude": -23.59735364, - "longitude": -50.12972569, - "name": "Conselheiro Mairinck" - }, - "410620": { - "latitude": -25.71912354, - "longitude": -49.5261215, - "name": "Contenda" - }, - "410630": { - "latitude": -24.74251196, - "longitude": -53.23704459, - "name": "Corbélia" - }, - "410640": { - "latitude": -23.22578836, - "longitude": -50.62352916, - "name": "Cornélio Procópio" - }, - "410645": { - "latitude": -26.18229374, - "longitude": -51.92522507, - "name": "Coronel Domingos Soares" - }, - "410650": { - "latitude": -25.9925175, - "longitude": -52.56441392, - "name": "Coronel Vivida" - }, - "410655": { - "latitude": -24.12374792, - "longitude": -52.14212571, - "name": "Corumbataí do Sul" - }, - "410657": { - "latitude": -25.59539238, - "longitude": -53.12975189, - "name": "Cruzeiro do Iguaçu" - }, - "410660": { - "latitude": -23.75874099, - "longitude": -53.08335665, - "name": "Cruzeiro do Oeste" - }, - "410670": { - "latitude": -22.98801264, - "longitude": -52.16248813, - "name": "Cruzeiro do Sul" - }, - "410680": { - "latitude": -25.92240298, - "longitude": -51.23218192, - "name": "Cruz Machado" - }, - "410685": { - "latitude": -24.01995295, - "longitude": -51.47543652, - "name": "Cruzmaltina" - }, - "410690": { - "latitude": -25.47790954, - "longitude": -49.28824442, - "name": "Curitiba" - }, - "410700": { - "latitude": -24.01323968, - "longitude": -50.46558666, - "name": "Curiúva" - }, - "410710": { - "latitude": -22.63504381, - "longitude": -52.89282845, - "name": "Diamante do Norte" - }, - "410712": { - "latitude": -24.99053147, - "longitude": -52.70410957, - "name": "Diamante do Sul" - }, - "410715": { - "latitude": -24.95421181, - "longitude": -54.10030202, - "name": "Diamante D'Oeste" - }, - "410720": { - "latitude": -25.75016247, - "longitude": -53.0753686, - "name": "Dois Vizinhos" - }, - "410725": { - "latitude": -23.34759305, - "longitude": -53.2900464, - "name": "Douradina" - }, - "410730": { - "latitude": -23.56118488, - "longitude": -52.21481276, - "name": "Doutor Camargo" - }, - "410740": { - "latitude": -25.9066457, - "longitude": -53.15376972, - "name": "Enéas Marques" - }, - "410750": { - "latitude": -23.75982836, - "longitude": -52.26974812, - "name": "Engenheiro Beltrão" - }, - "410752": { - "latitude": -23.71439017, - "longitude": -53.79878205, - "name": "Esperança Nova" - }, - "410753": { - "latitude": -24.71308832, - "longitude": -54.22207781, - "name": "Entre Rios do Oeste" - }, - "410754": { - "latitude": -25.35274734, - "longitude": -52.78712324, - "name": "Espigão Alto do Iguaçu" - }, - "410755": { - "latitude": -24.12330842, - "longitude": -52.62884842, - "name": "Farol" - }, - "410760": { - "latitude": -24.00333918, - "longitude": -51.28487644, - "name": "Faxinal" - }, - "410765": { - "latitude": -25.67641852, - "longitude": -49.2974172, - "name": "Fazenda Rio Grande" - }, - "410770": { - "latitude": -23.90111385, - "longitude": -52.02977219, - "name": "Fênix" - }, - "410773": { - "latitude": -25.51661006, - "longitude": -50.51029637, - "name": "Fernandes Pinheiro" - }, - "410775": { - "latitude": -23.8761808, - "longitude": -50.43029949, - "name": "Figueira" - }, - "410780": { - "latitude": -23.33273239, - "longitude": -52.34841653, - "name": "Floraí" - }, - "410785": { - "latitude": -26.23815177, - "longitude": -53.28647734, - "name": "Flor da Serra do Sul" - }, - "410790": { - "latitude": -23.60722396, - "longitude": -52.09007554, - "name": "Floresta" - }, - "410800": { - "latitude": -22.89315249, - "longitude": -51.40259913, - "name": "Florestópolis" - }, - "410810": { - "latitude": -23.10559018, - "longitude": -51.95645381, - "name": "Flórida" - }, - "410820": { - "latitude": -24.292645, - "longitude": -53.33167265, - "name": "Formosa do Oeste" - }, - "410830": { - "latitude": -25.46659432, - "longitude": -54.48338829, - "name": "Foz do Iguaçu" - }, - "410832": { - "latitude": -24.09481782, - "longitude": -53.87232674, - "name": "Francisco Alves" - }, - "410840": { - "latitude": -26.04768915, - "longitude": -53.13258223, - "name": "Francisco Beltrão" - }, - "410845": { - "latitude": -25.69963389, - "longitude": -52.09110074, - "name": "Foz do Jordão" - }, - "410850": { - "latitude": -26.47260574, - "longitude": -51.39193538, - "name": "General Carneiro" - }, - "410855": { - "latitude": -24.16030919, - "longitude": -51.90799448, - "name": "Godoy Moreira" - }, - "410860": { - "latitude": -24.17267074, - "longitude": -53.05218465, - "name": "Goioerê" - }, - "410865": { - "latitude": -25.12992641, - "longitude": -51.99452036, - "name": "Goioxim" - }, - "410870": { - "latitude": -24.19100822, - "longitude": -51.44748078, - "name": "Grandes Rios" - }, - "410880": { - "latitude": -24.19057187, - "longitude": -54.23119942, - "name": "Guaíra" - }, - "410890": { - "latitude": -22.92286485, - "longitude": -52.74009868, - "name": "Guairaçá" - }, - "410895": { - "latitude": -25.17068418, - "longitude": -50.83968209, - "name": "Guamiranga" - }, - "410900": { - "latitude": -23.46798394, - "longitude": -50.07694959, - "name": "Guapirama" - }, - "410910": { - "latitude": -23.32520727, - "longitude": -52.8260905, - "name": "Guaporema" - }, - "410920": { - "latitude": -22.95673536, - "longitude": -51.67886918, - "name": "Guaraci" - }, - "410930": { - "latitude": -25.05509806, - "longitude": -52.86326587, - "name": "Guaraniaçu" - }, - "410940": { - "latitude": -25.37135466, - "longitude": -51.49123908, - "name": "Guarapuava" - }, - "410950": { - "latitude": -25.23413669, - "longitude": -48.36736519, - "name": "Guaraqueçaba" - }, - "410960": { - "latitude": -25.81762644, - "longitude": -48.76867151, - "name": "Guaratuba" - }, - "410965": { - "latitude": -26.16276335, - "longitude": -52.37258625, - "name": "Honório Serpa" - }, - "410970": { - "latitude": -23.77822788, - "longitude": -50.28739755, - "name": "Ibaiti" - }, - "410975": { - "latitude": -25.15201349, - "longitude": -53.02404125, - "name": "Ibema" - }, - "410980": { - "latitude": -23.23640834, - "longitude": -51.03776072, - "name": "Ibiporã" - }, - "410990": { - "latitude": -23.3736092, - "longitude": -53.58561866, - "name": "Icaraíma" - }, - "411000": { - "latitude": -23.22684002, - "longitude": -51.84693925, - "name": "Iguaraçu" - }, - "411005": { - "latitude": -24.68784033, - "longitude": -53.08691233, - "name": "Iguatu" - }, - "411007": { - "latitude": -24.43850491, - "longitude": -50.7418566, - "name": "Imbaú" - }, - "411010": { - "latitude": -25.22597157, - "longitude": -50.65540675, - "name": "Imbituva" - }, - "411020": { - "latitude": -25.6343398, - "longitude": -51.19746859, - "name": "Inácio Martins" - }, - "411030": { - "latitude": -22.71864603, - "longitude": -52.22535621, - "name": "Inajá" - }, - "411040": { - "latitude": -23.48687227, - "longitude": -52.67316654, - "name": "Indianópolis" - }, - "411050": { - "latitude": -24.98845944, - "longitude": -50.58561331, - "name": "Ipiranga" - }, - "411060": { - "latitude": -24.04511597, - "longitude": -53.71983221, - "name": "Iporã" - }, - "411065": { - "latitude": -24.43854554, - "longitude": -53.35175239, - "name": "Iracema do Oeste" - }, - "411070": { - "latitude": -25.48855161, - "longitude": -50.82561027, - "name": "Irati" - }, - "411080": { - "latitude": -24.35228934, - "longitude": -52.11100189, - "name": "Iretama" - }, - "411090": { - "latitude": -22.65966206, - "longitude": -51.96774282, - "name": "Itaguajé" - }, - "411095": { - "latitude": -25.15607875, - "longitude": -54.35821176, - "name": "Itaipulândia" - }, - "411100": { - "latitude": -22.9827937, - "longitude": -50.41400957, - "name": "Itambaracá" - }, - "411110": { - "latitude": -23.70652754, - "longitude": -52.0082605, - "name": "Itambé" - }, - "411120": { - "latitude": -25.98619926, - "longitude": -52.82392166, - "name": "Itapejara d'Oeste" - }, - "411125": { - "latitude": -25.12490088, - "longitude": -49.49053612, - "name": "Itaperuçu" - }, - "411130": { - "latitude": -22.72872107, - "longitude": -52.89846215, - "name": "Itaúna do Sul" - }, - "411140": { - "latitude": -24.98717835, - "longitude": -50.85987129, - "name": "Ivaí" - }, - "411150": { - "latitude": -24.28266279, - "longitude": -51.62891833, - "name": "Ivaiporã" - }, - "411155": { - "latitude": -23.35385136, - "longitude": -53.42427934, - "name": "Ivaté" - }, - "411160": { - "latitude": -23.59911152, - "longitude": -52.17744327, - "name": "Ivatuba" - }, - "411170": { - "latitude": -23.71813227, - "longitude": -50.07977562, - "name": "Jaboti" - }, - "411180": { - "latitude": -23.15068442, - "longitude": -49.94741711, - "name": "Jacarezinho" - }, - "411190": { - "latitude": -23.065263, - "longitude": -51.55638324, - "name": "Jaguapitã" - }, - "411200": { - "latitude": -24.33078837, - "longitude": -49.70515284, - "name": "Jaguariaíva" - }, - "411210": { - "latitude": -23.62791419, - "longitude": -51.68457794, - "name": "Jandaia do Sul" - }, - "411220": { - "latitude": -24.12806732, - "longitude": -52.81123347, - "name": "Janiópolis" - }, - "411230": { - "latitude": -23.73320141, - "longitude": -50.1629691, - "name": "Japira" - }, - "411240": { - "latitude": -23.43884391, - "longitude": -52.54118163, - "name": "Japurá" - }, - "411250": { - "latitude": -24.20560192, - "longitude": -51.76741433, - "name": "Jardim Alegre" - }, - "411260": { - "latitude": -22.57382173, - "longitude": -52.07934397, - "name": "Jardim Olinda" - }, - "411270": { - "latitude": -23.25115163, - "longitude": -50.92418333, - "name": "Jataizinho" - }, - "411275": { - "latitude": -24.41395887, - "longitude": -53.4105972, - "name": "Jesuítas" - }, - "411280": { - "latitude": -23.45683548, - "longitude": -49.9103112, - "name": "Joaquim Távora" - }, - "411290": { - "latitude": -23.47345902, - "longitude": -50.23216941, - "name": "Jundiaí do Sul" - }, - "411295": { - "latitude": -24.39750147, - "longitude": -52.83471784, - "name": "Juranda" - }, - "411300": { - "latitude": -23.63698374, - "longitude": -52.44778197, - "name": "Jussara" - }, - "411310": { - "latitude": -23.85712246, - "longitude": -51.689906, - "name": "Kaloré" - }, - "411320": { - "latitude": -25.77051963, - "longitude": -49.87109076, - "name": "Lapa" - }, - "411325": { - "latitude": -24.9020998, - "longitude": -52.49063929, - "name": "Laranjal" - }, - "411330": { - "latitude": -25.34548604, - "longitude": -52.38179723, - "name": "Laranjeiras do Sul" - }, - "411340": { - "latitude": -23.02663643, - "longitude": -50.7112997, - "name": "Leópolis" - }, - "411342": { - "latitude": -24.08622468, - "longitude": -51.63895629, - "name": "Lidianópolis" - }, - "411345": { - "latitude": -25.26132417, - "longitude": -53.55805401, - "name": "Lindoeste" - }, - "411350": { - "latitude": -22.94913203, - "longitude": -53.07125297, - "name": "Loanda" - }, - "411360": { - "latitude": -22.98175913, - "longitude": -51.98723798, - "name": "Lobato" - }, - "411370": { - "latitude": -23.51425196, - "longitude": -51.11037658, - "name": "Londrina" - }, - "411373": { - "latitude": -24.34740284, - "longitude": -52.33080502, - "name": "Luiziana" - }, - "411375": { - "latitude": -24.0802033, - "longitude": -51.77098451, - "name": "Lunardelli" - }, - "411380": { - "latitude": -22.72796812, - "longitude": -51.66448003, - "name": "Lupionópolis" - }, - "411390": { - "latitude": -25.88094377, - "longitude": -50.85842957, - "name": "Mallet" - }, - "411400": { - "latitude": -24.36107357, - "longitude": -52.58907392, - "name": "Mamborê" - }, - "411410": { - "latitude": -23.27866779, - "longitude": -52.05583277, - "name": "Mandaguaçu" - }, - "411420": { - "latitude": -23.48200557, - "longitude": -51.70669962, - "name": "Mandaguari" - }, - "411430": { - "latitude": -25.84237937, - "longitude": -49.32228599, - "name": "Mandirituba" - }, - "411435": { - "latitude": -26.09538059, - "longitude": -53.34525919, - "name": "Manfrinópolis" - }, - "411440": { - "latitude": -26.03342083, - "longitude": -52.20928188, - "name": "Mangueirinha" - }, - "411450": { - "latitude": -24.48932223, - "longitude": -51.64040461, - "name": "Manoel Ribas" - }, - "411460": { - "latitude": -24.57173242, - "longitude": -54.13670772, - "name": "Marechal Cândido Rondon" - }, - "411470": { - "latitude": -23.58235225, - "longitude": -53.22150472, - "name": "Maria Helena" - }, - "411480": { - "latitude": -23.53065247, - "longitude": -51.86785236, - "name": "Marialva" - }, - "411490": { - "latitude": -23.77332571, - "longitude": -51.28361849, - "name": "Marilândia do Sul" - }, - "411500": { - "latitude": -22.73281452, - "longitude": -53.06447866, - "name": "Marilena" - }, - "411510": { - "latitude": -24.05365757, - "longitude": -53.21066267, - "name": "Mariluz" - }, - "411520": { - "latitude": -23.40094933, - "longitude": -51.9678126, - "name": "Maringá" - }, - "411530": { - "latitude": -26.33607744, - "longitude": -52.58075848, - "name": "Mariópolis" - }, - "411535": { - "latitude": -24.44485361, - "longitude": -53.79169091, - "name": "Maripá" - }, - "411540": { - "latitude": -26.24653974, - "longitude": -53.09308614, - "name": "Marmeleiro" - }, - "411545": { - "latitude": -25.10057303, - "longitude": -52.25321903, - "name": "Marquinho" - }, - "411550": { - "latitude": -23.75430722, - "longitude": -51.65957702, - "name": "Marumbi" - }, - "411560": { - "latitude": -25.35104646, - "longitude": -53.90600712, - "name": "Matelândia" - }, - "411570": { - "latitude": -25.76172958, - "longitude": -48.55475503, - "name": "Matinhos" - }, - "411573": { - "latitude": -24.70146276, - "longitude": -52.21191742, - "name": "Mato Rico" - }, - "411575": { - "latitude": -23.91107202, - "longitude": -51.1802564, - "name": "Mauá da Serra" - }, - "411580": { - "latitude": -25.26317096, - "longitude": -54.09192079, - "name": "Medianeira" - }, - "411585": { - "latitude": -24.43340487, - "longitude": -54.18623578, - "name": "Mercedes" - }, - "411590": { - "latitude": -23.20238531, - "longitude": -52.74614307, - "name": "Mirador" - }, - "411600": { - "latitude": -22.97311245, - "longitude": -51.48521661, - "name": "Miraselva" - }, - "411605": { - "latitude": -25.09557157, - "longitude": -54.24128055, - "name": "Missal" - }, - "411610": { - "latitude": -24.02443954, - "longitude": -53.00557149, - "name": "Moreira Sales" - }, - "411620": { - "latitude": -25.51834964, - "longitude": -48.85602206, - "name": "Morretes" - }, - "411630": { - "latitude": -23.13027127, - "longitude": -51.73487964, - "name": "Munhoz de Melo" - }, - "411640": { - "latitude": -22.91407842, - "longitude": -51.79807014, - "name": "Nossa Senhora das Graças" - }, - "411650": { - "latitude": -23.16960004, - "longitude": -52.61061107, - "name": "Nova Aliança do Ivaí" - }, - "411660": { - "latitude": -23.34539588, - "longitude": -50.70629257, - "name": "Nova América da Colina" - }, - "411670": { - "latitude": -24.50271909, - "longitude": -53.27698147, - "name": "Nova Aurora" - }, - "411680": { - "latitude": -24.65923669, - "longitude": -52.55851068, - "name": "Nova Cantu" - }, - "411690": { - "latitude": -23.1914204, - "longitude": -52.2508935, - "name": "Nova Esperança" - }, - "411695": { - "latitude": -25.89843332, - "longitude": -53.25759702, - "name": "Nova Esperança do Sudoeste" - }, - "411700": { - "latitude": -23.41850517, - "longitude": -50.53846975, - "name": "Nova Fátima" - }, - "411705": { - "latitude": -25.2259835, - "longitude": -52.57478872, - "name": "Nova Laranjeiras" - }, - "411710": { - "latitude": -22.78688556, - "longitude": -52.95477128, - "name": "Nova Londrina" - }, - "411720": { - "latitude": -23.42670294, - "longitude": -53.07216686, - "name": "Nova Olímpia" - }, - "411721": { - "latitude": -23.59363276, - "longitude": -50.74213228, - "name": "Nova Santa Bárbara" - }, - "411722": { - "latitude": -24.44035507, - "longitude": -53.9585387, - "name": "Nova Santa Rosa" - }, - "411725": { - "latitude": -25.59080023, - "longitude": -53.37830762, - "name": "Nova Prata do Iguaçu" - }, - "411727": { - "latitude": -24.4599342, - "longitude": -51.94445774, - "name": "Nova Tebas" - }, - "411729": { - "latitude": -23.78090198, - "longitude": -51.53281414, - "name": "Novo Itacolomi" - }, - "411730": { - "latitude": -24.13507097, - "longitude": -50.94695583, - "name": "Ortigueira" - }, - "411740": { - "latitude": -23.45973786, - "longitude": -52.23134536, - "name": "Ourizona" - }, - "411745": { - "latitude": -24.79379517, - "longitude": -53.90968191, - "name": "Ouro Verde do Oeste" - }, - "411750": { - "latitude": -23.46509844, - "longitude": -52.12215107, - "name": "Paiçandu" - }, - "411760": { - "latitude": -26.45109278, - "longitude": -51.81435878, - "name": "Palmas" - }, - "411770": { - "latitude": -25.44262574, - "longitude": -50.05777473, - "name": "Palmeira" - }, - "411780": { - "latitude": -24.87570519, - "longitude": -52.26572356, - "name": "Palmital" - }, - "411790": { - "latitude": -24.2746361, - "longitude": -53.82404043, - "name": "Palotina" - }, - "411800": { - "latitude": -23.26809089, - "longitude": -52.63551089, - "name": "Paraíso do Norte" - }, - "411810": { - "latitude": -22.84729623, - "longitude": -52.14462489, - "name": "Paranacity" - }, - "411820": { - "latitude": -25.52655982, - "longitude": -48.51767549, - "name": "Paranaguá" - }, - "411830": { - "latitude": -22.66047208, - "longitude": -52.10267765, - "name": "Paranapoema" - }, - "411840": { - "latitude": -22.9212589, - "longitude": -52.51061952, - "name": "Paranavaí" - }, - "411845": { - "latitude": -24.63422928, - "longitude": -54.24826097, - "name": "Pato Bragado" - }, - "411850": { - "latitude": -26.16902194, - "longitude": -52.6632085, - "name": "Pato Branco" - }, - "411860": { - "latitude": -26.17739308, - "longitude": -50.86084993, - "name": "Paula Freitas" - }, - "411870": { - "latitude": -26.0608417, - "longitude": -50.7486413, - "name": "Paulo Frontin" - }, - "411880": { - "latitude": -23.93118054, - "longitude": -52.32667299, - "name": "Peabiru" - }, - "411885": { - "latitude": -23.92300927, - "longitude": -53.36502165, - "name": "Perobal" - }, - "411890": { - "latitude": -23.83079435, - "longitude": -53.70706349, - "name": "Pérola" - }, - "411900": { - "latitude": -25.84986569, - "longitude": -53.75889217, - "name": "Pérola d'Oeste" - }, - "411910": { - "latitude": -26.09071077, - "longitude": -49.45319955, - "name": "Piên" - }, - "411915": { - "latitude": -25.41989557, - "longitude": -49.15560749, - "name": "Pinhais" - }, - "411920": { - "latitude": -23.90352016, - "longitude": -50.06131107, - "name": "Pinhalão" - }, - "411925": { - "latitude": -26.01600764, - "longitude": -53.47802588, - "name": "Pinhal de São Bento" - }, - "411930": { - "latitude": -25.78550762, - "longitude": -51.63236497, - "name": "Pinhão" - }, - "411940": { - "latitude": -24.47466263, - "longitude": -49.92770916, - "name": "Piraí do Sul" - }, - "411950": { - "latitude": -25.47243625, - "longitude": -49.05230861, - "name": "Piraquara" - }, - "411960": { - "latitude": -24.69109343, - "longitude": -51.78041427, - "name": "Pitanga" - }, - "411965": { - "latitude": -23.20924359, - "longitude": -51.57244886, - "name": "Pitangueiras" - }, - "411970": { - "latitude": -23.09165633, - "longitude": -52.93452077, - "name": "Planaltina do Paraná" - }, - "411980": { - "latitude": -25.73723376, - "longitude": -53.70776967, - "name": "Planalto" - }, - "411990": { - "latitude": -25.13969857, - "longitude": -50.08079333, - "name": "Ponta Grossa" - }, - "411995": { - "latitude": -25.63649497, - "longitude": -48.474786, - "name": "Pontal do Paraná" - }, - "412000": { - "latitude": -22.74267005, - "longitude": -51.40994412, - "name": "Porecatu" - }, - "412010": { - "latitude": -25.52976098, - "longitude": -49.89528131, - "name": "Porto Amazonas" - }, - "412015": { - "latitude": -25.58463885, - "longitude": -52.38219727, - "name": "Porto Barreiro" - }, - "412020": { - "latitude": -22.8330967, - "longitude": -53.31383382, - "name": "Porto Rico" - }, - "412030": { - "latitude": -26.22765065, - "longitude": -51.22226003, - "name": "Porto Vitória" - }, - "412033": { - "latitude": -23.02557222, - "longitude": -51.40054624, - "name": "Prado Ferreira" - }, - "412035": { - "latitude": -25.96626278, - "longitude": -53.72119027, - "name": "Pranchita" - }, - "412040": { - "latitude": -23.2637976, - "longitude": -52.14937489, - "name": "Presidente Castelo Branco" - }, - "412050": { - "latitude": -22.86220373, - "longitude": -51.0741041, - "name": "Primeiro de Maio" - }, - "412060": { - "latitude": -25.1308027, - "longitude": -51.09783087, - "name": "Prudentópolis" - }, - "412065": { - "latitude": -24.30314393, - "longitude": -53.15533248, - "name": "Quarto Centenário" - }, - "412070": { - "latitude": -23.56211542, - "longitude": -49.93190053, - "name": "Quatiguá" - }, - "412080": { - "latitude": -25.36865473, - "longitude": -48.99436765, - "name": "Quatro Barras" - }, - "412085": { - "latitude": -24.5717419, - "longitude": -53.97653443, - "name": "Quatro Pontes" - }, - "412090": { - "latitude": -25.45741463, - "longitude": -52.95499894, - "name": "Quedas do Iguaçu" - }, - "412100": { - "latitude": -23.04243648, - "longitude": -53.52146901, - "name": "Querência do Norte" - }, - "412110": { - "latitude": -23.82970692, - "longitude": -52.1404077, - "name": "Quinta do Sol" - }, - "412120": { - "latitude": -25.91051949, - "longitude": -49.48147218, - "name": "Quitandinha" - }, - "412125": { - "latitude": -25.09436195, - "longitude": -54.07607145, - "name": "Ramilândia" - }, - "412130": { - "latitude": -23.07995528, - "longitude": -50.91937475, - "name": "Rancho Alegre" - }, - "412135": { - "latitude": -24.29048865, - "longitude": -52.96082378, - "name": "Rancho Alegre D'Oeste" - }, - "412140": { - "latitude": -25.67440079, - "longitude": -53.54352807, - "name": "Realeza" - }, - "412150": { - "latitude": -25.65853099, - "longitude": -50.62092492, - "name": "Rebouças" - }, - "412160": { - "latitude": -26.22514214, - "longitude": -52.95088458, - "name": "Renascença" - }, - "412170": { - "latitude": -24.59549761, - "longitude": -50.9565309, - "name": "Reserva" - }, - "412175": { - "latitude": -25.86778124, - "longitude": -51.96370752, - "name": "Reserva do Iguaçu" - }, - "412180": { - "latitude": -23.26168329, - "longitude": -49.76275932, - "name": "Ribeirão Claro" - }, - "412190": { - "latitude": -23.44826327, - "longitude": -50.37430325, - "name": "Ribeirão do Pinhal" - }, - "412200": { - "latitude": -25.72088238, - "longitude": -50.79262616, - "name": "Rio Azul" - }, - "412210": { - "latitude": -23.79740053, - "longitude": -51.43337428, - "name": "Rio Bom" - }, - "412215": { - "latitude": -25.54661175, - "longitude": -52.6085227, - "name": "Rio Bonito do Iguaçu" - }, - "412217": { - "latitude": -24.34656107, - "longitude": -51.33373609, - "name": "Rio Branco do Ivaí" - }, - "412220": { - "latitude": -25.07646501, - "longitude": -49.3475772, - "name": "Rio Branco do Sul" - }, - "412230": { - "latitude": -26.09478816, - "longitude": -49.68348499, - "name": "Rio Negro" - }, - "412240": { - "latitude": -23.27127999, - "longitude": -51.409205, - "name": "Rolândia" - }, - "412250": { - "latitude": -24.56585661, - "longitude": -52.26131024, - "name": "Roncador" - }, - "412260": { - "latitude": -23.47767854, - "longitude": -52.80453735, - "name": "Rondon" - }, - "412265": { - "latitude": -24.31571648, - "longitude": -51.2034457, - "name": "Rosário do Ivaí" - }, - "412270": { - "latitude": -23.34869326, - "longitude": -51.58449398, - "name": "Sabáudia" - }, - "412280": { - "latitude": -26.14128135, - "longitude": -53.4154105, - "name": "Salgado Filho" - }, - "412290": { - "latitude": -23.63080409, - "longitude": -49.68303943, - "name": "Salto do Itararé" - }, - "412300": { - "latitude": -25.77538941, - "longitude": -53.28706044, - "name": "Salto do Lontra" - }, - "412310": { - "latitude": -23.25908159, - "longitude": -50.41010955, - "name": "Santa Amélia" - }, - "412320": { - "latitude": -23.54441116, - "longitude": -50.79754352, - "name": "Santa Cecília do Pavão" - }, - "412330": { - "latitude": -23.08494993, - "longitude": -53.36294005, - "name": "Santa Cruz de Monte Castelo" - }, - "412340": { - "latitude": -23.06307252, - "longitude": -51.83876095, - "name": "Santa Fé" - }, - "412350": { - "latitude": -24.8888841, - "longitude": -54.30562785, - "name": "Santa Helena" - }, - "412360": { - "latitude": -22.71298595, - "longitude": -51.8978241, - "name": "Santa Inês" - }, - "412370": { - "latitude": -23.11449746, - "longitude": -53.24071625, - "name": "Santa Isabel do Ivaí" - }, - "412380": { - "latitude": -25.78358313, - "longitude": -53.42303964, - "name": "Santa Izabel do Oeste" - }, - "412382": { - "latitude": -25.38932434, - "longitude": -53.55351997, - "name": "Santa Lúcia" - }, - "412385": { - "latitude": -24.9091834, - "longitude": -51.92961498, - "name": "Santa Maria do Oeste" - }, - "412390": { - "latitude": -23.06063242, - "longitude": -50.53882094, - "name": "Santa Mariana" - }, - "412395": { - "latitude": -23.15435292, - "longitude": -53.10919643, - "name": "Santa Mônica" - }, - "412400": { - "latitude": -23.75079423, - "longitude": -49.6323726, - "name": "Santana do Itararé" - }, - "412402": { - "latitude": -25.03660925, - "longitude": -53.60601532, - "name": "Santa Tereza do Oeste" - }, - "412405": { - "latitude": -25.45664469, - "longitude": -54.42737317, - "name": "Santa Terezinha de Itaipu" - }, - "412410": { - "latitude": -23.2966681, - "longitude": -50.08563862, - "name": "Santo Antônio da Platina" - }, - "412420": { - "latitude": -22.69901091, - "longitude": -52.35611833, - "name": "Santo Antônio do Caiuá" - }, - "412430": { - "latitude": -23.5804907, - "longitude": -50.63023923, - "name": "Santo Antônio do Paraíso" - }, - "412440": { - "latitude": -26.06661339, - "longitude": -53.63320716, - "name": "Santo Antônio do Sudoeste" - }, - "412450": { - "latitude": -22.71873608, - "longitude": -51.80195565, - "name": "Santo Inácio" - }, - "412460": { - "latitude": -23.34217425, - "longitude": -52.4804594, - "name": "São Carlos do Ivaí" - }, - "412470": { - "latitude": -23.71624324, - "longitude": -50.7784111, - "name": "São Jerônimo da Serra" - }, - "412480": { - "latitude": -25.77404496, - "longitude": -52.79305419, - "name": "São João" - }, - "412490": { - "latitude": -22.83821955, - "longitude": -52.33070049, - "name": "São João do Caiuá" - }, - "412500": { - "latitude": -23.99263549, - "longitude": -51.84808227, - "name": "São João do Ivaí" - }, - "412510": { - "latitude": -25.6699938, - "longitude": -50.28671766, - "name": "São João do Triunfo" - }, - "412520": { - "latitude": -25.65589824, - "longitude": -52.94005417, - "name": "São Jorge d'Oeste" - }, - "412530": { - "latitude": -23.43503067, - "longitude": -52.31691534, - "name": "São Jorge do Ivaí" - }, - "412535": { - "latitude": -23.73859866, - "longitude": -53.94773179, - "name": "São Jorge do Patrocínio" - }, - "412540": { - "latitude": -23.95867302, - "longitude": -49.67121558, - "name": "São José da Boa Vista" - }, - "412545": { - "latitude": -24.81547203, - "longitude": -54.11957152, - "name": "São José das Palmeiras" - }, - "412550": { - "latitude": -25.66436316, - "longitude": -49.0949456, - "name": "São José dos Pinhais" - }, - "412555": { - "latitude": -23.37231805, - "longitude": -52.61240854, - "name": "São Manoel do Paraná" - }, - "412560": { - "latitude": -25.90820898, - "longitude": -50.44198393, - "name": "São Mateus do Sul" - }, - "412570": { - "latitude": -25.38748925, - "longitude": -54.26202869, - "name": "São Miguel do Iguaçu" - }, - "412575": { - "latitude": -24.90650417, - "longitude": -53.89073145, - "name": "São Pedro do Iguaçu" - }, - "412580": { - "latitude": -23.84554829, - "longitude": -51.87179128, - "name": "São Pedro do Ivaí" - }, - "412590": { - "latitude": -22.78496265, - "longitude": -53.18126455, - "name": "São Pedro do Paraná" - }, - "412600": { - "latitude": -23.45533692, - "longitude": -50.72251434, - "name": "São Sebastião da Amoreira" - }, - "412610": { - "latitude": -23.52449061, - "longitude": -52.53878421, - "name": "São Tomé" - }, - "412620": { - "latitude": -23.87521625, - "longitude": -50.60464167, - "name": "Sapopema" - }, - "412625": { - "latitude": -23.46824374, - "longitude": -51.86706304, - "name": "Sarandi" - }, - "412627": { - "latitude": -25.71320786, - "longitude": -52.60436883, - "name": "Saudade do Iguaçu" - }, - "412630": { - "latitude": -24.24920995, - "longitude": -49.45594248, - "name": "Sengés" - }, - "412635": { - "latitude": -25.47695489, - "longitude": -54.02755762, - "name": "Serranópolis do Iguaçu" - }, - "412640": { - "latitude": -22.93419503, - "longitude": -50.87500192, - "name": "Sertaneja" - }, - "412650": { - "latitude": -23.05733828, - "longitude": -51.07197278, - "name": "Sertanópolis" - }, - "412660": { - "latitude": -23.63917112, - "longitude": -49.79294694, - "name": "Siqueira Campos" - }, - "412665": { - "latitude": -25.69335401, - "longitude": -52.71854972, - "name": "Sulina" - }, - "412667": { - "latitude": -23.8222413, - "longitude": -51.05197373, - "name": "Tamarana" - }, - "412670": { - "latitude": -23.19852521, - "longitude": -52.4838486, - "name": "Tamboara" - }, - "412680": { - "latitude": -23.65845771, - "longitude": -52.89029454, - "name": "Tapejara" - }, - "412690": { - "latitude": -23.32910371, - "longitude": -53.13408531, - "name": "Tapira" - }, - "412700": { - "latitude": -25.31343899, - "longitude": -50.40849755, - "name": "Teixeira Soares" - }, - "412710": { - "latitude": -24.25000868, - "longitude": -50.52254981, - "name": "Telêmaco Borba" - }, - "412720": { - "latitude": -23.6966714, - "longitude": -52.38805857, - "name": "Terra Boa" - }, - "412730": { - "latitude": -22.72941198, - "longitude": -52.68165232, - "name": "Terra Rica" - }, - "412740": { - "latitude": -24.20871362, - "longitude": -54.06277921, - "name": "Terra Roxa" - }, - "412750": { - "latitude": -24.65577875, - "longitude": -50.46867169, - "name": "Tibagi" - }, - "412760": { - "latitude": -25.90149581, - "longitude": -49.11215493, - "name": "Tijucas do Sul" - }, - "412770": { - "latitude": -24.70485277, - "longitude": -53.77761766, - "name": "Toledo" - }, - "412780": { - "latitude": -23.7253996, - "longitude": -49.96272074, - "name": "Tomazina" - }, - "412785": { - "latitude": -25.43887175, - "longitude": -53.22462732, - "name": "Três Barras do Paraná" - }, - "412788": { - "latitude": -24.95255024, - "longitude": -48.90262204, - "name": "Tunas do Paraná" - }, - "412790": { - "latitude": -23.87922409, - "longitude": -52.84349355, - "name": "Tuneiras do Oeste" - }, - "412795": { - "latitude": -24.64600437, - "longitude": -53.50930161, - "name": "Tupãssi" - }, - "412796": { - "latitude": -25.01194494, - "longitude": -51.48047037, - "name": "Turvo" - }, - "412800": { - "latitude": -24.50493338, - "longitude": -53.02166696, - "name": "Ubiratã" - }, - "412810": { - "latitude": -23.67983845, - "longitude": -53.41411318, - "name": "Umuarama" - }, - "412820": { - "latitude": -26.10939085, - "longitude": -51.07493403, - "name": "União da Vitória" - }, - "412830": { - "latitude": -23.06702176, - "longitude": -52.10911324, - "name": "Uniflor" - }, - "412840": { - "latitude": -23.21633213, - "longitude": -50.82991781, - "name": "Uraí" - }, - "412850": { - "latitude": -23.85511684, - "longitude": -49.78450381, - "name": "Wenceslau Braz" - }, - "412853": { - "latitude": -24.18986345, - "longitude": -50.23987783, - "name": "Ventania" - }, - "412855": { - "latitude": -25.00737179, - "longitude": -53.92046044, - "name": "Vera Cruz do Oeste" - }, - "412860": { - "latitude": -25.8750896, - "longitude": -52.95838118, - "name": "Verê" - }, - "412862": { - "latitude": -23.53883858, - "longitude": -53.82464587, - "name": "Alto Paraíso" - }, - "412863": { - "latitude": -24.62643621, - "longitude": -49.39296485, - "name": "Doutor Ulysses" - }, - "412865": { - "latitude": -25.41012267, - "longitude": -52.23681205, - "name": "Virmond" - }, - "412870": { - "latitude": -26.28121984, - "longitude": -52.80779693, - "name": "Vitorino" - }, - "412880": { - "latitude": -23.7357485, - "longitude": -53.59195291, - "name": "Xambrê" - }, - "420005": { - "latitude": -27.5838249, - "longitude": -51.05626283, - "name": "Abdon Batista" - }, - "420010": { - "latitude": -26.56242686, - "longitude": -52.25571912, - "name": "Abelardo Luz" - }, - "420020": { - "latitude": -27.45511639, - "longitude": -49.82477986, - "name": "Agrolândia" - }, - "420030": { - "latitude": -27.32755943, - "longitude": -49.72074686, - "name": "Agronômica" - }, - "420040": { - "latitude": -26.76446918, - "longitude": -51.61240584, - "name": "Água Doce" - }, - "420050": { - "latitude": -27.05438602, - "longitude": -52.95673528, - "name": "Águas de Chapecó" - }, - "420055": { - "latitude": -26.85163885, - "longitude": -52.85231124, - "name": "Águas Frias" - }, - "420060": { - "latitude": -27.73348095, - "longitude": -48.93602694, - "name": "Águas Mornas" - }, - "420070": { - "latitude": -27.70594673, - "longitude": -49.33075107, - "name": "Alfredo Wagner" - }, - "420075": { - "latitude": -27.42153508, - "longitude": -51.9259484, - "name": "Alto Bela Vista" - }, - "420080": { - "latitude": -26.53294818, - "longitude": -53.33310864, - "name": "Anchieta" - }, - "420090": { - "latitude": -27.54300568, - "longitude": -49.06722368, - "name": "Angelina" - }, - "420100": { - "latitude": -27.73032179, - "longitude": -51.07955798, - "name": "Anita Garibaldi" - }, - "420110": { - "latitude": -27.87977598, - "longitude": -49.1387501, - "name": "Anitápolis" - }, - "420120": { - "latitude": -27.49747423, - "longitude": -48.8309818, - "name": "Antônio Carlos" - }, - "420125": { - "latitude": -27.12450236, - "longitude": -49.3642446, - "name": "Apiúna" - }, - "420127": { - "latitude": -27.14086808, - "longitude": -52.18154486, - "name": "Arabutã" - }, - "420130": { - "latitude": -26.46170809, - "longitude": -48.75777735, - "name": "Araquari" - }, - "420140": { - "latitude": -28.94229341, - "longitude": -49.47117421, - "name": "Araranguá" - }, - "420150": { - "latitude": -28.23788064, - "longitude": -49.01467767, - "name": "Armazém" - }, - "420160": { - "latitude": -26.92149911, - "longitude": -51.33667814, - "name": "Arroio Trinta" - }, - "420165": { - "latitude": -27.07085356, - "longitude": -52.44198671, - "name": "Arvoredo" - }, - "420170": { - "latitude": -26.97363368, - "longitude": -49.39596552, - "name": "Ascurra" - }, - "420180": { - "latitude": -27.4373039, - "longitude": -49.74255039, - "name": "Atalanta" - }, - "420190": { - "latitude": -27.32963166, - "longitude": -49.59034699, - "name": "Aurora" - }, - "420195": { - "latitude": -29.01946508, - "longitude": -49.47505673, - "name": "Balneário Arroio do Silva" - }, - "420200": { - "latitude": -27.00474456, - "longitude": -48.62174256, - "name": "Balneário Camboriú" - }, - "420205": { - "latitude": -26.44635057, - "longitude": -48.65289255, - "name": "Balneário Barra do Sul" - }, - "420207": { - "latitude": -29.15351604, - "longitude": -49.61536798, - "name": "Balneário Gaivota" - }, - "420208": { - "latitude": -26.7685958, - "longitude": -53.64816795, - "name": "Bandeirante" - }, - "420209": { - "latitude": -26.66835784, - "longitude": -53.42505536, - "name": "Barra Bonita" - }, - "420210": { - "latitude": -26.66243796, - "longitude": -48.72741952, - "name": "Barra Velha" - }, - "420213": { - "latitude": -26.41807905, - "longitude": -50.4868443, - "name": "Bela Vista do Toldo" - }, - "420215": { - "latitude": -26.85708207, - "longitude": -53.61806005, - "name": "Belmonte" - }, - "420220": { - "latitude": -26.80094023, - "longitude": -49.43539637, - "name": "Benedito Novo" - }, - "420230": { - "latitude": -27.43352985, - "longitude": -48.6939469, - "name": "Biguaçu" - }, - "420240": { - "latitude": -26.88576667, - "longitude": -49.09730925, - "name": "Blumenau" - }, - "420243": { - "latitude": -27.76311753, - "longitude": -49.90916304, - "name": "Bocaina do Sul" - }, - "420245": { - "latitude": -27.17265933, - "longitude": -48.52004494, - "name": "Bombinhas" - }, - "420250": { - "latitude": -28.36100461, - "longitude": -49.65245192, - "name": "Bom Jardim da Serra" - }, - "420253": { - "latitude": -26.7390419, - "longitude": -52.38999114, - "name": "Bom Jesus" - }, - "420257": { - "latitude": -26.68402082, - "longitude": -53.09528807, - "name": "Bom Jesus do Oeste" - }, - "420260": { - "latitude": -27.78535989, - "longitude": -49.56300899, - "name": "Bom Retiro" - }, - "420270": { - "latitude": -27.2185761, - "longitude": -49.1235258, - "name": "Botuverá" - }, - "420280": { - "latitude": -28.24094545, - "longitude": -49.14236463, - "name": "Braço do Norte" - }, - "420285": { - "latitude": -27.36859855, - "longitude": -49.90361665, - "name": "Braço do Trombudo" - }, - "420287": { - "latitude": -27.34696789, - "longitude": -50.84496053, - "name": "Brunópolis" - }, - "420290": { - "latitude": -27.12500008, - "longitude": -48.90974339, - "name": "Brusque" - }, - "420300": { - "latitude": -26.76301574, - "longitude": -51.08466523, - "name": "Caçador" - }, - "420310": { - "latitude": -27.02517552, - "longitude": -53.26305758, - "name": "Caibi" - }, - "420315": { - "latitude": -26.6221556, - "longitude": -51.00686568, - "name": "Calmon" - }, - "420320": { - "latitude": -27.0709387, - "longitude": -48.70898929, - "name": "Camboriú" - }, - "420325": { - "latitude": -28.06218198, - "longitude": -50.60691207, - "name": "Capão Alto" - }, - "420330": { - "latitude": -26.12055649, - "longitude": -49.21753924, - "name": "Campo Alegre" - }, - "420340": { - "latitude": -27.84701444, - "longitude": -50.77112433, - "name": "Campo Belo do Sul" - }, - "420350": { - "latitude": -26.45041879, - "longitude": -53.13029028, - "name": "Campo Erê" - }, - "420360": { - "latitude": -27.4130018, - "longitude": -51.24461188, - "name": "Campos Novos" - }, - "420370": { - "latitude": -27.23460358, - "longitude": -48.80230959, - "name": "Canelinha" - }, - "420380": { - "latitude": -26.24995001, - "longitude": -50.5333707, - "name": "Canoinhas" - }, - "420390": { - "latitude": -27.41193939, - "longitude": -51.63081493, - "name": "Capinzal" - }, - "420395": { - "latitude": -28.45556383, - "longitude": -48.94338454, - "name": "Capivari de Baixo" - }, - "420400": { - "latitude": -27.0449981, - "longitude": -51.69641104, - "name": "Catanduvas" - }, - "420410": { - "latitude": -27.1467112, - "longitude": -52.92021077, - "name": "Caxambu do Sul" - }, - "420415": { - "latitude": -27.65196889, - "longitude": -51.30824148, - "name": "Celso Ramos" - }, - "420417": { - "latitude": -27.77635468, - "longitude": -50.93193514, - "name": "Cerro Negro" - }, - "420419": { - "latitude": -27.58272661, - "longitude": -49.5563835, - "name": "Chapadão do Lageado" - }, - "420420": { - "latitude": -27.12514376, - "longitude": -52.6503387, - "name": "Chapecó" - }, - "420425": { - "latitude": -28.59869688, - "longitude": -49.33393038, - "name": "Cocal do Sul" - }, - "420430": { - "latitude": -27.23912655, - "longitude": -52.00738181, - "name": "Concórdia" - }, - "420435": { - "latitude": -26.97570745, - "longitude": -52.64165994, - "name": "Cordilheira Alta" - }, - "420440": { - "latitude": -26.88316141, - "longitude": -52.72505204, - "name": "Coronel Freitas" - }, - "420445": { - "latitude": -26.53464592, - "longitude": -52.67187452, - "name": "Coronel Martins" - }, - "420450": { - "latitude": -26.43993381, - "longitude": -49.32671148, - "name": "Corupá" - }, - "420455": { - "latitude": -27.59682977, - "longitude": -50.37809603, - "name": "Correia Pinto" - }, - "420460": { - "latitude": -28.71569532, - "longitude": -49.37971559, - "name": "Criciúma" - }, - "420470": { - "latitude": -26.87922756, - "longitude": -53.1906646, - "name": "Cunha Porã" - }, - "420475": { - "latitude": -26.97508678, - "longitude": -53.10087034, - "name": "Cunhataí" - }, - "420480": { - "latitude": -27.29293362, - "longitude": -50.61754794, - "name": "Curitibanos" - }, - "420490": { - "latitude": -26.8584136, - "longitude": -53.47930052, - "name": "Descanso" - }, - "420500": { - "latitude": -26.32984262, - "longitude": -53.53310482, - "name": "Dionísio Cerqueira" - }, - "420510": { - "latitude": -26.98870076, - "longitude": -49.7780824, - "name": "Dona Emma" - }, - "420515": { - "latitude": -26.70556726, - "longitude": -49.55383878, - "name": "Doutor Pedrinho" - }, - "420517": { - "latitude": -26.73970997, - "longitude": -52.57836813, - "name": "Entre Rios" - }, - "420519": { - "latitude": -28.99033715, - "longitude": -49.65292076, - "name": "Ermo" - }, - "420520": { - "latitude": -27.2843508, - "longitude": -51.42188961, - "name": "Erval Velho" - }, - "420530": { - "latitude": -26.84666947, - "longitude": -52.24432281, - "name": "Faxinal dos Guedes" - }, - "420535": { - "latitude": -26.76378082, - "longitude": -53.3373423, - "name": "Flor do Sertão" - }, - "420540": { - "latitude": -27.57884066, - "longitude": -48.50909204, - "name": "Florianópolis" - }, - "420543": { - "latitude": -26.63418929, - "longitude": -52.79378915, - "name": "Formosa do Sul" - }, - "420545": { - "latitude": -28.78169341, - "longitude": -49.49328333, - "name": "Forquilhinha" - }, - "420550": { - "latitude": -27.0378148, - "longitude": -50.87243224, - "name": "Fraiburgo" - }, - "420555": { - "latitude": -27.1917413, - "longitude": -50.76564964, - "name": "Frei Rogério" - }, - "420560": { - "latitude": -26.44940944, - "longitude": -52.65901067, - "name": "Galvão" - }, - "420570": { - "latitude": -28.04674063, - "longitude": -48.65894886, - "name": "Garopaba" - }, - "420580": { - "latitude": -26.05711168, - "longitude": -48.86732766, - "name": "Garuva" - }, - "420590": { - "latitude": -26.93134285, - "longitude": -48.96603278, - "name": "Gaspar" - }, - "420600": { - "latitude": -27.37669321, - "longitude": -48.57728453, - "name": "Governador Celso Ramos" - }, - "420610": { - "latitude": -28.15503548, - "longitude": -49.31402215, - "name": "Grão-Pará" - }, - "420620": { - "latitude": -28.35401954, - "longitude": -49.01952408, - "name": "Gravatal" - }, - "420630": { - "latitude": -27.10333776, - "longitude": -49.02075046, - "name": "Guabiruba" - }, - "420640": { - "latitude": -26.58010557, - "longitude": -53.57107631, - "name": "Guaraciaba" - }, - "420650": { - "latitude": -26.47655093, - "longitude": -48.94488242, - "name": "Guaramirim" - }, - "420660": { - "latitude": -26.39833636, - "longitude": -53.48402066, - "name": "Guarujá do Sul" - }, - "420665": { - "latitude": -27.11647392, - "longitude": -52.7833899, - "name": "Guatambú" - }, - "420670": { - "latitude": -27.19537551, - "longitude": -51.41066483, - "name": "Herval d'Oeste" - }, - "420675": { - "latitude": -27.20837421, - "longitude": -51.21546323, - "name": "Ibiam" - }, - "420680": { - "latitude": -27.09247047, - "longitude": -51.37004037, - "name": "Ibicaré" - }, - "420690": { - "latitude": -27.01815048, - "longitude": -49.52854435, - "name": "Ibirama" - }, - "420700": { - "latitude": -28.75161536, - "longitude": -49.27734643, - "name": "Içara" - }, - "420710": { - "latitude": -26.8590409, - "longitude": -48.85735098, - "name": "Ilhota" - }, - "420720": { - "latitude": -28.23147922, - "longitude": -48.8344127, - "name": "Imaruí" - }, - "420730": { - "latitude": -28.19418591, - "longitude": -48.70275386, - "name": "Imbituba" - }, - "420740": { - "latitude": -27.50291286, - "longitude": -49.40652574, - "name": "Imbuia" - }, - "420750": { - "latitude": -26.99497938, - "longitude": -49.22417769, - "name": "Indaial" - }, - "420757": { - "latitude": -26.98773, - "longitude": -51.2755068, - "name": "Iomerê" - }, - "420760": { - "latitude": -27.37081858, - "longitude": -51.79870774, - "name": "Ipira" - }, - "420765": { - "latitude": -27.00043163, - "longitude": -53.48941442, - "name": "Iporã do Oeste" - }, - "420768": { - "latitude": -26.67873914, - "longitude": -52.4760137, - "name": "Ipuaçu" - }, - "420770": { - "latitude": -27.0403092, - "longitude": -52.15289061, - "name": "Ipumirim" - }, - "420775": { - "latitude": -26.8453172, - "longitude": -53.32445649, - "name": "Iraceminha" - }, - "420780": { - "latitude": -27.02523499, - "longitude": -51.91794815, - "name": "Irani" - }, - "420785": { - "latitude": -26.62759228, - "longitude": -52.89009911, - "name": "Irati" - }, - "420790": { - "latitude": -26.35706631, - "longitude": -50.76069119, - "name": "Irineópolis" - }, - "420800": { - "latitude": -27.24401505, - "longitude": -52.33215832, - "name": "Itá" - }, - "420810": { - "latitude": -26.47214831, - "longitude": -49.89124549, - "name": "Itaiópolis" - }, - "420820": { - "latitude": -26.96901297, - "longitude": -48.75341716, - "name": "Itajaí" - }, - "420830": { - "latitude": -27.10858335, - "longitude": -48.63442695, - "name": "Itapema" - }, - "420840": { - "latitude": -27.11222241, - "longitude": -53.71167414, - "name": "Itapiranga" - }, - "420845": { - "latitude": -26.08248656, - "longitude": -48.65235955, - "name": "Itapoá" - }, - "420850": { - "latitude": -27.4534496, - "longitude": -49.5388699, - "name": "Ituporanga" - }, - "420860": { - "latitude": -27.14151023, - "longitude": -51.77266695, - "name": "Jaborá" - }, - "420870": { - "latitude": -28.994832, - "longitude": -49.84814825, - "name": "Jacinto Machado" - }, - "420880": { - "latitude": -28.65789586, - "longitude": -49.04474832, - "name": "Jaguaruna" - }, - "420890": { - "latitude": -26.48190769, - "longitude": -49.15997434, - "name": "Jaraguá do Sul" - }, - "420895": { - "latitude": -26.71719519, - "longitude": -52.87130602, - "name": "Jardinópolis" - }, - "420900": { - "latitude": -27.15179613, - "longitude": -51.59293464, - "name": "Joaçaba" - }, - "420910": { - "latitude": -26.24428223, - "longitude": -48.95140521, - "name": "Joinville" - }, - "420915": { - "latitude": -26.85948734, - "longitude": -49.64630645, - "name": "José Boiteux" - }, - "420917": { - "latitude": -26.39410563, - "longitude": -52.72092006, - "name": "Jupiá" - }, - "420920": { - "latitude": -27.25088231, - "longitude": -51.59031113, - "name": "Lacerdópolis" - }, - "420930": { - "latitude": -28.02046733, - "longitude": -50.34057307, - "name": "Lages" - }, - "420940": { - "latitude": -28.48642338, - "longitude": -48.82596498, - "name": "Laguna" - }, - "420945": { - "latitude": -26.8549413, - "longitude": -52.55208511, - "name": "Lajeado Grande" - }, - "420950": { - "latitude": -27.2079823, - "longitude": -49.73361403, - "name": "Laurentino" - }, - "420960": { - "latitude": -28.38458538, - "longitude": -49.45193164, - "name": "Lauro Müller" - }, - "420970": { - "latitude": -26.85842921, - "longitude": -50.70256878, - "name": "Lebon Régis" - }, - "420980": { - "latitude": -27.47214025, - "longitude": -49.25722236, - "name": "Leoberto Leal" - }, - "420985": { - "latitude": -27.03150728, - "longitude": -52.0524661, - "name": "Lindóia do Sul" - }, - "420990": { - "latitude": -27.18943446, - "longitude": -49.50730881, - "name": "Lontras" - }, - "421000": { - "latitude": -26.72735195, - "longitude": -48.89108169, - "name": "Luiz Alves" - }, - "421003": { - "latitude": -27.09041293, - "longitude": -51.5056331, - "name": "Luzerna" - }, - "421005": { - "latitude": -26.80351415, - "longitude": -51.35313152, - "name": "Macieira" - }, - "421010": { - "latitude": -26.20081172, - "longitude": -49.88955904, - "name": "Mafra" - }, - "421020": { - "latitude": -27.42792581, - "longitude": -49.05263193, - "name": "Major Gercino" - }, - "421030": { - "latitude": -26.48121348, - "longitude": -50.36157715, - "name": "Major Vieira" - }, - "421040": { - "latitude": -28.863963, - "longitude": -49.45554724, - "name": "Maracajá" - }, - "421050": { - "latitude": -26.75997358, - "longitude": -53.19811283, - "name": "Maravilha" - }, - "421055": { - "latitude": -26.81238261, - "longitude": -52.63006958, - "name": "Marema" - }, - "421060": { - "latitude": -26.6269113, - "longitude": -48.98819179, - "name": "Massaranduba" - }, - "421070": { - "latitude": -26.48128759, - "longitude": -51.14183007, - "name": "Matos Costa" - }, - "421080": { - "latitude": -28.84175106, - "longitude": -49.60179373, - "name": "Meleiro" - }, - "421085": { - "latitude": -27.18559323, - "longitude": -50.17513588, - "name": "Mirim Doce" - }, - "421090": { - "latitude": -26.77477747, - "longitude": -53.05109629, - "name": "Modelo" - }, - "421100": { - "latitude": -27.09929259, - "longitude": -53.44649708, - "name": "Mondaí" - }, - "421105": { - "latitude": -27.19373491, - "longitude": -50.92753484, - "name": "Monte Carlo" - }, - "421110": { - "latitude": -26.66069378, - "longitude": -50.29154044, - "name": "Monte Castelo" - }, - "421120": { - "latitude": -28.63769596, - "longitude": -49.24286164, - "name": "Morro da Fumaça" - }, - "421125": { - "latitude": -28.72206489, - "longitude": -49.74048358, - "name": "Morro Grande" - }, - "421130": { - "latitude": -26.82871112, - "longitude": -48.72743788, - "name": "Navegantes" - }, - "421140": { - "latitude": -26.90816856, - "longitude": -52.90669279, - "name": "Nova Erechim" - }, - "421145": { - "latitude": -26.96114187, - "longitude": -52.83316646, - "name": "Nova Itaberaba" - }, - "421150": { - "latitude": -27.31326812, - "longitude": -49.04136678, - "name": "Nova Trento" - }, - "421160": { - "latitude": -28.68471789, - "longitude": -49.58491232, - "name": "Nova Veneza" - }, - "421165": { - "latitude": -26.49497925, - "longitude": -52.7963614, - "name": "Novo Horizonte" - }, - "421170": { - "latitude": -28.27993785, - "longitude": -49.37185983, - "name": "Orleans" - }, - "421175": { - "latitude": -27.51721435, - "longitude": -49.97162825, - "name": "Otacílio Costa" - }, - "421180": { - "latitude": -27.28343666, - "longitude": -51.6818857, - "name": "Ouro" - }, - "421185": { - "latitude": -26.71153346, - "longitude": -52.27875796, - "name": "Ouro Verde" - }, - "421187": { - "latitude": -27.21300275, - "longitude": -52.48786858, - "name": "Paial" - }, - "421189": { - "latitude": -27.96363042, - "longitude": -50.0721353, - "name": "Painel" - }, - "421190": { - "latitude": -27.77182147, - "longitude": -48.6617082, - "name": "Palhoça" - }, - "421200": { - "latitude": -26.37354382, - "longitude": -53.31452924, - "name": "Palma Sola" - }, - "421205": { - "latitude": -27.56259374, - "longitude": -50.16161443, - "name": "Palmeira" - }, - "421210": { - "latitude": -27.09262173, - "longitude": -53.17982907, - "name": "Palmitos" - }, - "421220": { - "latitude": -26.50242441, - "longitude": -50.17236226, - "name": "Papanduva" - }, - "421223": { - "latitude": -26.66280037, - "longitude": -53.67830388, - "name": "Paraíso" - }, - "421225": { - "latitude": -29.26724753, - "longitude": -49.72193227, - "name": "Passo de Torres" - }, - "421227": { - "latitude": -26.70608276, - "longitude": -51.96106257, - "name": "Passos Maia" - }, - "421230": { - "latitude": -27.96487732, - "longitude": -48.76033311, - "name": "Paulo Lopes" - }, - "421240": { - "latitude": -28.47942091, - "longitude": -49.20447505, - "name": "Pedras Grandes" - }, - "421250": { - "latitude": -26.80787734, - "longitude": -48.65079043, - "name": "Penha" - }, - "421260": { - "latitude": -27.35136073, - "longitude": -51.875059, - "name": "Peritiba" - }, - "421265": { - "latitude": -28.40176403, - "longitude": -48.88364248, - "name": "Pescaria Brava" - }, - "421270": { - "latitude": -27.54574075, - "longitude": -49.68272427, - "name": "Petrolândia" - }, - "421280": { - "latitude": -26.7594916, - "longitude": -48.73329013, - "name": "Balneário Piçarras" - }, - "421290": { - "latitude": -26.82937348, - "longitude": -52.97663207, - "name": "Pinhalzinho" - }, - "421300": { - "latitude": -27.04943102, - "longitude": -51.23605423, - "name": "Pinheiro Preto" - }, - "421310": { - "latitude": -27.46121871, - "longitude": -51.77282038, - "name": "Piratuba" - }, - "421315": { - "latitude": -27.05196405, - "longitude": -52.86898318, - "name": "Planalto Alegre" - }, - "421320": { - "latitude": -26.72818624, - "longitude": -49.17330418, - "name": "Pomerode" - }, - "421330": { - "latitude": -27.4101571, - "longitude": -50.29874092, - "name": "Ponte Alta" - }, - "421335": { - "latitude": -27.18028906, - "longitude": -50.41856692, - "name": "Ponte Alta do Norte" - }, - "421340": { - "latitude": -26.86176858, - "longitude": -51.92821373, - "name": "Ponte Serrada" - }, - "421350": { - "latitude": -27.17494003, - "longitude": -48.61674068, - "name": "Porto Belo" - }, - "421360": { - "latitude": -26.38362841, - "longitude": -51.0077846, - "name": "Porto União" - }, - "421370": { - "latitude": -27.28616553, - "longitude": -49.97727204, - "name": "Pouso Redondo" - }, - "421380": { - "latitude": -29.18186769, - "longitude": -49.9895021, - "name": "Praia Grande" - }, - "421390": { - "latitude": -27.23333457, - "longitude": -51.78093559, - "name": "Presidente Castello Branco" - }, - "421400": { - "latitude": -27.0625838, - "longitude": -49.71442977, - "name": "Presidente Getúlio" - }, - "421410": { - "latitude": -27.26825291, - "longitude": -49.35495247, - "name": "Presidente Nereu" - }, - "421415": { - "latitude": -26.43294507, - "longitude": -53.6117757, - "name": "Princesa" - }, - "421420": { - "latitude": -26.72923645, - "longitude": -52.71798208, - "name": "Quilombo" - }, - "421430": { - "latitude": -27.6739315, - "longitude": -49.0898805, - "name": "Rancho Queimado" - }, - "421440": { - "latitude": -26.90907634, - "longitude": -51.06340944, - "name": "Rio das Antas" - }, - "421450": { - "latitude": -26.89230672, - "longitude": -50.13139402, - "name": "Rio do Campo" - }, - "421460": { - "latitude": -27.15897684, - "longitude": -49.84167277, - "name": "Rio do Oeste" - }, - "421470": { - "latitude": -26.61792662, - "longitude": -49.36838484, - "name": "Rio dos Cedros" - }, - "421480": { - "latitude": -27.19605087, - "longitude": -49.62995257, - "name": "Rio do Sul" - }, - "421490": { - "latitude": -28.09342424, - "longitude": -49.19056686, - "name": "Rio Fortuna" - }, - "421500": { - "latitude": -26.44271403, - "longitude": -49.5961558, - "name": "Rio Negrinho" - }, - "421505": { - "latitude": -27.91423503, - "longitude": -49.75337595, - "name": "Rio Rufino" - }, - "421507": { - "latitude": -26.97845506, - "longitude": -53.34435193, - "name": "Riqueza" - }, - "421510": { - "latitude": -26.89509708, - "longitude": -49.35103649, - "name": "Rodeio" - }, - "421520": { - "latitude": -26.64838953, - "longitude": -53.31712398, - "name": "Romelândia" - }, - "421530": { - "latitude": -26.96962326, - "longitude": -50.01068506, - "name": "Salete" - }, - "421535": { - "latitude": -26.59052164, - "longitude": -53.02227853, - "name": "Saltinho" - }, - "421540": { - "latitude": -26.89593498, - "longitude": -51.42801836, - "name": "Salto Veloso" - }, - "421545": { - "latitude": -28.65131475, - "longitude": -49.12583417, - "name": "Sangão" - }, - "421550": { - "latitude": -26.926038, - "longitude": -50.44624009, - "name": "Santa Cecília" - }, - "421555": { - "latitude": -26.92195559, - "longitude": -53.61965218, - "name": "Santa Helena" - }, - "421560": { - "latitude": -28.01190657, - "longitude": -49.18186523, - "name": "Santa Rosa de Lima" - }, - "421565": { - "latitude": -29.12148252, - "longitude": -49.74375064, - "name": "Santa Rosa do Sul" - }, - "421567": { - "latitude": -26.66760288, - "longitude": -50.00529594, - "name": "Santa Terezinha" - }, - "421568": { - "latitude": -26.59274865, - "longitude": -53.16992505, - "name": "Santa Terezinha do Progresso" - }, - "421569": { - "latitude": -26.63087442, - "longitude": -52.69731236, - "name": "Santiago do Sul" - }, - "421570": { - "latitude": -27.74176612, - "longitude": -48.79655036, - "name": "Santo Amaro da Imperatriz" - }, - "421575": { - "latitude": -26.48769547, - "longitude": -52.9876113, - "name": "São Bernardino" - }, - "421580": { - "latitude": -26.29490159, - "longitude": -49.34998168, - "name": "São Bento do Sul" - }, - "421590": { - "latitude": -27.95655407, - "longitude": -48.93909777, - "name": "São Bonifácio" - }, - "421600": { - "latitude": -27.03010923, - "longitude": -53.03141184, - "name": "São Carlos" - }, - "421605": { - "latitude": -27.29520554, - "longitude": -50.34949651, - "name": "São Cristóvão do Sul" - }, - "421610": { - "latitude": -26.53938728, - "longitude": -52.55460249, - "name": "São Domingos" - }, - "421620": { - "latitude": -26.26161403, - "longitude": -48.64048202, - "name": "São Francisco do Sul" - }, - "421625": { - "latitude": -27.09160713, - "longitude": -53.59166415, - "name": "São João do Oeste" - }, - "421630": { - "latitude": -27.32892834, - "longitude": -48.85901593, - "name": "São João Batista" - }, - "421635": { - "latitude": -26.59105248, - "longitude": -48.79773346, - "name": "São João do Itaperiú" - }, - "421640": { - "latitude": -29.20556695, - "longitude": -49.81346774, - "name": "São João do Sul" - }, - "421650": { - "latitude": -28.29834917, - "longitude": -50.01398598, - "name": "São Joaquim" - }, - "421660": { - "latitude": -27.5784711, - "longitude": -48.65625577, - "name": "São José" - }, - "421670": { - "latitude": -26.48085134, - "longitude": -53.53373642, - "name": "São José do Cedro" - }, - "421680": { - "latitude": -27.59827165, - "longitude": -50.6502629, - "name": "São José do Cerrito" - }, - "421690": { - "latitude": -26.46548822, - "longitude": -52.85977286, - "name": "São Lourenço do Oeste" - }, - "421700": { - "latitude": -28.35313461, - "longitude": -49.16816231, - "name": "São Ludgero" - }, - "421710": { - "latitude": -28.12455671, - "longitude": -48.97190448, - "name": "São Martinho" - }, - "421715": { - "latitude": -26.68964349, - "longitude": -53.2399617, - "name": "São Miguel da Boa Vista" - }, - "421720": { - "latitude": -26.72723694, - "longitude": -53.51212123, - "name": "São Miguel do Oeste" - }, - "421725": { - "latitude": -27.59156738, - "longitude": -48.83713075, - "name": "São Pedro de Alcântara" - }, - "421730": { - "latitude": -26.89720679, - "longitude": -53.04001443, - "name": "Saudades" - }, - "421740": { - "latitude": -26.36795231, - "longitude": -49.06045572, - "name": "Schroeder" - }, - "421750": { - "latitude": -27.14783261, - "longitude": -52.34069428, - "name": "Seara" - }, - "421755": { - "latitude": -26.69262092, - "longitude": -53.02523844, - "name": "Serra Alta" - }, - "421760": { - "latitude": -28.5832716, - "longitude": -49.5266957, - "name": "Siderópolis" - }, - "421770": { - "latitude": -29.07019068, - "longitude": -49.65592709, - "name": "Sombrio" - }, - "421775": { - "latitude": -26.69534181, - "longitude": -52.94680043, - "name": "Sul Brasil" - }, - "421780": { - "latitude": -27.07845581, - "longitude": -50.09243482, - "name": "Taió" - }, - "421790": { - "latitude": -27.14702847, - "longitude": -51.14706908, - "name": "Tangará" - }, - "421795": { - "latitude": -26.67606662, - "longitude": -53.15654615, - "name": "Tigrinhos" - }, - "421800": { - "latitude": -27.2475633, - "longitude": -48.70088637, - "name": "Tijucas" - }, - "421810": { - "latitude": -28.80739345, - "longitude": -49.86846229, - "name": "Timbé do Sul" - }, - "421820": { - "latitude": -26.80819198, - "longitude": -49.26884809, - "name": "Timbó" - }, - "421825": { - "latitude": -26.6242535, - "longitude": -50.66563355, - "name": "Timbó Grande" - }, - "421830": { - "latitude": -26.16992128, - "longitude": -50.25523016, - "name": "Três Barras" - }, - "421835": { - "latitude": -28.499162, - "longitude": -49.4898412, - "name": "Treviso" - }, - "421840": { - "latitude": -28.56622421, - "longitude": -49.15419058, - "name": "Treze de Maio" - }, - "421850": { - "latitude": -26.96479125, - "longitude": -51.44935441, - "name": "Treze Tílias" - }, - "421860": { - "latitude": -27.3120973, - "longitude": -49.81141613, - "name": "Trombudo Central" - }, - "421870": { - "latitude": -28.48158146, - "longitude": -49.03724862, - "name": "Tubarão" - }, - "421875": { - "latitude": -26.98811658, - "longitude": -53.64994895, - "name": "Tunápolis" - }, - "421880": { - "latitude": -28.90308218, - "longitude": -49.70342184, - "name": "Turvo" - }, - "421885": { - "latitude": -26.78666633, - "longitude": -52.85600991, - "name": "União do Oeste" - }, - "421890": { - "latitude": -28.03887622, - "longitude": -49.57745827, - "name": "Urubici" - }, - "421895": { - "latitude": -28.02365407, - "longitude": -49.90088889, - "name": "Urupema" - }, - "421900": { - "latitude": -28.49269944, - "longitude": -49.32827746, - "name": "Urussanga" - }, - "421910": { - "latitude": -26.77869255, - "longitude": -52.12417604, - "name": "Vargeão" - }, - "421915": { - "latitude": -27.46687705, - "longitude": -50.95046386, - "name": "Vargem" - }, - "421917": { - "latitude": -26.94499634, - "longitude": -51.75663115, - "name": "Vargem Bonita" - }, - "421920": { - "latitude": -27.38788245, - "longitude": -49.34775258, - "name": "Vidal Ramos" - }, - "421930": { - "latitude": -27.00659043, - "longitude": -51.12679146, - "name": "Videira" - }, - "421935": { - "latitude": -26.82643354, - "longitude": -49.84520207, - "name": "Vitor Meireles" - }, - "421940": { - "latitude": -26.93734511, - "longitude": -49.841761, - "name": "Witmarsum" - }, - "421950": { - "latitude": -26.87227936, - "longitude": -52.40975398, - "name": "Xanxerê" - }, - "421960": { - "latitude": -27.02121447, - "longitude": -52.32188985, - "name": "Xavantina" - }, - "421970": { - "latitude": -26.9703088, - "longitude": -52.52910542, - "name": "Xaxim" - }, - "421985": { - "latitude": -27.47698781, - "longitude": -51.53561486, - "name": "Zortéa" - }, - "422000": { - "latitude": -28.82673995, - "longitude": -49.25423722, - "name": "Balneário Rincão" - }, - "430003": { - "latitude": -31.69064827, - "longitude": -54.13918106, - "name": "Aceguá" - }, - "430005": { - "latitude": -28.21385637, - "longitude": -52.0517412, - "name": "Água Santa" - }, - "430010": { - "latitude": -29.6080872, - "longitude": -53.22658129, - "name": "Agudo" - }, - "430020": { - "latitude": -28.20993129, - "longitude": -53.73719909, - "name": "Ajuricaba" - }, - "430030": { - "latitude": -27.65175101, - "longitude": -54.78321685, - "name": "Alecrim" - }, - "430040": { - "latitude": -29.76395505, - "longitude": -55.83571567, - "name": "Alegrete" - }, - "430045": { - "latitude": -27.81354341, - "longitude": -54.05620824, - "name": "Alegria" - }, - "430047": { - "latitude": -28.12995658, - "longitude": -52.90764178, - "name": "Almirante Tamandaré do Sul" - }, - "430050": { - "latitude": -27.21726097, - "longitude": -53.06352303, - "name": "Alpestre" - }, - "430055": { - "latitude": -28.80431982, - "longitude": -52.98892481, - "name": "Alto Alegre" - }, - "430057": { - "latitude": -29.36290547, - "longitude": -51.30492367, - "name": "Alto Feliz" - }, - "430060": { - "latitude": -29.99498429, - "longitude": -51.03742385, - "name": "Alvorada" - }, - "430063": { - "latitude": -30.81021736, - "longitude": -52.31738407, - "name": "Amaral Ferrador" - }, - "430064": { - "latitude": -27.36559241, - "longitude": -53.19261869, - "name": "Ametista do Sul" - }, - "430066": { - "latitude": -28.59427366, - "longitude": -51.50418911, - "name": "André da Rocha" - }, - "430070": { - "latitude": -28.9701668, - "longitude": -51.99467062, - "name": "Anta Gorda" - }, - "430080": { - "latitude": -28.88239688, - "longitude": -51.3165981, - "name": "Antônio Prado" - }, - "430085": { - "latitude": -30.9186252, - "longitude": -51.57861112, - "name": "Arambaré" - }, - "430087": { - "latitude": -29.63499166, - "longitude": -50.93458054, - "name": "Araricá" - }, - "430090": { - "latitude": -27.38748903, - "longitude": -52.30237694, - "name": "Aratiba" - }, - "430100": { - "latitude": -29.36212058, - "longitude": -51.96502035, - "name": "Arroio do Meio" - }, - "430105": { - "latitude": -29.52042217, - "longitude": -49.89311177, - "name": "Arroio do Sal" - }, - "430107": { - "latitude": -31.44037497, - "longitude": -52.39750554, - "name": "Arroio do Padre" - }, - "430110": { - "latitude": -30.19291552, - "longitude": -51.75196056, - "name": "Arroio dos Ratos" - }, - "430120": { - "latitude": -29.25886505, - "longitude": -53.05226393, - "name": "Arroio do Tigre" - }, - "430130": { - "latitude": -32.18841632, - "longitude": -52.91985697, - "name": "Arroio Grande" - }, - "430140": { - "latitude": -28.86414005, - "longitude": -52.18704734, - "name": "Arvorezinha" - }, - "430150": { - "latitude": -28.53386843, - "longitude": -54.00728792, - "name": "Augusto Pestana" - }, - "430155": { - "latitude": -27.70849929, - "longitude": -52.07645401, - "name": "Áurea" - }, - "430160": { - "latitude": -31.23648504, - "longitude": -54.0165792, - "name": "Bagé" - }, - "430163": { - "latitude": -30.21122871, - "longitude": -50.29376397, - "name": "Balneário Pinhal" - }, - "430165": { - "latitude": -29.38514066, - "longitude": -51.48896395, - "name": "Barão" - }, - "430170": { - "latitude": -27.56768236, - "longitude": -52.4172102, - "name": "Barão de Cotegipe" - }, - "430175": { - "latitude": -30.41737107, - "longitude": -51.79849353, - "name": "Barão do Triunfo" - }, - "430180": { - "latitude": -27.72312757, - "longitude": -51.43863111, - "name": "Barracão" - }, - "430185": { - "latitude": -27.20530497, - "longitude": -53.76366018, - "name": "Barra do Guarita" - }, - "430187": { - "latitude": -30.15136964, - "longitude": -57.33529965, - "name": "Barra do Quaraí" - }, - "430190": { - "latitude": -30.37387525, - "longitude": -51.35764191, - "name": "Barra do Ribeiro" - }, - "430192": { - "latitude": -27.40304552, - "longitude": -52.40671139, - "name": "Barra do Rio Azul" - }, - "430195": { - "latitude": -27.92169475, - "longitude": -53.01670365, - "name": "Barra Funda" - }, - "430200": { - "latitude": -29.11335382, - "longitude": -52.58866294, - "name": "Barros Cassal" - }, - "430205": { - "latitude": -27.48479858, - "longitude": -52.6426212, - "name": "Benjamin Constant do Sul" - }, - "430210": { - "latitude": -29.12569124, - "longitude": -51.55168764, - "name": "Bento Gonçalves" - }, - "430215": { - "latitude": -27.7016007, - "longitude": -53.34152025, - "name": "Boa Vista das Missões" - }, - "430220": { - "latitude": -27.67480332, - "longitude": -54.09976615, - "name": "Boa Vista do Buricá" - }, - "430222": { - "latitude": -28.65608608, - "longitude": -53.83759965, - "name": "Boa Vista do Cadeado" - }, - "430223": { - "latitude": -28.86524006, - "longitude": -53.46150179, - "name": "Boa Vista do Incra" - }, - "430225": { - "latitude": -29.35127879, - "longitude": -51.67252461, - "name": "Boa Vista do Sul" - }, - "430230": { - "latitude": -28.59816159, - "longitude": -50.42326882, - "name": "Bom Jesus" - }, - "430235": { - "latitude": -29.47036804, - "longitude": -51.36347302, - "name": "Bom Princípio" - }, - "430237": { - "latitude": -27.54526366, - "longitude": -53.84892697, - "name": "Bom Progresso" - }, - "430240": { - "latitude": -29.63773373, - "longitude": -51.92256634, - "name": "Bom Retiro do Sul" - }, - "430245": { - "latitude": -29.30573106, - "longitude": -52.4139257, - "name": "Boqueirão do Leão" - }, - "430250": { - "latitude": -28.66174761, - "longitude": -54.97138885, - "name": "Bossoroca" - }, - "430258": { - "latitude": -28.35431858, - "longitude": -53.751779, - "name": "Bozano" - }, - "430260": { - "latitude": -27.58119806, - "longitude": -53.74215496, - "name": "Braga" - }, - "430265": { - "latitude": -29.53703095, - "longitude": -51.62229085, - "name": "Brochier" - }, - "430270": { - "latitude": -30.18359316, - "longitude": -52.00483377, - "name": "Butiá" - }, - "430280": { - "latitude": -30.59342292, - "longitude": -53.47794012, - "name": "Caçapava do Sul" - }, - "430290": { - "latitude": -29.9204278, - "longitude": -54.8028096, - "name": "Cacequi" - }, - "430300": { - "latitude": -30.20620516, - "longitude": -52.98645214, - "name": "Cachoeira do Sul" - }, - "430310": { - "latitude": -29.92092641, - "longitude": -51.09531931, - "name": "Cachoeirinha" - }, - "430320": { - "latitude": -27.81412259, - "longitude": -51.67693088, - "name": "Cacique Doble" - }, - "430330": { - "latitude": -28.33533469, - "longitude": -54.65526208, - "name": "Caibaté" - }, - "430340": { - "latitude": -27.24655208, - "longitude": -53.46655466, - "name": "Caiçara" - }, - "430350": { - "latitude": -30.9227262, - "longitude": -51.78850757, - "name": "Camaquã" - }, - "430355": { - "latitude": -28.61639643, - "longitude": -52.22125721, - "name": "Camargo" - }, - "430360": { - "latitude": -29.05816759, - "longitude": -50.13527135, - "name": "Cambará do Sul" - }, - "430367": { - "latitude": -28.72619662, - "longitude": -51.09865459, - "name": "Campestre da Serra" - }, - "430370": { - "latitude": -27.96299736, - "longitude": -54.8341046, - "name": "Campina das Missões" - }, - "430380": { - "latitude": -27.7362595, - "longitude": -52.6574592, - "name": "Campinas do Sul" - }, - "430390": { - "latitude": -29.6726894, - "longitude": -51.04853527, - "name": "Campo Bom" - }, - "430400": { - "latitude": -27.66832835, - "longitude": -53.82460504, - "name": "Campo Novo" - }, - "430410": { - "latitude": -28.90561408, - "longitude": -53.05772631, - "name": "Campos Borges" - }, - "430420": { - "latitude": -29.70049889, - "longitude": -52.81316895, - "name": "Candelária" - }, - "430430": { - "latitude": -27.93371384, - "longitude": -54.7194778, - "name": "Cândido Godói" - }, - "430435": { - "latitude": -31.55443476, - "longitude": -53.74571959, - "name": "Candiota" - }, - "430440": { - "latitude": -29.35136833, - "longitude": -50.7751504, - "name": "Canela" - }, - "430450": { - "latitude": -31.21740473, - "longitude": -52.66951762, - "name": "Canguçu" - }, - "430460": { - "latitude": -29.91222062, - "longitude": -51.17964922, - "name": "Canoas" - }, - "430461": { - "latitude": -29.32700684, - "longitude": -52.23415343, - "name": "Canudos do Vale" - }, - "430462": { - "latitude": -28.15238744, - "longitude": -51.38916559, - "name": "Capão Bonito do Sul" - }, - "430463": { - "latitude": -29.67972592, - "longitude": -49.99977158, - "name": "Capão da Canoa" - }, - "430465": { - "latitude": -28.95929263, - "longitude": -54.58239888, - "name": "Capão do Cipó" - }, - "430466": { - "latitude": -31.83337098, - "longitude": -52.53817794, - "name": "Capão do Leão" - }, - "430467": { - "latitude": -30.13484399, - "longitude": -50.51183643, - "name": "Capivari do Sul" - }, - "430468": { - "latitude": -29.70592295, - "longitude": -51.35735656, - "name": "Capela de Santana" - }, - "430469": { - "latitude": -29.28319991, - "longitude": -51.98432139, - "name": "Capitão" - }, - "430470": { - "latitude": -28.27787102, - "longitude": -52.86360884, - "name": "Carazinho" - }, - "430471": { - "latitude": -29.7722247, - "longitude": -50.34182568, - "name": "Caraá" - }, - "430480": { - "latitude": -29.32165597, - "longitude": -51.50465495, - "name": "Carlos Barbosa" - }, - "430485": { - "latitude": -27.70432049, - "longitude": -51.92976026, - "name": "Carlos Gomes" - }, - "430490": { - "latitude": -28.59438626, - "longitude": -51.96720288, - "name": "Casca" - }, - "430495": { - "latitude": -28.24841555, - "longitude": -51.73695632, - "name": "Caseiros" - }, - "430500": { - "latitude": -28.16848387, - "longitude": -54.03436835, - "name": "Catuípe" - }, - "430510": { - "latitude": -29.10219479, - "longitude": -51.02367358, - "name": "Caxias do Sul" - }, - "430511": { - "latitude": -27.77543817, - "longitude": -52.00308853, - "name": "Centenário" - }, - "430512": { - "latitude": -31.72971083, - "longitude": -52.79599043, - "name": "Cerrito" - }, - "430513": { - "latitude": -29.62705896, - "longitude": -52.99547662, - "name": "Cerro Branco" - }, - "430515": { - "latitude": -27.62854966, - "longitude": -53.16308801, - "name": "Cerro Grande" - }, - "430517": { - "latitude": -30.583929, - "longitude": -51.76023558, - "name": "Cerro Grande do Sul" - }, - "430520": { - "latitude": -28.1309705, - "longitude": -54.73940804, - "name": "Cerro Largo" - }, - "430530": { - "latitude": -28.09690824, - "longitude": -53.1150815, - "name": "Chapada" - }, - "430535": { - "latitude": -29.99020188, - "longitude": -51.55620956, - "name": "Charqueadas" - }, - "430537": { - "latitude": -27.94501883, - "longitude": -52.0004427, - "name": "Charrua" - }, - "430540": { - "latitude": -27.98649325, - "longitude": -53.90984921, - "name": "Chiapetta" - }, - "430543": { - "latitude": -33.65253677, - "longitude": -53.41273508, - "name": "Chuí" - }, - "430544": { - "latitude": -30.78198289, - "longitude": -52.00476581, - "name": "Chuvisca" - }, - "430545": { - "latitude": -30.12101934, - "longitude": -50.27219149, - "name": "Cidreira" - }, - "430550": { - "latitude": -28.34620509, - "longitude": -51.91764257, - "name": "Ciríaco" - }, - "430558": { - "latitude": -29.39176372, - "longitude": -51.86557684, - "name": "Colinas" - }, - "430560": { - "latitude": -28.47244391, - "longitude": -52.9913531, - "name": "Colorado" - }, - "430570": { - "latitude": -28.16550282, - "longitude": -53.49390796, - "name": "Condor" - }, - "430580": { - "latitude": -27.68926521, - "longitude": -52.99030752, - "name": "Constantina" - }, - "430583": { - "latitude": -29.16823922, - "longitude": -52.1263171, - "name": "Coqueiro Baixo" - }, - "430585": { - "latitude": -28.13081403, - "longitude": -52.75918716, - "name": "Coqueiros do Sul" - }, - "430587": { - "latitude": -28.4038679, - "longitude": -54.06032179, - "name": "Coronel Barros" - }, - "430590": { - "latitude": -27.79770343, - "longitude": -53.64635101, - "name": "Coronel Bicaco" - }, - "430593": { - "latitude": -29.2627132, - "longitude": -51.72047602, - "name": "Coronel Pilar" - }, - "430595": { - "latitude": -28.99544313, - "longitude": -51.68924605, - "name": "Cotiporã" - }, - "430597": { - "latitude": -28.12173012, - "longitude": -52.33261444, - "name": "Coxilha" - }, - "430600": { - "latitude": -27.48745954, - "longitude": -54.13663253, - "name": "Crissiumal" - }, - "430605": { - "latitude": -31.0090033, - "longitude": -52.03038757, - "name": "Cristal" - }, - "430607": { - "latitude": -27.43242126, - "longitude": -53.24855568, - "name": "Cristal do Sul" - }, - "430610": { - "latitude": -28.70297462, - "longitude": -53.56257041, - "name": "Cruz Alta" - }, - "430613": { - "latitude": -27.62734015, - "longitude": -52.64401776, - "name": "Cruzaltense" - }, - "430620": { - "latitude": -29.54056355, - "longitude": -52.03361608, - "name": "Cruzeiro do Sul" - }, - "430630": { - "latitude": -28.41640787, - "longitude": -51.81230032, - "name": "David Canabarro" - }, - "430632": { - "latitude": -27.24026987, - "longitude": -53.89343958, - "name": "Derrubadas" - }, - "430635": { - "latitude": -28.20469082, - "longitude": -55.07962871, - "name": "Dezesseis de Novembro" - }, - "430637": { - "latitude": -29.81344541, - "longitude": -54.16323321, - "name": "Dilermando de Aguiar" - }, - "430640": { - "latitude": -29.59948262, - "longitude": -51.09026382, - "name": "Dois Irmãos" - }, - "430642": { - "latitude": -27.67619179, - "longitude": -53.49596118, - "name": "Dois Irmãos das Missões" - }, - "430645": { - "latitude": -28.97663053, - "longitude": -51.8431752, - "name": "Dois Lajeados" - }, - "430650": { - "latitude": -30.60437983, - "longitude": -52.20147614, - "name": "Dom Feliciano" - }, - "430655": { - "latitude": -29.36758013, - "longitude": -49.85539094, - "name": "Dom Pedro de Alcântara" - }, - "430660": { - "latitude": -31.05708829, - "longitude": -54.665105, - "name": "Dom Pedrito" - }, - "430670": { - "latitude": -29.5605377, - "longitude": -53.34640212, - "name": "Dona Francisca" - }, - "430673": { - "latitude": -27.48685466, - "longitude": -54.36752691, - "name": "Doutor Maurício Cardoso" - }, - "430675": { - "latitude": -29.09191507, - "longitude": -51.97670568, - "name": "Doutor Ricardo" - }, - "430676": { - "latitude": -30.07812409, - "longitude": -51.49917129, - "name": "Eldorado do Sul" - }, - "430680": { - "latitude": -29.21295739, - "longitude": -51.92182725, - "name": "Encantado" - }, - "430690": { - "latitude": -30.63003864, - "longitude": -52.67222883, - "name": "Encruzilhada do Sul" - }, - "430692": { - "latitude": -27.68477255, - "longitude": -52.90872845, - "name": "Engenho Velho" - }, - "430693": { - "latitude": -28.45954936, - "longitude": -54.30187233, - "name": "Entre-Ijuís" - }, - "430695": { - "latitude": -27.51902906, - "longitude": -52.72688591, - "name": "Entre Rios do Sul" - }, - "430697": { - "latitude": -27.82922578, - "longitude": -52.31848011, - "name": "Erebango" - }, - "430700": { - "latitude": -27.64324485, - "longitude": -52.25745165, - "name": "Erechim" - }, - "430705": { - "latitude": -28.42067128, - "longitude": -52.55439269, - "name": "Ernestina" - }, - "430710": { - "latitude": -32.0209055, - "longitude": -53.40148186, - "name": "Herval" - }, - "430720": { - "latitude": -27.35139053, - "longitude": -52.5808519, - "name": "Erval Grande" - }, - "430730": { - "latitude": -27.51406324, - "longitude": -53.51872187, - "name": "Erval Seco" - }, - "430740": { - "latitude": -28.03761847, - "longitude": -51.1700437, - "name": "Esmeralda" - }, - "430745": { - "latitude": -27.32822205, - "longitude": -54.00913811, - "name": "Esperança do Sul" - }, - "430750": { - "latitude": -28.86412004, - "longitude": -52.82715994, - "name": "Espumoso" - }, - "430755": { - "latitude": -27.92854417, - "longitude": -52.29024547, - "name": "Estação" - }, - "430760": { - "latitude": -29.64760437, - "longitude": -51.18821133, - "name": "Estância Velha" - }, - "430770": { - "latitude": -29.85174727, - "longitude": -51.17679724, - "name": "Esteio" - }, - "430780": { - "latitude": -29.50882178, - "longitude": -51.91987985, - "name": "Estrela" - }, - "430781": { - "latitude": -29.22402572, - "longitude": -53.17828056, - "name": "Estrela Velha" - }, - "430783": { - "latitude": -28.56555795, - "longitude": -54.24502358, - "name": "Eugênio de Castro" - }, - "430786": { - "latitude": -28.88657901, - "longitude": -51.71748732, - "name": "Fagundes Varela" - }, - "430790": { - "latitude": -29.2100581, - "longitude": -51.36591641, - "name": "Farroupilha" - }, - "430800": { - "latitude": -29.55793375, - "longitude": -53.46288346, - "name": "Faxinal do Soturno" - }, - "430805": { - "latitude": -27.37529515, - "longitude": -52.67618916, - "name": "Faxinalzinho" - }, - "430807": { - "latitude": -29.58912527, - "longitude": -51.8385382, - "name": "Fazenda Vilanova" - }, - "430810": { - "latitude": -29.45517608, - "longitude": -51.28487558, - "name": "Feliz" - }, - "430820": { - "latitude": -29.03153141, - "longitude": -51.22113569, - "name": "Flores da Cunha" - }, - "430825": { - "latitude": -27.85782383, - "longitude": -52.04533936, - "name": "Floriano Peixoto" - }, - "430830": { - "latitude": -29.00855305, - "longitude": -52.37791016, - "name": "Fontoura Xavier" - }, - "430840": { - "latitude": -29.97546141, - "longitude": -53.50620681, - "name": "Formigueiro" - }, - "430843": { - "latitude": -29.38851308, - "longitude": -52.12577764, - "name": "Forquetinha" - }, - "430845": { - "latitude": -28.89512383, - "longitude": -53.27588398, - "name": "Fortaleza dos Valos" - }, - "430850": { - "latitude": -27.34051591, - "longitude": -53.3598525, - "name": "Frederico Westphalen" - }, - "430860": { - "latitude": -29.2412968, - "longitude": -51.58192822, - "name": "Garibaldi" - }, - "430865": { - "latitude": -28.23386172, - "longitude": -55.53868934, - "name": "Garruchos" - }, - "430870": { - "latitude": -27.5986958, - "longitude": -52.11551586, - "name": "Gaurama" - }, - "430880": { - "latitude": -29.86536707, - "longitude": -51.91629448, - "name": "General Câmara" - }, - "430885": { - "latitude": -28.38620259, - "longitude": -52.03957883, - "name": "Gentil" - }, - "430890": { - "latitude": -27.85210805, - "longitude": -52.18054157, - "name": "Getúlio Vargas" - }, - "430900": { - "latitude": -28.03000273, - "longitude": -54.29910961, - "name": "Giruá" - }, - "430905": { - "latitude": -29.88645989, - "longitude": -50.77068134, - "name": "Glorinha" - }, - "430910": { - "latitude": -29.38604697, - "longitude": -50.89686596, - "name": "Gramado" - }, - "430912": { - "latitude": -27.44568735, - "longitude": -52.9149157, - "name": "Gramado dos Loureiros" - }, - "430915": { - "latitude": -29.28898997, - "longitude": -52.60068277, - "name": "Gramado Xavier" - }, - "430920": { - "latitude": -29.8894729, - "longitude": -50.94704648, - "name": "Gravataí" - }, - "430925": { - "latitude": -28.57760746, - "longitude": -51.65978959, - "name": "Guabiju" - }, - "430930": { - "latitude": -30.17731636, - "longitude": -51.43419465, - "name": "Guaíba" - }, - "430940": { - "latitude": -28.8550002, - "longitude": -51.90437963, - "name": "Guaporé" - }, - "430950": { - "latitude": -28.16795463, - "longitude": -54.58645239, - "name": "Guarani das Missões" - }, - "430955": { - "latitude": -29.5456716, - "longitude": -51.42629702, - "name": "Harmonia" - }, - "430957": { - "latitude": -29.44150987, - "longitude": -52.66934783, - "name": "Herveiras" - }, - "430960": { - "latitude": -27.59028087, - "longitude": -54.29870309, - "name": "Horizontina" - }, - "430965": { - "latitude": -31.44773339, - "longitude": -53.88947682, - "name": "Hulha Negra" - }, - "430970": { - "latitude": -27.57420984, - "longitude": -53.97989546, - "name": "Humaitá" - }, - "430975": { - "latitude": -29.4182603, - "longitude": -53.16614471, - "name": "Ibarama" - }, - "430980": { - "latitude": -28.10210986, - "longitude": -51.78752373, - "name": "Ibiaçá" - }, - "430990": { - "latitude": -28.37952522, - "longitude": -51.62722207, - "name": "Ibiraiaras" - }, - "430995": { - "latitude": -28.62517155, - "longitude": -52.44276578, - "name": "Ibirapuitã" - }, - "431000": { - "latitude": -28.5949618, - "longitude": -53.17233488, - "name": "Ibirubá" - }, - "431010": { - "latitude": -29.56047439, - "longitude": -50.79484334, - "name": "Igrejinha" - }, - "431020": { - "latitude": -28.32044902, - "longitude": -53.8948826, - "name": "Ijuí" - }, - "431030": { - "latitude": -28.93119727, - "longitude": -52.13036599, - "name": "Ilópolis" - }, - "431033": { - "latitude": -29.9306267, - "longitude": -50.11771482, - "name": "Imbé" - }, - "431036": { - "latitude": -29.34479365, - "longitude": -51.77423425, - "name": "Imigrante" - }, - "431040": { - "latitude": -27.90119387, - "longitude": -54.18044488, - "name": "Independência" - }, - "431041": { - "latitude": -27.90250803, - "longitude": -54.03055053, - "name": "Inhacorá" - }, - "431043": { - "latitude": -28.71750457, - "longitude": -51.29912251, - "name": "Ipê" - }, - "431046": { - "latitude": -27.93115079, - "longitude": -52.41856191, - "name": "Ipiranga do Sul" - }, - "431050": { - "latitude": -27.24933677, - "longitude": -53.24155719, - "name": "Iraí" - }, - "431053": { - "latitude": -29.57694781, - "longitude": -53.7620389, - "name": "Itaara" - }, - "431055": { - "latitude": -28.80999797, - "longitude": -55.26732543, - "name": "Itacurubi" - }, - "431057": { - "latitude": -28.77573908, - "longitude": -52.19556733, - "name": "Itapuca" - }, - "431060": { - "latitude": -29.21373364, - "longitude": -56.17566029, - "name": "Itaqui" - }, - "431065": { - "latitude": -29.46234425, - "longitude": -50.16425965, - "name": "Itati" - }, - "431070": { - "latitude": -27.35618173, - "longitude": -52.47745858, - "name": "Itatiba do Sul" - }, - "431075": { - "latitude": -29.51357081, - "longitude": -53.58363306, - "name": "Ivorá" - }, - "431080": { - "latitude": -29.58064879, - "longitude": -51.15704321, - "name": "Ivoti" - }, - "431085": { - "latitude": -27.629546, - "longitude": -53.26411178, - "name": "Jaboticaba" - }, - "431087": { - "latitude": -29.03509862, - "longitude": -53.01432835, - "name": "Jacuizinho" - }, - "431090": { - "latitude": -27.78665953, - "longitude": -52.54716946, - "name": "Jacutinga" - }, - "431100": { - "latitude": -32.40995775, - "longitude": -53.33593864, - "name": "Jaguarão" - }, - "431110": { - "latitude": -29.45846459, - "longitude": -54.64782861, - "name": "Jaguari" - }, - "431112": { - "latitude": -28.94817659, - "longitude": -50.36115873, - "name": "Jaquirana" - }, - "431113": { - "latitude": -29.29148309, - "longitude": -54.29804653, - "name": "Jari" - }, - "431115": { - "latitude": -28.76654378, - "longitude": -54.15479602, - "name": "Jóia" - }, - "431120": { - "latitude": -29.25843528, - "longitude": -53.65244377, - "name": "Júlio de Castilhos" - }, - "431123": { - "latitude": -29.5026596, - "longitude": -53.0418393, - "name": "Lagoa Bonita do Sul" - }, - "431125": { - "latitude": -29.23810092, - "longitude": -52.78747524, - "name": "Lagoão" - }, - "431127": { - "latitude": -28.57094504, - "longitude": -52.83413203, - "name": "Lagoa dos Três Cantos" - }, - "431130": { - "latitude": -28.22642114, - "longitude": -51.50169868, - "name": "Lagoa Vermelha" - }, - "431140": { - "latitude": -29.44352178, - "longitude": -52.00726674, - "name": "Lajeado" - }, - "431142": { - "latitude": -27.7032734, - "longitude": -53.20602909, - "name": "Lajeado do Bugre" - }, - "431150": { - "latitude": -30.77208055, - "longitude": -54.15360584, - "name": "Lavras do Sul" - }, - "431160": { - "latitude": -27.54952459, - "longitude": -53.06387451, - "name": "Liberato Salzano" - }, - "431162": { - "latitude": -29.58260282, - "longitude": -51.21962606, - "name": "Lindolfo Collor" - }, - "431164": { - "latitude": -29.45967923, - "longitude": -51.21548401, - "name": "Linha Nova" - }, - "431170": { - "latitude": -27.58700317, - "longitude": -51.67394654, - "name": "Machadinho" - }, - "431171": { - "latitude": -29.06619021, - "longitude": -55.77496168, - "name": "Maçambará" - }, - "431173": { - "latitude": -29.26236817, - "longitude": -50.00306529, - "name": "Mampituba" - }, - "431175": { - "latitude": -29.42837971, - "longitude": -55.55690605, - "name": "Manoel Viana" - }, - "431177": { - "latitude": -29.63574987, - "longitude": -50.20826019, - "name": "Maquiné" - }, - "431179": { - "latitude": -29.54817256, - "longitude": -51.55028294, - "name": "Maratá" - }, - "431180": { - "latitude": -28.45520515, - "longitude": -52.26868156, - "name": "Marau" - }, - "431190": { - "latitude": -27.4785148, - "longitude": -51.95064671, - "name": "Marcelino Ramos" - }, - "431198": { - "latitude": -30.31397598, - "longitude": -51.5842985, - "name": "Mariana Pimentel" - }, - "431200": { - "latitude": -27.34249217, - "longitude": -52.16837647, - "name": "Mariano Moro" - }, - "431205": { - "latitude": -29.28931667, - "longitude": -52.14878739, - "name": "Marques de Souza" - }, - "431210": { - "latitude": -29.53753741, - "longitude": -54.46789448, - "name": "Mata" - }, - "431213": { - "latitude": -28.27764632, - "longitude": -52.19888191, - "name": "Mato Castelhano" - }, - "431215": { - "latitude": -29.52481706, - "longitude": -52.13617322, - "name": "Mato Leitão" - }, - "431217": { - "latitude": -28.2430187, - "longitude": -54.65656653, - "name": "Mato Queimado" - }, - "431220": { - "latitude": -27.60388058, - "longitude": -51.815452, - "name": "Maximiliano de Almeida" - }, - "431225": { - "latitude": -30.07472356, - "longitude": -52.07791462, - "name": "Minas do Leão" - }, - "431230": { - "latitude": -27.490423, - "longitude": -53.74557396, - "name": "Miraguaí" - }, - "431235": { - "latitude": -28.66982696, - "longitude": -52.05018857, - "name": "Montauri" - }, - "431237": { - "latitude": -28.70023001, - "longitude": -50.80508579, - "name": "Monte Alegre dos Campos" - }, - "431238": { - "latitude": -29.14036636, - "longitude": -51.65167487, - "name": "Monte Belo do Sul" - }, - "431240": { - "latitude": -29.71012955, - "longitude": -51.50299003, - "name": "Montenegro" - }, - "431242": { - "latitude": -28.69375937, - "longitude": -52.66187723, - "name": "Mormaço" - }, - "431244": { - "latitude": -29.33758963, - "longitude": -49.95419943, - "name": "Morrinhos do Sul" - }, - "431245": { - "latitude": -31.63714885, - "longitude": -52.63774798, - "name": "Morro Redondo" - }, - "431247": { - "latitude": -29.52217141, - "longitude": -51.05143992, - "name": "Morro Reuter" - }, - "431250": { - "latitude": -30.85427812, - "longitude": -50.72905275, - "name": "Mostardas" - }, - "431260": { - "latitude": -29.14040344, - "longitude": -51.81558247, - "name": "Muçum" - }, - "431261": { - "latitude": -28.38503666, - "longitude": -51.22968453, - "name": "Muitos Capões" - }, - "431262": { - "latitude": -28.32696974, - "longitude": -51.7769047, - "name": "Muliterno" - }, - "431265": { - "latitude": -28.45939894, - "longitude": -52.82492141, - "name": "Não-Me-Toque" - }, - "431267": { - "latitude": -28.52078381, - "longitude": -52.44836634, - "name": "Nicolau Vergueiro" - }, - "431270": { - "latitude": -27.36950158, - "longitude": -52.85725073, - "name": "Nonoai" - }, - "431275": { - "latitude": -28.70800906, - "longitude": -52.17141703, - "name": "Nova Alvorada" - }, - "431280": { - "latitude": -28.6512335, - "longitude": -51.74633041, - "name": "Nova Araçá" - }, - "431290": { - "latitude": -28.72599964, - "longitude": -51.75413284, - "name": "Nova Bassano" - }, - "431295": { - "latitude": -27.99681901, - "longitude": -52.97951834, - "name": "Nova Boa Vista" - }, - "431300": { - "latitude": -29.22207138, - "longitude": -52.03526445, - "name": "Nova Bréscia" - }, - "431301": { - "latitude": -27.59526237, - "longitude": -54.12545486, - "name": "Nova Candelária" - }, - "431303": { - "latitude": -29.40333906, - "longitude": -54.8215406, - "name": "Nova Esperança do Sul" - }, - "431306": { - "latitude": -29.58548106, - "longitude": -50.89920851, - "name": "Nova Hartz" - }, - "431308": { - "latitude": -29.00099081, - "longitude": -51.31589252, - "name": "Nova Pádua" - }, - "431310": { - "latitude": -29.43332264, - "longitude": -53.41623939, - "name": "Nova Palma" - }, - "431320": { - "latitude": -29.37208307, - "longitude": -51.08511205, - "name": "Nova Petrópolis" - }, - "431330": { - "latitude": -28.76072554, - "longitude": -51.60822778, - "name": "Nova Prata" - }, - "431333": { - "latitude": -28.0761819, - "longitude": -53.7036744, - "name": "Nova Ramada" - }, - "431335": { - "latitude": -28.98931304, - "longitude": -51.40847872, - "name": "Nova Roma do Sul" - }, - "431337": { - "latitude": -29.8443493, - "longitude": -51.28856048, - "name": "Nova Santa Rita" - }, - "431339": { - "latitude": -29.76014498, - "longitude": -52.9954903, - "name": "Novo Cabrais" - }, - "431340": { - "latitude": -29.73475152, - "longitude": -51.0490435, - "name": "Novo Hamburgo" - }, - "431342": { - "latitude": -27.54489798, - "longitude": -54.53729719, - "name": "Novo Machado" - }, - "431344": { - "latitude": -27.56181373, - "longitude": -53.16712181, - "name": "Novo Tiradentes" - }, - "431346": { - "latitude": -27.74425721, - "longitude": -53.05848298, - "name": "Novo Xingu" - }, - "431349": { - "latitude": -27.89952975, - "longitude": -53.11598618, - "name": "Novo Barreiro" - }, - "431350": { - "latitude": -29.91596792, - "longitude": -50.26756569, - "name": "Osório" - }, - "431360": { - "latitude": -27.7220636, - "longitude": -51.78037078, - "name": "Paim Filho" - }, - "431365": { - "latitude": -30.36236964, - "longitude": -50.44921374, - "name": "Palmares do Sul" - }, - "431370": { - "latitude": -27.9400064, - "longitude": -53.38229165, - "name": "Palmeira das Missões" - }, - "431380": { - "latitude": -27.32781612, - "longitude": -53.58784637, - "name": "Palmitinho" - }, - "431390": { - "latitude": -28.32955053, - "longitude": -53.50742665, - "name": "Panambi" - }, - "431395": { - "latitude": -30.25775746, - "longitude": -52.37095951, - "name": "Pantano Grande" - }, - "431400": { - "latitude": -28.60030159, - "longitude": -51.78835014, - "name": "Paraí" - }, - "431402": { - "latitude": -29.69625253, - "longitude": -53.12130973, - "name": "Paraíso do Sul" - }, - "431403": { - "latitude": -29.61044705, - "longitude": -51.42287456, - "name": "Pareci Novo" - }, - "431405": { - "latitude": -29.65918339, - "longitude": -50.8561314, - "name": "Parobé" - }, - "431406": { - "latitude": -29.43920979, - "longitude": -52.8699015, - "name": "Passa Sete" - }, - "431407": { - "latitude": -29.75930332, - "longitude": -52.24514508, - "name": "Passo do Sobrado" - }, - "431410": { - "latitude": -28.2688897, - "longitude": -52.45249573, - "name": "Passo Fundo" - }, - "431413": { - "latitude": -27.70961794, - "longitude": -52.39469386, - "name": "Paulo Bento" - }, - "431415": { - "latitude": -29.56926614, - "longitude": -51.72835016, - "name": "Paverama" - }, - "431417": { - "latitude": -31.83897375, - "longitude": -53.69127847, - "name": "Pedras Altas" - }, - "431420": { - "latitude": -31.95973038, - "longitude": -52.87250221, - "name": "Pedro Osório" - }, - "431430": { - "latitude": -28.45383743, - "longitude": -53.59373196, - "name": "Pejuçara" - }, - "431440": { - "latitude": -31.57111656, - "longitude": -52.34521354, - "name": "Pelotas" - }, - "431442": { - "latitude": -29.46069678, - "longitude": -51.10913526, - "name": "Picada Café" - }, - "431445": { - "latitude": -27.52895628, - "longitude": -53.23505804, - "name": "Pinhal" - }, - "431446": { - "latitude": -27.85358101, - "longitude": -51.21940983, - "name": "Pinhal da Serra" - }, - "431447": { - "latitude": -29.2914596, - "longitude": -53.33563184, - "name": "Pinhal Grande" - }, - "431449": { - "latitude": -27.22168452, - "longitude": -53.6343013, - "name": "Pinheirinho do Vale" - }, - "431450": { - "latitude": -31.40510174, - "longitude": -53.41345447, - "name": "Pinheiro Machado" - }, - "431454": { - "latitude": -29.0929434, - "longitude": -51.46168231, - "name": "Pinto Bandeira" - }, - "431455": { - "latitude": -28.06522373, - "longitude": -55.2444272, - "name": "Pirapó" - }, - "431460": { - "latitude": -31.43870428, - "longitude": -53.10324819, - "name": "Piratini" - }, - "431470": { - "latitude": -27.33569056, - "longitude": -53.07795537, - "name": "Planalto" - }, - "431475": { - "latitude": -29.44611785, - "longitude": -51.64081604, - "name": "Poço das Antas" - }, - "431477": { - "latitude": -28.03628966, - "longitude": -52.64125293, - "name": "Pontão" - }, - "431478": { - "latitude": -27.65480599, - "longitude": -52.50622107, - "name": "Ponte Preta" - }, - "431480": { - "latitude": -29.70101259, - "longitude": -51.24867414, - "name": "Portão" - }, - "431490": { - "latitude": -30.09526193, - "longitude": -51.16443615, - "name": "Porto Alegre" - }, - "431500": { - "latitude": -27.85070503, - "longitude": -54.9591881, - "name": "Porto Lucena" - }, - "431505": { - "latitude": -27.59193693, - "longitude": -54.65718137, - "name": "Porto Mauá" - }, - "431507": { - "latitude": -27.75456385, - "longitude": -54.89111894, - "name": "Porto Vera Cruz" - }, - "431510": { - "latitude": -27.93201984, - "longitude": -55.14316439, - "name": "Porto Xavier" - }, - "431513": { - "latitude": -29.15798626, - "longitude": -52.22864415, - "name": "Pouso Novo" - }, - "431514": { - "latitude": -29.52427417, - "longitude": -51.17433946, - "name": "Presidente Lucena" - }, - "431515": { - "latitude": -29.22426527, - "longitude": -52.31892771, - "name": "Progresso" - }, - "431517": { - "latitude": -28.73694102, - "longitude": -51.48731113, - "name": "Protásio Alves" - }, - "431520": { - "latitude": -29.02855395, - "longitude": -52.14768114, - "name": "Putinga" - }, - "431530": { - "latitude": -30.27946752, - "longitude": -56.15303061, - "name": "Quaraí" - }, - "431531": { - "latitude": -27.84272907, - "longitude": -52.47129444, - "name": "Quatro Irmãos" - }, - "431532": { - "latitude": -29.30964036, - "longitude": -54.06549088, - "name": "Quevedos" - }, - "431535": { - "latitude": -28.7569209, - "longitude": -53.11686879, - "name": "Quinze de Novembro" - }, - "431540": { - "latitude": -27.57013825, - "longitude": -53.63168399, - "name": "Redentora" - }, - "431545": { - "latitude": -29.11846594, - "longitude": -52.06784672, - "name": "Relvado" - }, - "431550": { - "latitude": -29.81735978, - "longitude": -53.34391074, - "name": "Restinga Sêca" - }, - "431555": { - "latitude": -27.25283843, - "longitude": -52.87973823, - "name": "Rio dos Índios" - }, - "431560": { - "latitude": -32.219813, - "longitude": -52.40456507, - "name": "Rio Grande" - }, - "431570": { - "latitude": -30.02276997, - "longitude": -52.43693842, - "name": "Rio Pardo" - }, - "431575": { - "latitude": -29.61578476, - "longitude": -50.39973778, - "name": "Riozinho" - }, - "431580": { - "latitude": -29.25674926, - "longitude": -51.8293118, - "name": "Roca Sales" - }, - "431590": { - "latitude": -27.46339346, - "longitude": -53.17062191, - "name": "Rodeio Bonito" - }, - "431595": { - "latitude": -28.25489607, - "longitude": -54.83439442, - "name": "Rolador" - }, - "431600": { - "latitude": -29.62904809, - "longitude": -50.54999968, - "name": "Rolante" - }, - "431610": { - "latitude": -27.81104382, - "longitude": -52.7496098, - "name": "Ronda Alta" - }, - "431620": { - "latitude": -27.8324752, - "longitude": -52.8930773, - "name": "Rondinha" - }, - "431630": { - "latitude": -28.05958505, - "longitude": -55.08803015, - "name": "Roque Gonzales" - }, - "431640": { - "latitude": -30.32593487, - "longitude": -55.11296507, - "name": "Rosário do Sul" - }, - "431642": { - "latitude": -27.70793191, - "longitude": -53.13197963, - "name": "Sagrada Família" - }, - "431643": { - "latitude": -28.38678786, - "longitude": -53.09442441, - "name": "Saldanha Marinho" - }, - "431645": { - "latitude": -29.06824323, - "longitude": -53.25421879, - "name": "Salto do Jacuí" - }, - "431647": { - "latitude": -28.0997427, - "longitude": -54.83167328, - "name": "Salvador das Missões" - }, - "431650": { - "latitude": -29.45778046, - "longitude": -51.53536621, - "name": "Salvador do Sul" - }, - "431660": { - "latitude": -27.9572344, - "longitude": -51.80035579, - "name": "Sananduva" - }, - "431670": { - "latitude": -28.37385765, - "longitude": -53.28455397, - "name": "Santa Bárbara do Sul" - }, - "431673": { - "latitude": -28.18132184, - "longitude": -51.89848105, - "name": "Santa Cecília do Sul" - }, - "431675": { - "latitude": -29.45327793, - "longitude": -52.13229287, - "name": "Santa Clara do Sul" - }, - "431680": { - "latitude": -29.64623012, - "longitude": -52.40717533, - "name": "Santa Cruz do Sul" - }, - "431690": { - "latitude": -29.7849214, - "longitude": -53.82503688, - "name": "Santa Maria" - }, - "431695": { - "latitude": -29.4758607, - "longitude": -50.9690862, - "name": "Santa Maria do Herval" - }, - "431697": { - "latitude": -30.37105953, - "longitude": -54.09771764, - "name": "Santa Margarida do Sul" - }, - "431700": { - "latitude": -30.81703937, - "longitude": -53.17700366, - "name": "Santana da Boa Vista" - }, - "431710": { - "latitude": -30.73838459, - "longitude": -55.56229378, - "name": "Sant'Ana do Livramento" - }, - "431720": { - "latitude": -27.86441522, - "longitude": -54.49700444, - "name": "Santa Rosa" - }, - "431725": { - "latitude": -29.16389245, - "longitude": -51.71077312, - "name": "Santa Tereza" - }, - "431730": { - "latitude": -33.16428464, - "longitude": -53.00777871, - "name": "Santa Vitória do Palmar" - }, - "431740": { - "latitude": -29.12720018, - "longitude": -54.79626541, - "name": "Santiago" - }, - "431750": { - "latitude": -28.25048881, - "longitude": -54.29774807, - "name": "Santo Ângelo" - }, - "431755": { - "latitude": -28.49560401, - "longitude": -52.00863962, - "name": "Santo Antônio do Palma" - }, - "431760": { - "latitude": -29.87275223, - "longitude": -50.55919231, - "name": "Santo Antônio da Patrulha" - }, - "431770": { - "latitude": -28.4939554, - "longitude": -55.42603619, - "name": "Santo Antônio das Missões" - }, - "431775": { - "latitude": -28.36509417, - "longitude": -52.68146705, - "name": "Santo Antônio do Planalto" - }, - "431780": { - "latitude": -27.9030809, - "longitude": -53.75581507, - "name": "Santo Augusto" - }, - "431790": { - "latitude": -27.79836245, - "longitude": -54.71099987, - "name": "Santo Cristo" - }, - "431795": { - "latitude": -27.92306714, - "longitude": -51.66122453, - "name": "Santo Expedito do Sul" - }, - "431800": { - "latitude": -28.74668842, - "longitude": -55.7965758, - "name": "São Borja" - }, - "431805": { - "latitude": -28.53832645, - "longitude": -51.86782664, - "name": "São Domingos do Sul" - }, - "431810": { - "latitude": -29.44778961, - "longitude": -55.13129166, - "name": "São Francisco de Assis" - }, - "431820": { - "latitude": -29.20229502, - "longitude": -50.55647839, - "name": "São Francisco de Paula" - }, - "431830": { - "latitude": -30.30526673, - "longitude": -54.36542522, - "name": "São Gabriel" - }, - "431840": { - "latitude": -30.29060075, - "longitude": -51.91191523, - "name": "São Jerônimo" - }, - "431842": { - "latitude": -27.79765459, - "longitude": -51.83473676, - "name": "São João da Urtiga" - }, - "431843": { - "latitude": -29.64209569, - "longitude": -53.47047794, - "name": "São João do Polêsine" - }, - "431844": { - "latitude": -28.49832266, - "longitude": -51.71566738, - "name": "São Jorge" - }, - "431845": { - "latitude": -27.7948215, - "longitude": -53.13169812, - "name": "São José das Missões" - }, - "431846": { - "latitude": -29.06503122, - "longitude": -52.27455962, - "name": "São José do Herval" - }, - "431848": { - "latitude": -29.53555554, - "longitude": -51.25758492, - "name": "São José do Hortêncio" - }, - "431849": { - "latitude": -27.73837, - "longitude": -54.12412669, - "name": "São José do Inhacorá" - }, - "431850": { - "latitude": -31.76363866, - "longitude": -51.66533212, - "name": "São José do Norte" - }, - "431860": { - "latitude": -27.77238317, - "longitude": -51.56030435, - "name": "São José do Ouro" - }, - "431861": { - "latitude": -29.5483775, - "longitude": -51.48589668, - "name": "São José do Sul" - }, - "431862": { - "latitude": -28.64859646, - "longitude": -49.96169494, - "name": "São José dos Ausentes" - }, - "431870": { - "latitude": -29.75533029, - "longitude": -51.14485, - "name": "São Leopoldo" - }, - "431880": { - "latitude": -31.23448477, - "longitude": -52.12255475, - "name": "São Lourenço do Sul" - }, - "431890": { - "latitude": -28.41846559, - "longitude": -54.89092105, - "name": "São Luiz Gonzaga" - }, - "431900": { - "latitude": -28.96302021, - "longitude": -51.06509707, - "name": "São Marcos" - }, - "431910": { - "latitude": -27.72904723, - "longitude": -53.95323763, - "name": "São Martinho" - }, - "431912": { - "latitude": -29.47480812, - "longitude": -53.88627846, - "name": "São Martinho da Serra" - }, - "431915": { - "latitude": -28.67279892, - "longitude": -54.52162754, - "name": "São Miguel das Missões" - }, - "431920": { - "latitude": -28.20305242, - "longitude": -55.24817183, - "name": "São Nicolau" - }, - "431930": { - "latitude": -27.98879949, - "longitude": -54.97529124, - "name": "São Paulo das Missões" - }, - "431935": { - "latitude": -29.41921495, - "longitude": -51.50633615, - "name": "São Pedro da Serra" - }, - "431936": { - "latitude": -27.77970721, - "longitude": -53.23767537, - "name": "São Pedro das Missões" - }, - "431937": { - "latitude": -28.12348651, - "longitude": -54.894914, - "name": "São Pedro do Butiá" - }, - "431940": { - "latitude": -29.61138226, - "longitude": -54.23800323, - "name": "São Pedro do Sul" - }, - "431950": { - "latitude": -29.58942591, - "longitude": -51.33717387, - "name": "São Sebastião do Caí" - }, - "431960": { - "latitude": -30.17573703, - "longitude": -53.61982369, - "name": "São Sepé" - }, - "431970": { - "latitude": -27.55378378, - "longitude": -52.55948597, - "name": "São Valentim" - }, - "431971": { - "latitude": -29.05680091, - "longitude": -51.76098673, - "name": "São Valentim do Sul" - }, - "431973": { - "latitude": -27.82105372, - "longitude": -53.90869328, - "name": "São Valério do Sul" - }, - "431975": { - "latitude": -29.38264166, - "longitude": -51.37264592, - "name": "São Vendelino" - }, - "431980": { - "latitude": -29.70958261, - "longitude": -54.75422371, - "name": "São Vicente do Sul" - }, - "431990": { - "latitude": -29.61414729, - "longitude": -50.99572087, - "name": "Sapiranga" - }, - "432000": { - "latitude": -29.82335341, - "longitude": -51.13370912, - "name": "Sapucaia do Sul" - }, - "432010": { - "latitude": -27.94132881, - "longitude": -52.89630221, - "name": "Sarandi" - }, - "432020": { - "latitude": -27.50106135, - "longitude": -53.36263735, - "name": "Seberi" - }, - "432023": { - "latitude": -27.64112633, - "longitude": -53.95315799, - "name": "Sede Nova" - }, - "432026": { - "latitude": -29.3124866, - "longitude": -52.92942931, - "name": "Segredo" - }, - "432030": { - "latitude": -28.66861125, - "longitude": -52.97862748, - "name": "Selbach" - }, - "432032": { - "latitude": -28.02882826, - "longitude": -54.53679979, - "name": "Senador Salgado Filho" - }, - "432035": { - "latitude": -30.62529305, - "longitude": -51.6076865, - "name": "Sentinela do Sul" - }, - "432040": { - "latitude": -28.70156851, - "longitude": -51.93367611, - "name": "Serafina Corrêa" - }, - "432045": { - "latitude": -29.3950954, - "longitude": -52.24341572, - "name": "Sério" - }, - "432050": { - "latitude": -28.00985851, - "longitude": -52.31407128, - "name": "Sertão" - }, - "432055": { - "latitude": -30.46684439, - "longitude": -51.62999833, - "name": "Sertão Santana" - }, - "432057": { - "latitude": -28.14515007, - "longitude": -54.46010362, - "name": "Sete de Setembro" - }, - "432060": { - "latitude": -27.41545341, - "longitude": -52.11139194, - "name": "Severiano de Almeida" - }, - "432065": { - "latitude": -29.63339326, - "longitude": -53.5702025, - "name": "Silveira Martins" - }, - "432067": { - "latitude": -29.4449111, - "longitude": -52.56898505, - "name": "Sinimbu" - }, - "432070": { - "latitude": -29.4055365, - "longitude": -53.02626958, - "name": "Sobradinho" - }, - "432080": { - "latitude": -28.83915974, - "longitude": -52.53712253, - "name": "Soledade" - }, - "432085": { - "latitude": -29.66707298, - "longitude": -51.73095612, - "name": "Tabaí" - }, - "432090": { - "latitude": -28.05853137, - "longitude": -52.01078332, - "name": "Tapejara" - }, - "432100": { - "latitude": -28.66137661, - "longitude": -52.86156835, - "name": "Tapera" - }, - "432110": { - "latitude": -30.66381936, - "longitude": -51.44131106, - "name": "Tapes" - }, - "432120": { - "latitude": -29.67003811, - "longitude": -50.76202026, - "name": "Taquara" - }, - "432130": { - "latitude": -29.74477848, - "longitude": -51.83153205, - "name": "Taquari" - }, - "432132": { - "latitude": -27.40840873, - "longitude": -53.4858289, - "name": "Taquaruçu do Sul" - }, - "432135": { - "latitude": -31.28857715, - "longitude": -51.07475995, - "name": "Tavares" - }, - "432140": { - "latitude": -27.37259012, - "longitude": -53.76409557, - "name": "Tenente Portela" - }, - "432143": { - "latitude": -29.60191783, - "longitude": -50.06651494, - "name": "Terra de Areia" - }, - "432145": { - "latitude": -29.47185338, - "longitude": -51.77794436, - "name": "Teutônia" - }, - "432146": { - "latitude": -28.58200365, - "longitude": -52.59827789, - "name": "Tio Hugo" - }, - "432147": { - "latitude": -27.36825748, - "longitude": -54.12095025, - "name": "Tiradentes do Sul" - }, - "432149": { - "latitude": -29.47042558, - "longitude": -54.29877397, - "name": "Toropi" - }, - "432150": { - "latitude": -29.32834639, - "longitude": -49.80971625, - "name": "Torres" - }, - "432160": { - "latitude": -30.02820579, - "longitude": -50.22198599, - "name": "Tramandaí" - }, - "432162": { - "latitude": -29.28267673, - "longitude": -52.08756433, - "name": "Travesseiro" - }, - "432163": { - "latitude": -27.49257266, - "longitude": -52.18016258, - "name": "Três Arroios" - }, - "432166": { - "latitude": -29.47443481, - "longitude": -49.96318869, - "name": "Três Cachoeiras" - }, - "432170": { - "latitude": -29.48241191, - "longitude": -50.7789047, - "name": "Três Coroas" - }, - "432180": { - "latitude": -27.73158518, - "longitude": -54.26535855, - "name": "Três de Maio" - }, - "432183": { - "latitude": -29.42848071, - "longitude": -50.08538178, - "name": "Três Forquilhas" - }, - "432185": { - "latitude": -27.61713942, - "longitude": -52.83735378, - "name": "Três Palmeiras" - }, - "432190": { - "latitude": -27.44101594, - "longitude": -53.92927733, - "name": "Três Passos" - }, - "432195": { - "latitude": -27.52774022, - "longitude": -52.89902475, - "name": "Trindade do Sul" - }, - "432200": { - "latitude": -29.84472679, - "longitude": -51.57111121, - "name": "Triunfo" - }, - "432210": { - "latitude": -27.63935839, - "longitude": -54.43099261, - "name": "Tucunduva" - }, - "432215": { - "latitude": -29.11408751, - "longitude": -52.8927907, - "name": "Tunas" - }, - "432218": { - "latitude": -27.93016469, - "longitude": -51.53759954, - "name": "Tupanci do Sul" - }, - "432220": { - "latitude": -29.02051519, - "longitude": -54.00349666, - "name": "Tupanciretã" - }, - "432225": { - "latitude": -29.4740186, - "longitude": -51.42690147, - "name": "Tupandi" - }, - "432230": { - "latitude": -27.70651127, - "longitude": -54.55460814, - "name": "Tuparendi" - }, - "432232": { - "latitude": -31.47510021, - "longitude": -52.15607688, - "name": "Turuçu" - }, - "432234": { - "latitude": -28.03815349, - "longitude": -54.64654906, - "name": "Ubiretama" - }, - "432235": { - "latitude": -28.77249907, - "longitude": -52.02152922, - "name": "União da Serra" - }, - "432237": { - "latitude": -29.06850347, - "longitude": -55.15878302, - "name": "Unistalda" - }, - "432240": { - "latitude": -29.84058987, - "longitude": -56.72940221, - "name": "Uruguaiana" - }, - "432250": { - "latitude": -28.3703557, - "longitude": -50.92375178, - "name": "Vacaria" - }, - "432252": { - "latitude": -29.83078694, - "longitude": -52.11244481, - "name": "Vale Verde" - }, - "432253": { - "latitude": -29.58366637, - "longitude": -52.68953969, - "name": "Vale do Sol" - }, - "432254": { - "latitude": -29.36276167, - "longitude": -51.24839589, - "name": "Vale Real" - }, - "432255": { - "latitude": -28.49029767, - "longitude": -51.83513878, - "name": "Vanini" - }, - "432260": { - "latitude": -29.57858444, - "longitude": -52.19494881, - "name": "Venâncio Aires" - }, - "432270": { - "latitude": -29.7131666, - "longitude": -52.5386523, - "name": "Vera Cruz" - }, - "432280": { - "latitude": -28.9634367, - "longitude": -51.55155946, - "name": "Veranópolis" - }, - "432285": { - "latitude": -29.06678157, - "longitude": -51.86048029, - "name": "Vespasiano Corrêa" - }, - "432290": { - "latitude": -27.57226663, - "longitude": -51.99371317, - "name": "Viadutos" - }, - "432300": { - "latitude": -30.16700825, - "longitude": -50.86937274, - "name": "Viamão" - }, - "432310": { - "latitude": -27.17107884, - "longitude": -53.38793076, - "name": "Vicente Dutra" - }, - "432320": { - "latitude": -28.55013938, - "longitude": -52.68526343, - "name": "Victor Graeff" - }, - "432330": { - "latitude": -28.85884657, - "longitude": -51.55293025, - "name": "Vila Flores" - }, - "432335": { - "latitude": -28.12816438, - "longitude": -52.14241422, - "name": "Vila Lângaro" - }, - "432340": { - "latitude": -28.55780581, - "longitude": -52.15176923, - "name": "Vila Maria" - }, - "432345": { - "latitude": -30.34599399, - "longitude": -53.87891858, - "name": "Vila Nova do Sul" - }, - "432350": { - "latitude": -27.32483932, - "longitude": -53.51029204, - "name": "Vista Alegre" - }, - "432360": { - "latitude": -28.82075015, - "longitude": -51.78218911, - "name": "Vista Alegre do Prata" - }, - "432370": { - "latitude": -27.2657559, - "longitude": -53.70075084, - "name": "Vista Gaúcha" - }, - "432375": { - "latitude": -28.38172268, - "longitude": -54.4636499, - "name": "Vitória das Missões" - }, - "432377": { - "latitude": -29.4063848, - "longitude": -51.74294013, - "name": "Westfália" - }, - "432380": { - "latitude": -29.80789486, - "longitude": -50.06968898, - "name": "Xangri-lá" - }, - "500020": { - "latitude": -19.96282226, - "longitude": -52.9266922, - "name": "Água Clara" - }, - "500025": { - "latitude": -18.20915244, - "longitude": -53.74919235, - "name": "Alcinópolis" - }, - "500060": { - "latitude": -23.15780838, - "longitude": -54.96817302, - "name": "Amambai" - }, - "500070": { - "latitude": -20.69624435, - "longitude": -55.77206893, - "name": "Anastácio" - }, - "500080": { - "latitude": -22.11145678, - "longitude": -52.80484244, - "name": "Anaurilândia" - }, - "500085": { - "latitude": -22.0624438, - "longitude": -53.86580245, - "name": "Angélica" - }, - "500090": { - "latitude": -22.20572391, - "longitude": -55.96955206, - "name": "Antônio João" - }, - "500100": { - "latitude": -20.07560952, - "longitude": -51.29020398, - "name": "Aparecida do Taboado" - }, - "500110": { - "latitude": -19.74621103, - "longitude": -55.87699014, - "name": "Aquidauana" - }, - "500124": { - "latitude": -22.90768783, - "longitude": -55.45018664, - "name": "Aral Moreira" - }, - "500150": { - "latitude": -19.80563094, - "longitude": -54.305523, - "name": "Bandeirantes" - }, - "500190": { - "latitude": -21.80573007, - "longitude": -52.57244147, - "name": "Bataguassu" - }, - "500200": { - "latitude": -22.39081613, - "longitude": -53.1776016, - "name": "Batayporã" - }, - "500210": { - "latitude": -21.93458603, - "longitude": -56.53843081, - "name": "Bela Vista" - }, - "500215": { - "latitude": -20.54877219, - "longitude": -56.69947334, - "name": "Bodoquena" - }, - "500220": { - "latitude": -21.03326103, - "longitude": -56.48281425, - "name": "Bonito" - }, - "500230": { - "latitude": -21.07594842, - "longitude": -52.43400741, - "name": "Brasilândia" - }, - "500240": { - "latitude": -22.58831193, - "longitude": -54.80275729, - "name": "Caarapó" - }, - "500260": { - "latitude": -19.34192545, - "longitude": -53.86951563, - "name": "Camapuã" - }, - "500270": { - "latitude": -20.91358432, - "longitude": -54.24946376, - "name": "Campo Grande" - }, - "500280": { - "latitude": -21.94082781, - "longitude": -57.08947575, - "name": "Caracol" - }, - "500290": { - "latitude": -19.09534438, - "longitude": -52.17992289, - "name": "Cassilândia" - }, - "500295": { - "latitude": -18.99452311, - "longitude": -52.69802122, - "name": "Chapadão do Sul" - }, - "500310": { - "latitude": -19.80755298, - "longitude": -55.05731481, - "name": "Corguinho" - }, - "500315": { - "latitude": -23.34773027, - "longitude": -55.38308228, - "name": "Coronel Sapucaia" - }, - "500320": { - "latitude": -18.7244531, - "longitude": -56.72699495, - "name": "Corumbá" - }, - "500325": { - "latitude": -18.51879167, - "longitude": -53.20312945, - "name": "Costa Rica" - }, - "500330": { - "latitude": -18.28119562, - "longitude": -54.67391315, - "name": "Coxim" - }, - "500345": { - "latitude": -22.1560907, - "longitude": -54.15208195, - "name": "Deodápolis" - }, - "500348": { - "latitude": -20.6004375, - "longitude": -55.36243287, - "name": "Dois Irmãos do Buriti" - }, - "500350": { - "latitude": -22.01398249, - "longitude": -54.5877757, - "name": "Douradina" - }, - "500370": { - "latitude": -22.14486424, - "longitude": -54.83888266, - "name": "Dourados" - }, - "500375": { - "latitude": -23.73823899, - "longitude": -54.22509102, - "name": "Eldorado" - }, - "500380": { - "latitude": -22.33732681, - "longitude": -54.43972717, - "name": "Fátima do Sul" - }, - "500390": { - "latitude": -18.74444978, - "longitude": -53.86235135, - "name": "Figueirão" - }, - "500400": { - "latitude": -22.42724521, - "longitude": -54.1924899, - "name": "Glória de Dourados" - }, - "500410": { - "latitude": -21.54164045, - "longitude": -55.99614168, - "name": "Guia Lopes da Laguna" - }, - "500430": { - "latitude": -23.43420407, - "longitude": -54.53830067, - "name": "Iguatemi" - }, - "500440": { - "latitude": -19.65760028, - "longitude": -52.02182513, - "name": "Inocência" - }, - "500450": { - "latitude": -22.00537884, - "longitude": -54.87349256, - "name": "Itaporã" - }, - "500460": { - "latitude": -23.34156836, - "longitude": -54.11916679, - "name": "Itaquiraí" - }, - "500470": { - "latitude": -22.37147896, - "longitude": -53.79914278, - "name": "Ivinhema" - }, - "500480": { - "latitude": -23.81076611, - "longitude": -54.53806896, - "name": "Japorã" - }, - "500490": { - "latitude": -20.22723364, - "longitude": -54.34829736, - "name": "Jaraguari" - }, - "500500": { - "latitude": -21.58199526, - "longitude": -56.35182256, - "name": "Jardim" - }, - "500510": { - "latitude": -22.70672579, - "longitude": -53.95730926, - "name": "Jateí" - }, - "500515": { - "latitude": -22.77628266, - "longitude": -54.48888916, - "name": "Juti" - }, - "500520": { - "latitude": -19.10306306, - "longitude": -57.56881438, - "name": "Ladário" - }, - "500525": { - "latitude": -22.6775156, - "longitude": -55.13209523, - "name": "Laguna Carapã" - }, - "500540": { - "latitude": -21.54335294, - "longitude": -55.39682943, - "name": "Maracaju" - }, - "500560": { - "latitude": -20.12120789, - "longitude": -56.59623666, - "name": "Miranda" - }, - "500568": { - "latitude": -23.94269857, - "longitude": -54.27418076, - "name": "Mundo Novo" - }, - "500570": { - "latitude": -23.02253805, - "longitude": -54.02566574, - "name": "Naviraí" - }, - "500580": { - "latitude": -21.10081548, - "longitude": -55.90145882, - "name": "Nioaque" - }, - "500600": { - "latitude": -21.49101165, - "longitude": -54.2164443, - "name": "Nova Alvorada do Sul" - }, - "500620": { - "latitude": -21.9255816, - "longitude": -53.42196776, - "name": "Nova Andradina" - }, - "500625": { - "latitude": -22.60303292, - "longitude": -53.78187167, - "name": "Novo Horizonte do Sul" - }, - "500627": { - "latitude": -19.22818563, - "longitude": -53.13033528, - "name": "Paraíso das Águas" - }, - "500630": { - "latitude": -19.52743813, - "longitude": -51.396138, - "name": "Paranaíba" - }, - "500635": { - "latitude": -23.71121595, - "longitude": -55.35596437, - "name": "Paranhos" - }, - "500640": { - "latitude": -17.91430989, - "longitude": -54.33915321, - "name": "Pedro Gomes" - }, - "500660": { - "latitude": -22.20229921, - "longitude": -55.58355266, - "name": "Ponta Porã" - }, - "500690": { - "latitude": -21.22600406, - "longitude": -57.38413702, - "name": "Porto Murtinho" - }, - "500710": { - "latitude": -20.59663649, - "longitude": -53.54418982, - "name": "Ribas do Rio Pardo" - }, - "500720": { - "latitude": -21.69613998, - "longitude": -54.55781257, - "name": "Rio Brilhante" - }, - "500730": { - "latitude": -19.44690375, - "longitude": -54.96296002, - "name": "Rio Negro" - }, - "500740": { - "latitude": -18.81361625, - "longitude": -55.04286977, - "name": "Rio Verde de Mato Grosso" - }, - "500750": { - "latitude": -19.97871412, - "longitude": -54.73551358, - "name": "Rochedo" - }, - "500755": { - "latitude": -21.31905364, - "longitude": -52.77451056, - "name": "Santa Rita do Pardo" - }, - "500769": { - "latitude": -19.16914557, - "longitude": -54.48272394, - "name": "São Gabriel do Oeste" - }, - "500770": { - "latitude": -23.88058006, - "longitude": -55.02792318, - "name": "Sete Quedas" - }, - "500780": { - "latitude": -20.28205559, - "longitude": -51.75818757, - "name": "Selvíria" - }, - "500790": { - "latitude": -21.09387121, - "longitude": -54.94211197, - "name": "Sidrolândia" - }, - "500793": { - "latitude": -17.64863993, - "longitude": -54.43238884, - "name": "Sonora" - }, - "500795": { - "latitude": -23.64932544, - "longitude": -54.99040096, - "name": "Tacuru" - }, - "500797": { - "latitude": -22.66782595, - "longitude": -53.43106087, - "name": "Taquarussu" - }, - "500800": { - "latitude": -20.44739903, - "longitude": -55.02409178, - "name": "Terenos" - }, - "500830": { - "latitude": -20.43886305, - "longitude": -52.21122353, - "name": "Três Lagoas" - }, - "500840": { - "latitude": -22.46721823, - "longitude": -54.42487167, - "name": "Vicentina" - }, - "510010": { - "latitude": -15.17726935, - "longitude": -56.31803576, - "name": "Acorizal" - }, - "510020": { - "latitude": -13.97756107, - "longitude": -52.50025607, - "name": "Água Boa" - }, - "510025": { - "latitude": -10.05579633, - "longitude": -56.36772595, - "name": "Alta Floresta" - }, - "510030": { - "latitude": -17.44983188, - "longitude": -53.46671849, - "name": "Alto Araguaia" - }, - "510035": { - "latitude": -11.81150234, - "longitude": -51.75022344, - "name": "Alto Boa Vista" - }, - "510040": { - "latitude": -16.88902409, - "longitude": -53.58075108, - "name": "Alto Garças" - }, - "510050": { - "latitude": -14.75979738, - "longitude": -56.66124171, - "name": "Alto Paraguai" - }, - "510060": { - "latitude": -17.82720623, - "longitude": -53.29657364, - "name": "Alto Taquari" - }, - "510080": { - "latitude": -8.758635833, - "longitude": -57.82599821, - "name": "Apiacás" - }, - "510100": { - "latitude": -15.12348221, - "longitude": -51.79512338, - "name": "Araguaiana" - }, - "510120": { - "latitude": -16.7538578, - "longitude": -53.12551701, - "name": "Araguainha" - }, - "510125": { - "latitude": -15.25301627, - "longitude": -58.45910266, - "name": "Araputanga" - }, - "510130": { - "latitude": -14.50709102, - "longitude": -56.85934161, - "name": "Arenápolis" - }, - "510140": { - "latitude": -10.17966394, - "longitude": -59.85630769, - "name": "Aripuanã" - }, - "510160": { - "latitude": -16.81037919, - "longitude": -56.02952144, - "name": "Barão de Melgaço" - }, - "510170": { - "latitude": -15.09255866, - "longitude": -57.42586752, - "name": "Barra do Bugres" - }, - "510180": { - "latitude": -15.3820187, - "longitude": -52.50901912, - "name": "Barra do Garças" - }, - "510185": { - "latitude": -12.21780898, - "longitude": -51.739478, - "name": "Bom Jesus do Araguaia" - }, - "510190": { - "latitude": -12.42310382, - "longitude": -57.99883674, - "name": "Brasnorte" - }, - "510250": { - "latitude": -16.53842296, - "longitude": -57.83459385, - "name": "Cáceres" - }, - "510260": { - "latitude": -14.37373652, - "longitude": -53.11372598, - "name": "Campinápolis" - }, - "510263": { - "latitude": -13.68828597, - "longitude": -57.93090059, - "name": "Campo Novo do Parecis" - }, - "510267": { - "latitude": -15.39973643, - "longitude": -55.03154333, - "name": "Campo Verde" - }, - "510268": { - "latitude": -13.57984602, - "longitude": -59.19305441, - "name": "Campos de Júlio" - }, - "510269": { - "latitude": -11.20158309, - "longitude": -51.82363387, - "name": "Canabrava do Norte" - }, - "510270": { - "latitude": -13.32983941, - "longitude": -52.39891541, - "name": "Canarana" - }, - "510279": { - "latitude": -10.10638309, - "longitude": -55.83415924, - "name": "Carlinda" - }, - "510285": { - "latitude": -10.94072604, - "longitude": -58.60279724, - "name": "Castanheira" - }, - "510300": { - "latitude": -15.12517624, - "longitude": -55.5826016, - "name": "Chapada dos Guimarães" - }, - "510305": { - "latitude": -11.44815467, - "longitude": -55.0476983, - "name": "Cláudia" - }, - "510310": { - "latitude": -13.85350024, - "longitude": -51.14320028, - "name": "Cocalinho" - }, - "510320": { - "latitude": -10.63098487, - "longitude": -55.46858408, - "name": "Colíder" - }, - "510325": { - "latitude": -9.292440665, - "longitude": -60.30419381, - "name": "Colniza" - }, - "510330": { - "latitude": -13.19366495, - "longitude": -59.75136304, - "name": "Comodoro" - }, - "510335": { - "latitude": -10.40416663, - "longitude": -51.69857253, - "name": "Confresa" - }, - "510336": { - "latitude": -14.63468202, - "longitude": -59.33223622, - "name": "Conquista D'Oeste" - }, - "510337": { - "latitude": -9.537854005, - "longitude": -58.67515456, - "name": "Cotriguaçu" - }, - "510340": { - "latitude": -15.4523371, - "longitude": -55.95551276, - "name": "Cuiabá" - }, - "510343": { - "latitude": -15.61711275, - "longitude": -57.87644937, - "name": "Curvelândia" - }, - "510345": { - "latitude": -14.7300761, - "longitude": -56.96161614, - "name": "Denise" - }, - "510350": { - "latitude": -14.09573829, - "longitude": -56.8045687, - "name": "Diamantino" - }, - "510360": { - "latitude": -15.65580934, - "longitude": -54.77420336, - "name": "Dom Aquino" - }, - "510370": { - "latitude": -11.93290124, - "longitude": -54.18480386, - "name": "Feliz Natal" - }, - "510380": { - "latitude": -15.52738637, - "longitude": -58.70257463, - "name": "Figueirópolis D'Oeste" - }, - "510385": { - "latitude": -12.99596158, - "longitude": -53.45617697, - "name": "Gaúcha do Norte" - }, - "510390": { - "latitude": -15.5572539, - "longitude": -53.39168076, - "name": "General Carneiro" - }, - "510395": { - "latitude": -15.83919655, - "longitude": -58.32529257, - "name": "Glória D'Oeste" - }, - "510410": { - "latitude": -9.776268562, - "longitude": -54.62110532, - "name": "Guarantã do Norte" - }, - "510420": { - "latitude": -16.38427184, - "longitude": -53.58780872, - "name": "Guiratinga" - }, - "510450": { - "latitude": -15.33520191, - "longitude": -58.59759198, - "name": "Indiavaí" - }, - "510452": { - "latitude": -12.01702621, - "longitude": -56.05865921, - "name": "Ipiranga do Norte" - }, - "510454": { - "latitude": -12.14039218, - "longitude": -56.75487811, - "name": "Itanhangá" - }, - "510455": { - "latitude": -11.11093787, - "longitude": -55.58936717, - "name": "Itaúba" - }, - "510460": { - "latitude": -17.33388781, - "longitude": -54.59732059, - "name": "Itiquira" - }, - "510480": { - "latitude": -15.97748711, - "longitude": -55.19049361, - "name": "Jaciara" - }, - "510490": { - "latitude": -15.35480949, - "longitude": -56.59967288, - "name": "Jangada" - }, - "510500": { - "latitude": -15.30479478, - "longitude": -58.86566572, - "name": "Jauru" - }, - "510510": { - "latitude": -11.02373224, - "longitude": -57.61840292, - "name": "Juara" - }, - "510515": { - "latitude": -11.53209469, - "longitude": -59.32449525, - "name": "Juína" - }, - "510517": { - "latitude": -10.3974524, - "longitude": -58.62482561, - "name": "Juruena" - }, - "510520": { - "latitude": -16.21491888, - "longitude": -54.96056257, - "name": "Juscimeira" - }, - "510523": { - "latitude": -15.37707191, - "longitude": -57.77917941, - "name": "Lambari D'Oeste" - }, - "510525": { - "latitude": -13.03726269, - "longitude": -56.16745525, - "name": "Lucas do Rio Verde" - }, - "510530": { - "latitude": -11.01467515, - "longitude": -50.94579946, - "name": "Luciara" - }, - "510550": { - "latitude": -15.18956457, - "longitude": -59.99004954, - "name": "Vila Bela da Santíssima Trindade" - }, - "510558": { - "latitude": -10.88623966, - "longitude": -54.05337752, - "name": "Marcelândia" - }, - "510560": { - "latitude": -10.01397578, - "longitude": -54.35687472, - "name": "Matupá" - }, - "510562": { - "latitude": -15.65413849, - "longitude": -58.05496081, - "name": "Mirassol d'Oeste" - }, - "510590": { - "latitude": -14.37822934, - "longitude": -55.81337363, - "name": "Nobres" - }, - "510600": { - "latitude": -14.34773722, - "longitude": -56.72249294, - "name": "Nortelândia" - }, - "510610": { - "latitude": -15.83900481, - "longitude": -56.48403983, - "name": "Nossa Senhora do Livramento" - }, - "510615": { - "latitude": -9.768441107, - "longitude": -58.07694127, - "name": "Nova Bandeirantes" - }, - "510617": { - "latitude": -14.15624025, - "longitude": -51.88995558, - "name": "Nova Nazaré" - }, - "510618": { - "latitude": -14.2998341, - "longitude": -59.77145562, - "name": "Nova Lacerda" - }, - "510619": { - "latitude": -10.91893088, - "longitude": -54.90665795, - "name": "Nova Santa Helena" - }, - "510620": { - "latitude": -14.78291959, - "longitude": -55.05779247, - "name": "Nova Brasilândia" - }, - "510621": { - "latitude": -10.70027907, - "longitude": -56.0417279, - "name": "Nova Canaã do Norte" - }, - "510622": { - "latitude": -13.62999777, - "longitude": -56.10550522, - "name": "Nova Mutum" - }, - "510623": { - "latitude": -14.80443328, - "longitude": -57.42145129, - "name": "Nova Olímpia" - }, - "510624": { - "latitude": -13.02168341, - "longitude": -54.76203065, - "name": "Nova Ubiratã" - }, - "510625": { - "latitude": -14.63461728, - "longitude": -52.38015497, - "name": "Nova Xavantina" - }, - "510626": { - "latitude": -9.752155069, - "longitude": -55.40368078, - "name": "Novo Mundo" - }, - "510627": { - "latitude": -11.38360154, - "longitude": -57.30351869, - "name": "Novo Horizonte do Norte" - }, - "510628": { - "latitude": -15.08121291, - "longitude": -53.25251817, - "name": "Novo São Joaquim" - }, - "510629": { - "latitude": -9.593533071, - "longitude": -56.68259484, - "name": "Paranaíta" - }, - "510630": { - "latitude": -13.67508749, - "longitude": -54.09709521, - "name": "Paranatinga" - }, - "510631": { - "latitude": -12.31338636, - "longitude": -50.88794648, - "name": "Novo Santo Antônio" - }, - "510637": { - "latitude": -16.79909591, - "longitude": -54.24973604, - "name": "Pedra Preta" - }, - "510642": { - "latitude": -10.14949045, - "longitude": -53.59394237, - "name": "Peixoto de Azevedo" - }, - "510645": { - "latitude": -14.58878237, - "longitude": -54.67396754, - "name": "Planalto da Serra" - }, - "510650": { - "latitude": -16.78284414, - "longitude": -56.9447028, - "name": "Poconé" - }, - "510665": { - "latitude": -15.93195595, - "longitude": -52.72139944, - "name": "Pontal do Araguaia" - }, - "510670": { - "latitude": -16.65894998, - "longitude": -52.93657485, - "name": "Ponte Branca" - }, - "510675": { - "latitude": -15.51682264, - "longitude": -59.4577423, - "name": "Pontes e Lacerda" - }, - "510677": { - "latitude": -10.82617093, - "longitude": -51.71357869, - "name": "Porto Alegre do Norte" - }, - "510680": { - "latitude": -11.73495821, - "longitude": -56.74569836, - "name": "Porto dos Gaúchos" - }, - "510682": { - "latitude": -15.95648672, - "longitude": -58.98234153, - "name": "Porto Esperidião" - }, - "510685": { - "latitude": -15.52117638, - "longitude": -57.21550456, - "name": "Porto Estrela" - }, - "510700": { - "latitude": -15.85395919, - "longitude": -54.18327634, - "name": "Poxoréu" - }, - "510704": { - "latitude": -15.09999129, - "longitude": -54.21981216, - "name": "Primavera do Leste" - }, - "510706": { - "latitude": -12.15871956, - "longitude": -52.74343692, - "name": "Querência" - }, - "510710": { - "latitude": -15.56656355, - "longitude": -58.29711454, - "name": "São José dos Quatro Marcos" - }, - "510715": { - "latitude": -14.92842881, - "longitude": -58.45777988, - "name": "Reserva do Cabaçal" - }, - "510718": { - "latitude": -12.87475388, - "longitude": -51.56833101, - "name": "Ribeirão Cascalheira" - }, - "510719": { - "latitude": -16.49401, - "longitude": -52.75977638, - "name": "Ribeirãozinho" - }, - "510720": { - "latitude": -15.27296711, - "longitude": -58.14977249, - "name": "Rio Branco" - }, - "510724": { - "latitude": -11.93466339, - "longitude": -54.89969589, - "name": "Santa Carmem" - }, - "510726": { - "latitude": -14.45032925, - "longitude": -57.34672492, - "name": "Santo Afonso" - }, - "510729": { - "latitude": -16.4840369, - "longitude": -54.25013071, - "name": "São José do Povo" - }, - "510730": { - "latitude": -13.55123387, - "longitude": -56.80818783, - "name": "São José do Rio Claro" - }, - "510735": { - "latitude": -10.69645313, - "longitude": -52.61691852, - "name": "São José do Xingu" - }, - "510740": { - "latitude": -15.9540735, - "longitude": -54.74030434, - "name": "São Pedro da Cipa" - }, - "510757": { - "latitude": -10.46305975, - "longitude": -61.00996586, - "name": "Rondolândia" - }, - "510760": { - "latitude": -16.56704174, - "longitude": -54.68811111, - "name": "Rondonópolis" - }, - "510770": { - "latitude": -14.75340637, - "longitude": -55.93663236, - "name": "Rosário Oeste" - }, - "510774": { - "latitude": -10.06449902, - "longitude": -52.54146299, - "name": "Santa Cruz do Xingu" - }, - "510775": { - "latitude": -15.05085971, - "longitude": -58.05085551, - "name": "Salto do Céu" - }, - "510776": { - "latitude": -13.83317062, - "longitude": -55.29428436, - "name": "Santa Rita do Trivelato" - }, - "510777": { - "latitude": -10.33263807, - "longitude": -50.79231389, - "name": "Santa Terezinha" - }, - "510779": { - "latitude": -14.81174913, - "longitude": -53.65698186, - "name": "Santo Antônio do Leste" - }, - "510780": { - "latitude": -16.53582773, - "longitude": -55.44714105, - "name": "Santo Antônio do Leverger" - }, - "510785": { - "latitude": -11.45459042, - "longitude": -51.96959949, - "name": "São Félix do Araguaia" - }, - "510787": { - "latitude": -13.15448555, - "longitude": -58.6535217, - "name": "Sapezal" - }, - "510788": { - "latitude": -12.02300703, - "longitude": -51.36209771, - "name": "Serra Nova Dourada" - }, - "510790": { - "latitude": -11.71085412, - "longitude": -55.50151904, - "name": "Sinop" - }, - "510792": { - "latitude": -12.74186439, - "longitude": -55.67822656, - "name": "Sorriso" - }, - "510794": { - "latitude": -11.21411092, - "longitude": -56.49626293, - "name": "Tabaporã" - }, - "510795": { - "latitude": -14.43061703, - "longitude": -58.29147454, - "name": "Tangará da Serra" - }, - "510800": { - "latitude": -12.5680086, - "longitude": -56.53176427, - "name": "Tapurah" - }, - "510805": { - "latitude": -10.51256233, - "longitude": -54.984062, - "name": "Terra Nova do Norte" - }, - "510810": { - "latitude": -15.90369874, - "longitude": -53.45721271, - "name": "Tesouro" - }, - "510820": { - "latitude": -16.29473132, - "longitude": -52.88992899, - "name": "Torixoréu" - }, - "510830": { - "latitude": -11.527676, - "longitude": -54.31644728, - "name": "União do Sul" - }, - "510835": { - "latitude": -14.96610619, - "longitude": -58.9631074, - "name": "Vale de São Domingos" - }, - "510840": { - "latitude": -15.5624785, - "longitude": -56.24275107, - "name": "Várzea Grande" - }, - "510850": { - "latitude": -12.42241962, - "longitude": -55.34641238, - "name": "Vera" - }, - "510860": { - "latitude": -9.98064716, - "longitude": -51.40634923, - "name": "Vila Rica" - }, - "510880": { - "latitude": -10.29386315, - "longitude": -55.33817828, - "name": "Nova Guarita" - }, - "510885": { - "latitude": -14.29042974, - "longitude": -57.25744374, - "name": "Nova Marilândia" - }, - "510890": { - "latitude": -12.78386306, - "longitude": -57.22027425, - "name": "Nova Maringá" - }, - "510895": { - "latitude": -9.970185723, - "longitude": -57.24565622, - "name": "Nova Monte Verde" - }, - "520005": { - "latitude": -16.7854828, - "longitude": -49.45372499, - "name": "Abadia de Goiás" - }, - "520010": { - "latitude": -16.18683985, - "longitude": -48.71361439, - "name": "Abadiânia" - }, - "520013": { - "latitude": -17.4522088, - "longitude": -50.32603185, - "name": "Acreúna" - }, - "520015": { - "latitude": -16.36925413, - "longitude": -50.18467326, - "name": "Adelândia" - }, - "520017": { - "latitude": -14.9065147, - "longitude": -47.7954317, - "name": "Água Fria de Goiás" - }, - "520020": { - "latitude": -18.07798772, - "longitude": -48.7917311, - "name": "Água Limpa" - }, - "520025": { - "latitude": -15.75557591, - "longitude": -48.28591749, - "name": "Águas Lindas de Goiás" - }, - "520030": { - "latitude": -16.08910425, - "longitude": -48.48234076, - "name": "Alexânia" - }, - "520050": { - "latitude": -17.69337079, - "longitude": -49.46536269, - "name": "Aloândia" - }, - "520055": { - "latitude": -14.17125688, - "longitude": -49.42901757, - "name": "Alto Horizonte" - }, - "520060": { - "latitude": -14.1829664, - "longitude": -47.5351209, - "name": "Alto Paraíso de Goiás" - }, - "520080": { - "latitude": -14.56634901, - "longitude": -46.6318374, - "name": "Alvorada do Norte" - }, - "520082": { - "latitude": -13.84247743, - "longitude": -49.61538265, - "name": "Amaralina" - }, - "520085": { - "latitude": -16.26111274, - "longitude": -50.0013076, - "name": "Americano do Brasil" - }, - "520090": { - "latitude": -16.62655827, - "longitude": -51.10728319, - "name": "Amorinópolis" - }, - "520110": { - "latitude": -16.29073358, - "longitude": -48.97353621, - "name": "Anápolis" - }, - "520120": { - "latitude": -18.31236113, - "longitude": -48.22537199, - "name": "Anhanguera" - }, - "520130": { - "latitude": -16.39746733, - "longitude": -49.96805437, - "name": "Anicuns" - }, - "520140": { - "latitude": -16.80982888, - "longitude": -49.26291727, - "name": "Aparecida de Goiânia" - }, - "520145": { - "latitude": -18.21683543, - "longitude": -51.26305319, - "name": "Aparecida do Rio Doce" - }, - "520150": { - "latitude": -18.76813002, - "longitude": -52.04538168, - "name": "Aporé" - }, - "520160": { - "latitude": -16.3656216, - "longitude": -49.70152904, - "name": "Araçu" - }, - "520170": { - "latitude": -15.97017798, - "longitude": -52.14675424, - "name": "Aragarças" - }, - "520180": { - "latitude": -16.95177625, - "longitude": -49.41918501, - "name": "Aragoiânia" - }, - "520215": { - "latitude": -15.1391702, - "longitude": -50.43958992, - "name": "Araguapaz" - }, - "520235": { - "latitude": -16.35346723, - "longitude": -51.58453739, - "name": "Arenópolis" - }, - "520250": { - "latitude": -14.80568925, - "longitude": -50.93746738, - "name": "Aruanã" - }, - "520260": { - "latitude": -16.69513092, - "longitude": -50.52592566, - "name": "Aurilândia" - }, - "520280": { - "latitude": -16.49258732, - "longitude": -49.76600901, - "name": "Avelinópolis" - }, - "520310": { - "latitude": -16.35992444, - "longitude": -52.43823126, - "name": "Baliza" - }, - "520320": { - "latitude": -14.90753178, - "longitude": -48.8811947, - "name": "Barro Alto" - }, - "520330": { - "latitude": -16.95745094, - "longitude": -48.91158096, - "name": "Bela Vista de Goiás" - }, - "520340": { - "latitude": -16.16833676, - "longitude": -52.07238791, - "name": "Bom Jardim de Goiás" - }, - "520350": { - "latitude": -18.18912731, - "longitude": -49.87845167, - "name": "Bom Jesus de Goiás" - }, - "520355": { - "latitude": -16.60190559, - "longitude": -49.01036339, - "name": "Bonfinópolis" - }, - "520357": { - "latitude": -13.57189728, - "longitude": -49.86361181, - "name": "Bonópolis" - }, - "520360": { - "latitude": -16.38787194, - "longitude": -49.37808112, - "name": "Brazabrantes" - }, - "520380": { - "latitude": -15.236628, - "longitude": -51.20825709, - "name": "Britânia" - }, - "520390": { - "latitude": -18.1251207, - "longitude": -49.00741788, - "name": "Buriti Alegre" - }, - "520393": { - "latitude": -16.16985213, - "longitude": -50.45293739, - "name": "Buriti de Goiás" - }, - "520396": { - "latitude": -14.40698074, - "longitude": -46.29663057, - "name": "Buritinópolis" - }, - "520400": { - "latitude": -15.75973122, - "longitude": -46.9924422, - "name": "Cabeceiras" - }, - "520410": { - "latitude": -18.54283831, - "longitude": -50.98208256, - "name": "Cachoeira Alta" - }, - "520420": { - "latitude": -16.7206161, - "longitude": -50.69939543, - "name": "Cachoeira de Goiás" - }, - "520425": { - "latitude": -18.49025505, - "longitude": -49.62296102, - "name": "Cachoeira Dourada" - }, - "520430": { - "latitude": -18.7011675, - "longitude": -51.13072602, - "name": "Caçu" - }, - "520440": { - "latitude": -17.00703326, - "longitude": -51.81471896, - "name": "Caiapônia" - }, - "520450": { - "latitude": -17.70937498, - "longitude": -48.64703744, - "name": "Caldas Novas" - }, - "520455": { - "latitude": -16.74217829, - "longitude": -48.97208976, - "name": "Caldazinha" - }, - "520460": { - "latitude": -16.78728889, - "longitude": -49.69997581, - "name": "Campestre de Goiás" - }, - "520465": { - "latitude": -13.88480762, - "longitude": -48.56812941, - "name": "Campinaçu" - }, - "520470": { - "latitude": -14.04500148, - "longitude": -48.97524173, - "name": "Campinorte" - }, - "520480": { - "latitude": -17.55148017, - "longitude": -47.76843627, - "name": "Campo Alegre de Goiás" - }, - "520485": { - "latitude": -16.28595315, - "longitude": -49.10352815, - "name": "Campo Limpo de Goiás" - }, - "520490": { - "latitude": -12.99988952, - "longitude": -46.51069034, - "name": "Campos Belos" - }, - "520495": { - "latitude": -14.19997263, - "longitude": -49.66047203, - "name": "Campos Verdes" - }, - "520500": { - "latitude": -15.42519947, - "longitude": -49.74381698, - "name": "Carmo do Rio Verde" - }, - "520505": { - "latitude": -18.15574909, - "longitude": -50.33970172, - "name": "Castelândia" - }, - "520510": { - "latitude": -17.93092596, - "longitude": -47.66464245, - "name": "Catalão" - }, - "520520": { - "latitude": -16.45476262, - "longitude": -49.58364637, - "name": "Caturaí" - }, - "520530": { - "latitude": -13.63496896, - "longitude": -47.69613481, - "name": "Cavalcante" - }, - "520540": { - "latitude": -15.27654428, - "longitude": -49.63765175, - "name": "Ceres" - }, - "520545": { - "latitude": -17.08645342, - "longitude": -49.7565982, - "name": "Cezarina" - }, - "520547": { - "latitude": -18.46483897, - "longitude": -52.63351379, - "name": "Chapadão do Céu" - }, - "520549": { - "latitude": -16.12417612, - "longitude": -47.81910414, - "name": "Cidade Ocidental" - }, - "520551": { - "latitude": -15.65563708, - "longitude": -48.60288554, - "name": "Cocalzinho de Goiás" - }, - "520552": { - "latitude": -13.9849645, - "longitude": -48.0750852, - "name": "Colinas do Sul" - }, - "520570": { - "latitude": -16.36592107, - "longitude": -50.58203167, - "name": "Córrego do Ouro" - }, - "520580": { - "latitude": -15.93028528, - "longitude": -48.67945623, - "name": "Corumbá de Goiás" - }, - "520590": { - "latitude": -18.16907322, - "longitude": -48.53363121, - "name": "Corumbaíba" - }, - "520620": { - "latitude": -16.69840937, - "longitude": -47.51801814, - "name": "Cristalina" - }, - "520630": { - "latitude": -17.21365188, - "longitude": -48.7074205, - "name": "Cristianópolis" - }, - "520640": { - "latitude": -14.63962926, - "longitude": -50.06525148, - "name": "Crixás" - }, - "520650": { - "latitude": -17.24121194, - "longitude": -49.35717226, - "name": "Cromínia" - }, - "520660": { - "latitude": -18.32055017, - "longitude": -48.13389711, - "name": "Cumari" - }, - "520670": { - "latitude": -14.55624208, - "longitude": -46.1909343, - "name": "Damianópolis" - }, - "520680": { - "latitude": -16.25657678, - "longitude": -49.33339228, - "name": "Damolândia" - }, - "520690": { - "latitude": -18.11774799, - "longitude": -47.56573245, - "name": "Davinópolis" - }, - "520710": { - "latitude": -16.22320418, - "longitude": -51.34968014, - "name": "Diorama" - }, - "520725": { - "latitude": -16.80488991, - "longitude": -52.49338322, - "name": "Doverlândia" - }, - "520735": { - "latitude": -17.42184934, - "longitude": -49.74189527, - "name": "Edealina" - }, - "520740": { - "latitude": -17.47672471, - "longitude": -49.9642589, - "name": "Edéia" - }, - "520750": { - "latitude": -13.81391335, - "longitude": -49.08633839, - "name": "Estrela do Norte" - }, - "520753": { - "latitude": -15.43551329, - "longitude": -50.37049221, - "name": "Faina" - }, - "520760": { - "latitude": -16.15159109, - "longitude": -50.85681184, - "name": "Fazenda Nova" - }, - "520780": { - "latitude": -16.64001375, - "longitude": -50.31299332, - "name": "Firminópolis" - }, - "520790": { - "latitude": -14.65179876, - "longitude": -46.9046478, - "name": "Flores de Goiás" - }, - "520800": { - "latitude": -15.30771561, - "longitude": -47.24765178, - "name": "Formosa" - }, - "520810": { - "latitude": -13.72300345, - "longitude": -48.86759647, - "name": "Formoso" - }, - "520815": { - "latitude": -16.40310402, - "longitude": -48.67292067, - "name": "Gameleira de Goiás" - }, - "520830": { - "latitude": -13.26419833, - "longitude": -46.51885327, - "name": "Divinópolis de Goiás" - }, - "520840": { - "latitude": -16.51470056, - "longitude": -49.06653239, - "name": "Goianápolis" - }, - "520850": { - "latitude": -18.12292245, - "longitude": -48.13888049, - "name": "Goiandira" - }, - "520860": { - "latitude": -15.27536102, - "longitude": -49.16742529, - "name": "Goianésia" - }, - "520870": { - "latitude": -16.64333456, - "longitude": -49.27419322, - "name": "Goiânia" - }, - "520880": { - "latitude": -16.50007889, - "longitude": -49.4293018, - "name": "Goianira" - }, - "520890": { - "latitude": -15.84697614, - "longitude": -50.24310994, - "name": "Goiás" - }, - "520910": { - "latitude": -17.99375027, - "longitude": -49.65991377, - "name": "Goiatuba" - }, - "520915": { - "latitude": -18.50902431, - "longitude": -50.15571569, - "name": "Gouvelândia" - }, - "520920": { - "latitude": -16.91124815, - "longitude": -49.57264913, - "name": "Guapó" - }, - "520929": { - "latitude": -15.67245478, - "longitude": -50.05037717, - "name": "Guaraíta" - }, - "520940": { - "latitude": -13.88967755, - "longitude": -46.43234935, - "name": "Guarani de Goiás" - }, - "520945": { - "latitude": -14.69962281, - "longitude": -49.73098697, - "name": "Guarinos" - }, - "520960": { - "latitude": -15.74344954, - "longitude": -49.78506976, - "name": "Heitoraí" - }, - "520970": { - "latitude": -17.01171072, - "longitude": -49.2668018, - "name": "Hidrolândia" - }, - "520980": { - "latitude": -14.73977593, - "longitude": -49.36310591, - "name": "Hidrolina" - }, - "520990": { - "latitude": -14.09076418, - "longitude": -46.75497813, - "name": "Iaciara" - }, - "520993": { - "latitude": -18.5089601, - "longitude": -49.91606227, - "name": "Inaciolândia" - }, - "520995": { - "latitude": -17.18504028, - "longitude": -49.96825823, - "name": "Indiara" - }, - "521000": { - "latitude": -16.30775137, - "longitude": -49.51625891, - "name": "Inhumas" - }, - "521010": { - "latitude": -17.50573335, - "longitude": -48.05481816, - "name": "Ipameri" - }, - "521015": { - "latitude": -15.16934912, - "longitude": -49.67013938, - "name": "Ipiranga de Goiás" - }, - "521020": { - "latitude": -16.41586855, - "longitude": -51.18076062, - "name": "Iporá" - }, - "521030": { - "latitude": -16.35743705, - "longitude": -50.88027927, - "name": "Israelândia" - }, - "521040": { - "latitude": -16.08080609, - "longitude": -49.82395922, - "name": "Itaberaí" - }, - "521056": { - "latitude": -15.93824591, - "longitude": -49.62670149, - "name": "Itaguari" - }, - "521060": { - "latitude": -15.77270211, - "longitude": -49.61276813, - "name": "Itaguaru" - }, - "521080": { - "latitude": -19.10101265, - "longitude": -51.3199354, - "name": "Itajá" - }, - "521090": { - "latitude": -14.94253751, - "longitude": -49.64797915, - "name": "Itapaci" - }, - "521100": { - "latitude": -15.70290432, - "longitude": -50.77122043, - "name": "Itapirapuã" - }, - "521120": { - "latitude": -15.54759413, - "longitude": -49.95043125, - "name": "Itapuranga" - }, - "521130": { - "latitude": -18.84408348, - "longitude": -51.33064983, - "name": "Itarumã" - }, - "521140": { - "latitude": -16.1958734, - "longitude": -49.6096882, - "name": "Itauçu" - }, - "521150": { - "latitude": -18.35312294, - "longitude": -49.41667369, - "name": "Itumbiara" - }, - "521160": { - "latitude": -16.6758673, - "longitude": -51.03419788, - "name": "Ivolândia" - }, - "521170": { - "latitude": -17.09195154, - "longitude": -50.18240384, - "name": "Jandaia" - }, - "521180": { - "latitude": -15.70201425, - "longitude": -49.38714132, - "name": "Jaraguá" - }, - "521190": { - "latitude": -17.90975995, - "longitude": -51.73197703, - "name": "Jataí" - }, - "521200": { - "latitude": -16.19000791, - "longitude": -51.05832015, - "name": "Jaupaci" - }, - "521205": { - "latitude": -15.96551386, - "longitude": -49.41170369, - "name": "Jesúpolis" - }, - "521210": { - "latitude": -17.795604, - "longitude": -49.61862018, - "name": "Joviânia" - }, - "521220": { - "latitude": -15.58287822, - "longitude": -51.32985672, - "name": "Jussara" - }, - "521225": { - "latitude": -19.18320384, - "longitude": -51.28466279, - "name": "Lagoa Santa" - }, - "521230": { - "latitude": -16.57026443, - "longitude": -48.88888477, - "name": "Leopoldo de Bulhões" - }, - "521250": { - "latitude": -16.48175223, - "longitude": -47.9921759, - "name": "Luziânia" - }, - "521260": { - "latitude": -17.29964003, - "longitude": -49.45815646, - "name": "Mairipotaba" - }, - "521270": { - "latitude": -14.41950758, - "longitude": -46.06678908, - "name": "Mambaí" - }, - "521280": { - "latitude": -13.99653255, - "longitude": -49.39602597, - "name": "Mara Rosa" - }, - "521290": { - "latitude": -17.98542604, - "longitude": -48.68939393, - "name": "Marzagão" - }, - "521295": { - "latitude": -15.3775114, - "longitude": -50.77460078, - "name": "Matrinchã" - }, - "521300": { - "latitude": -18.03614047, - "longitude": -50.36421776, - "name": "Maurilândia" - }, - "521305": { - "latitude": -15.0170496, - "longitude": -48.30860729, - "name": "Mimoso de Goiás" - }, - "521308": { - "latitude": -13.49918838, - "longitude": -48.348818, - "name": "Minaçu" - }, - "521310": { - "latitude": -17.5979557, - "longitude": -52.76027486, - "name": "Mineiros" - }, - "521340": { - "latitude": -16.50782571, - "longitude": -50.77315163, - "name": "Moiporá" - }, - "521350": { - "latitude": -13.29460489, - "longitude": -46.92384744, - "name": "Monte Alegre de Goiás" - }, - "521370": { - "latitude": -15.91412924, - "longitude": -51.57954131, - "name": "Montes Claros de Goiás" - }, - "521375": { - "latitude": -17.31802136, - "longitude": -51.18983638, - "name": "Montividiu" - }, - "521377": { - "latitude": -13.14567662, - "longitude": -48.73157759, - "name": "Montividiu do Norte" - }, - "521380": { - "latitude": -17.77476409, - "longitude": -49.12926512, - "name": "Morrinhos" - }, - "521385": { - "latitude": -15.31102268, - "longitude": -50.01170395, - "name": "Morro Agudo de Goiás" - }, - "521390": { - "latitude": -16.16235357, - "longitude": -50.15819117, - "name": "Mossâmedes" - }, - "521400": { - "latitude": -14.84259902, - "longitude": -50.58722788, - "name": "Mozarlândia" - }, - "521405": { - "latitude": -13.79865432, - "longitude": -50.2034815, - "name": "Mundo Novo" - }, - "521410": { - "latitude": -13.71907572, - "longitude": -49.30387157, - "name": "Mutunópolis" - }, - "521440": { - "latitude": -16.58336583, - "longitude": -49.84984282, - "name": "Nazário" - }, - "521450": { - "latitude": -16.42658266, - "longitude": -49.18632324, - "name": "Nerópolis" - }, - "521460": { - "latitude": -14.49858399, - "longitude": -48.40166255, - "name": "Niquelândia" - }, - "521470": { - "latitude": -15.045281, - "longitude": -49.9349411, - "name": "Nova América" - }, - "521480": { - "latitude": -18.0987974, - "longitude": -48.29560594, - "name": "Nova Aurora" - }, - "521483": { - "latitude": -14.13374692, - "longitude": -50.56193269, - "name": "Nova Crixás" - }, - "521486": { - "latitude": -15.07781943, - "longitude": -49.50834747, - "name": "Nova Glória" - }, - "521487": { - "latitude": -14.31147665, - "longitude": -49.28825524, - "name": "Nova Iguaçu de Goiás" - }, - "521490": { - "latitude": -13.80065434, - "longitude": -47.01073395, - "name": "Nova Roma" - }, - "521500": { - "latitude": -16.35807543, - "longitude": -49.3090928, - "name": "Nova Veneza" - }, - "521520": { - "latitude": -16.05517374, - "longitude": -50.64598421, - "name": "Novo Brasil" - }, - "521523": { - "latitude": -16.12499777, - "longitude": -48.0750725, - "name": "Novo Gama" - }, - "521525": { - "latitude": -13.25036834, - "longitude": -49.72641256, - "name": "Novo Planalto" - }, - "521530": { - "latitude": -17.00786024, - "longitude": -48.19547905, - "name": "Orizona" - }, - "521540": { - "latitude": -16.25507702, - "longitude": -49.22058798, - "name": "Ouro Verde de Goiás" - }, - "521550": { - "latitude": -18.21935194, - "longitude": -47.74727708, - "name": "Ouvidor" - }, - "521560": { - "latitude": -15.3612976, - "longitude": -48.30525009, - "name": "Padre Bernardo" - }, - "521565": { - "latitude": -16.70435457, - "longitude": -51.44090972, - "name": "Palestina de Goiás" - }, - "521570": { - "latitude": -16.80900328, - "longitude": -49.94590707, - "name": "Palmeiras de Goiás" - }, - "521580": { - "latitude": -17.30649495, - "longitude": -48.39682179, - "name": "Palmelo" - }, - "521590": { - "latitude": -16.81982278, - "longitude": -50.19513231, - "name": "Palminópolis" - }, - "521600": { - "latitude": -18.20403193, - "longitude": -49.40325067, - "name": "Panamá" - }, - "521630": { - "latitude": -18.8084258, - "longitude": -50.62381573, - "name": "Paranaiguara" - }, - "521640": { - "latitude": -17.04706627, - "longitude": -50.63784954, - "name": "Paraúna" - }, - "521645": { - "latitude": -17.49426409, - "longitude": -52.22476552, - "name": "Perolândia" - }, - "521680": { - "latitude": -16.11193466, - "longitude": -49.31643516, - "name": "Petrolina de Goiás" - }, - "521690": { - "latitude": -14.58721023, - "longitude": -49.52169764, - "name": "Pilar de Goiás" - }, - "521710": { - "latitude": -17.33188701, - "longitude": -48.9934023, - "name": "Piracanjuba" - }, - "521720": { - "latitude": -16.41412464, - "longitude": -51.84191034, - "name": "Piranhas" - }, - "521730": { - "latitude": -15.81017209, - "longitude": -49.0119142, - "name": "Pirenópolis" - }, - "521740": { - "latitude": -17.2721992, - "longitude": -48.38905037, - "name": "Pires do Rio" - }, - "521760": { - "latitude": -15.28434957, - "longitude": -47.7520536, - "name": "Planaltina" - }, - "521770": { - "latitude": -17.53113783, - "longitude": -49.53814103, - "name": "Pontalina" - }, - "521800": { - "latitude": -13.29234419, - "longitude": -49.23101557, - "name": "Porangatu" - }, - "521805": { - "latitude": -17.9011366, - "longitude": -50.14808799, - "name": "Porteirão" - }, - "521810": { - "latitude": -17.35127019, - "longitude": -52.70453549, - "name": "Portelândia" - }, - "521830": { - "latitude": -14.23029868, - "longitude": -46.43560275, - "name": "Posse" - }, - "521839": { - "latitude": -17.27318364, - "longitude": -49.2461413, - "name": "Professor Jamil" - }, - "521850": { - "latitude": -18.43729833, - "longitude": -50.52919719, - "name": "Quirinópolis" - }, - "521860": { - "latitude": -15.34065666, - "longitude": -49.53252592, - "name": "Rialma" - }, - "521870": { - "latitude": -15.47239044, - "longitude": -49.44025033, - "name": "Rianápolis" - }, - "521878": { - "latitude": -17.83277465, - "longitude": -48.78277739, - "name": "Rio Quente" - }, - "521880": { - "latitude": -17.73901773, - "longitude": -51.03895417, - "name": "Rio Verde" - }, - "521890": { - "latitude": -15.18106677, - "longitude": -49.87682701, - "name": "Rubiataba" - }, - "521900": { - "latitude": -16.28526443, - "longitude": -50.3754137, - "name": "Sanclerlândia" - }, - "521910": { - "latitude": -16.59645728, - "longitude": -49.679501, - "name": "Santa Bárbara de Goiás" - }, - "521920": { - "latitude": -17.3603918, - "longitude": -48.59313554, - "name": "Santa Cruz de Goiás" - }, - "521925": { - "latitude": -15.6677196, - "longitude": -51.17163651, - "name": "Santa Fé de Goiás" - }, - "521930": { - "latitude": -17.80155373, - "longitude": -50.57874605, - "name": "Santa Helena de Goiás" - }, - "521935": { - "latitude": -15.25054039, - "longitude": -49.39001727, - "name": "Santa Isabel" - }, - "521940": { - "latitude": -17.24404518, - "longitude": -53.06887825, - "name": "Santa Rita do Araguaia" - }, - "521945": { - "latitude": -14.87668038, - "longitude": -49.05627094, - "name": "Santa Rita do Novo Destino" - }, - "521950": { - "latitude": -16.06276463, - "longitude": -49.4860278, - "name": "Santa Rosa de Goiás" - }, - "521960": { - "latitude": -13.5724749, - "longitude": -48.98207935, - "name": "Santa Tereza de Goiás" - }, - "521970": { - "latitude": -14.32249961, - "longitude": -49.67265005, - "name": "Santa Terezinha de Goiás" - }, - "521971": { - "latitude": -17.5251732, - "longitude": -50.63061083, - "name": "Santo Antônio da Barra" - }, - "521973": { - "latitude": -16.47676878, - "longitude": -49.29409292, - "name": "Santo Antônio de Goiás" - }, - "521975": { - "latitude": -16.08497644, - "longitude": -48.28290738, - "name": "Santo Antônio do Descoberto" - }, - "521980": { - "latitude": -13.5340815, - "longitude": -46.48406486, - "name": "São Domingos" - }, - "521990": { - "latitude": -15.95132588, - "longitude": -49.255957, - "name": "São Francisco de Goiás" - }, - "522000": { - "latitude": -14.48561502, - "longitude": -47.42285095, - "name": "São João d'Aliança" - }, - "522005": { - "latitude": -16.81844291, - "longitude": -50.37288802, - "name": "São João da Paraúna" - }, - "522010": { - "latitude": -16.45552365, - "longitude": -50.37548755, - "name": "São Luís de Montes Belos" - }, - "522015": { - "latitude": -14.91621803, - "longitude": -49.27611219, - "name": "São Luiz do Norte" - }, - "522020": { - "latitude": -13.14524377, - "longitude": -50.24928215, - "name": "São Miguel do Araguaia" - }, - "522026": { - "latitude": -16.98952176, - "longitude": -48.66780267, - "name": "São Miguel do Passa Quatro" - }, - "522028": { - "latitude": -15.36689574, - "longitude": -49.82765217, - "name": "São Patrício" - }, - "522040": { - "latitude": -19.01091293, - "longitude": -50.59087213, - "name": "São Simão" - }, - "522045": { - "latitude": -16.70564436, - "longitude": -49.10775979, - "name": "Senador Canedo" - }, - "522050": { - "latitude": -18.2246371, - "longitude": -52.2119303, - "name": "Serranópolis" - }, - "522060": { - "latitude": -16.60673946, - "longitude": -48.55846701, - "name": "Silvânia" - }, - "522068": { - "latitude": -14.43256464, - "longitude": -46.58290432, - "name": "Simolândia" - }, - "522070": { - "latitude": -14.73553802, - "longitude": -46.23899605, - "name": "Sítio d'Abadia" - }, - "522100": { - "latitude": -16.04631282, - "longitude": -49.59577985, - "name": "Taquaral de Goiás" - }, - "522108": { - "latitude": -13.68247209, - "longitude": -47.23760568, - "name": "Teresina de Goiás" - }, - "522119": { - "latitude": -16.44283209, - "longitude": -49.07432691, - "name": "Terezópolis de Goiás" - }, - "522130": { - "latitude": -18.34418901, - "longitude": -47.78217347, - "name": "Três Ranchos" - }, - "522140": { - "latitude": -16.63895254, - "longitude": -49.54524159, - "name": "Trindade" - }, - "522145": { - "latitude": -13.42128682, - "longitude": -48.75421301, - "name": "Trombas" - }, - "522150": { - "latitude": -16.57719646, - "longitude": -50.13209846, - "name": "Turvânia" - }, - "522155": { - "latitude": -17.75455427, - "longitude": -50.31264286, - "name": "Turvelândia" - }, - "522157": { - "latitude": -14.14959129, - "longitude": -49.96611904, - "name": "Uirapuru" - }, - "522160": { - "latitude": -14.41937782, - "longitude": -49.09018726, - "name": "Uruaçu" - }, - "522170": { - "latitude": -15.57809805, - "longitude": -49.64338312, - "name": "Uruana" - }, - "522180": { - "latitude": -17.43598335, - "longitude": -48.19615268, - "name": "Urutaí" - }, - "522185": { - "latitude": -16.0845529, - "longitude": -47.98836193, - "name": "Valparaíso de Goiás" - }, - "522190": { - "latitude": -17.07803345, - "longitude": -49.6113973, - "name": "Varjão" - }, - "522200": { - "latitude": -16.81297896, - "longitude": -48.44180852, - "name": "Vianópolis" - }, - "522205": { - "latitude": -17.72457384, - "longitude": -49.872794, - "name": "Vicentinópolis" - }, - "522220": { - "latitude": -14.99357889, - "longitude": -47.06261646, - "name": "Vila Boa" - }, - "522230": { - "latitude": -15.2692031, - "longitude": -48.8145421, - "name": "Vila Propício" - }, - "530010": { - "latitude": -15.78116622, - "longitude": -47.79685087, - "name": "Brasília" - } - }, - "UF_name": { - "AC": "Acre", - "AL": "Alagoas", - "AP": "Amapá", - "AM": "Amazonas", - "BA": "Bahia", - "CE": "Ceará", - "DF": "Distrito Federal", - "ES": "Espírito Santo", - "GO": "Goiás", - "MA": "Maranhão", - "MT": "Mato Grosso", - "MS": "Mato Grosso do Sul", - "MG": "Minas Gerais", - "PA": "Pará", - "PB": "Paraíba", - "PR": "Paraná", - "PE": "Pernambuco", - "PI": "Piauí", - "RJ": "Rio de Janeiro", - "RN": "Rio Grande do Norte", - "RS": "Rio Grande do Sul", - "RO": "Rondônia", - "RR": "Roraima", - "SC": "Santa Catarina", - "SP": "São Paulo", - "SE": "Sergipe", - "TO": "Tocantins" - }, - "country_iso2": { - "afganistán": "AF", - "africa do sul": "ZA", - "albania": "AL", - "alemanha": "DE", - "andorra": "AD", - "angola": "AO", - "angola, republica de": "AO", - "anguila": "AI", - "antártida": "AQ", - "antigua y barbuda": "AG", - "arabia saudí": "SA", - "argelia": "DZ", - "argentina": "AR", - "armenia": "AM", - "aruba": "AW", - "australia": "AU", - "austria": "AT", - "azerbaiyán": "AZ", - "bahamas": "BS", - "bangladesh": "BD", - "barbados": "BB", - "baréin": "BH", - "bélgica": "BE", - "belice": "BZ", - "benín": "BJ", - "bermudas": "BM", - "bielorrusia": "BY", - "bolivia": "BO", - "bosnia y herzegovina": "BA", - "botsuana": "BW", - "brasil": "BR", - "brunéi": "BN", - "bulgaria": "BG", - "burkina faso": "BF", - "burundi": "BI", - "bután": "BT", - "cabo verde": "CV", - "camboya": "KH", - "camerún": "CM", - "canadá": "CA", - "caribe neerlandés": "BQ", - "catar": "QA", - "chad": "TD", - "chequia": "CZ", - "chile": "CL", - "china": "CN", - "china, republica popular": "CN", - "chipre": "CY", - "ciudad del vaticano": "VA", - "colombia": "CO", - "comoras": "KM", - "congo": "CG", - "corea del norte": "KP", - "coreia, republica da (coreia do sul)": "KR", - "costa rica": "CR", - "côte d’ivoire": "CI", - "croacia": "HR", - "cuba": "CU", - "curazao": "CW", - "dinamarca": "DK", - "dominica": "DM", - "ecuador": "EC", - "egito": "EG", - "el salvador": "SV", - "emirados arabes unidos": "AE", - "eritrea": "ER", - "eslovaquia": "SK", - "eslovenia": "SI", - "españa": "ES", - "espanha": "ES", - "estados unidos": "US", - "estado da palestina": "PS", - "ee.uu.": "US", - "estonia": "EE", - "esuatini": "SZ", - "etiopía": "ET", - "filipinas": "PH", - "finlandia": "FI", - "fiyi": "FJ", - "francia": "FR", - "franca": "FR", - "gabón": "GA", - "gambia": "GM", - "georgia": "GE", - "ghana": "GH", - "gibraltar": "GI", - "granada": "GD", - "grecia": "GR", - "groenlandia": "GL", - "guadalupe": "GP", - "guam": "GU", - "guatemala": "GT", - "guiana francesa": "GF", - "guernsey": "GG", - "guinea": "GN", - "guinea ecuatorial": "GQ", - "guinea-bisáu": "GW", - "guiana": "GY", - "haití": "HT", - "honduras": "HN", - "hungría": "HU", - "ilhas bahamas": "BS", - "india": "IN", - "indonesia": "ID", - "irak": "IQ", - "irán": "IR", - "irlanda": "IE", - "isla bouvet": "BV", - "isla de man": "IM", - "isla de navidad": "CX", - "isla norfolk": "NF", - "islandia": "IS", - "islas åland": "AX", - "islas caimán": "KY", - "islas cocos": "CC", - "islas cook": "CK", - "islas feroe": "FO", - "islas georgia del sur y sandwich del sur": "GS", - "islas heard y mcdonald": "HM", - "islas malvinas": "FK", - "islas marianas del norte": "MP", - "islas marshall": "MH", - "islas menores alejadas de ee. uu.": "UM", - "islas pitcairn": "PN", - "islas salomón": "SB", - "islas turcas y caicos": "TC", - "islas vírgenes británicas": "VG", - "islas vírgenes de ee. uu.": "VI", - "israel": "IL", - "italia": "IT", - "jamaica": "JM", - "japao": "JP", - "jersey": "JE", - "jordania": "JO", - "kazajistán": "KZ", - "kenia": "KE", - "kirguistán": "KG", - "kiribati": "KI", - "kuwait": "KW", - "laos": "LA", - "lesoto": "LS", - "letonia": "LV", - "líbano": "LB", - "liberia": "LR", - "libia": "LY", - "liechtenstein": "LI", - "lituania": "LT", - "luxemburgo": "LU", - "macedonia del norte": "MK", - "madagascar": "MG", - "malasia": "MY", - "malaui": "MW", - "maldivas": "MV", - "mali": "ML", - "malta": "MT", - "marrocos": "MA", - "martinica": "MQ", - "mauricio": "MU", - "mauritania": "MR", - "mayotte": "YT", - "méxico": "MX", - "micronesia": "FM", - "moldavia": "MD", - "mónaco": "MC", - "mongolia": "MN", - "montenegro": "ME", - "montserrat": "MS", - "mocambique": "MZ", - "myanmar (birmania)": "MM", - "namibia": "NA", - "nauru": "NR", - "nepal": "NP", - "nicaragua": "NI", - "níger": "NE", - "nigeria": "NG", - "niue": "NU", - "noruega": "NO", - "nueva caledonia": "NC", - "nueva zelanda": "NZ", - "omán": "OM", - "paises baixos (holanda)": "NL", - "pakistán": "PK", - "palaos": "PW", - "panamá": "PA", - "papúa nueva guinea": "PG", - "paraguay": "PY", - "paraguai": "PY", - "perú": "PE", - "polinesia francesa": "PF", - "polonia": "PL", - "portugal": "PT", - "puerto rico": "PR", - "rae de hong kong (china)": "HK", - "rae de macao (china)": "MO", - "reino unido": "GB", - "república centroafricana": "CF", - "república democrática del congo": "CD", - "república dominicana": "DO", - "reunión": "RE", - "ruanda": "RW", - "rumanía": "RO", - "russia, federacao da": "RU", - "sáhara occidental": "EH", - "samoa": "WS", - "samoa americana": "AS", - "san bartolomé": "BL", - "san cristóbal y nieves": "KN", - "san marino": "SM", - "san martín": "MF", - "san pedro y miquelón": "PM", - "san vicente y las granadinas": "VC", - "santa elena": "SH", - "santa lucía": "LC", - "santo tomé y príncipe": "ST", - "senegal": "SN", - "serbia": "RS", - "seychelles": "SC", - "sierra leona": "SL", - "singapur": "SG", - "sint maarten": "SX", - "siria": "SY", - "somalia": "SO", - "sri lanka": "LK", - "sudáfrica": "ZA", - "sudán": "SD", - "sudán del sur": "SS", - "suecia": "SE", - "suica": "CH", - "surinam": "SR", - "svalbard y jan mayen": "SJ", - "tailandia": "TH", - "taiwán": "TW", - "tanzania": "TZ", - "tayikistán": "TJ", - "territorio británico del océano índico": "IO", - "territorios australes franceses": "TF", - "territorios palestinos": "PS", - "timor-leste": "TL", - "togo": "TG", - "tokelau": "TK", - "tonga": "TO", - "trinidad y tobago": "TT", - "túnez": "TN", - "turkmenistán": "TM", - "turquia, republica da": "TR", - "tuvalu": "TV", - "ucrania": "UA", - "uganda": "UG", - "uruguai": "UY", - "uzbekistán": "UZ", - "vanuatu": "VU", - "venezuela": "VE", - "vietnam": "VN", - "wallis y futuna": "WF", - "yemen": "YE", - "yibuti": "DJ", - "zambia": "ZM", - "zimbabue": "ZW", - "afganistan": "AF", - "antartida": "AQ", - "antarctica": "AQ", - "arabia saudi": "SA", - "azerbaiyan": "AZ", - "banglades": "BD", - "barein": "BH", - "belgica": "BE", - "benin": "BJ", - "brunei": "BN", - "butan": "BT", - "camerun": "CM", - "canada": "CA", - "caribe neerlandes": "BQ", - "cote d'ivoire": "CI", - "emiratos arabes unidos": "AE", - "espana": "ES", - "etiopia": "ET", - "gabon": "GA", - "guinea-bisau": "GW", - "haiti": "HT", - "hungria": "HU", - "iran": "IR", - "islas aland": "AX", - "islas caiman": "KY", - "islas salomon": "SB", - "islas virgenes britanicas": "VG", - "islas virgenes de ee. uu.": "VI", - "japon": "JP", - "kazajistan": "KZ", - "kirguistan": "KG", - "libano": "LB", - "mexico": "MX", - "monaco": "MC", - "niger": "NE", - "oman": "OM", - "paises bajos": "NL", - "pakistan": "PK", - "panama": "PA", - "papua nueva guinea": "PG", - "peru": "PE", - "republica centroafricana": "CF", - "republica democratica del congo": "CD", - "republica dominicana": "DO", - "reunion": "RE", - "rumania": "RO", - "sahara occidental": "EH", - "san bartolome": "BL", - "san cristobal y nieves": "KN", - "san martin": "MF", - "san pedro y miquelon": "PM", - "santa lucia": "LC", - "santo tome y principe": "ST", - "sudafrica": "ZA", - "sudan": "SD", - "sudan del sur": "SS", - "taiwan": "TW", - "tayikistan": "TJ", - "territorio britanico del oceano indico": "IO", - "tunez": "TN", - "turkmenistan": "TM", - "turquia": "TR", - "uzbekistan": "UZ", - "república árabe siria": "SY", - "república de corea": "KR", - "arabia saudita": "SA", - "belarusia": "BY", - "estados unidos de américa": "US", - "estados unidos da america": "US", - "islas vírgenes de los estados unidos": "VI", - "federación de rusia": "RU", - "reino unido de gran bretaña e irlanda del norte": "GB", - "república docimincana": "DO", - "santa helena": "SH", - "veneuela": "VE", - "kenya": "KE", - "qatar": "QA", - "antillas neerlandesas": "BQ" - } -} - diff --git a/ingestion/functions/parsing/brazil_srag/input_event.json b/ingestion/functions/parsing/brazil_srag/input_event.json deleted file mode 100644 index 6cbe485e3..000000000 --- a/ingestion/functions/parsing/brazil_srag/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "manaus_test/content.csv", - "sourceUrl": "https://opendatasus.saude.gov.br/dataset/bd-srag-2021", - "sourceId": "607ea271a3dd860053555ff4" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/brazil_srag/sample_data.csv b/ingestion/functions/parsing/brazil_srag/sample_data.csv deleted file mode 100644 index eaf026b4f..000000000 --- a/ingestion/functions/parsing/brazil_srag/sample_data.csv +++ /dev/null @@ -1,5 +0,0 @@ -DT_NOTIFIC;SEM_NOT;DT_SIN_PRI;SEM_PRI;SG_UF_NOT;ID_REGIONA;CO_REGIONA;ID_MUNICIP;CO_MUN_NOT;ID_UNIDADE;CO_UNI_NOT;CS_SEXO;DT_NASC;NU_IDADE_N;TP_IDADE;COD_IDADE;CS_GESTANT;CS_RACA;CS_ESCOL_N;ID_PAIS;CO_PAIS;SG_UF;ID_RG_RESI;CO_RG_RESI;ID_MN_RESI;CO_MUN_RES;CS_ZONA;SURTO_SG;NOSOCOMIAL;AVE_SUINO;FEBRE;TOSSE;GARGANTA;DISPNEIA;DESC_RESP;SATURACAO;DIARREIA;VOMITO;OUTRO_SIN;OUTRO_DES;PUERPERA;FATOR_RISC;CARDIOPATI;HEMATOLOGI;SIND_DOWN;HEPATICA;ASMA;DIABETES;NEUROLOGIC;PNEUMOPATI;IMUNODEPRE;RENAL;OBESIDADE;OBES_IMC;OUT_MORBI;MORB_DESC;VACINA;DT_UT_DOSE;MAE_VAC;DT_VAC_MAE;M_AMAMENTA;DT_DOSEUNI;DT_1_DOSE;DT_2_DOSE;ANTIVIRAL;TP_ANTIVIR;OUT_ANTIV;DT_ANTIVIR;HOSPITAL;DT_INTERNA;SG_UF_INTE;ID_RG_INTE;CO_RG_INTE;ID_MN_INTE;CO_MU_INTE;UTI;DT_ENTUTI;DT_SAIDUTI;SUPORT_VEN;RAIOX_RES;RAIOX_OUT;DT_RAIOX;AMOSTRA;DT_COLETA;TP_AMOSTRA;OUT_AMOST;PCR_RESUL;DT_PCR;POS_PCRFLU;TP_FLU_PCR;PCR_FLUASU;FLUASU_OUT;PCR_FLUBLI;FLUBLI_OUT;POS_PCROUT;PCR_VSR;PCR_PARA1;PCR_PARA2;PCR_PARA3;PCR_PARA4;PCR_ADENO;PCR_METAP;PCR_BOCA;PCR_RINO;PCR_OUTRO;DS_PCR_OUT;CLASSI_FIN;CLASSI_OUT;CRITERIO;EVOLUCAO;DT_EVOLUCA;DT_ENCERRA;DT_DIGITA;HISTO_VGM;PAIS_VGM;CO_PS_VGM;LO_PS_VGM;DT_VGM;DT_RT_VGM;PCR_SARS2;PAC_COCBO;PAC_DSCBO;OUT_ANIM;DOR_ABD;FADIGA;PERD_OLFT;PERD_PALA;TOMO_RES;TOMO_OUT;DT_TOMO;TP_TES_AN;DT_RES_AN;RES_AN;POS_AN_FLU;TP_FLU_AN;POS_AN_OUT;AN_SARS2;AN_VSR;AN_PARA1;AN_PARA2;AN_PARA3;AN_ADENO;AN_OUTRO;DS_AN_OUT;TP_AM_SOR;SOR_OUT;DT_CO_SOR;TP_SOR;OUT_SOR;DT_RES;RES_IGG;RES_IGM;RES_IGA;ESTRANG;VACINA_COV;DOSE_1_COV;DOSE_2_COV;LAB_PR_COV;LOTE_1_COV;LOTE_2_COV;FNT_IN_COV -11/01/2021;2;03/01/2021;1;SP;GVE I CAPITAL;1331;SAO PAULO;355030;;2084341;M;21/12/1989;79;3;3079;6;1;;BRASIL;1;SP;GVE I CAPITAL;1331;SAO PAULO;355030;1;;;;;;;1;;1;;;1;QUEDA DO ESTADO GERAL, PROSTRA;;1;1;;;;;;;;;;;;1;;;;;;;;;;2;;;;1;11/01/2021;SP;GVE I CAPITAL;1331;SAO PAULO;355030;2;;;2;2;;10/01/2021;1;10/01/2021;1;;1;12/01/2021;2;;;;;;1;;;;;;;;;;;;5;;1;1;23/01/2021;18/01/2021;11/01/2021;0;;;;;;1;;;;;;;;5;;10/01/2021;;;4;;;;;;;;;;;;;;;;;;;;;;;13/8/2021;13/11/2021;;231123w2;231123w3; -10/01/2021;2;10/01/2021;2;SP;GVE XVII CAMPINAS;1342;CAMPINAS;350950;;2022877;F;15/11/1965;47;3;3047;5;2;9;BRASIL;1;SP;GVE XVII CAMPINAS;1342;CAMPINAS;350950;1;2;2;2;1;1;;1;1;1;;;;;;1;;;;;;;;1;;;;;;;2;;;;;;;;1;1;;;1;10/01/2021;SP;GVE XVII CAMPINAS;1342;CAMPINAS;350950;;;;2;2;;10/01/2021;1;10/01/2021;1;;2;18/01/2021;;;;;;;;;;;;;;;;;;;5;;1;9;;28/01/2021;11/01/2021;2;;;;;;;;;;;;;;;;;;;5;;;;;;;;;;;;;;;;;;;;;;;14/8/2021;;;245231;; -11/01/2021;2;05/01/2021;1;SC;FLORIANOPOLIS;1476;FLORIANOPOLIS;420540;;3157245;F;31/08/1981;90;3;3090;5;1;1;BRASIL;1;SC;FLORIANOPOLIS;1476;FLORIANOPOLIS;420540;1;;2;9;;;;;1;1;;;1;QEG, DIFICULDADE DEGLUTICAO;;1;;;;;1;;1;;;;;;1;;9;;;;;;;;9;;;;1;08/01/2021;SC;FLORIANOPOLIS;1476;FLORIANOPOLIS;420540;;;;2;;;;1;09/01/2021;1;;2;09/01/2021;;;;;;;;;;;;;;;;;;;5;;1;3;12/01/2021;13/01/2021;11/01/2021;0;;;;;;;;;;;;;;3;;08/01/2021;;;5;;;;;;;;;;;;;;;;;;;;;;;;;;;; -13/01/2021;2;09/01/2021;1;SP;GVE I CAPITAL;1331;SAO PAULO;355030;;2084341;F;15/2/1949;55;3;3055;5;1;;BRASIL;1;SP;GVE I CAPITAL;1331;SAO PAULO;355030;1;;;;1;1;1;1;1;1;2;2;9;;;1;1;;;;;1;;;;;;;;;;;;;;;;;2;;;;1;13/01/2021;SP;GVE VII SANTO ANDRE;1332;SANTO ANDRE;354780;2;;;2;;;;1;09/01/2021;1;;1;11/01/2021;2;;;;;;1;;;;;;;;;;;;5;;1;;;13/01/2021;13/01/2021;0;;;;;;1;;;;2;2;2;2;1;;13/01/2021;;;5;;;;;;;;;;;;;;;;;;;;;;;16/8/2021;25/12/2021;;13141ax2;151234i; diff --git a/ingestion/functions/parsing/brazil_srag/srag.py b/ingestion/functions/parsing/brazil_srag/srag.py deleted file mode 100644 index a7dc278aa..000000000 --- a/ingestion/functions/parsing/brazil_srag/srag.py +++ /dev/null @@ -1,489 +0,0 @@ -import os -import sys -from datetime import datetime -import csv -import json - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir, os.pardir, 'common')) - import parsing_lib - - -_AGE = "NU_IDADE_N" -_AGE_TYPE = "TP_IDADE" -_GENDER = "CS_SEXO" -_ETHNICITY = "CS_RACA" -_STATE = "SG_UF_NOT" -_MUNICIPALITY = "CO_MUN_NOT" -_DATE_CONFIRMED = "DT_NOTIFIC" -_COVID_CONFIRMED = "CLASSI_FIN" -_SEROLOGICAL_TEST_IGG = "RES_IGG" -_SEROLOGICAL_TEST_IGM = "RES_IGM" -_SEROLOGICAL_TEST_IGA = "RES_IGA" -_PCR_TEST = "PCR_SARS2" -_DATE_SYMPTOMS = "DT_SIN_PRI" -_PREGNANCY = "CS_GESTANT" -_FEVER = "FEBRE" -_COUGH = "TOSSE" -_SORE_THROAT = "GARGANTA" -_DYSPNEA = "DISPNEIA" -_BREATHING_DIFFICULTY = "DESC_RESP" -_LOW_OXYGEN = "SATURACAO" -_DIARRHOEA = "DIARREIA" -_VOMITING = "VOMITO" -_STOMACH_ACHE = "DOR_ABD" -_FATIGUE = "FADIGA" -_SMELL = "PERD_OLFT" -_TASTE = "PERD_PALA" -_HEART = "CARDIOPATI" -_HEMATOLOGIC = "HEMATOLOGI" -_DOWN_SYND = "SIND_DOWN" -_LIVER = "HEPATICA" -_ASTHMA = "ASMA" -_DIABETES = "DIABETES" -_NEUROLOGIC = "NEUROLOGIC" -_LUNG = "PNEUMOPATI" -_KIDNEY = "RENAL" -_OBESITY = "OBESIDADE" -_OTHER_COMORB = "MORB_DESC" -_HOSPITALIZED = "HOSPITAL" -_DATE_HOSP = "DT_INTERNA" -_ICU = "UTI" -_ICU_ENTRY = "DT_ENTUTI" -_ICU_DISCHARGE = "DT_SAIDUTI" -_OUTCOME = "EVOLUCAO" -_DATE_OUTCOME = "DT_EVOLUCA" -_BATCH_DOSE_1 = "LOTE_1_COV" -_BATCH_DOSE_2 = "LOTE_2_COV" -_DATE_DOSE_1 = "DOSE_1_COV" -_DATE_DOSE_2 = "DOSE_2_COV" -_TRAVEL_YN = "HISTO_VGM" -_TRAVEL_COUNTRY = "PAIS_VGM" -_TRAVEL_OUT = "DT_VGM" -_TRAVEL_RETURN = "DT_RT_VGM" - -_COMORBIDITIES_MAP = { - "DIABETES": "diabetes mellitus", - "CS_GESTANT": "pregnancy", - "RENAL": "chronic kidney disease", - "CARDIOPATI": "heart disease", - "OBESIDADE": "obesity", - "SIND_DOWN": "Down syndrome", - "HEPATICA": "liver disease", - "ASMA": "asthma", - "NEUROLOGIC": "nervous system disease", - "PNEUMOPATI": "respiratory system disease", -} - -_SYMPTOMS_MAP = { - "PERD_PALA": "taste alteration", - "PERD_OLFT": "smell alteration", - "GARGANTA": "throat pain", - "DISPNEIA": "dyspnea", - "FEBRE": "fever", - "TOSSE": "cough", - # According to symptom ontology, breathing difficulty is exact synonym of dyspnea - "DESC_RESP": "dyspnea", - "SATURACAO": "hypoxemia", - "DIARREIA": "diarrhoea", - "VOMITO": "vomiting", - "DOR_ABD": "abdominal discomfort", - "FADIGA": "fatigue" -} - -# 'UF_name' maps the UF (Unidade Federativa, admin level 1) codes to their respective names -# 'code_name_latlong' maps the municipality codes obtained from https://www.ibge.gov.br/en/geosciences/territorial-organization/territorial-meshes/2786-np-municipal-mesh/18890-municipal-mesh.html?=&t=acesso-ao-produto to respective name and lat/longs.The final digit is omitted as it is not included in the data. -# 'country_iso2' maps Spanish country names to their ISO-2 codes, and also includes common alternative spellings of country names as observed in data (e.g. lack of accents, common typos) -# 'country_translate_lat_long' maps country ISO-2 codes to longitude/latitude of country centroids, obtained from https://raw.githubusercontent.com/google/dspl/master/samples/google/canonical/countries.csv, as well as the corresponding country name in English -with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "dictionaries.json"), encoding='utf-8') as json_file: - dictionaries = json.load(json_file) - -_UF_NAME_MAP = dictionaries["UF_name"] - -_CODE_NAME_LATLONG = dictionaries["code_name_latlong"] - -_COUNTRY_ISO2_MAP = dictionaries["country_iso2"] - - -# Date function for ADI and mongoimport format -def convert_date(raw_date: str, reference_date=None, dataserver=True, adi = True): - """ - Convert raw date field into a value interpretable by the dataserver. - - Removing timestamp as always midnight. - - Set dataserver to False in order to return version appropriate for notes. - - Set adi to True to return version compatible with automated data ingestion - - Can supply a reference_date, so that any case with a date after this reference returns None - A reference date of midnight on Feb 21st would only return cases up to the end of Feb 20th - - Hospitalization dates are sometimes given as dates in the future, which aren't allowed - """ - today = datetime.now().date() - if adi is False: - if raw_date and datetime.strptime(raw_date, "%d/%m/%Y") < datetime.strptime(str(today), "%Y-%m-%d"): - date = datetime.strptime(raw_date, "%d/%m/%Y") - return {"$date": f"{date.isoformat()}Z"} - if not dataserver: - return date.strftime("%m/%d/%Y") - else: - if raw_date and datetime.strptime(raw_date, "%d/%m/%Y") < datetime.strptime(str(today), "%Y-%m-%d"): - date = datetime.strptime(raw_date, "%d/%m/%Y") - return date.strftime("%m/%d/%YZ") - - -def convert_vaccines(date_dose_1, date_dose_2, batch_dose_1, batch_dose_2): - vaccines = {} - if date_dose_1: - vaccines[0] = { - "date": convert_date(date_dose_1), - "batch": batch_dose_1 - } - if date_dose_2 and date_dose_2 != date_dose_1: - vaccines[1] = { - "date": convert_date(date_dose_2), - "batch": batch_dose_2 - } - if not vaccines: - return None - n_vaccines = max(vaccines) + 1 - # Ensure vaccines are listed in order - if list(range(n_vaccines)) == sorted(vaccines.keys()): - return [vaccines[i] for i in range(n_vaccines)] - else: - return None - - -def convert_location(state, municipality): - location = {} - geometry = {} - location["country"] = "Brazil" - location["administrativeAreaLevel1"] = _UF_NAME_MAP[state] - location["administrativeAreaLevel2"] = _CODE_NAME_LATLONG[municipality]["name"] - location["geoResolution"] = "Admin2" - location["name"] = ", ".join([_CODE_NAME_LATLONG[municipality]["name"], _UF_NAME_MAP[state], "Brazil"]) - - geometry["latitude"] = _CODE_NAME_LATLONG[municipality]["latitude"] - geometry["longitude"] = _CODE_NAME_LATLONG[municipality]["longitude"] - location["geometry"] = geometry - return location - - -def convert_gender(raw_gender: str): - if raw_gender == "M": - return "Male" - elif raw_gender == "F": - return "Female" - elif raw_gender == "I": - return "Other" - - -def convert_test(serological_igg, serological_igm, serological_iga, pcr): - if pcr == "1": - return "PCR test" - if any(i == "1" for i in [serological_igg, serological_igm, serological_iga]): - return "Serological test" - - -def convert_events(date_confirmed, date_symptoms, serological_igg, serological_igm, serological_iga, pcr, hospitalized, date_hospitalized, icu, date_icu_entry, date_icu_discharge, outcome, date_outcome): - events = [ - { - "name": "confirmed", - "dateRange": { - "start": convert_date(date_confirmed), - "end": convert_date(date_confirmed) - }, - "value": convert_test(serological_igg, serological_igm, serological_iga, pcr) - } - ] - if date_symptoms: - events.append( - { - "name": "onsetSymptoms", - "dateRange": { - "start": convert_date(date_symptoms), - "end": convert_date(date_symptoms) - }, - } - ) - if hospitalized == "1": - events.append( - { - "name": "hospitalAdmission", - "value": "Yes", - "dateRange": { - "start": convert_date(date_hospitalized), - "end": convert_date(date_hospitalized) - } - } - ) - elif hospitalized == "2": - events.append( - { - "name": "hospitalAdmission", - "value": "No" - } - ) - if icu == "1": - events.append( - { - "name": "icuAdmission", - "value": "Yes", - "dateRange": { - "start": convert_date(date_icu_entry), - "end": convert_date(date_icu_discharge) - } - } - ) - elif icu == "2": - events.append( - { - "name": "icuAdmission", - "value": "No" - } - ) - if outcome == "1": - events.append( - { - "name": "outcome", - "value": "Recovered", - "dateRange": { - "start": convert_date(date_outcome), - "end": convert_date(date_outcome) - } - } - ) - #outcome == 3 signifies death from other causes - elif outcome == "2" or outcome == "3": - events.append( - { - "name": "outcome", - "value": "Death", - "dateRange": { - "start": convert_date(date_outcome), - "end": convert_date(date_outcome) - } - } - ) - return events - - -def convert_symptoms(taste, smell, throat, dyspnea, fever, cough, diff_breathing, hypoxemia, diarrhoea, vomiting, abdominal, fatigue): - symptoms = {} - if any([i=="1" for i in [taste, smell, throat, dyspnea, fever, cough, diff_breathing, hypoxemia, diarrhoea, vomiting, abdominal, fatigue]]): - - symptoms["status"] = "Symptomatic" - values = [] - - if taste == "1": - values.append(_SYMPTOMS_MAP["PERD_PALA"]) - if smell == "1": - values.append(_SYMPTOMS_MAP["PERD_OLFT"]) - if throat == "1": - values.append(_SYMPTOMS_MAP["GARGANTA"]) - if dyspnea == "1": - values.append(_SYMPTOMS_MAP["DISPNEIA"]) - if fever == "1": - values.append(_SYMPTOMS_MAP["FEBRE"]) - if cough == "1": - values.append(_SYMPTOMS_MAP["TOSSE"]) - if diff_breathing == "1": - values.append(_SYMPTOMS_MAP["DESC_RESP"]) - if hypoxemia == "1": - values.append(_SYMPTOMS_MAP["SATURACAO"]) - if diarrhoea == "1": - values.append(_SYMPTOMS_MAP["DIARREIA"]) - if vomiting == "1": - values.append(_SYMPTOMS_MAP["VOMITO"]) - if abdominal == "1": - values.append(_SYMPTOMS_MAP["DOR_ABD"]) - if fatigue == "1": - values.append(_SYMPTOMS_MAP["FADIGA"]) - - if values: - #Remove possible duplicate dyspnea entry - symptoms["values"] = list(dict.fromkeys(values)) - - return symptoms - - -def convert_preexisting_conditions(diabetes, pregnancy, kidney, heart, obesity, down, liver, asthma, nervous, respiratory, other): - preexistingConditions = {} - values = [] - - if diabetes == "1": - values.append(_COMORBIDITIES_MAP["DIABETES"]) - if any([pregnancy == i for i in ["1", "2", "3", "4"]]): - values.append(_COMORBIDITIES_MAP["CS_GESTANT"]) - if kidney == "1": - values.append(_COMORBIDITIES_MAP["RENAL"]) - if heart == "1": - values.append(_COMORBIDITIES_MAP["CARDIOPATI"]) - if obesity == "1": - values.append(_COMORBIDITIES_MAP["OBESIDADE"]) - if down == "1": - values.append(_COMORBIDITIES_MAP["SIND_DOWN"]) - if liver == "1": - values.append(_COMORBIDITIES_MAP["HEPATICA"]) - if asthma == "1": - values.append(_COMORBIDITIES_MAP["ASMA"]) - if nervous == "1": - values.append(_COMORBIDITIES_MAP["NEUROLOGIC"]) - if respiratory == "1": - values.append(_COMORBIDITIES_MAP["PNEUMOPATI"]) - if other: - values.append(str('other comorbidity listed as: ' + other)) - - if values: - preexistingConditions["hasPreexistingConditions"] = True - preexistingConditions["values"] = values - return preexistingConditions - - -def convert_demographics(gender: str, age: str, age_type, ethnicity): - demo = {} - demo["gender"] = convert_gender(gender) - # 3 indicates an age in years - if age_type == "3": - demo["ageRange"] = {"start": float(age), "end": float(age)} - # 2 indicates an age in months - elif age_type == "2": - demo["ageRange"] = {"start": float(age)/12, "end": float(age)/12} - # 1 indicates an age in days; 365.25 is average number of days a year - elif age_type == "1": - demo["ageRange"] = {"start": float(age)/365.25, "end": float(age)/365.25} - demo["ethnicity"] = convert_ethnicity(ethnicity) - return demo - - -def convert_ethnicity(ethnicity: str): - if ethnicity == "2": - return "Black" - elif ethnicity == "4": - return "Mixed" - elif ethnicity == "3": - return "Asian" - elif ethnicity == "1": - return "White" - elif ethnicity == "5": - return "Indigenous" - - -def convert_travel(travel_yn, travel_country, travel_out, travel_in): - ''' - International travel within 14 days before symptoms appeared is recorded. - ''' - if travel_yn == "1": - travel = {} - travel_countries = [] - country_ISO2 = _COUNTRY_ISO2_MAP[travel_country.lower()] - travel_countries.append({"location": parsing_lib.geocode_country(country_ISO2)}) - travel["traveledPrior30Days"] = True - travel["travel"] = travel_countries - travel["dateRange"] = {"start": convert_date(travel_out), "end": convert_date(travel_in)} - if travel: - return travel - - -def convert_notes(outcome): - raw_notes = [] - if outcome == "3": - raw_notes.append("Patient died from other causes") - if raw_notes: - return (", ").join(raw_notes) - - -def parse_cases(raw_data_file: str, source_id: str, source_url: str): - """ - Parses G.h-format case data from raw API data. - """ - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f, delimiter=";") - for row in reader: - confirmation_date = convert_date(row[_DATE_CONFIRMED]) - if confirmation_date is not None and row[_COVID_CONFIRMED] == "5": - try: - case = { - "caseReference": {"sourceId": source_id, "sourceUrl": source_url}, - "location": convert_location(row[_STATE], row[_MUNICIPALITY]), - "events": convert_events( - row[_DATE_CONFIRMED], - row[_DATE_SYMPTOMS], - row[_SEROLOGICAL_TEST_IGG], - row[_SEROLOGICAL_TEST_IGM], - row[_SEROLOGICAL_TEST_IGA], - row[_PCR_TEST], - row[_HOSPITALIZED], - row[_DATE_HOSP], - row[_ICU], - row[_ICU_ENTRY], - row[_ICU_DISCHARGE], - row[_OUTCOME], - row[_DATE_OUTCOME] - ), - "symptoms": convert_symptoms( - row[_TASTE], - row[_SMELL], - row[_SORE_THROAT], - row[_DYSPNEA], - row[_FEVER], - row[_COUGH], - row[_BREATHING_DIFFICULTY], - row[_LOW_OXYGEN], - row[_DIARRHOEA], - row[_VOMITING], - row[_STOMACH_ACHE], - row[_FATIGUE], - ), - "demographics": convert_demographics( - row[_GENDER], row[_AGE], row[_AGE_TYPE], row[_ETHNICITY] - ), - "preexistingConditions": convert_preexisting_conditions( - row[_DIABETES], - row[_PREGNANCY], - row[_KIDNEY], - row[_HEART], - row[_OBESITY], - row[_DOWN_SYND], - row[_LIVER], - row[_ASTHMA], - row[_NEUROLOGIC], - row[_LUNG], - row[_OTHER_COMORB] - ), - "travelHistory": convert_travel( - row[_TRAVEL_YN], - row[_TRAVEL_COUNTRY], - row[_TRAVEL_OUT], - row[_TRAVEL_RETURN] - ) - } - notes = convert_notes( - row[_OUTCOME] - ) - if vaccines := convert_vaccines( - row[_DATE_DOSE_1], - row[_DATE_DOSE_2], - row[_BATCH_DOSE_1], - row[_BATCH_DOSE_2] - ): - case["vaccines"] = vaccines - if notes: - case["restrictedNotes"] = notes - yield case - except ValueError as ve: - raise ValueError(f"error converting case: {ve}") - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) diff --git a/ingestion/functions/parsing/brazil_srag/srag_test.py b/ingestion/functions/parsing/brazil_srag/srag_test.py deleted file mode 100644 index 72f7751c5..000000000 --- a/ingestion/functions/parsing/brazil_srag/srag_test.py +++ /dev/null @@ -1,203 +0,0 @@ -import os -import unittest - -from brazil_srag import srag - -_SOURCE_ID = "abc123" -_SOURCE_URL = "foo.bar" - -_EXPECTED = [ - { - "caseReference": {"sourceId": "abc123", "sourceUrl": "foo.bar"}, - "demographics": { - "ageRange": {"end": 79.0, "start": 79.0}, - "ethnicity": "White", - "gender": "Male", - }, - "events": [ - { - "dateRange": {"end": "01/11/2021Z", "start": "01/11/2021Z"}, - "name": "confirmed", - "value": "PCR test", - }, - { - "dateRange": {"end": "01/03/2021Z", "start": "01/03/2021Z"}, - "name": "onsetSymptoms", - }, - { - "dateRange": {"end": "01/11/2021Z", "start": "01/11/2021Z"}, - "name": "hospitalAdmission", - "value": "Yes", - }, - {"name": "icuAdmission", "value": "No"}, - { - "dateRange": {"end": "01/23/2021Z", "start": "01/23/2021Z"}, - "name": "outcome", - "value": "Recovered", - }, - ], - "location": { - "administrativeAreaLevel1": "São Paulo", - "administrativeAreaLevel2": "São Paulo", - "country": "Brazil", - "geoResolution": "Admin2", - "geometry": {"latitude": -23.65008109, "longitude": -46.64811076}, - "name": "São Paulo, São Paulo, Brazil", - }, - "preexistingConditions": { - "hasPreexistingConditions": True, - "values": ["heart disease"], - }, - "symptoms": {"status": "Symptomatic", "values": ["dyspnea", "hypoxemia"]}, - "travelHistory": None, - "vaccines": [ - {"batch": "231123w2", "date": "08/13/2021Z"}, - {"batch": "231123w3", "date": "11/13/2021Z"}, - ], - }, - { - "caseReference": {"sourceId": "abc123", "sourceUrl": "foo.bar"}, - "demographics": { - "ageRange": {"end": 47.0, "start": 47.0}, - "ethnicity": "Black", - "gender": "Female", - }, - "events": [ - { - "dateRange": {"end": "01/10/2021Z", "start": "01/10/2021Z"}, - "name": "confirmed", - "value": None, - }, - { - "dateRange": {"end": "01/10/2021Z", "start": "01/10/2021Z"}, - "name": "onsetSymptoms", - }, - { - "dateRange": {"end": "01/10/2021Z", "start": "01/10/2021Z"}, - "name": "hospitalAdmission", - "value": "Yes", - }, - ], - "location": { - "administrativeAreaLevel1": "São Paulo", - "administrativeAreaLevel2": "Campinas", - "country": "Brazil", - "geoResolution": "Admin2", - "geometry": {"latitude": -22.88376008, "longitude": -47.04379961}, - "name": "Campinas, São Paulo, Brazil", - }, - "preexistingConditions": { - "hasPreexistingConditions": True, - "values": ["respiratory system disease"], - }, - "symptoms": { - "status": "Symptomatic", - "values": ["dyspnea", "fever", "cough", "hypoxemia"], - }, - "travelHistory": None, - "vaccines": [{"batch": "245231", "date": "08/14/2021Z"}], - }, - { - "caseReference": {"sourceId": "abc123", "sourceUrl": "foo.bar"}, - "demographics": { - "ageRange": {"end": 90.0, "start": 90.0}, - "ethnicity": "White", - "gender": "Female", - }, - "events": [ - { - "dateRange": {"end": "01/11/2021Z", "start": "01/11/2021Z"}, - "name": "confirmed", - "value": None, - }, - { - "dateRange": {"end": "01/05/2021Z", "start": "01/05/2021Z"}, - "name": "onsetSymptoms", - }, - { - "dateRange": {"end": "01/08/2021Z", "start": "01/08/2021Z"}, - "name": "hospitalAdmission", - "value": "Yes", - }, - { - "dateRange": {"end": "01/12/2021Z", "start": "01/12/2021Z"}, - "name": "outcome", - "value": "Death", - }, - ], - "location": { - "administrativeAreaLevel1": "Santa Catarina", - "administrativeAreaLevel2": "Florianópolis", - "country": "Brazil", - "geoResolution": "Admin2", - "geometry": {"latitude": -27.57884066, "longitude": -48.50909204}, - "name": "Florianópolis, Santa Catarina, Brazil", - }, - "preexistingConditions": { - "hasPreexistingConditions": True, - "values": ["asthma", "nervous system disease"], - }, - "restrictedNotes": "Patient died from other causes", - "symptoms": {"status": "Symptomatic", "values": ["dyspnea", "hypoxemia"]}, - "travelHistory": None, - }, - { - "caseReference": {"sourceId": "abc123", "sourceUrl": "foo.bar"}, - "demographics": { - "ageRange": {"end": 55.0, "start": 55.0}, - "ethnicity": "White", - "gender": "Female", - }, - "events": [ - { - "dateRange": {"end": "01/13/2021Z", "start": "01/13/2021Z"}, - "name": "confirmed", - "value": "PCR test", - }, - { - "dateRange": {"end": "01/09/2021Z", "start": "01/09/2021Z"}, - "name": "onsetSymptoms", - }, - { - "dateRange": {"end": "01/13/2021Z", "start": "01/13/2021Z"}, - "name": "hospitalAdmission", - "value": "Yes", - }, - {"name": "icuAdmission", "value": "No"}, - ], - "location": { - "administrativeAreaLevel1": "São Paulo", - "administrativeAreaLevel2": "São Paulo", - "country": "Brazil", - "geoResolution": "Admin2", - "geometry": {"latitude": -23.65008109, "longitude": -46.64811076}, - "name": "São Paulo, São Paulo, Brazil", - }, - "preexistingConditions": { - "hasPreexistingConditions": True, - "values": ["diabetes mellitus", "heart disease"], - }, - "symptoms": { - "status": "Symptomatic", - "values": ["throat pain", "dyspnea", "fever", "cough", "hypoxemia"], - }, - "travelHistory": None, - "vaccines": [ - {"batch": "13141ax2", "date": "08/16/2021Z"}, - {"batch": "151234i", "date": "12/25/2021Z"}, - ], - }, -] - - -class BrazilSRAGTest(unittest.TestCase): - def setUp(self): - # Default of 1500 is not enough to show diffs when there is one. - self.maxDiff = 10000 - - def test_parse(self): - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = srag.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), _EXPECTED) diff --git a/ingestion/functions/parsing/canada/__init__.py b/ingestion/functions/parsing/canada/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/canada/canada.py b/ingestion/functions/parsing/canada/canada.py deleted file mode 100644 index 3fb9bcb01..000000000 --- a/ingestion/functions/parsing/canada/canada.py +++ /dev/null @@ -1,125 +0,0 @@ -import csv -import json -import os -import sys -import re -from datetime import date, datetime - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib -# Input format: -# 1. '60-69' -> {"start": 60, "end": 69} -# 2. '<10' -> {"start": 0, "end": 10} -# 3. '>90' -> {"start": 90, "end": 10} -# 4. '90+' -> {"start": 90} -def convert_age(raw_age): - if len(raw_age) == 0: - return None - if raw_age[0] == '<': - return { "start": 0 , "end": int(raw_age[1:]) } - if raw_age[0] == '>': - return { "start": int(raw_age[1:]) } - if raw_age.endswith('+'): - return { "start": int(raw_age[:-1]) } - segments = raw_age.split("-") - if len(segments) != 2: - return None - return { "start": int(segments[0]) , "end": int(segments[1]) } - -def convert_location(health_region, province, country): - terms = [] - if country == "Not Reported": - raise ValueError("Country is not reported") - if health_region != "Not Reported": - terms.append(health_region) - if province != "Not Reported": - terms.append(province) - terms.append(country) - return {"query": ", ".join(terms)} - -# dd-mm-yyyy -> %m/%d/%Y -def convert_date(raw): - return datetime.strftime(datetime.strptime(raw, "%d-%m-%Y"), "%m/%d/%Y") - -def additional_sources(case_source, additional_source): - def parse(source): - if len(source) == 0: - return None - segments = source.split(";") - # The url might be (1) https://abc.def or [1] https://abc.def. - rtn = [] - for segment in segments: - rst = re.findall(r"(http.*)", segment) - if len(rst) != 0: - rtn.append(rst[0].strip()) - return rtn - return parse(case_source) + parse(additional_source) - -def convert_travel(s): - if len(s) == 0: - return {"travelledPrior30Days": False} - travel = [{"location": {"query": country.strip()}} for country in s.split(",")] - if len(travel) == 0: - return {"travelledPrior30Days": False} - else: - return {"travelledPrior30Days": True, "travel": travel} - -def parse_cases(raw_data_file, source_id, source_url): - """ - Parses G.h-format case data from raw API data. - """ - - def parse_csv_line(row): - """ - Parse one csv line within the csv file. - """ - - date_report = convert_date(row["date_report"]) - - return { - "caseReference": { - "sourceId": source_id, - "sourceEntryId": row["case_id"], - "sourceUrl": source_url, - "additionalSources": additional_sources(row["case_source"], row["additional_source"]) - }, - "location": convert_location(row["health_region"], row["province"], row["country"]), - "travelHistory": convert_travel(row["travel_history_country"]), - "events": [ - { - "name": "confirmed", - "dateRange": - { - "start": date_report, - "end": date_report - } - } - ], - "demographics": { - "ageRange": convert_age(row["age"]), - "gender": row["sex"] if row["sex"] in ('Male', 'Female') else None, - }, - "notes": row["additional_info"] if len(row["additional_info"]) > 0 else None - } - - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f) - return [parse_csv_line(row) for row in reader] - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) \ No newline at end of file diff --git a/ingestion/functions/parsing/canada/canada_test.py b/ingestion/functions/parsing/canada/canada_test.py deleted file mode 100644 index 1015a0384..000000000 --- a/ingestion/functions/parsing/canada/canada_test.py +++ /dev/null @@ -1,77 +0,0 @@ -import json -import os -import pytest -import tempfile - -from datetime import date - -_SOURCE_ID = "abc123" -_SOURCE_URL = "https://foo.bar" -_PARSED_CASE = ({ - "caseReference": { - "sourceId": - _SOURCE_ID, - "sourceEntryId": - "1", - "sourceUrl": - _SOURCE_URL, - "additionalSources": [ - "https://news.ontario.ca/mohltc/en/2020/01/ontario-confirms-first-case-of-wuhan-novel-coronavirus.html", - "https://globalnews.ca/news/6497313/coronavirus-timeine-cases-canada/", - "https://globalnews.ca/news/6462626/coronavirus-toronto-hospital/", - "http://abc.xyz" - ] - }, - "location": { - "query": "Toronto, Ontario, Canada" - }, - "travelHistory": { - "travelledPrior30Days": - True, - "travel": [{ - "location": { - "query": "Japan" - } - }, { - "location": { - "query": "China" - } - }] - }, - "events": [{ - "name": "confirmed", - "dateRange": { - "start": "01/25/2020", - "end": "01/25/2020" - } - }], - "demographics": { - "ageRange": { - "start": 50, - "end": 59 - }, - "gender": "Male" - }, - "notes": - None -}) - - -@pytest.fixture() -def sample_data(): - """Loads sample source data from file.""" - current_dir = os.path.dirname(__file__) - file_path = os.path.join(current_dir, "sample_data.csv") - with open(file_path) as event_file: - return event_file.read() - - -def test_parse_cases_converts_fields_to_ghdsi_schema(sample_data): - from canada import canada # Import locally to avoid superseding mock - fd, fname = tempfile.mkstemp() - with os.fdopen(fd, "w") as f: - f.write(sample_data) - f.flush() - - result, = canada.parse_cases(fname, _SOURCE_ID, _SOURCE_URL) - assert result == _PARSED_CASE diff --git a/ingestion/functions/parsing/canada/input_event.json b/ingestion/functions/parsing/canada/input_event.json deleted file mode 100644 index 7c5d3684e..000000000 --- a/ingestion/functions/parsing/canada/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "sourceUrl": "https://raw.githubusercontent.com/ishaberry/Covid19Canada/master/cases.csv", - "s3Key": "5f596b7cb48729003fb4aca6/2020/09/10/0248/content.csv", - "sourceId": "5f596b7cb48729003fb4aca6" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/canada/sample_data.csv b/ingestion/functions/parsing/canada/sample_data.csv deleted file mode 100644 index 8974d55cc..000000000 --- a/ingestion/functions/parsing/canada/sample_data.csv +++ /dev/null @@ -1,2 +0,0 @@ -"case_id","provincial_case_id","age","sex","health_region","province","country","date_report","report_week","travel_yn","travel_history_country","locally_acquired","case_source","additional_info","additional_source","method_note" -1,1,"50-59","Male","Toronto","Ontario","Canada","25-01-2020","19-01-2020","1","Japan, China","","(1) https://news.ontario.ca/mohltc/en/2020/01/ontario-confirms-first-case-of-wuhan-novel-coronavirus.html ;(2) https://globalnews.ca/news/6497313/coronavirus-timeine-cases-canada/; (3) https://globalnews.ca/news/6462626/coronavirus-toronto-hospital/","","http://abc.xyz",0 \ No newline at end of file diff --git a/ingestion/functions/parsing/ch_zurich/__init__.py b/ingestion/functions/parsing/ch_zurich/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/ch_zurich/input_event.json b/ingestion/functions/parsing/ch_zurich/input_event.json deleted file mode 100644 index 08635dd52..000000000 --- a/ingestion/functions/parsing/ch_zurich/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "5f6863d78a4a5200342cd2da/2020/09/21/0827/content.csv", - "sourceUrl": "https://github.com/openZH/covid_19/blob/master/fallzahlen_kanton_alter_geschlecht_csv/COVID19_Fallzahlen_Kanton_ZH_altersklassen_geschlecht.csv", - "sourceId": "5f6863d78a4a5200342cd2da" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/ch_zurich/sample_data.csv b/ingestion/functions/parsing/ch_zurich/sample_data.csv deleted file mode 100644 index 2ee305e3c..000000000 --- a/ingestion/functions/parsing/ch_zurich/sample_data.csv +++ /dev/null @@ -1,6 +0,0 @@ -Week,Year,Area,AgeYearCat,Gender,NewConfCases,NewDeaths,Source -9,2020,Canton_ZH,0-9,F,1,0,https://gd.zh.ch/internet/gesundheitsdirektion/de/themen/coronavirus.html -9,2020,Canton_ZH,0-9,M,1,0,https://gd.zh.ch/internet/gesundheitsdirektion/de/themen/coronavirus.html -9,2020,Canton_ZH,100+,F,1,0,https://gd.zh.ch/internet/gesundheitsdirektion/de/themen/coronavirus.html -11,2020,Canton_ZH,60-69,unbekannt,1,0,https://gd.zh.ch/internet/gesundheitsdirektion/de/themen/coronavirus.html -11,2020,Canton_ZH,42,M,1,0,https://gd.zh.ch/internet/gesundheitsdirektion/de/themen/coronavirus.html diff --git a/ingestion/functions/parsing/ch_zurich/zurich.py b/ingestion/functions/parsing/ch_zurich/zurich.py deleted file mode 100644 index 4b1e928eb..000000000 --- a/ingestion/functions/parsing/ch_zurich/zurich.py +++ /dev/null @@ -1,126 +0,0 @@ -import json -import os -import sys -from datetime import datetime -import csv -import common.ingestion_logging as logging - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - -logger = logging.getLogger(__name__) - -# Fixed location, all cases are for the canton of Zurich in Switzerland. -_LOCATION = { - "country": "Switzerland", - "administrativeAreaLevel1": "Zurich", - "geoResolution": "Admin1", - "name": "Zurich canton", - "geometry": { - "longitude": 8.651071, - "latitude": 47.42568 - } -} - -_GENDER_MAP = {"M": "Male", "F": "Female"} - -def convert_date(year: str, week: str): - """ - Convert raw date field into a value interpretable by the dataserver. - - The date is given by year and week number, the date filtering API - expects mm/dd/YYYYZ format so we use the first day of the given week. - """ - date = datetime.fromisocalendar(int(year), int(week), 1) - return date.strftime("%m/%d/%YZ") - - -def convert_demographics(gender: str, age: str): - demo = {} - if gender.lower() != 'unbekannt': - demo["gender"] = _GENDER_MAP.get(gender.upper(), None) - if age != 'unbekannt': - # 100+ - if age.endswith("+"): - demo["ageRange"] = { - "start": int(age[:-1]), - "end": 120, - } - # 45-55 - elif '-' in age: - start, _, end = age.partition('-') - demo["ageRange"] = { - "start": int(start), - "end": int(end), - } - # 42 - elif age.isdigit(): - demo["ageRange"] = { - "start": int(age), - "end": int(age), - } - return demo or None - - -def parse_cases(raw_data_file: str, source_id: str, source_url: str): - """ - Parses G.h-format case data from raw API data. - - Some caveats: - 1. There are no patient ID/case ID in the raw API so we aren't able - to dedupe. - 2. We can't link confirmed cases and confirmed deaths because of (1) - so we're only importing confirmed cases and ignoring deaths. - 3. Granularity for cases is weekly, not daily so we use the first day of - the given week arbitrarily. - """ - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f) - for row in reader: - num_confirmed_cases = int(row['NewConfCases']) - if not num_confirmed_cases: - continue - try: - when = convert_date(row["Year"], row["Week"]) - case = { - "caseReference": { - "sourceId": source_id, - "sourceUrl": source_url - }, - "location": _LOCATION, - "events": [ - { - "name": "confirmed", - "dateRange": - { - "start": when, - "end": when, - }, - }, - ], - "demographics": convert_demographics( - row['Gender'], row['AgeYearCat']), - } - for _ in range(num_confirmed_cases): - yield case - except ValueError as ve: - logger.error(ve) - - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/ch_zurich/zurich_test.py b/ingestion/functions/parsing/ch_zurich/zurich_test.py deleted file mode 100644 index 3dda2d721..000000000 --- a/ingestion/functions/parsing/ch_zurich/zurich_test.py +++ /dev/null @@ -1,63 +0,0 @@ -import os -import unittest - -from ch_zurich import zurich - -_SOURCE_ID = "abc123" -_SOURCE_URL = ( - "https://gd.zh.ch/internet/gesundheitsdirektion/de/themen/coronavirus.html" -) - - -def _c(confirmed_date, gender, age_start, age_end): - c = { - "caseReference": { - "sourceId": _SOURCE_ID, - "sourceUrl": _SOURCE_URL, - }, - "location": { - "country": "Switzerland", - "administrativeAreaLevel1": "Zurich", - "geoResolution": "Admin1", - "name": "Zurich canton", - "geometry": { - "longitude": 8.651071, - "latitude": 47.42568, - }, - }, - "events": [ - { - "name": "confirmed", - "dateRange": {"start": confirmed_date, "end": confirmed_date}, - }, - ], - "demographics": { - "ageRange": { - "start": age_start, - "end": age_end, - }, - }, - } - if gender: - c["demographics"]["gender"] = gender - return c - - -_PARSED_CASES = [ - _c("02/24/2020Z", "Female", 0, 9), - _c("02/24/2020Z", "Male", 0, 9), - _c("02/24/2020Z", "Female", 100, 120), - _c("03/09/2020Z", None, 60, 69), - _c("03/09/2020Z", "Male", 42, 42), -] - - -class CHZurichTest(unittest.TestCase): - def test_parse(self): - # Default of 1500 is not enough to show diffs when there is one. - self.maxDiff = 5000 - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = zurich.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), _PARSED_CASES) diff --git a/ingestion/functions/parsing/colombia/__init__.py b/ingestion/functions/parsing/colombia/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/colombia/colombia.py b/ingestion/functions/parsing/colombia/colombia.py deleted file mode 100644 index 34fabe0e0..000000000 --- a/ingestion/functions/parsing/colombia/colombia.py +++ /dev/null @@ -1,319 +0,0 @@ -import os -import sys -from datetime import datetime -import csv -import json -import common.ingestion_logging as logging - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir, os.pardir, 'common')) - import parsing_lib - -logger = logging.getLogger(__name__) - -with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "geocoding_dictionaries.json")) as json_file: - geocoding_dictionaries = json.load(json_file) - -mun_code_coord = geocoding_dictionaries['mun_code_coord'] -mun_code_place_name = geocoding_dictionaries['mun_code_place_name'] -spanish_country_code_dict = geocoding_dictionaries['spanish_country_code_dict'] - - -def convert_date(raw_date: str, dataserver=True): - """ - Convert raw date field into a value interpretable by the dataserver. - - Removing timestamp as always midnight. - - Set dataserver to False in order to return version appropriate for notes. - """ - date = datetime.strptime(raw_date.split(' ')[0], "%Y-%m-%d") - if not dataserver: - return date.strftime("%m/%d/%Y") - return date.strftime("%m/%d/%YZ") - - -def convert_gender(raw_gender): - if raw_gender == "M": - return "Male" - if raw_gender == "F": - return "Female" - return None - - -def get_location(raw_entry): - ''' - Uses a dict mapping based on common municipality code of lookup table ('MPIO_CCNCT') and source dataset ('Código DIVIPOLA municipio') - ''' - try: - long, lat = mun_code_coord[raw_entry['Código DIVIPOLA municipio']][1:] - geometry = {'latitude': lat, - 'longitude': long} - mun, dep = mun_code_place_name[raw_entry['Código DIVIPOLA municipio']] - place_name = f"{mun}, {dep}, Colombia" - - location = {} - location["country"] = "Colombia" - location["geoResolution"] = "Admin2" - location["name"] = place_name - location["geometry"] = geometry - location["administrativeAreaLevel1"] = dep - location["administrativeAreaLevel2"] = mun - - return location - - except BaseException: - logger.error(raw_entry) - return None - - -def get_travel_history_location(raw_entry): - country_spanish = raw_entry['Nombre del país'] - - try: - iso2 = spanish_country_code_dict[country_spanish.lower()] - return parsing_lib.geocode_country(iso2) - except BaseException: - logger.error(country_spanish) - - -def convert_demographics(entry): - ''' - This takes a whole row, and returns Age, Gender and Ethnicity in a dictionary. - Age is given as an int, but the adjacent field, 'Age Measurement Unit', determines what this int represents. - 1 = Years; 2 = Months; 3 = Days - ''' - - ethnicity_map = {'1': 'Indigenous', - '2': 'ROM', - '3': 'Raizal', - '4': 'Palenquero', - '5': 'Black', - '6': 'Other'} - - demo = {} - if entry['Edad']: - if str(entry['Unidad de medida de edad']) == '1': - demo["ageRange"] = { - "start": float(entry['Edad']), - "end": float(entry['Edad']) - } - elif str(entry['Unidad de medida de edad']) == '2': - demo["ageRange"] = { - "start": float(entry['Edad']) / 12, - "end": float(entry['Edad']) / 12 - } - elif str(entry['Unidad de medida de edad']) == '3': - demo["ageRange"] = { - "start": float(entry['Edad']) / 365, - "end": float(entry['Edad']) / 365 - } - if entry['Sexo']: - demo["gender"] = convert_gender(entry['Sexo']) - - if entry['Pertenencia étnica']: - ethnicity = ethnicity_map.get(str(entry['Pertenencia étnica']), "") - if entry['Nombre del grupo étnico']: - ethnicity += f", {entry['Nombre del grupo étnico']}" - else: - ethnicity = 'Unknown' - demo["ethnicity"] = ethnicity - - return demo or None - - -def parse_cases(raw_data_file, source_id, source_url): - """ - Parses G.h-format case data from raw API data. - - Caveats: - - Assuming the date confirmed is the date of diagnosis (Fecha diagnostico) rather than - Fecha de notificación (generally several days earlier). When date of diagnosis, using date reported online as proxy. - - - Case can have date of death, but 'Recuperado' column says recovered. This corresponds to patients who died but - not from Covid-19. - - - Notes added include date reported online and date that SIVIGILA (national health alert system) was notiifed. - Also whether case was imported, and how patient recovery was confirmed. - - - Tipo recuperación refers to how they decided the patient had recovered: either by 21 days elapsing since - symptoms, or a negative PCR/antigen test - - - No dates for travel history, only distinction is between cases of type: 'Importado' vs. 'Relacionado'. - We assume cases listed as importado (imported) have travelled in the last 30 days, and geocode their country of origin. - - """ - - symptom_map = {'leve': 'Mild', - 'moderado': 'Moderate', - 'grave': 'Serious'} - - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f) - for entry in reader: - location = get_location(entry) - if entry["Fecha de diagnóstico"]: - confirmation_date = convert_date(entry["Fecha de diagnóstico"]) - else: - confirmation_date = convert_date(entry["fecha reporte web"]) - if location and confirmation_date: - notes = [] - case = { - "caseReference": { - "sourceId": source_id, - "sourceEntryId": entry["ID de caso"], - "sourceUrl": source_url - }, - "location": location, - "demographics": convert_demographics(entry) - } - - if entry["Fecha de diagnóstico"]: - case["events"] = [ - { - "name": "confirmed", - "dateRange": - { - "start": confirmation_date, - "end": confirmation_date - } - }, - ] - else: - case["events"] = [ - { - "name": "confirmed", - "dateRange": - { - "start": confirmation_date, - "end": confirmation_date - } - }, - ] - notes.append( - "No Date of Diagnosis provided, so using Date Reported Online (fecha reporte web) as a proxy. This is normally approx. 1 week later.") - - # If patient was symptomatic, mark date of onsetSymptoms, - # otherwise asymptomatic - if entry["Fecha de inicio de síntomas"]: - case["symptoms"] = { - "status": "Symptomatic", - } - case["events"].append({ - "name": "onsetSymptoms", - "dateRange": { - "start": convert_date(entry['Fecha de inicio de síntomas']), - "end": convert_date(entry['Fecha de inicio de síntomas']), - } - }) - - else: - case["symptoms"] = { - "status": "Asymptomatic", - } - - # Patient Outcome - If patient died, mark date - if entry["Fecha de muerte"]: - case["events"].append({ - "name": "outcome", - "value": "Death", - "dateRange": { - "start": convert_date(entry['Fecha de muerte']), - "end": convert_date(entry['Fecha de muerte']), - } - }) - if entry["Recuperado"].lower() != "fallecido": - notes.append( - "Died from something other than Covid-19.") - - elif entry["Recuperado"].lower() == "recuperado": - case["events"].append({ - "name": "outcome", - "value": "Recovered", - "dateRange": { - "start": convert_date(entry['Fecha de recuperación']), - "end": convert_date(entry['Fecha de recuperación']), - } - }) - - elif entry['Recuperado'].lower() == 'activo': - notes.append('Case still active') - - if entry["Ubicación del caso"].lower() == "hospital": - case["events"].append({ - "name": "hospitalAdmission", - "value": "Yes" - }) - if entry["Ubicación del caso"].lower() == 'hospital uci': - case["events"].append({ - "name": "icuAdmission", - "value": "Yes" - }) - - if entry["Ubicación del caso"].lower() == 'casa': - notes.append( - "Patient self-isolated and recovered at home.") - - # Add travelHistory and notes for imported cases - we currently do not have any travel dates, - # so unknown whether in last 30 days, assuming YES - if entry["Tipo de contagio"].lower() == "importado": - if entry['Nombre del país']: - country_of_origin = entry['Nombre del país'] - case["travelHistory"] = { - "traveledPrior30Days": True, - "travel": [ - { - "location": get_travel_history_location(entry) - }] - } - notes.append( - f"Case is reported as importing the disease into Colombia, and country of origin is {entry['Nombre del país']}.") - else: - notes.append( - f"Case is reported as importing the disease into Colombia, but country of origin is not specified") - elif entry["Tipo de contagio"].lower() == 'relacionado': - notes.append("Case was transmitted within Colombia.") - elif entry["Tipo de contagio"].lower() == 'en estudio': - notes.append( - "Case transmission under investigation (currently unknown).") - - # Include severity of symptoms - if entry["Estado"].lower() in symptom_map.keys(): - notes.append( - f"Symptom severity was {symptom_map.get(entry['Estado'].lower())}") - - if entry['fecha reporte web']: - notes.append( - f"Date reported online was {convert_date(entry['fecha reporte web'],dataserver=False)}.") - if entry['Fecha de notificación']: - notes.append( - f"Date reported to SIVIGILA was {convert_date(entry['Fecha de notificación'],dataserver=False)}.") - - if entry['Tipo de recuperación'] == 'PCR': - notes.append( - f"Patient recovery was confirmed by a negative PCR test.") - elif entry['Tipo de recuperación'] == 'Tiempo': - notes.append( - f"Patient recovery was confirmed by 21 days elapsing with no symptoms.") - - if notes: - case["notes"] = ", ".join(notes) - - yield case - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/colombia/colombia_test.py b/ingestion/functions/parsing/colombia/colombia_test.py deleted file mode 100644 index 8198569ee..000000000 --- a/ingestion/functions/parsing/colombia/colombia_test.py +++ /dev/null @@ -1,513 +0,0 @@ -import os -import unittest -from colombia import colombia - - -_SOURCE_ID = "placeholder_ID" -_SOURCE_URL = "placeholder_URL" - - -class ColombiaTest(unittest.TestCase): - def setUp(self): - self.maxDiff = 150000 - - def test_parse(self): - ''' - Includes imported and internally transmitted cases - ''' - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - result = colombia.parse_cases( - sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual( - list(result), - [{'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '1', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'Colombia', - 'geoResolution': 'Admin2', - 'name': 'BOGOTÁ, D.C., BOGOTÁ, D.C., Colombia', - 'geometry': {'latitude': 4.31610770770964, 'longitude': -74.1810727121648}, - 'administrativeAreaLevel1': 'BOGOTÁ, D.C.', - 'administrativeAreaLevel2': 'BOGOTÁ, D.C.'}, - 'demographics': {'ageRange': {'start': 19.0, 'end': 19.0}, - 'gender': 'Female', - 'ethnicity': 'Other'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '03/06/2020Z', 'end': '03/06/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '02/27/2020Z', 'end': '02/27/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '03/13/2020Z', 'end': '03/13/2020Z'}}], - 'symptoms': {'status': 'Symptomatic'}, - 'travelHistory': {'traveledPrior30Days': True, - 'travel': [{'location': {'country': 'IT', - 'geoResolution': 'Country', - 'name': 'Italy', - 'geometry': {'latitude': 41.87194, 'longitude': 12.56738}}}]}, - 'notes': 'Patient self-isolated and recovered at home., Case is reported as importing the disease into Colombia, and country of origin is ITALIA., Symptom severity was Mild, Date reported online was 03/06/2020., Date reported to SIVIGILA was 03/02/2020., Patient recovery was confirmed by a negative PCR test.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '2', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'Colombia', - 'geoResolution': 'Admin2', - 'name': 'BUGA, VALLE DEL CAUCA, Colombia', - 'geometry': {'latitude': 3.85524552901928, 'longitude': -76.1051444045495}, - 'administrativeAreaLevel1': 'VALLE DEL CAUCA', - 'administrativeAreaLevel2': 'BUGA'}, - 'demographics': {'ageRange': {'start': 34.0, 'end': 34.0}, - 'gender': 'Male', - 'ethnicity': 'Black'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '03/09/2020Z', 'end': '03/09/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '03/04/2020Z', 'end': '03/04/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '03/19/2020Z', 'end': '03/19/2020Z'}}], - 'symptoms': {'status': 'Symptomatic'}, - 'travelHistory': {'traveledPrior30Days': True, - 'travel': [{'location': {'country': 'ES', - 'geoResolution': 'Country', - 'name': 'Spain', - 'geometry': {'latitude': 40.463667, 'longitude': -3.74922}}}]}, - 'notes': 'Patient self-isolated and recovered at home., Case is reported as importing the disease into Colombia, and country of origin is ESPAÑA., Symptom severity was Mild, Date reported online was 03/09/2020., Date reported to SIVIGILA was 03/06/2020., Patient recovery was confirmed by a negative PCR test.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '3', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'Colombia', - 'geoResolution': 'Admin2', - 'name': 'MEDELLÍN, ANTIOQUIA, Colombia', - 'geometry': {'latitude': 6.25759027927781, 'longitude': -75.6110318154478}, - 'administrativeAreaLevel1': 'ANTIOQUIA', - 'administrativeAreaLevel2': 'MEDELLÍN'}, - 'demographics': {'ageRange': {'start': 50.0, 'end': 50.0}, - 'gender': 'Female', - 'ethnicity': 'Other'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '03/09/2020Z', 'end': '03/09/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '02/29/2020Z', 'end': '02/29/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '03/15/2020Z', 'end': '03/15/2020Z'}}], - 'symptoms': {'status': 'Symptomatic'}, - 'travelHistory': {'traveledPrior30Days': True, - 'travel': [{'location': {'country': 'ES', - 'geoResolution': 'Country', - 'name': 'Spain', - 'geometry': {'latitude': 40.463667, 'longitude': -3.74922}}}]}, - 'notes': 'Patient self-isolated and recovered at home., Case is reported as importing the disease into Colombia, and country of origin is ESPAÑA., Symptom severity was Mild, Date reported online was 03/09/2020., Date reported to SIVIGILA was 03/07/2020., Patient recovery was confirmed by a negative PCR test.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '4', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'Colombia', - 'geoResolution': 'Admin2', - 'name': 'MEDELLÍN, ANTIOQUIA, Colombia', - 'geometry': {'latitude': 6.25759027927781, 'longitude': -75.6110318154478}, - 'administrativeAreaLevel1': 'ANTIOQUIA', - 'administrativeAreaLevel2': 'MEDELLÍN'}, - 'demographics': {'ageRange': {'start': 55.0, 'end': 55.0}, - 'gender': 'Male', - 'ethnicity': 'Other'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '03/11/2020Z', 'end': '03/11/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '03/06/2020Z', 'end': '03/06/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '03/26/2020Z', 'end': '03/26/2020Z'}}], - 'symptoms': {'status': 'Symptomatic'}, - 'notes': 'Patient self-isolated and recovered at home., Case was transmitted within Colombia., Symptom severity was Mild, Date reported online was 03/11/2020., Date reported to SIVIGILA was 03/09/2020., Patient recovery was confirmed by a negative PCR test.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '5', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'Colombia', - 'geoResolution': 'Admin2', - 'name': 'MEDELLÍN, ANTIOQUIA, Colombia', - 'geometry': {'latitude': 6.25759027927781, 'longitude': -75.6110318154478}, - 'administrativeAreaLevel1': 'ANTIOQUIA', - 'administrativeAreaLevel2': 'MEDELLÍN'}, - 'demographics': {'ageRange': {'start': 25.0, 'end': 25.0}, - 'gender': 'Male', - 'ethnicity': 'Other'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '03/11/2020Z', 'end': '03/11/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '03/08/2020Z', 'end': '03/08/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '03/23/2020Z', 'end': '03/23/2020Z'}}], - 'symptoms': {'status': 'Symptomatic'}, - 'notes': 'Patient self-isolated and recovered at home., Case was transmitted within Colombia., Symptom severity was Mild, Date reported online was 03/11/2020., Date reported to SIVIGILA was 03/09/2020., Patient recovery was confirmed by a negative PCR test.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '6', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'Colombia', - 'geoResolution': 'Admin2', - 'name': 'ITAGÜÍ, ANTIOQUIA, Colombia', - 'geometry': {'latitude': 6.17927953587734, 'longitude': -75.614203758093}, - 'administrativeAreaLevel1': 'ANTIOQUIA', - 'administrativeAreaLevel2': 'ITAGÜÍ'}, - 'demographics': {'ageRange': {'start': 27.0, 'end': 27.0}, - 'gender': 'Female', - 'ethnicity': 'Other'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '03/11/2020Z', 'end': '03/11/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '03/06/2020Z', 'end': '03/06/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '03/26/2020Z', 'end': '03/26/2020Z'}}], - 'symptoms': {'status': 'Symptomatic'}, - 'notes': 'Patient self-isolated and recovered at home., Case was transmitted within Colombia., Symptom severity was Mild, Date reported online was 03/11/2020., Date reported to SIVIGILA was 03/10/2020., Patient recovery was confirmed by a negative PCR test.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '7', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'Colombia', - 'geoResolution': 'Admin2', - 'name': 'CARTAGENA DE INDIAS, BOLÍVAR, Colombia', - 'geometry': {'latitude': 10.4634301173375, 'longitude': -75.4588996435526}, - 'administrativeAreaLevel1': 'BOLÍVAR', - 'administrativeAreaLevel2': 'CARTAGENA DE INDIAS'}, - 'demographics': {'ageRange': {'start': 85.0, 'end': 85.0}, - 'gender': 'Female', - 'ethnicity': 'Other'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '03/11/2020Z', 'end': '03/11/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '03/02/2020Z', 'end': '03/02/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '03/17/2020Z', 'end': '03/17/2020Z'}}], - 'symptoms': {'status': 'Symptomatic'}, - 'travelHistory': {'traveledPrior30Days': True, - 'travel': [{'location': {'country': 'US', - 'geoResolution': 'Country', - 'name': 'United States', - 'geometry': {'latitude': 37.09024, 'longitude': -95.712891}}}]}, - 'notes': 'Patient self-isolated and recovered at home., Case is reported as importing the disease into Colombia, and country of origin is ESTADOS UNIDOS DE AMÉRICA., Symptom severity was Mild, Date reported online was 03/11/2020., Date reported to SIVIGILA was 03/08/2020., Patient recovery was confirmed by a negative PCR test.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '8', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'Colombia', - 'geoResolution': 'Admin2', - 'name': 'BOGOTÁ, D.C., BOGOTÁ, D.C., Colombia', - 'geometry': {'latitude': 4.31610770770964, 'longitude': -74.1810727121648}, - 'administrativeAreaLevel1': 'BOGOTÁ, D.C.', - 'administrativeAreaLevel2': 'BOGOTÁ, D.C.'}, - 'demographics': {'ageRange': {'start': 22.0, 'end': 22.0}, - 'gender': 'Female', - 'ethnicity': 'Other'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '03/11/2020Z', 'end': '03/11/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '03/06/2020Z', 'end': '03/06/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '03/21/2020Z', 'end': '03/21/2020Z'}}], - 'symptoms': {'status': 'Symptomatic'}, - 'travelHistory': {'traveledPrior30Days': True, - 'travel': [{'location': {'country': 'ES', - 'geoResolution': 'Country', - 'name': 'Spain', - 'geometry': {'latitude': 40.463667, 'longitude': -3.74922}}}]}, - 'notes': 'Patient self-isolated and recovered at home., Case is reported as importing the disease into Colombia, and country of origin is ESPAÑA., Symptom severity was Mild, Date reported online was 03/11/2020., Date reported to SIVIGILA was 03/09/2020., Patient recovery was confirmed by a negative PCR test.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '9', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'Colombia', - 'geoResolution': 'Admin2', - 'name': 'BOGOTÁ, D.C., BOGOTÁ, D.C., Colombia', - 'geometry': {'latitude': 4.31610770770964, 'longitude': -74.1810727121648}, - 'administrativeAreaLevel1': 'BOGOTÁ, D.C.', - 'administrativeAreaLevel2': 'BOGOTÁ, D.C.'}, - 'demographics': {'ageRange': {'start': 28.0, 'end': 28.0}, - 'gender': 'Female', - 'ethnicity': 'Other'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '03/11/2020Z', 'end': '03/11/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '03/07/2020Z', 'end': '03/07/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '03/23/2020Z', 'end': '03/23/2020Z'}}], - 'symptoms': {'status': 'Symptomatic'}, - 'travelHistory': {'traveledPrior30Days': True, - 'travel': [{'location': {'country': 'ES', - 'geoResolution': 'Country', - 'name': 'Spain', - 'geometry': {'latitude': 40.463667, 'longitude': -3.74922}}}]}, - 'notes': 'Patient self-isolated and recovered at home., Case is reported as importing the disease into Colombia, and country of origin is ESPAÑA., Symptom severity was Mild, Date reported online was 03/11/2020., Date reported to SIVIGILA was 03/08/2020., Patient recovery was confirmed by a negative PCR test.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '10', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'Colombia', - 'geoResolution': 'Admin2', - 'name': 'BOGOTÁ, D.C., BOGOTÁ, D.C., Colombia', - 'geometry': {'latitude': 4.31610770770964, 'longitude': -74.1810727121648}, - 'administrativeAreaLevel1': 'BOGOTÁ, D.C.', - 'administrativeAreaLevel2': 'BOGOTÁ, D.C.'}, - 'demographics': {'ageRange': {'start': 36.0, 'end': 36.0}, - 'gender': 'Female', - 'ethnicity': 'Other'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '03/12/2020Z', 'end': '03/12/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '03/06/2020Z', 'end': '03/06/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '03/21/2020Z', 'end': '03/21/2020Z'}}], - 'symptoms': {'status': 'Symptomatic'}, - 'travelHistory': {'traveledPrior30Days': True, - 'travel': [{'location': {'country': 'ES', - 'geoResolution': 'Country', - 'name': 'Spain', - 'geometry': {'latitude': 40.463667, 'longitude': -3.74922}}}]}, - 'notes': 'Patient self-isolated and recovered at home., Case is reported as importing the disease into Colombia, and country of origin is ESPAÑA., Symptom severity was Mild, Date reported online was 03/12/2020., Date reported to SIVIGILA was 03/12/2020., Patient recovery was confirmed by a negative PCR test.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '11', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'Colombia', - 'geoResolution': 'Admin2', - 'name': 'BOGOTÁ, D.C., BOGOTÁ, D.C., Colombia', - 'geometry': {'latitude': 4.31610770770964, 'longitude': -74.1810727121648}, - 'administrativeAreaLevel1': 'BOGOTÁ, D.C.', - 'administrativeAreaLevel2': 'BOGOTÁ, D.C.'}, - 'demographics': {'ageRange': {'start': 42.0, 'end': 42.0}, - 'gender': 'Female', - 'ethnicity': 'Other'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '03/12/2020Z', 'end': '03/12/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '03/06/2020Z', 'end': '03/06/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '03/31/2020Z', 'end': '03/31/2020Z'}}], - 'symptoms': {'status': 'Symptomatic'}, - 'travelHistory': {'traveledPrior30Days': True, - 'travel': [{'location': {'country': 'ES', - 'geoResolution': 'Country', - 'name': 'Spain', - 'geometry': {'latitude': 40.463667, 'longitude': -3.74922}}}]}, - 'notes': 'Patient self-isolated and recovered at home., Case is reported as importing the disease into Colombia, and country of origin is ESPAÑA., Symptom severity was Mild, Date reported online was 03/12/2020., Date reported to SIVIGILA was 03/11/2020., Patient recovery was confirmed by a negative PCR test.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '12', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'Colombia', - 'geoResolution': 'Admin2', - 'name': 'NEIVA, HUILA, Colombia', - 'geometry': {'latitude': 2.99336002479853, 'longitude': -75.272362338162}, - 'administrativeAreaLevel1': 'HUILA', - 'administrativeAreaLevel2': 'NEIVA'}, - 'demographics': {'ageRange': {'start': 74.0, 'end': 74.0}, - 'gender': 'Female', - 'ethnicity': 'Other'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '03/12/2020Z', 'end': '03/12/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '03/06/2020Z', 'end': '03/06/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '04/09/2020Z', 'end': '04/09/2020Z'}}], - 'symptoms': {'status': 'Symptomatic'}, - 'travelHistory': {'traveledPrior30Days': True, - 'travel': [{'location': {'country': 'IT', - 'geoResolution': 'Country', - 'name': 'Italy', - 'geometry': {'latitude': 41.87194, 'longitude': 12.56738}}}]}, - 'notes': 'Patient self-isolated and recovered at home., Case is reported as importing the disease into Colombia, and country of origin is ITALIA., Symptom severity was Mild, Date reported online was 03/12/2020., Date reported to SIVIGILA was 03/10/2020., Patient recovery was confirmed by a negative PCR test.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '13', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'Colombia', - 'geoResolution': 'Admin2', - 'name': 'NEIVA, HUILA, Colombia', - 'geometry': {'latitude': 2.99336002479853, 'longitude': -75.272362338162}, - 'administrativeAreaLevel1': 'HUILA', - 'administrativeAreaLevel2': 'NEIVA'}, - 'demographics': {'ageRange': {'start': 68.0, 'end': 68.0}, - 'gender': 'Female', - 'ethnicity': 'Other'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '03/12/2020Z', 'end': '03/12/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '03/06/2020Z', 'end': '03/06/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '03/30/2020Z', 'end': '03/30/2020Z'}}], - 'symptoms': {'status': 'Symptomatic'}, - 'notes': 'Patient self-isolated and recovered at home., Case was transmitted within Colombia., Symptom severity was Mild, Date reported online was 03/12/2020., Date reported to SIVIGILA was 03/10/2020., Patient recovery was confirmed by a negative PCR test.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '14', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'Colombia', - 'geoResolution': 'Admin2', - 'name': 'PALMIRA, VALLE DEL CAUCA, Colombia', - 'geometry': {'latitude': 3.5583916329393, 'longitude': -76.2278025103617}, - 'administrativeAreaLevel1': 'VALLE DEL CAUCA', - 'administrativeAreaLevel2': 'PALMIRA'}, - 'demographics': {'ageRange': {'start': 48.0, 'end': 48.0}, - 'gender': 'Male', - 'ethnicity': 'Black'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '03/13/2020Z', 'end': '03/13/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '03/07/2020Z', 'end': '03/07/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '03/21/2020Z', 'end': '03/21/2020Z'}}], - 'symptoms': {'status': 'Symptomatic'}, - 'travelHistory': {'traveledPrior30Days': True, - 'travel': [{'location': {'country': 'ES', - 'geoResolution': 'Country', - 'name': 'Spain', - 'geometry': {'latitude': 40.463667, 'longitude': -3.74922}}}]}, - 'notes': 'Patient self-isolated and recovered at home., Case is reported as importing the disease into Colombia, and country of origin is ESPAÑA., Symptom severity was Mild, Date reported online was 03/13/2020., Date reported to SIVIGILA was 03/10/2020., Patient recovery was confirmed by a negative PCR test.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '15', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'Colombia', - 'geoResolution': 'Admin2', - 'name': 'VILLAVICENCIO, META, Colombia', - 'geometry': {'latitude': 4.09166560580672, 'longitude': -73.4929036676635}, - 'administrativeAreaLevel1': 'META', - 'administrativeAreaLevel2': 'VILLAVICENCIO'}, - 'demographics': {'ageRange': {'start': 30.0, 'end': 30.0}, - 'gender': 'Female', - 'ethnicity': 'Other'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '03/13/2020Z', 'end': '03/13/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '03/09/2020Z', 'end': '03/09/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '03/23/2020Z', 'end': '03/23/2020Z'}}], - 'symptoms': {'status': 'Symptomatic'}, - 'travelHistory': {'traveledPrior30Days': True, - 'travel': [{'location': {'country': 'ES', - 'geoResolution': 'Country', - 'name': 'Spain', - 'geometry': {'latitude': 40.463667, 'longitude': -3.74922}}}]}, - 'notes': 'Patient self-isolated and recovered at home., Case is reported as importing the disease into Colombia, and country of origin is ESPAÑA., Symptom severity was Mild, Date reported online was 03/13/2020., Date reported to SIVIGILA was 03/13/2020., Patient recovery was confirmed by a negative PCR test.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '16', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'Colombia', - 'geoResolution': 'Admin2', - 'name': 'BOGOTÁ, D.C., BOGOTÁ, D.C., Colombia', - 'geometry': {'latitude': 4.31610770770964, 'longitude': -74.1810727121648}, - 'administrativeAreaLevel1': 'BOGOTÁ, D.C.', - 'administrativeAreaLevel2': 'BOGOTÁ, D.C.'}, - 'demographics': {'ageRange': {'start': 61.0, 'end': 61.0}, - 'gender': 'Female', - 'ethnicity': 'Black'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '03/13/2020Z', 'end': '03/13/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '03/08/2020Z', 'end': '03/08/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '03/23/2020Z', 'end': '03/23/2020Z'}}], - 'symptoms': {'status': 'Symptomatic'}, - 'travelHistory': {'traveledPrior30Days': True, - 'travel': [{'location': {'country': 'IT', - 'geoResolution': 'Country', - 'name': 'Italy', - 'geometry': {'latitude': 41.87194, 'longitude': 12.56738}}}]}, - 'notes': 'Patient self-isolated and recovered at home., Case is reported as importing the disease into Colombia, and country of origin is ITALIA., Symptom severity was Mild, Date reported online was 03/13/2020., Date reported to SIVIGILA was 03/11/2020., Patient recovery was confirmed by a negative PCR test.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '17', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'Colombia', - 'geoResolution': 'Admin2', - 'name': 'BOGOTÁ, D.C., BOGOTÁ, D.C., Colombia', - 'geometry': {'latitude': 4.31610770770964, 'longitude': -74.1810727121648}, - 'administrativeAreaLevel1': 'BOGOTÁ, D.C.', - 'administrativeAreaLevel2': 'BOGOTÁ, D.C.'}, - 'demographics': {'ageRange': {'start': 73.0, 'end': 73.0}, - 'gender': 'Female', - 'ethnicity': 'Other'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '03/14/2020Z', 'end': '03/14/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '02/28/2020Z', 'end': '02/28/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '03/14/2020Z', 'end': '03/14/2020Z'}}], - 'symptoms': {'status': 'Symptomatic'}, - 'travelHistory': {'traveledPrior30Days': True, - 'travel': [{'location': {'country': 'ES', - 'geoResolution': 'Country', - 'name': 'Spain', - 'geometry': {'latitude': 40.463667, 'longitude': -3.74922}}}]}, - 'notes': 'Patient self-isolated and recovered at home., Case is reported as importing the disease into Colombia, and country of origin is ESPAÑA., Symptom severity was Mild, Date reported online was 03/14/2020., Date reported to SIVIGILA was 03/11/2020., Patient recovery was confirmed by a negative PCR test.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '18', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'Colombia', - 'geoResolution': 'Admin2', - 'name': 'BOGOTÁ, D.C., BOGOTÁ, D.C., Colombia', - 'geometry': {'latitude': 4.31610770770964, 'longitude': -74.1810727121648}, - 'administrativeAreaLevel1': 'BOGOTÁ, D.C.', - 'administrativeAreaLevel2': 'BOGOTÁ, D.C.'}, - 'demographics': {'ageRange': {'start': 54.0, 'end': 54.0}, - 'gender': 'Male', - 'ethnicity': 'Other'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '03/14/2020Z', 'end': '03/14/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '03/07/2020Z', 'end': '03/07/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '04/07/2020Z', 'end': '04/07/2020Z'}}], - 'symptoms': {'status': 'Symptomatic'}, - 'travelHistory': {'traveledPrior30Days': True, - 'travel': [{'location': {'country': 'ES', - 'geoResolution': 'Country', - 'name': 'Spain', - 'geometry': {'latitude': 40.463667, 'longitude': -3.74922}}}]}, - 'notes': 'Patient self-isolated and recovered at home., Case is reported as importing the disease into Colombia, and country of origin is ESPAÑA., Symptom severity was Mild, Date reported online was 03/14/2020., Date reported to SIVIGILA was 03/11/2020., Patient recovery was confirmed by 21 days elapsing with no symptoms.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '19', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'Colombia', - 'geoResolution': 'Admin2', - 'name': 'BOGOTÁ, D.C., BOGOTÁ, D.C., Colombia', - 'geometry': {'latitude': 4.31610770770964, 'longitude': -74.1810727121648}, - 'administrativeAreaLevel1': 'BOGOTÁ, D.C.', - 'administrativeAreaLevel2': 'BOGOTÁ, D.C.'}, - 'demographics': {'ageRange': {'start': 54.0, 'end': 54.0}, - 'gender': 'Female', - 'ethnicity': 'Other'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '03/14/2020Z', 'end': '03/14/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '03/09/2020Z', 'end': '03/09/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '03/24/2020Z', 'end': '03/24/2020Z'}}], - 'symptoms': {'status': 'Symptomatic'}, - 'notes': 'Patient self-isolated and recovered at home., Case was transmitted within Colombia., Symptom severity was Mild, Date reported online was 03/14/2020., Date reported to SIVIGILA was 03/12/2020., Patient recovery was confirmed by a negative PCR test.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '20', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'Colombia', - 'geoResolution': 'Admin2', - 'name': 'MEDELLÍN, ANTIOQUIA, Colombia', - 'geometry': {'latitude': 6.25759027927781, 'longitude': -75.6110318154478}, - 'administrativeAreaLevel1': 'ANTIOQUIA', - 'administrativeAreaLevel2': 'MEDELLÍN'}, - 'demographics': {'ageRange': {'start': 26.0, 'end': 26.0}, - 'gender': 'Female', - 'ethnicity': 'Other'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '03/14/2020Z', 'end': '03/14/2020Z'}}, - {'name': 'onsetSymptoms', - 'dateRange': {'start': '03/09/2020Z', 'end': '03/09/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '03/24/2020Z', 'end': '03/24/2020Z'}}], - 'symptoms': {'status': 'Symptomatic'}, - 'notes': 'Patient self-isolated and recovered at home., Case was transmitted within Colombia., Symptom severity was Mild, Date reported online was 03/14/2020., Date reported to SIVIGILA was 03/11/2020., Patient recovery was confirmed by a negative PCR test.'}]) diff --git a/ingestion/functions/parsing/colombia/geocoding_dictionaries.json b/ingestion/functions/parsing/colombia/geocoding_dictionaries.json deleted file mode 100644 index 63dcb49a4..000000000 --- a/ingestion/functions/parsing/colombia/geocoding_dictionaries.json +++ /dev/null @@ -1,10431 +0,0 @@ -{ - "mun_code_coord": { - "5002": [ - "ABEJORRAL", - -75.4384735263005, - 5.80372815468004 - ], - "5004": [ - "ABRIAQU\u00cd", - -76.0859775574324, - 6.62756937505525 - ], - "5021": [ - "ALEJANDR\u00cdA", - -75.0905970228711, - 6.36553412507763 - ], - "5030": [ - "AMAG\u00c1", - -75.7080030979362, - 6.03292199335545 - ], - "5034": [ - "ANDES", - -75.9245910122075, - 5.62395229594614 - ], - "5036": [ - "ANGEL\u00d3POLIS", - -75.7159496619688, - 6.12143030160661 - ], - "5038": [ - "ANGOSTURA", - -75.3583157941328, - 6.86149884037343 - ], - "5040": [ - "ANOR\u00cd", - -75.1084895370243, - 7.19311077625728 - ], - "5044": [ - "ANZ\u00c1", - -75.912590869277, - 6.30804025736744 - ], - "5055": [ - "ARGELIA", - -75.0946979571591, - 5.70811452622031 - ], - "5059": [ - "ARMENIA", - -75.8099552800928, - 6.16368375645894 - ], - "5091": [ - "BETANIA", - -75.9868910733463, - 5.72708128466894 - ], - "5093": [ - "BETULIA", - -75.9564924608851, - 6.18578361009647 - ], - "5101": [ - "CIUDAD BOL\u00cdVAR", - -76.0106525252865, - 5.84099566491665 - ], - "5107": [ - "BRICE\u00d1O", - -75.5622347345711, - 7.11178845859606 - ], - "5113": [ - "BURITIC\u00c1", - -75.9120659435771, - 6.80906488679415 - ], - "5120": [ - "C\u00c1CERES", - -75.2236974381288, - 7.66515510211354 - ], - "5125": [ - "CAICEDO", - -75.9935149779565, - 6.42346363646328 - ], - "5134": [ - "CAMPAMENTO", - -75.2876617766858, - 7.03601747596039 - ], - "5142": [ - "CARACOL\u00cd", - -74.7335481748635, - 6.3379738814853 - ], - "5145": [ - "CARAMANTA", - -75.6308209650548, - 5.55527529639301 - ], - "5148": [ - "EL CARMEN DE VIBORAL", - -75.2635361033781, - 5.97807884199601 - ], - "5150": [ - "CAROLINA", - -75.3059063046834, - 6.75482154438106 - ], - "5172": [ - "CHIGOROD\u00d3", - -76.6396421187895, - 7.6316656367309 - ], - "5190": [ - "CISNEROS", - -75.082541146251, - 6.55006546899437 - ], - "5197": [ - "COCORN\u00c1", - -75.1601540345634, - 6.0055930748229 - ], - "5206": [ - "CONCEPCI\u00d3N", - -75.2178590139513, - 6.3761061867979 - ], - "5209": [ - "CONCORDIA", - -75.9001467822964, - 6.05746867716262 - ], - "5237": [ - "DON MAT\u00cdAS", - -75.3668305113615, - 6.50541152331681 - ], - "5250": [ - "EL BAGRE", - -74.6642772618984, - 7.70463334931552 - ], - "5264": [ - "ENTRERRIOS", - -75.5591308318663, - 6.59465600199361 - ], - "5282": [ - "FREDONIA", - -75.6792624194154, - 5.88770293345884 - ], - "5284": [ - "FRONTINO", - -76.3319975784482, - 6.6913639636367 - ], - "5306": [ - "GIRALDO", - -75.9480466248778, - 6.66309586005552 - ], - "5313": [ - "GRANADA", - -75.1276364640264, - 6.12338072169691 - ], - "5318": [ - "GUARNE", - -75.4373088263984, - 6.26662585794293 - ], - "5321": [ - "GUATAP\u00c9", - -75.1585189243412, - 6.24577560970049 - ], - "5347": [ - "HELICONIA", - -75.7497100180622, - 6.2145117871239 - ], - "5353": [ - "HISPANIA", - -75.9066920282748, - 5.79703900145696 - ], - "5361": [ - "ITUANGO", - -75.8503510523525, - 7.30294625504107 - ], - "5368": [ - "JERIC\u00d3", - -75.7648825559844, - 5.76982053577591 - ], - "5390": [ - "LA PINTADA", - -75.6022020609364, - 5.74658395827615 - ], - "5400": [ - "LA UNI\u00d3N", - -75.3542902286723, - 5.94043468578788 - ], - "5425": [ - "MACEO", - -74.714108541333, - 6.53457358674075 - ], - "5440": [ - "MARINILLA", - -75.3048793301241, - 6.18520515028809 - ], - "5467": [ - "MONTEBELLO", - -75.5197269271648, - 5.91685390321978 - ], - "5483": [ - "NARI\u00d1O", - -75.194570188247, - 5.58127531400566 - ], - "5495": [ - "NECH\u00cd", - -74.7924214892378, - 7.99046767595981 - ], - "5501": [ - "OLAYA", - -75.775670967043, - 6.611418080732 - ], - "5541": [ - "PE\u00d1OL", - -75.223509055881, - 6.23239636815691 - ], - "5543": [ - "PEQUE", - -75.8896884303506, - 7.04418005453638 - ], - "5576": [ - "PUEBLORRICO", - -75.8607666658922, - 5.80970185967824 - ], - "5579": [ - "PUERTO BERR\u00cdO", - -74.5287421030021, - 6.48192226875113 - ], - "5585": [ - "PUERTO NARE", - -74.7031772202434, - 6.12653914119864 - ], - "5591": [ - "PUERTO TRIUNFO", - -74.6861918013718, - 5.95483015279963 - ], - "5604": [ - "REMEDIOS", - -74.5586565191238, - 6.99726737484467 - ], - "5607": [ - "RETIRO", - -75.5157380454, - 6.05344425402124 - ], - "5628": [ - "SABANALARGA", - -75.7922275314788, - 6.90100050302449 - ], - "5642": [ - "SALGAR", - -75.9813725102711, - 5.97050233238352 - ], - "5647": [ - "SAN ANDR\u00c8S", - -75.6657757969543, - 6.91842722988868 - ], - "5649": [ - "SAN CARLOS", - -74.9073276915979, - 6.19378966057354 - ], - "5652": [ - "SAN FRANCISCO", - -74.976032638865, - 5.87950561942046 - ], - "5658": [ - "SAN JOS\u00c9 DE LA MONTA\u00d1A", - -75.6777082600405, - 6.8232589099981 - ], - "5659": [ - "SAN JUAN DE URAB\u00c1", - -76.5324823326043, - 8.70714157319171 - ], - "5660": [ - "SAN LUIS", - -74.9620054993574, - 6.01451682122204 - ], - "5664": [ - "SAN PEDRO", - -75.5624837248611, - 6.45866648865399 - ], - "5665": [ - "SAN PEDRO DE URABA", - -76.3166422892741, - 8.37915688518111 - ], - "5667": [ - "SAN RAFAEL", - -74.998586517378, - 6.31074453073218 - ], - "5670": [ - "SAN ROQUE", - -74.931858814472, - 6.44867515919491 - ], - "5674": [ - "SAN VICENTE", - -75.3274016280479, - 6.31038752153208 - ], - "5679": [ - "SANTA B\u00c1RBARA", - -75.583303711205, - 5.87898495603356 - ], - "5697": [ - "SANTUARIO", - -75.2521227766901, - 6.12420949511092 - ], - "5736": [ - "SEGOVIA", - -74.621639262973, - 7.26692338972055 - ], - "5756": [ - "SONS\u00d3N", - -75.0593590491524, - 5.76250368215749 - ], - "5761": [ - "SOPETR\u00c1N", - -75.7458090307843, - 6.52016454968241 - ], - "5789": [ - "T\u00c1MESIS", - -75.7097997437487, - 5.67375857107083 - ], - "5790": [ - "TARAZ\u00c1", - -75.4018943738744, - 7.48887599431281 - ], - "5792": [ - "TARSO", - -75.8287114426849, - 5.87106455630297 - ], - "5809": [ - "TITIRIB\u00cd", - -75.7996600461353, - 6.05834996999485 - ], - "5842": [ - "URAMITA", - -76.1331851868454, - 6.91391498344373 - ], - "5854": [ - "VALDIVIA", - -75.4009450124975, - 7.26540421035128 - ], - "5856": [ - "VALPARA\u00cdSO", - -75.6308341244265, - 5.6519378021739 - ], - "5858": [ - "VEGACH\u00cd", - -74.7540302035354, - 6.83653512219284 - ], - "5861": [ - "VENECIA", - -75.7772242258579, - 5.95657635469058 - ], - "5885": [ - "YALI", - -74.7556500206882, - 6.7168706797595 - ], - "5887": [ - "YARUMAL", - -75.4543995968985, - 6.98813077356953 - ], - "5890": [ - "YOLOMB\u00d3", - -74.9227533807498, - 6.64532583793877 - ], - "5895": [ - "ZARAGOZA", - -74.8584832567332, - 7.47400400394062 - ], - "8001": [ - "BARRANQUILLA", - -74.8277160248611, - 10.9815200583058 - ], - "8078": [ - "BARANOA", - -74.9221948944785, - 10.7932930094087 - ], - "8137": [ - "CAMPO DE LA CRUZ", - -74.8784083106609, - 10.4026208472275 - ], - "8141": [ - "CANDELARIA", - -74.8775657189606, - 10.4890199183992 - ], - "8296": [ - "GALAPA", - -74.8870867929774, - 10.897719042876 - ], - "8372": [ - "JUAN DE ACOSTA", - -75.0784192089662, - 10.8230647656972 - ], - "8421": [ - "LURUACO", - -75.1540273985511, - 10.6350311517592 - ], - "8433": [ - "MALAMBO", - -74.8061750575399, - 10.8482884115618 - ], - "8436": [ - "MANAT\u00cd", - -74.9847727994452, - 10.4541466705484 - ], - "8520": [ - "PALMAR DE VARELA", - -74.7701508923814, - 10.6948120664641 - ], - "8549": [ - "PIOJ\u00d3", - -75.1436603228293, - 10.7407895838688 - ], - "8558": [ - "POLONUEVO", - -74.8541484246015, - 10.7674014049443 - ], - "8560": [ - "PONEDERA", - -74.7984731476816, - 10.5946510121397 - ], - "8573": [ - "PUERTO COLOMBIA", - -74.9074057915171, - 11.0044225865888 - ], - "8606": [ - "REPEL\u00d3N", - -75.1218805158337, - 10.5075705038367 - ], - "8634": [ - "SABANAGRANDE", - -74.7687965923949, - 10.7989401423135 - ], - "8638": [ - "SABANALARGA", - -74.9551055083717, - 10.6225080834355 - ], - "8675": [ - "SANTA LUC\u00cdA", - -74.9654117767845, - 10.353641911398 - ], - "8685": [ - "SANTO TOM\u00c1S", - -74.7947955186248, - 10.7440482276311 - ], - "8758": [ - "SOLEDAD", - -74.7784248918308, - 10.90690658567 - ], - "8770": [ - "SUAN", - -74.9071330742545, - 10.3108503390326 - ], - "8832": [ - "TUBAR\u00c1", - -74.9842324093292, - 10.9072190750849 - ], - "8849": [ - "USIACUR\u00cd", - -74.9826741147191, - 10.7405226475468 - ], - "13006": [ - "ACH\u00cd", - -74.4780594446511, - 8.6229432583363 - ], - "13030": [ - "ALTOS DEL ROSARIO", - -74.1951581028898, - 8.75746886010938 - ], - "13042": [ - "ARENAL", - -74.1069594374792, - 8.34101799330804 - ], - "13052": [ - "ARJONA", - -75.3712178732777, - 10.1642212147689 - ], - "13062": [ - "ARROYOHONDO", - -75.026904204943, - 10.2417180381574 - ], - "13074": [ - "BARRANCO DE LOBA", - -74.1627108561036, - 8.83618540647711 - ], - "13140": [ - "CALAMAR", - -75.0011947354248, - 10.2188284834007 - ], - "13160": [ - "CANTAGALLO", - -74.1001404311173, - 7.23922914687607 - ], - "13188": [ - "CICUCO", - -74.6880301306956, - 9.23516173225753 - ], - "13212": [ - "C\u00d3RDOBA", - -74.8944563432715, - 9.54004750107103 - ], - "13222": [ - "CLEMENCIA", - -75.3144665158501, - 10.5566369435243 - ], - "13244": [ - "EL CARMEN DE BOL\u00cdVAR", - -75.157935716737, - 9.69981986809862 - ], - "13248": [ - "EL GUAMO", - -74.9281107075532, - 10.034836715118 - ], - "13268": [ - "EL PE\u00d1ON", - -73.9123014692911, - 8.86481878338691 - ], - "13300": [ - "HATILLO DE LOBA", - -74.0907167548434, - 8.98171724650226 - ], - "13430": [ - "MAGANGU\u00c9", - -74.7472865501969, - 9.16958550834199 - ], - "13433": [ - "MAHATES", - -75.179781599053, - 10.1782138981459 - ], - "13440": [ - "MARGARITA", - -74.2258378584513, - 9.05458954450898 - ], - "13442": [ - "MARIA LA BAJA", - -75.343802638144, - 9.97601715900879 - ], - "13458": [ - "MONTECRISTO", - -74.4634291104477, - 8.01710023769587 - ], - "13468": [ - "MOMP\u00d3S", - -74.5451999657704, - 9.14251082661014 - ], - "13473": [ - "MORALES", - -73.9713458984789, - 8.25370005952903 - ], - "13490": [ - "NOROSI", - -74.1158891131287, - 8.50613475752187 - ], - "13549": [ - "PINILLOS", - -74.3858809645493, - 8.87158847833977 - ], - "13580": [ - "REGIDOR", - -73.8511788087249, - 8.72201814575948 - ], - "13600": [ - "RIOVIEJO", - -73.9970335276656, - 8.49302256975097 - ], - "13620": [ - "SAN CRIST\u00d3BAL", - -75.0733383416469, - 10.3697208614458 - ], - "13647": [ - "SAN ESTANISLAO", - -75.2052348567943, - 10.364681909287 - ], - "13654": [ - "SAN JACINTO", - -75.1060920000577, - 9.83536200239138 - ], - "13655": [ - "SAN JACINTO DEL CAUCA", - -74.6683999731639, - 8.23751028514381 - ], - "13657": [ - "SAN JUAN NEPOMUCENO", - -75.0657195777186, - 9.96795781468401 - ], - "13667": [ - "SAN MART\u00cdN DE LOBA", - -74.0103273790205, - 8.78769226177804 - ], - "13670": [ - "SAN PABLO", - -74.1356646063775, - 7.42236631994237 - ], - "13673": [ - "SANTA CATALINA", - -75.2654846183921, - 10.6498127655673 - ], - "13683": [ - "SANTA ROSA", - -75.3611579446285, - 10.4692108782442 - ], - "13688": [ - "SANTA ROSA DEL SUR", - -74.2627284254838, - 7.77251917183564 - ], - "13744": [ - "SIMIT\u00cd", - -73.9837160915779, - 7.85131553350971 - ], - "13760": [ - "SOPLAVIENTO", - -75.116992246136, - 10.3320903038624 - ], - "13780": [ - "TALAIGUA NUEVO", - -74.6401021502908, - 9.31344655207116 - ], - "13810": [ - "TIQUISO", - -74.2967613841704, - 8.4923451726539 - ], - "13836": [ - "TURBACO", - -75.3797153993308, - 10.3531075540787 - ], - "13838": [ - "TURBANA", - -75.4703770675293, - 10.2160414878069 - ], - "13873": [ - "VILLANUEVA", - -75.267362742697, - 10.4449131878677 - ], - "13894": [ - "ZAMBRANO", - -74.8806703517, - 9.74514700308189 - ], - "15022": [ - "ALMEIDA", - -73.3881342555189, - 4.95482509005906 - ], - "15047": [ - "AQUITANIA", - -72.8714947225413, - 5.43741638218804 - ], - "15051": [ - "ARCABUCO", - -73.4388796746592, - 5.74956530052101 - ], - "15087": [ - "BEL\u00c9N", - -72.8936988828059, - 6.00505927279563 - ], - "15090": [ - "BERBEO", - -73.1011739891016, - 5.232058458955 - ], - "15092": [ - "BET\u00c9ITIVA", - -72.8485787731905, - 5.92085894119083 - ], - "15097": [ - "BOAVITA", - -72.6202123991301, - 6.33751563343217 - ], - "15104": [ - "BOYAC\u00c1", - -73.3813699477618, - 5.439856223794 - ], - "15106": [ - "BRICE\u00d1O", - -73.9093268217898, - 5.67550998205643 - ], - "15109": [ - "BUENAVISTA", - -73.9506625526098, - 5.48939942500514 - ], - "15114": [ - "BUSBANZ\u00c1", - -72.8757462397603, - 5.84348373916655 - ], - "15131": [ - "CALDAS", - -73.8805750845905, - 5.5759906744721 - ], - "15135": [ - "CAMPOHERMOSO", - -73.1446703137545, - 5.00686254569953 - ], - "15162": [ - "CERINZA", - -72.9644728931965, - 5.96201370601062 - ], - "15172": [ - "CHINAVITA", - -73.3404807460312, - 5.20297164731558 - ], - "15176": [ - "CHIQUINQUIR\u00c1", - -73.8042453188851, - 5.62248803062574 - ], - "15180": [ - "CHISCAS", - -72.4179567571184, - 6.68911806730977 - ], - "15183": [ - "CHITA", - -72.4390317488186, - 6.09146849420729 - ], - "15185": [ - "CHITARAQUE", - -73.4258237584594, - 5.98439463142713 - ], - "15187": [ - "CHIVAT\u00c1", - -73.263315841383, - 5.56388109370782 - ], - "15189": [ - "CI\u00c9NEGA", - -73.2820577267122, - 5.39305964126222 - ], - "15204": [ - "COMBITA", - -73.3292895665887, - 5.68764704084377 - ], - "15212": [ - "COPER", - -74.0278295662299, - 5.44298345313783 - ], - "15215": [ - "CORRALES", - -72.8454484583567, - 5.82454582771265 - ], - "15218": [ - "COVARACHIA", - -72.7402042175338, - 6.51952148331199 - ], - "15223": [ - "CUBAR\u00c1", - -72.1815628587943, - 6.88695488535215 - ], - "15224": [ - "CUCAITA", - -73.4459864678563, - 5.52710411676923 - ], - "15226": [ - "CU\u00ccTIVA", - -72.939536874175, - 5.58775449842786 - ], - "15232": [ - "CH\u00cdQUIZA", - -73.4456239153029, - 5.64307565526435 - ], - "15236": [ - "CHIVOR", - -73.361423803238, - 4.87118161478898 - ], - "15238": [ - "DUITAMA", - -73.0670948749378, - 5.89060178050608 - ], - "15244": [ - "EL COCUY", - -72.4192375291254, - 6.35336318565314 - ], - "15248": [ - "EL ESPINO", - -72.4804962567772, - 6.50824056362049 - ], - "15272": [ - "FIRAVITOBA", - -73.0198335257905, - 5.67367659881654 - ], - "15276": [ - "FLORESTA", - -72.9249982747216, - 5.85899211803235 - ], - "15293": [ - "GACHANTIV\u00c1", - -73.5426552042656, - 5.74410598136702 - ], - "15296": [ - "GAMEZA", - -72.7355024466775, - 5.8033313518743 - ], - "15299": [ - "GARAGOA", - -73.3143027332257, - 5.08946665961476 - ], - "15317": [ - "GUACAMAYAS", - -72.5163533322742, - 6.44543855441833 - ], - "15322": [ - "GUATEQUE", - -73.4881235258904, - 5.01450831856077 - ], - "15325": [ - "GUAYAT\u00c1", - -73.4966337340352, - 4.93142434987431 - ], - "15332": [ - "G\u00dcIC\u00c1N", - -72.2559933456502, - 6.5669917732399 - ], - "15362": [ - "IZA", - -72.9698650551, - 5.61736602462488 - ], - "15367": [ - "JENESANO", - -73.3769476945275, - 5.37715298214502 - ], - "15368": [ - "JERIC\u00d3", - -72.585808559479, - 6.14545949550463 - ], - "15377": [ - "LABRANZA GRANDE", - -72.5903846128982, - 5.5413781419628 - ], - "15380": [ - "LA CAPILLA", - -73.4592370868927, - 5.11316711008538 - ], - "15401": [ - "LA VICTORIA", - -74.2287318020863, - 5.51672422829834 - ], - "15403": [ - "LA UVITA", - -72.5555108584749, - 6.26512619896052 - ], - "15407": [ - "VILLA DE LEYVA", - -73.5149480108235, - 5.66576243106252 - ], - "15425": [ - "MACANAL", - -73.2941369572083, - 4.98017650434444 - ], - "15442": [ - "MARIP\u00cd", - -74.02003127885, - 5.56981063904819 - ], - "15455": [ - "MIRAFLORES", - -73.1789672281314, - 5.15095330643398 - ], - "15464": [ - "MONGUA", - -72.6915815817356, - 5.70971246819617 - ], - "15466": [ - "MONGU\u00cc", - -72.8329866525775, - 5.69735223622901 - ], - "15469": [ - "MONIQUIRA", - -73.5585253853295, - 5.86337049105931 - ], - "15476": [ - "MOTAVITA", - -73.3773428306631, - 5.60619298924286 - ], - "15480": [ - "MUZO", - -74.1165767968554, - 5.52534622693847 - ], - "15494": [ - "NUEVO COL\u00d3N", - -73.4487342501725, - 5.354701492369 - ], - "15500": [ - "OICATA", - -73.2799190629638, - 5.6107878519713 - ], - "15507": [ - "OTANCHE", - -74.1971942316152, - 5.75378779105204 - ], - "15511": [ - "PACHAVITA", - -73.3995122025668, - 5.14832388510829 - ], - "15514": [ - "P\u00c1EZ", - -73.0043586382526, - 5.09521104449241 - ], - "15516": [ - "PAIPA", - -73.1379527804609, - 5.82677174778997 - ], - "15518": [ - "PAJARITO", - -72.6967267539084, - 5.3823289586376 - ], - "15522": [ - "PANQUEBA", - -72.4618243216729, - 6.44329976623742 - ], - "15531": [ - "PAUNA", - -74.00504122086, - 5.68880156410476 - ], - "15533": [ - "PAYA", - -72.3692906103274, - 5.62124275277384 - ], - "15537": [ - "PAZ DE R\u00cdO", - -72.7675262487782, - 6.02869937323345 - ], - "15542": [ - "PESCA", - -73.0783799408637, - 5.49848333270423 - ], - "15550": [ - "PISBA", - -72.4457904415706, - 5.74349380287786 - ], - "15572": [ - "PUERTO BOYAC\u00c1", - -74.452858105987, - 5.9534666573209 - ], - "15580": [ - "QU\u00cdPAMA", - -74.2179341050905, - 5.56154120504119 - ], - "15599": [ - "RAMIRIQU\u00cd", - -73.3107761001618, - 5.31993020444792 - ], - "15600": [ - "R\u00c1QUIRA", - -73.62894438452, - 5.49626862740556 - ], - "15621": [ - "ROND\u00d3N", - -73.1965099571836, - 5.37994788767074 - ], - "15632": [ - "SABOY\u00c1", - -73.7479946630612, - 5.69992605684857 - ], - "15638": [ - "S\u00c1CHICA", - -73.5431020110244, - 5.57346488918032 - ], - "15646": [ - "SAMAC\u00c1", - -73.5211756123703, - 5.47053997751498 - ], - "15660": [ - "SAN EDUARDO", - -73.049140679874, - 5.23461469499225 - ], - "15664": [ - "SAN JOS\u00c9 DE PARE", - -73.5438652309033, - 5.99415409401024 - ], - "15667": [ - "SAN LUIS DE GACENO", - -73.1237820946527, - 4.81527218044197 - ], - "15673": [ - "SAN MATEO", - -72.5596276014442, - 6.40688864946696 - ], - "15676": [ - "SAN MIGUEL DE SEMA", - -73.7471589861074, - 5.53232692845278 - ], - "15681": [ - "SAN PABLO DE BORBUR", - -74.1140374921711, - 5.6773450710015 - ], - "15686": [ - "SANTANA", - -73.4897482899931, - 6.05761497638361 - ], - "15690": [ - "SANTA MAR\u00cdA", - -73.2537750736992, - 4.82300256543728 - ], - "15693": [ - "SANTA ROSA DE VITERBO", - -72.9917277736215, - 5.89295040824173 - ], - "15696": [ - "SANTA SOF\u00cdA", - -73.6036628768318, - 5.73160272202021 - ], - "15720": [ - "SATIVANORTE", - -72.7303241635675, - 6.13211793808816 - ], - "15723": [ - "SATIVASUR", - -72.7153819142215, - 6.07066238320864 - ], - "15740": [ - "SIACHOQUE", - -73.2168177881499, - 5.49874770856198 - ], - "15753": [ - "SOAT\u00c1", - -72.696040902478, - 6.32308805230718 - ], - "15755": [ - "SOCOT\u00c1", - -72.5591290479171, - 5.93492039075606 - ], - "15757": [ - "SOCHA", - -72.6823979076875, - 5.96049885447456 - ], - "15759": [ - "SOGAMOSO", - -72.8863031588801, - 5.66795587782649 - ], - "15761": [ - "SOMONDOCO", - -73.4287878624809, - 4.97097407335139 - ], - "15762": [ - "SORA", - -73.44371838415, - 5.58057319829499 - ], - "15763": [ - "SOTAQUIR\u00c1", - -73.2530114310356, - 5.78527545015878 - ], - "15764": [ - "SORAC\u00c1", - -73.3189999746086, - 5.49489046866658 - ], - "15774": [ - "SUSAC\u00d3N", - -72.715756350401, - 6.2152005855462 - ], - "15776": [ - "SUTAMARCH\u00c0N", - -73.6259877350794, - 5.64003076575756 - ], - "15778": [ - "SUTATENZA", - -73.4335106687445, - 5.02685717115237 - ], - "15790": [ - "TASCO", - -72.7262681734812, - 5.88229426061349 - ], - "15798": [ - "TENZA", - -73.4247969985016, - 5.07141314714203 - ], - "15804": [ - "TIBANA", - -73.393252104306, - 5.30111665682804 - ], - "15808": [ - "TINJAC\u00c1", - -73.6761457285999, - 5.57756650365119 - ], - "15810": [ - "TIPACOQUE", - -72.6946358427302, - 6.42035349708938 - ], - "15814": [ - "TOCA", - -73.1606969117791, - 5.5802542947468 - ], - "15816": [ - "TOG\u00dc\u00cd", - -73.4892180626797, - 5.9218300683593 - ], - "15820": [ - "T\u00d3PAGA", - -72.8367295859327, - 5.76535031172932 - ], - "15822": [ - "TOTA", - -73.005344611973, - 5.48919491577308 - ], - "15832": [ - "TUNUNGU\u00c1", - -73.9433092712183, - 5.72030152144985 - ], - "15835": [ - "TURMEQU\u00c9", - -73.5090871471302, - 5.30569742606727 - ], - "15837": [ - "TUTA", - -73.1829821166938, - 5.67212729825422 - ], - "15839": [ - "TUTAZ\u00c1", - -72.8570783282127, - 6.07805191094449 - ], - "15842": [ - "UMBITA", - -73.4633847775349, - 5.21724137652775 - ], - "15861": [ - "VENTAQUEMADA", - -73.5209794327391, - 5.38338548862696 - ], - "15879": [ - "VIRACACH\u00c1", - -73.2662745659869, - 5.44055822412622 - ], - "15897": [ - "ZETAQUIR\u00c1", - -73.1676309228087, - 5.28563599158837 - ], - "17001": [ - "MANIZALES", - -75.5072598719214, - 5.08342870740413 - ], - "17013": [ - "AGUADAS", - -75.4503581981878, - 5.59677537664599 - ], - "17042": [ - "ANSERMA", - -75.7528907809891, - 5.20029922178819 - ], - "17050": [ - "ARANZAZU", - -75.4739261969038, - 5.26553997152909 - ], - "17088": [ - "BELALC\u00c1ZAR", - -75.8122599032959, - 4.99467724010602 - ], - "17174": [ - "CHINCHIN\u00c1", - -75.6671247511624, - 4.98711727969989 - ], - "17272": [ - "FILADELFIA", - -75.5897878411379, - 5.28574377907133 - ], - "17380": [ - "LA DORADA", - -74.7122957502886, - 5.54052658025229 - ], - "17388": [ - "LA MERCED", - -75.5579107093942, - 5.39318571773031 - ], - "17433": [ - "MANZANARES", - -75.1526344759429, - 5.2329539132946 - ], - "17442": [ - "MARMATO", - -75.6020995513212, - 5.49263203009703 - ], - "17444": [ - "MARQUETALIA", - -75.0411789262168, - 5.30914249490863 - ], - "17446": [ - "MARULANDA", - -75.2831664823807, - 5.23558524723757 - ], - "17486": [ - "NEIRA", - -75.5069297766811, - 5.18335859132345 - ], - "17495": [ - "NORCASIA", - -74.8549270759579, - 5.6380623523459 - ], - "17513": [ - "P\u00c1CORA", - -75.4824505666444, - 5.50003503660092 - ], - "17524": [ - "PALESTINA", - -75.661762661369, - 5.05034254514614 - ], - "17541": [ - "PENSILVANIA", - -75.166839965073, - 5.40718783851603 - ], - "17616": [ - "RISARALDA", - -75.7587979892511, - 5.11218739757581 - ], - "17653": [ - "SALAMINA", - -75.4096217688013, - 5.37033242738007 - ], - "17662": [ - "SAMAN\u00c1", - -74.9936848617015, - 5.54028580301266 - ], - "17665": [ - "SAN JOS\u00c9", - -75.8135149830137, - 5.07070413322364 - ], - "17777": [ - "SUPIA", - -75.6403570468456, - 5.45295802188432 - ], - "17867": [ - "VICTORIA", - -74.8362250208128, - 5.44754286251837 - ], - "17873": [ - "VILLAMARIA", - -75.4354401402889, - 4.94021159444195 - ], - "17877": [ - "VITERBO", - -75.8792970015462, - 5.04782205526377 - ], - "18001": [ - "FLORENCIA", - -75.5582390766461, - 1.74913871403065 - ], - "18029": [ - "ALBANIA", - -75.8823265203263, - 1.22786550067381 - ], - "18094": [ - "BEL\u00c9N DE LOS ANDAQU\u00cdES", - -75.87564543638, - 1.50092301307383 - ], - "18247": [ - "EL DONCELLO", - -75.1939441680654, - 1.79138591440314 - ], - "18256": [ - "EL PAUJIL", - -75.2340433485898, - 1.61774636805088 - ], - "18410": [ - "LA MONTA\u00d1ITA", - -75.2357273332431, - 1.30286045380406 - ], - "18460": [ - "MIL\u00c1N", - -75.3866476530768, - 1.14669256576142 - ], - "18479": [ - "MORELIA", - -75.6738112470477, - 1.38299612070586 - ], - "18592": [ - "PUERTO RICO", - -75.0730862808213, - 2.01894090211359 - ], - "18610": [ - "SAN JOS\u00c9 DEL FRAGUA", - -76.1100059531768, - 1.30470232394255 - ], - "18860": [ - "VALPARA\u00cdSO", - -75.6270476823483, - 1.06129221848546 - ], - "19001": [ - "POPAY\u00c1N", - -76.59194419797, - 2.47170436821721 - ], - "19022": [ - "ALMAGUER", - -76.8349452015118, - 1.91244052727075 - ], - "19050": [ - "ARGELIA", - -77.2631490650107, - 2.32933728704474 - ], - "19075": [ - "BALBOA", - -77.2088133074496, - 2.08473294973807 - ], - "19100": [ - "BOL\u00cdVAR", - -76.9633745448004, - 1.85395194433561 - ], - "19110": [ - "BUENOS AIRES", - -76.6790077053412, - 3.04592306079251 - ], - "19130": [ - "CAJIB\u00cdO", - -76.701385783913, - 2.6432092559562 - ], - "19137": [ - "CALDONO", - -76.4645161214723, - 2.81032824521438 - ], - "19142": [ - "CALOTO", - -76.3663824585023, - 3.04592644969781 - ], - "19212": [ - "CORINTO", - -76.2096456985855, - 3.13675361079899 - ], - "19256": [ - "EL TAMBO", - -77.0051120697573, - 2.53448831597193 - ], - "19290": [ - "FLORENCIA", - -77.0873572412323, - 1.69453474650709 - ], - "19300": [ - "GUACHEN\u00c9", - -76.3923483734135, - 3.14439096717856 - ], - "19355": [ - "INZA", - -76.1376253199024, - 2.49905879012679 - ], - "19364": [ - "JAMBAL\u00d3", - -76.3112491968423, - 2.84981013585559 - ], - "19392": [ - "LA SIERRA", - -76.7822803265939, - 2.18747357809448 - ], - "19397": [ - "LA VEGA", - -76.7588062110099, - 2.05393343228951 - ], - "19450": [ - "MERCADERES", - -77.1806038183866, - 1.79382516979296 - ], - "19455": [ - "MIRANDA", - -76.2167110264012, - 3.22823518354592 - ], - "19473": [ - "MORALES", - -76.7509625434547, - 2.81476547368033 - ], - "19513": [ - "PADILLA", - -76.3362436408362, - 3.19472810345367 - ], - "19517": [ - "P\u00c1EZ", - -75.9936826454397, - 2.73388770852166 - ], - "19532": [ - "PAT\u00cdA", - -77.0579270861999, - 2.14816540319886 - ], - "19533": [ - "PIAMONTE", - -76.3054725287061, - 1.15232351019801 - ], - "19548": [ - "PIENDAM\u00d3", - -76.5647242755921, - 2.7144627174096 - ], - "19573": [ - "PUERTO TEJADA", - -76.4184623502734, - 3.26673157362542 - ], - "19585": [ - "PURAC\u00c9 (COCONUCO)", - -76.3711563667138, - 2.28177598098194 - ], - "19622": [ - "ROSAS", - -76.7529275760587, - 2.25087677102956 - ], - "19693": [ - "SAN SEBASTI\u00c1N", - -76.7165242441357, - 1.85626182207129 - ], - "19698": [ - "SANTANDER DE QUILICHAO", - -76.498731458819, - 2.98446734223426 - ], - "19701": [ - "SANTA ROSA", - -76.5387628156644, - 1.5200217978216 - ], - "19743": [ - "SILVIA", - -76.3505735695244, - 2.6512918998609 - ], - "19760": [ - "SOTAR\u00c1 (Paispamba)", - -76.6114663331393, - 2.23182054782457 - ], - "19780": [ - "SU\u00c1REZ", - -76.7458246031089, - 2.93686582523441 - ], - "19785": [ - "SUCRE", - -76.9099396541572, - 2.05773519002502 - ], - "19807": [ - "TIMB\u00cdO", - -76.7105193290199, - 2.36962531734846 - ], - "19821": [ - "TORIB\u00cdO", - -76.2033156704935, - 2.97577200421408 - ], - "19824": [ - "TOTOR\u00d3", - -76.3904746458602, - 2.50450025360684 - ], - "19845": [ - "VILLA RICA", - -76.4644380005576, - 3.18064402701163 - ], - "20011": [ - "AGUACHICA", - -73.6227409161798, - 8.24873774216213 - ], - "20013": [ - "AGUST\u00cdN CODAZZI", - -73.2235824377938, - 9.94921590524992 - ], - "20032": [ - "ASTREA", - -73.9421464066879, - 9.51072792077431 - ], - "20060": [ - "BOSCONIA", - -73.866288528797, - 9.9463934168319 - ], - "20175": [ - "CHIMICHAGUA", - -73.7526739715593, - 9.21878288986099 - ], - "20178": [ - "CHIRIGUAN\u00c1", - -73.5479789413668, - 9.42664835127928 - ], - "20228": [ - "CURUMAN\u00cd", - -73.4881086100674, - 9.23877133044002 - ], - "20238": [ - "EL COPEY", - -73.9128206298968, - 10.1999535579942 - ], - "20250": [ - "EL PASO", - -73.6935046448185, - 9.68178090441033 - ], - "20295": [ - "GAMARRA", - -73.7064919558439, - 8.33772629143902 - ], - "20310": [ - "GONZALEZ", - -73.3753730861337, - 8.40551652190218 - ], - "20383": [ - "LA GLORIA", - -73.6330937585656, - 8.62133211394956 - ], - "20517": [ - "PAILITAS", - -73.5724721238778, - 8.93891614227183 - ], - "20550": [ - "PELAYA", - -73.6329554633208, - 8.76411673269253 - ], - "20614": [ - "R\u00cdO DE ORO", - -73.4875038537978, - 8.2010679759277 - ], - "20621": [ - "LA PAZ", - -73.1907549573655, - 10.1642465231557 - ], - "20710": [ - "SAN ALBERTO", - -73.4537197532035, - 7.8143905926886 - ], - "20750": [ - "SAN DIEGO", - -73.2879826988368, - 10.1695271174811 - ], - "20770": [ - "SAN MART\u00cdN", - -73.5443632435312, - 7.93778860115235 - ], - "20787": [ - "TAMALAMEQUE", - -73.763396195387, - 8.90207501040027 - ], - "23001": [ - "MONTER\u00cdA", - -75.9505507426664, - 8.58469800097169 - ], - "23068": [ - "AYAPEL", - -75.0486843525342, - 8.26576868386256 - ], - "23079": [ - "BUENAVISTA", - -75.4338253132915, - 8.19139794786179 - ], - "23090": [ - "CANALETE", - -76.2377907974904, - 8.72409579190368 - ], - "23162": [ - "CERET\u00c9", - -75.8346127587037, - 8.89101333060585 - ], - "23168": [ - "CHIM\u00c1", - -75.6523735019764, - 9.11024940206296 - ], - "23182": [ - "CHIN\u00da", - -75.3566768477471, - 9.02749348528184 - ], - "23189": [ - "CIENAGA DE ORO", - -75.6077982836763, - 8.84181188642825 - ], - "23300": [ - "COTORRA", - -75.7789398482769, - 9.05695248324977 - ], - "23350": [ - "LA APARTADA", - -75.2881602153511, - 8.0522184170864 - ], - "23417": [ - "LORICA", - -75.9097812269069, - 9.16503498926224 - ], - "23419": [ - "LOS C\u00d3RDOBAS", - -76.2949279348826, - 8.83903777992358 - ], - "23464": [ - "MOMIL", - -75.6509087528082, - 9.26546161283051 - ], - "23466": [ - "MONTEL\u00cdBANO", - -75.7606746907555, - 7.88633788797794 - ], - "23500": [ - "MO\u00d1ITOS", - -76.1193170829453, - 9.19051533332892 - ], - "23555": [ - "PLANETA RICA", - -75.6123784556992, - 8.29029802603576 - ], - "23570": [ - "PUEBLO NUEVO", - -75.4051615358095, - 8.48133956224017 - ], - "23574": [ - "PUERTO ESCONDIDO", - -76.1940591141223, - 8.98866772149086 - ], - "23586": [ - "PUR\u00cdSIMA", - -75.7212939112693, - 9.28238611829683 - ], - "23660": [ - "SAHAG\u00daN", - -75.4292566320889, - 8.79900700940554 - ], - "23670": [ - "SAN ANDRES DE SOTAVENTO", - -75.5209171042231, - 9.1212963456676 - ], - "23672": [ - "SAN ANTERO", - -75.7870025108283, - 9.35966748009792 - ], - "23675": [ - "SAN BERNARDO DEL VIENTO", - -75.9762385670594, - 9.33009831963633 - ], - "23678": [ - "SAN CARLOS", - -75.6925185139692, - 8.7064667249691 - ], - "23682": [ - "SAN JOS\u00c9 DE UR\u00c9", - -75.5672476258585, - 7.75305359136037 - ], - "23686": [ - "SAN PELAYO", - -75.9095876989724, - 8.98777738398929 - ], - "23815": [ - "TUCHIN", - -75.5441062506182, - 9.2246303725794 - ], - "23855": [ - "VALENCIA", - -76.221328591788, - 8.21990412031259 - ], - "25001": [ - "AGUA DE DIOS", - -74.6711105170483, - 4.37274468213396 - ], - "25019": [ - "ALB\u00c1N", - -74.4427843236373, - 4.89112164333595 - ], - "25035": [ - "ANAPOIMA", - -74.5256953062309, - 4.55996288734418 - ], - "25040": [ - "ANOLAIMA", - -74.4619425706706, - 4.7893136200917 - ], - "25053": [ - "ARBEL\u00c1EZ", - -74.3957629207933, - 4.23278699252488 - ], - "25086": [ - "BELTR\u00c1N", - -74.7563181361741, - 4.71968409677156 - ], - "25095": [ - "BITUIMA", - -74.528627667647, - 4.84782109703775 - ], - "25099": [ - "BOJAC\u00c1", - -74.3289880909397, - 4.69166843506452 - ], - "25120": [ - "CABRERA", - -74.4461560701396, - 3.91861924844487 - ], - "25123": [ - "CACHIPAY", - -74.4591952900619, - 4.72306334796367 - ], - "25126": [ - "CAJIC\u00c1", - -74.0298511606635, - 4.93040278601466 - ], - "25148": [ - "CAPARRAPI", - -74.5212359525761, - 5.38150140401363 - ], - "25151": [ - "C\u00c1QUEZA", - -73.9448243610441, - 4.40225946548688 - ], - "25154": [ - "CARMEN DE CARUPA", - -73.9261481800876, - 5.33885656263889 - ], - "25168": [ - "CHAGUAN\u00cd", - -74.6309013912012, - 4.95425175541261 - ], - "25175": [ - "CH\u00cdA", - -74.0369225161688, - 4.86545185373296 - ], - "25178": [ - "CHIPAQUE", - -74.0594698098572, - 4.42577893390846 - ], - "25181": [ - "CHOACH\u00cd", - -73.9128772388602, - 4.58296520514658 - ], - "25183": [ - "CHOCONT\u00c1", - -73.6806858401131, - 5.11841927853198 - ], - "25200": [ - "COGUA", - -73.9753655981075, - 5.10312753928035 - ], - "25214": [ - "COTA", - -74.123395077474, - 4.78827200364198 - ], - "25224": [ - "CUCUNUB\u00c1", - -73.7800188574474, - 5.23030811183551 - ], - "25245": [ - "EL COLEGIO", - -74.4265847845829, - 4.55694709192828 - ], - "25258": [ - "EL PE\u00d1ON", - -74.3083056458685, - 5.26172824887727 - ], - "25260": [ - "EL ROSAL", - -74.2380227367608, - 4.87972302304913 - ], - "25269": [ - "FACATATIV\u00c1", - -74.3380229052493, - 4.83405234039318 - ], - "25279": [ - "F\u00d3MEQUE", - -73.7970526768115, - 4.52856847123846 - ], - "25281": [ - "FOSCA", - -73.9528678485287, - 4.31628008106339 - ], - "25286": [ - "FUNZA", - -74.1986599313256, - 4.74399671878228 - ], - "25288": [ - "FUQUENE", - -73.7705982973066, - 5.41628890869774 - ], - "25290": [ - "FUSAGASUG\u00c1", - -74.3885886001206, - 4.32353502363779 - ], - "25293": [ - "GACHAL\u00c1", - -73.5105538254935, - 4.6549551389887 - ], - "25295": [ - "GACHANCIP\u00c1", - -73.8767175988388, - 5.01001953745964 - ], - "25297": [ - "GACHET\u00c1", - -73.6177328821808, - 4.86755114282358 - ], - "25299": [ - "GAMA", - -73.6005444252057, - 4.72357347314888 - ], - "25307": [ - "GIRARDOT", - -74.8114392291471, - 4.33815452382408 - ], - "25312": [ - "GRANADA", - -74.3372462006018, - 4.52348489128419 - ], - "25317": [ - "GUACHET\u00c1", - -73.693282349873, - 5.3872915488887 - ], - "25320": [ - "GUADUAS", - -74.6401465132215, - 5.17355476858489 - ], - "25322": [ - "GUASCA", - -73.8464348621168, - 4.80127683966267 - ], - "25324": [ - "GUATAQU\u00cd", - -74.7818497610379, - 4.51230285999784 - ], - "25326": [ - "GUATAVITA", - -73.7864856535359, - 4.91158717805727 - ], - "25328": [ - "GUAYABAL DE S\u00cdQUIMA", - -74.4834767994752, - 4.87939572587263 - ], - "25335": [ - "GUAYABETAL", - -73.8354398186343, - 4.23187595471726 - ], - "25339": [ - "GUTIERREZ", - -74.0246527126524, - 4.16608957141576 - ], - "25368": [ - "JERUSAL\u00c9N", - -74.6891585438103, - 4.57135025975539 - ], - "25372": [ - "JUN\u00cdN", - -73.6924787428337, - 4.70517079819641 - ], - "25377": [ - "LA CALERA", - -73.92939921803, - 4.70078545090563 - ], - "25386": [ - "LA MESA", - -74.473217177315, - 4.65077317376358 - ], - "25394": [ - "LA PALMA", - -74.4080786355525, - 5.33340065141819 - ], - "25398": [ - "LA PE\u00d1A", - -74.407866115903, - 5.20459882513779 - ], - "25402": [ - "LA VEGA", - -74.339360618793, - 4.97861984835949 - ], - "25407": [ - "LENGUAZAQUE", - -73.681532285399, - 5.30363717766088 - ], - "25426": [ - "MACHET\u00c1", - -73.6173824187509, - 5.04034920605684 - ], - "25430": [ - "MADRID", - -74.2597685567602, - 4.77267745139911 - ], - "25436": [ - "MANTA", - -73.563137416211, - 4.97688115947315 - ], - "25438": [ - "MEDINA", - -73.4059848802153, - 4.48443792944308 - ], - "25473": [ - "MOSQUERA", - -74.2357319444875, - 4.67271423179278 - ], - "25483": [ - "NARI\u00d1O", - -74.8056531775051, - 4.40795202050993 - ], - "25486": [ - "NEMOC\u00d3N", - -73.8838023833441, - 5.09370536486544 - ], - "25488": [ - "NILO", - -74.6146945677384, - 4.29478562106688 - ], - "25489": [ - "NIMAIMA", - -74.3963809468965, - 5.13374830931029 - ], - "25491": [ - "NOCAIMA", - -74.3897547649034, - 5.0661107671805 - ], - "25506": [ - "VENECIA", - -74.4525979647705, - 4.06334208159224 - ], - "25513": [ - "PACHO", - -74.1633654499713, - 5.16836764022312 - ], - "25518": [ - "PAIME", - -74.1639569627679, - 5.38764735054752 - ], - "25524": [ - "PANDI", - -74.4711213067334, - 4.18049727536113 - ], - "25530": [ - "PARATEBUENO", - -73.1869857906962, - 4.45234325441929 - ], - "25535": [ - "PASCA", - -74.2739692501449, - 4.29373361854705 - ], - "25572": [ - "PUERTO SALGAR", - -74.5801923079744, - 5.61975275160728 - ], - "25580": [ - "PUL\u00cd", - -74.6807440428268, - 4.69133625921555 - ], - "25592": [ - "QUEBRADANEGRA", - -74.4945107037941, - 5.09998103529611 - ], - "25594": [ - "QUETAME", - -73.8526456209688, - 4.33458905296 - ], - "25596": [ - "QUIPILE", - -74.5541125949709, - 4.71507264840564 - ], - "25599": [ - "APULO", - -74.5784206216462, - 4.52036258013578 - ], - "25612": [ - "RICAURTE", - -74.7294340422329, - 4.30736349603695 - ], - "25645": [ - "SAN ANTONIO DEL TEQUENDAMA", - -74.3449034241717, - 4.59974136367645 - ], - "25649": [ - "SAN BERNARDO", - -74.3539769304698, - 4.14095847196906 - ], - "25653": [ - "SAN CAYETANO", - -74.0723207779256, - 5.31460042930063 - ], - "25658": [ - "SAN FRANCISCO", - -74.2721712936208, - 4.96410078915487 - ], - "25662": [ - "SAN JUAN DE RIO SECO", - -74.6584930214053, - 4.84109819017471 - ], - "25718": [ - "SASAIMA", - -74.4123092192661, - 4.94680526938306 - ], - "25736": [ - "SESQUIL\u00c9", - -73.7809554647514, - 5.00877167984726 - ], - "25740": [ - "SIBAT\u00c9", - -74.2632896349513, - 4.46597001373771 - ], - "25743": [ - "SILVANIA", - -74.3705090389385, - 4.43696714788793 - ], - "25745": [ - "SIMIJACA", - -73.8451916513952, - 5.509773134454 - ], - "25754": [ - "SOACHA", - -74.2299300097031, - 4.53759938195848 - ], - "25758": [ - "SOPO", - -73.9658752862234, - 4.88806011946765 - ], - "25769": [ - "SUBACHOQUE", - -74.1568992420559, - 4.97035804058553 - ], - "25772": [ - "SUESCA", - -73.7826668235077, - 5.13608025565329 - ], - "25777": [ - "SUPAT\u00c1", - -74.231383241232, - 5.06169273779469 - ], - "25779": [ - "SUSA", - -73.8239252935371, - 5.44009236492495 - ], - "25781": [ - "SUTATAUSA", - -73.8554034361936, - 5.24290935373326 - ], - "25785": [ - "TABIO", - -74.0844964884862, - 4.9515200525617 - ], - "25793": [ - "TAUSA", - -73.9563170538243, - 5.19399767050191 - ], - "25797": [ - "TENA", - -74.3918253597308, - 4.65159860846615 - ], - "25799": [ - "TENJO", - -74.1468028799336, - 4.83854860844042 - ], - "25805": [ - "TIBACUY", - -74.4866776612702, - 4.32135314535465 - ], - "25807": [ - "TIBIRITA", - -73.5136254669407, - 5.08410269060126 - ], - "25815": [ - "TOCAIMA", - -74.6486440693469, - 4.45207298021127 - ], - "25817": [ - "TOCANCIP\u00c1", - -73.928870214206, - 4.96885292029155 - ], - "25823": [ - "TOPAIP\u00cd", - -74.2896399497184, - 5.35568839150087 - ], - "25839": [ - "UBAL\u00c1", - -73.4765460514015, - 4.80380519109937 - ], - "25841": [ - "UBAQUE", - -73.9756454574128, - 4.50075419120939 - ], - "25843": [ - "UBATE", - -73.8201056708867, - 5.31608065889928 - ], - "25845": [ - "UNE", - -74.0680872407406, - 4.30173334802239 - ], - "25851": [ - "\u00daTICA", - -74.4778000356292, - 5.19279571291407 - ], - "25862": [ - "VERGARA", - -74.3097922936256, - 5.1312675477326 - ], - "25867": [ - "VIAN\u00cd", - -74.5534585449644, - 4.88916314543919 - ], - "25871": [ - "VILLA G\u00d3MEZ", - -74.1907437578706, - 5.27069464203842 - ], - "25873": [ - "VILLAPINZ\u00d3N", - -73.5772592184929, - 5.22729871686363 - ], - "25875": [ - "VILLETA", - -74.4876474620608, - 5.01167040732584 - ], - "25878": [ - "VIOT\u00c1", - -74.4854333992661, - 4.436054111974 - ], - "25885": [ - "YACOP\u00cd", - -74.3648086582385, - 5.59191016163788 - ], - "25898": [ - "ZIPAC\u00d3N", - -74.3867344510078, - 4.75432173688492 - ], - "25899": [ - "ZIPAQUIRA", - -74.0230796801134, - 5.04619240312026 - ], - "41001": [ - "NEIVA", - -75.272362338162, - 2.99336002479853 - ], - "41006": [ - "ACEVEDO", - -75.9966418548977, - 1.70911445465087 - ], - "41013": [ - "AGRADO", - -75.7163223658339, - 2.26975042840346 - ], - "41016": [ - "AIPE", - -75.3526251463436, - 3.2623751954596 - ], - "41020": [ - "ALGECIRAS", - -75.2913494684451, - 2.49785068916021 - ], - "41026": [ - "ALTAMIRA", - -75.7685828885096, - 2.07922808937845 - ], - "41078": [ - "BARAYA", - -74.9579779745042, - 3.13542364284762 - ], - "41132": [ - "CAMPOALEGRE", - -75.3294380360327, - 2.65866668363161 - ], - "41206": [ - "COLOMBIA", - -74.6782925957132, - 3.45198800484895 - ], - "41244": [ - "EL\u00cdAS", - -75.9509169506908, - 2.00624819053741 - ], - "41298": [ - "GARZ\u00d3N", - -75.571311616243, - 2.17244292230719 - ], - "41306": [ - "GIGANTE", - -75.5169973823607, - 2.37178406752537 - ], - "41319": [ - "GUADALUPE", - -75.6969354995176, - 1.98439402554122 - ], - "41357": [ - "\u00cdQUIRA", - -75.6738314151226, - 2.69151778068275 - ], - "41359": [ - "ISNOS", - -76.2563632619718, - 2.00678434858123 - ], - "41378": [ - "LA ARGENTINA", - -76.1178184098865, - 2.18145257839383 - ], - "41396": [ - "LA PLATA", - -76.0011729966654, - 2.32807659431865 - ], - "41483": [ - "N\u00c1TAGA", - -75.7869375833334, - 2.57606629329681 - ], - "41503": [ - "OPORAPA", - -76.0411029001925, - 2.0611913707133 - ], - "41518": [ - "PAICOL", - -75.7280302793929, - 2.40689827853681 - ], - "41524": [ - "PALERMO", - -75.4406612516671, - 2.91449198172237 - ], - "41530": [ - "PALESTINA", - -76.1478559070265, - 1.68458076859608 - ], - "41548": [ - "PITAL", - -75.831951614328, - 2.2596017819102 - ], - "41551": [ - "PITALITO", - -76.1191958269784, - 1.82790359150714 - ], - "41615": [ - "RIVERA", - -75.2355448506088, - 2.78222412305812 - ], - "41660": [ - "SALADOBLANCO", - -76.2289787168615, - 2.10038285693823 - ], - "41668": [ - "SAN AGUST\u00cdN", - -76.4165655122885, - 1.92416550018627 - ], - "41676": [ - "SANTA MAR\u00cdA", - -75.6335978632677, - 2.92626594401838 - ], - "41770": [ - "SUAZA", - -75.8079847176514, - 1.87099210483162 - ], - "41791": [ - "TARQUI", - -75.8753484592893, - 2.13028055294746 - ], - "41797": [ - "TESALIA", - -75.6825964298248, - 2.52685514048319 - ], - "41799": [ - "TELLO", - -75.0853655403493, - 3.03061178543857 - ], - "41801": [ - "TERUEL", - -75.7143529892095, - 2.82411373278393 - ], - "41807": [ - "TIMAN\u00c1", - -75.917576497474, - 1.950715234868 - ], - "41872": [ - "VILLAVIEJA", - -75.1383829298428, - 3.2870578827584 - ], - "41885": [ - "YAGUAR\u00c1", - -75.5159264583825, - 2.64656334735007 - ], - "44035": [ - "ALBANIA", - -72.5320965688294, - 11.2286904813344 - ], - "44078": [ - "BARRANCAS", - -72.6867456005615, - 10.9894109049375 - ], - "44090": [ - "DIBULLA", - -73.4356886208437, - 11.0902966738182 - ], - "44098": [ - "DISTRACCI\u00d3N", - -72.9444849469469, - 10.925124138636 - ], - "44110": [ - "EL MOLINO", - -72.8858430957828, - 10.6366964510051 - ], - "44279": [ - "FONSECA", - -72.8018515922674, - 10.8283735698207 - ], - "44378": [ - "HATONUEVO", - -72.7384242665186, - 11.0990558128607 - ], - "44420": [ - "LA JAGUA DEL PILAR", - -73.0720919224508, - 10.4580940956337 - ], - "44430": [ - "MAICAO", - -72.2950081729084, - 11.3815776404461 - ], - "44560": [ - "MANAURE", - -72.5716039158071, - 11.6055426276309 - ], - "44650": [ - "SAN JUAN DEL CESAR", - -73.0865998585494, - 10.81311495543 - ], - "44855": [ - "URUMITA", - -72.9862399021487, - 10.494702097875 - ], - "44874": [ - "VILLANUEVA", - -72.9752028581945, - 10.5836475506532 - ], - "47030": [ - "ALGARROBO", - -74.1032302649574, - 10.2535647422578 - ], - "47058": [ - "ARIGUAN\u00cd", - -74.0846008401646, - 9.83426494981063 - ], - "47161": [ - "CERRO DE SAN ANTONIO", - -74.8198109032644, - 10.2937305899531 - ], - "47170": [ - "CHIVOLO", - -74.5260666577993, - 10.0995196011787 - ], - "47189": [ - "CI\u00c9NAGA", - -74.0427755373443, - 10.8892324432532 - ], - "47205": [ - "CONCORDIA", - -74.7781017433749, - 10.2328480049291 - ], - "47245": [ - "EL BANCO", - -73.9810557187276, - 9.11492642484754 - ], - "47258": [ - "EL PI\u00d1\u00d3N", - -74.6781775454511, - 10.3431098742668 - ], - "47268": [ - "EL RET\u00c9N", - -74.3251623767551, - 10.6596184528955 - ], - "47288": [ - "FUNDACI\u00d3N", - -73.8840651722349, - 10.4593781721183 - ], - "47318": [ - "GUAMAL", - -74.1396808424992, - 9.24800466917759 - ], - "47460": [ - "NUEVA GRANADA", - -74.3284022136334, - 9.73599812923223 - ], - "47541": [ - "PEDRAZA", - -74.8317808965998, - 10.1542954508444 - ], - "47545": [ - "PIJI\u00d1O DEL CARMEN", - -74.1447656960587, - 9.53074864947701 - ], - "47551": [ - "PIVIJAY", - -74.4125119569524, - 10.4330339855633 - ], - "47555": [ - "PLATO", - -74.6018157510782, - 9.76945610376385 - ], - "47570": [ - "PUEBLO VIEJO", - -74.3605787636231, - 10.8475902642815 - ], - "47605": [ - "REMOLINO", - -74.5810682155901, - 10.6486034979851 - ], - "47660": [ - "SABANAS DE SAN ANGEL", - -74.2644391946399, - 10.1053302693241 - ], - "47675": [ - "SALAMINA", - -74.7229697060476, - 10.5153817712483 - ], - "47692": [ - "SAN SEBASTIAN DE BUENAVISTA", - -74.2012169301141, - 9.35255961701721 - ], - "47703": [ - "SAN ZEN\u00d3N", - -74.3567225067608, - 9.32765226561541 - ], - "47707": [ - "SANTA ANA", - -74.3393527947654, - 9.51946640014585 - ], - "47720": [ - "SANTA B\u00c1RBARA DE PINTO", - -74.6478999836362, - 9.52211462842316 - ], - "47745": [ - "SITIONUEVO", - -74.6296603669012, - 10.8902761513496 - ], - "47798": [ - "TENERIFE", - -74.7326300028519, - 9.92470125972884 - ], - "47960": [ - "ZAPAY\u00c1N", - -74.6911545528408, - 10.1177989209937 - ], - "47980": [ - "ZONA BANANERA", - -74.1779830620246, - 10.7963502296281 - ], - "50006": [ - "ACAC\u00cdAS", - -73.7239134918389, - 4.00964446972397 - ], - "50110": [ - "BARRANCA DE UPIA", - -72.9954898263415, - 4.51907613816807 - ], - "50124": [ - "CABUYARO", - -72.952688970593, - 4.31524477104789 - ], - "50150": [ - "CASTILLA LA NUEVA", - -73.5388666904469, - 3.80515410083606 - ], - "50223": [ - "CUBARRAL", - -74.0752974486959, - 3.82824190740831 - ], - "50226": [ - "CUMARAL", - -73.3147754065133, - 4.23252640043287 - ], - "50245": [ - "EL CALVARIO", - -73.7144168555874, - 4.35376989768634 - ], - "50251": [ - "EL CASTILLO", - -73.8880070822895, - 3.6156245528644 - ], - "50270": [ - "EL DORADO", - -73.8316189353642, - 3.7069697962891 - ], - "50287": [ - "FUENTE DE ORO", - -73.596254307145, - 3.38237013652471 - ], - "50313": [ - "GRANADA", - -73.7469591087843, - 3.49656255961378 - ], - "50318": [ - "GUAMAL", - -73.9598386490739, - 3.94777559489189 - ], - "50330": [ - "MESETAS", - -74.124548255589, - 3.15477121259272 - ], - "50370": [ - "URIBE", - -74.4306613521855, - 3.04772686854218 - ], - "50400": [ - "LEJAN\u00cdAS", - -74.0962846787035, - 3.61471488325536 - ], - "50573": [ - "PUERTO L\u00d3PEZ", - -72.6457012002789, - 4.01429896907153 - ], - "50606": [ - "RESTREPO", - -73.4736661025808, - 4.23746700754618 - ], - "50680": [ - "SAN CARLOS DE GUAROA", - -73.2758342739103, - 3.84761772396871 - ], - "50683": [ - "SAN JUAN DE ARAMA", - -73.8163524481325, - 3.28985118350966 - ], - "50686": [ - "SAN JUANITO", - -73.6604135656703, - 4.47134633103277 - ], - "50689": [ - "SAN MART\u00cdN", - -72.9853695198818, - 3.53590923990574 - ], - "52036": [ - "ANCUYA", - -77.5311577774345, - 1.24525408251431 - ], - "52051": [ - "ARBOLEDA", - -77.1298500140056, - 1.48005117881156 - ], - "52083": [ - "BELEN", - -77.0428952628931, - 1.59076428824418 - ], - "52110": [ - "BUESACO", - -77.1163664036518, - 1.31521564283389 - ], - "52203": [ - "COLON", - -77.047315607874, - 1.63633438562556 - ], - "52207": [ - "CONSAC\u00c1", - -77.4406392149382, - 1.20906673868394 - ], - "52210": [ - "CONTADERO", - -77.5280873223826, - 0.932667464889352 - ], - "52215": [ - "C\u00d3RDOBA", - -77.3603297802145, - 0.770801807881067 - ], - "52224": [ - "CUASPUD", - -77.7359160121494, - 0.875427005298896 - ], - "52227": [ - "CUMBAL", - -77.9595844623701, - 0.944223279977805 - ], - "52233": [ - "CUMBITARA", - -77.5928163779866, - 1.72559011477624 - ], - "52240": [ - "CHACHAG\u00dc\u00cd", - -77.2696902276005, - 1.38649785083951 - ], - "52254": [ - "EL PE\u00d1OL", - -77.430509348931, - 1.51228397292644 - ], - "52256": [ - "EL ROSARIO", - -77.4382576807471, - 1.8450944566612 - ], - "52258": [ - "EL TABL\u00d3N DE G\u00d3MEZ", - -76.9852695963118, - 1.40943021459661 - ], - "52287": [ - "FUNES", - -77.3284304493189, - 0.914216990347061 - ], - "52320": [ - "GUAITARILLA", - -77.530113369684, - 1.15136666400127 - ], - "52323": [ - "GUALMAT\u00c1N", - -77.5826188347553, - 0.928642629686106 - ], - "52352": [ - "ILES", - -77.5186573025297, - 0.980534043665872 - ], - "52354": [ - "IMUES", - -77.5015086513419, - 1.07287697633679 - ], - "52378": [ - "LA CRUZ", - -76.9233526295564, - 1.58417600510277 - ], - "52385": [ - "LA LLANADA", - -77.7031676291681, - 1.55400611326806 - ], - "52399": [ - "LA UNI\u00d3N", - -77.142846225013, - 1.61969738220605 - ], - "52411": [ - "LINARES", - -77.5209377442823, - 1.39517308938314 - ], - "52418": [ - "LOS ANDES", - -77.7105444926733, - 1.67260127394502 - ], - "52480": [ - "NARI\u00d1O", - -77.3538883549437, - 1.28085961419992 - ], - "52565": [ - "PROVIDENCIA", - -77.5984421302353, - 1.23286482658686 - ], - "52573": [ - "PUERRES", - -77.3222487562224, - 0.826519370156211 - ], - "52585": [ - "PUPIALES", - -77.6333695443291, - 0.916769837655732 - ], - "52612": [ - "RICAURTE", - -78.0476496942495, - 1.20275503172781 - ], - "52685": [ - "SAN BERNARDO", - -77.0207066324073, - 1.52978249146785 - ], - "52687": [ - "SAN LORENZO", - -77.2187269325602, - 1.54213958861058 - ], - "52694": [ - "SAN PEDRO DE CARTAGO", - -77.1014032568381, - 1.53682350048631 - ], - "52699": [ - "SANTA CRUZ (Guachav\u00e9s)", - -77.7445744101534, - 1.28517938089743 - ], - "52720": [ - "SAPUYES", - -77.6804499024209, - 1.03618904626323 - ], - "52786": [ - "TAMINANGO", - -77.325253161907, - 1.59166139790562 - ], - "52788": [ - "TANGUA", - -77.3506349147487, - 1.06407811829707 - ], - "52838": [ - "TUQUERRES", - -77.6307323868581, - 1.13444052876805 - ], - "52885": [ - "YACUANQUER", - -77.424675695332, - 1.1255479222869 - ], - "54003": [ - "ABREGO", - -73.1585048483567, - 8.01983448250334 - ], - "54051": [ - "ARBOLEDAS", - -72.8613642023821, - 7.61323128649365 - ], - "54125": [ - "C\u00c1COTA", - -72.6521215322447, - 7.27056009308809 - ], - "54172": [ - "CHIN\u00c1COTA", - -72.5839097997018, - 7.58335323498727 - ], - "54174": [ - "CHITAG\u00c0", - -72.5254474654727, - 7.05161677612822 - ], - "54206": [ - "CONVENCI\u00d3N", - -73.2000776856867, - 8.87315989460511 - ], - "54223": [ - "CUCUTILLA", - -72.7970344769368, - 7.50218237033451 - ], - "54245": [ - "EL CARMEN", - -73.3458592155996, - 8.86799003437634 - ], - "54250": [ - "EL TARRA", - -73.0317596995366, - 8.67826367168069 - ], - "54347": [ - "HERR\u00c1N", - -72.4926999873449, - 7.49395578654959 - ], - "54385": [ - "LA ESPERANZA", - -73.3613967256186, - 7.69523359467076 - ], - "54398": [ - "LA PLAYA", - -73.1878932681174, - 8.25675787585297 - ], - "54418": [ - "LOURDES", - -72.8467029071809, - 7.96371276147487 - ], - "54480": [ - "MUTISCUA", - -72.768345806507, - 7.316949495974 - ], - "54520": [ - "PAMPLONITA", - -72.6351540155819, - 7.48287886491383 - ], - "54553": [ - "PUERTO SANTANDER", - -72.4111906597777, - 8.32913864543727 - ], - "54599": [ - "RAGONVALIA", - -72.5075662273728, - 7.59535597882748 - ], - "54660": [ - "SALAZAR", - -72.8676995913973, - 7.77274782686335 - ], - "54670": [ - "SAN CALIXTO", - -73.1579809429469, - 8.45383754920262 - ], - "54673": [ - "SAN CAYETANO", - -72.6097120387692, - 7.84787219910619 - ], - "54680": [ - "SANTIAGO", - -72.7182541082669, - 7.88923445745991 - ], - "54743": [ - "SILOS", - -72.7861789339417, - 7.1809915996006 - ], - "54800": [ - "TEORAMA", - -73.1571409661135, - 8.76001379430456 - ], - "54810": [ - "TIB\u00da", - -72.7992585520605, - 8.71350723784336 - ], - "54871": [ - "VILLA CARO", - -72.9875941859283, - 7.93629317537241 - ], - "63001": [ - "ARMENIA", - -75.7248975509691, - 4.49950353681895 - ], - "63111": [ - "BUENAVISTA", - -75.7440373441092, - 4.36663238496178 - ], - "63130": [ - "CALARCA", - -75.6567500840336, - 4.46787663786967 - ], - "63190": [ - "CIRCASIA", - -75.6668903510544, - 4.60483782116325 - ], - "63212": [ - "C\u00d3RDOBA", - -75.6513230814638, - 4.39597517984954 - ], - "63272": [ - "FILANDIA", - -75.6714694104632, - 4.66932534914663 - ], - "63302": [ - "G\u00c9NOVA", - -75.760566952209, - 4.18010777616334 - ], - "63401": [ - "LA TEBAIDA", - -75.8173213642142, - 4.43567415878632 - ], - "63470": [ - "MONTENEGRO", - -75.8180742632166, - 4.52188525359408 - ], - "63548": [ - "PIJAO", - -75.6833021171803, - 4.30397868163848 - ], - "63594": [ - "QUIMBAYA", - -75.7920508724617, - 4.61027349886558 - ], - "63690": [ - "SALENTO", - -75.5309128456793, - 4.6113160574457 - ], - "66001": [ - "PEREIRA", - -75.7123622835768, - 4.78129211958265 - ], - "66045": [ - "AP\u00cdA", - -75.9535388143761, - 5.13963732779143 - ], - "66088": [ - "BEL\u00c9N DE UMBR\u00cdA", - -75.8679389348507, - 5.20039869664271 - ], - "66318": [ - "GU\u00c1TICA", - -75.8043665904115, - 5.32029596711003 - ], - "66383": [ - "LA CELIA", - -76.0082267836339, - 4.98812767973061 - ], - "66400": [ - "LA VIRGINIA", - -75.8520382223163, - 4.90471502630053 - ], - "66440": [ - "MARSELLA", - -75.7532138983598, - 4.94293618677496 - ], - "66572": [ - "PUEBLO RICO", - -76.0735942125173, - 5.2862954081206 - ], - "66594": [ - "QUINCHIA", - -75.7133968329908, - 5.32390686543101 - ], - "66682": [ - "SANTA ROSA DE CABAL", - -75.5495017473516, - 4.83378983086528 - ], - "66687": [ - "SANTUARIO", - -75.9819820643337, - 5.04597805913384 - ], - "68013": [ - "AGUADA", - -73.5303854158584, - 6.18220848146164 - ], - "68020": [ - "ALBANIA", - -73.8284597422101, - 5.77807339595512 - ], - "68051": [ - "ARATOCA", - -73.0116269767604, - 6.71676659045339 - ], - "68077": [ - "BARBOSA", - -73.623452299382, - 5.9556173324192 - ], - "68079": [ - "BARICHARA", - -73.2151846697959, - 6.64706254836627 - ], - "68081": [ - "BARRANCABERMEJA", - -73.7821164639394, - 7.05407456010413 - ], - "68092": [ - "BETULIA", - -73.3874352131949, - 7.01320406166355 - ], - "68101": [ - "BOLIVAR", - -74.1134062042841, - 6.09369082300627 - ], - "68121": [ - "CABRERA", - -73.2503489291603, - 6.56254367830106 - ], - "68132": [ - "CALIFORNIA", - -72.9263443319444, - 7.35328808783975 - ], - "68147": [ - "CAPITANEJO", - -72.6743520348081, - 6.52020010161666 - ], - "68152": [ - "CARCAS\u00cd", - -72.5696843477762, - 6.65967528060171 - ], - "68160": [ - "CEPIT\u00c1", - -72.9292462975266, - 6.7524655384241 - ], - "68162": [ - "CERRITO", - -72.645363252307, - 6.90392317856639 - ], - "68167": [ - "CHARALA", - -73.154010662897, - 6.19555195256109 - ], - "68169": [ - "CHARTA", - -72.987878805256, - 7.25896440504189 - ], - "68176": [ - "CHIMA", - -73.4147612141851, - 6.37267718618339 - ], - "68179": [ - "CHIPAT\u00c1", - -73.6323902661005, - 6.0679480326086 - ], - "68190": [ - "CIMITARRA", - -74.1703042725472, - 6.40972961273731 - ], - "68207": [ - "CONCEPCI\u00d3N", - -72.605716117417, - 6.78453117534741 - ], - "68209": [ - "CONFINES", - -73.2398527255901, - 6.35562069903121 - ], - "68211": [ - "CONTRATACI\u00d3N", - -73.5021152790989, - 6.30311661577248 - ], - "68217": [ - "COROMORO", - -72.9817680332221, - 6.23473578598589 - ], - "68229": [ - "CURIT\u00cd", - -73.0187245163354, - 6.61834460350796 - ], - "68235": [ - "EL CARMEN DE CHUCURI", - -73.5647528811531, - 6.66426000553083 - ], - "68245": [ - "EL GUACAMAYO", - -73.5359115125913, - 6.25354798130727 - ], - "68250": [ - "EL PE\u00d1\u00d3N", - -73.927178684602, - 6.09672735632217 - ], - "68255": [ - "EL PLAY\u00d3N", - -73.1815819198995, - 7.52428472417972 - ], - "68264": [ - "ENCINO", - -73.062066657483, - 6.07906123047058 - ], - "68266": [ - "ENCISO", - -72.680279397983, - 6.65824115696297 - ], - "68271": [ - "FLORI\u00c1N", - -73.9552493137526, - 5.80110629525743 - ], - "68276": [ - "FLORIDABLANCA", - -73.0680015474425, - 7.07970468367166 - ], - "68296": [ - "GAL\u00c1N", - -73.3246712490471, - 6.67181099819735 - ], - "68298": [ - "G\u00c1MBITA", - -73.319399344055, - 5.9243835642008 - ], - "68318": [ - "GUACA", - -72.8236987401798, - 6.94343410527297 - ], - "68320": [ - "GUADALUPE", - -73.409774459534, - 6.23327825299307 - ], - "68322": [ - "GUAPOT\u00c1", - -73.3311527585869, - 6.31929987044039 - ], - "68324": [ - "GUAVAT\u00c1", - -73.7217367142047, - 5.94489484941384 - ], - "68327": [ - "G\u00dcEPSA", - -73.5789950949425, - 6.03337387885764 - ], - "68344": [ - "HATO", - -73.3617884114203, - 6.55987830351129 - ], - "68368": [ - "JES\u00daS MAR\u00cdA", - -73.8234221814439, - 5.85428823894968 - ], - "68370": [ - "JORD\u00c1N SUBE", - -73.0996131880318, - 6.71377972224949 - ], - "68377": [ - "LA BELLEZA", - -74.0507248989182, - 5.91023264993622 - ], - "68385": [ - "LAND\u00c1ZURI", - -73.818680904485, - 6.33150172469407 - ], - "68397": [ - "LA PAZ", - -73.629771957752, - 6.21737437440934 - ], - "68406": [ - "LEBR\u00cdJA", - -73.2913809784956, - 7.2040600663958 - ], - "68418": [ - "LOS SANTOS", - -73.1078508634242, - 6.81216293921047 - ], - "68425": [ - "MACARAVITA", - -72.5853649284163, - 6.51374531003479 - ], - "68432": [ - "M\u00c1LAGA", - -72.738410922652, - 6.72022235467807 - ], - "68444": [ - "MATANZA", - -73.0543899783211, - 7.34877832237501 - ], - "68464": [ - "MOGOTES", - -72.9583477321161, - 6.49253232157873 - ], - "68468": [ - "MOLAGAVITA", - -72.8191627472424, - 6.64329056544727 - ], - "68498": [ - "OCAMONTE", - -73.1221183386624, - 6.35536886336099 - ], - "68500": [ - "OIBA", - -73.2796151601632, - 6.22559622189551 - ], - "68502": [ - "ONZAGA", - -72.8120583851113, - 6.33519455448805 - ], - "68522": [ - "PALMAR", - -73.2890067160412, - 6.52475399873677 - ], - "68524": [ - "PALMAS DEL SOCORRO", - -73.2827317504569, - 6.39175011236093 - ], - "68533": [ - "P\u00c1RAMO", - -73.1714823268918, - 6.41663113608818 - ], - "68547": [ - "PIEDECUESTA", - -73.005171716003, - 6.96245608004994 - ], - "68549": [ - "PINCHOTE", - -73.1757098703984, - 6.51389263094786 - ], - "68572": [ - "PUENTE NACIONAL", - -73.6784181601552, - 5.83112991100659 - ], - "68573": [ - "PUERTO PARRA", - -73.9576125615259, - 6.68527885906756 - ], - "68575": [ - "PUERTO WILCHES", - -73.7838343580542, - 7.57716072673479 - ], - "68615": [ - "RIONEGRO", - -73.3724641753727, - 7.47422608702852 - ], - "68655": [ - "SABANA DE TORRES", - -73.571318076708, - 7.40654220176196 - ], - "68669": [ - "SAN ANDRES", - -72.8161320309984, - 6.79648306846582 - ], - "68673": [ - "SAN BENITO", - -73.5274905103178, - 6.10168120954696 - ], - "68679": [ - "SAN GIL", - -73.1188791185591, - 6.55077877048234 - ], - "68682": [ - "SAN JOAQU\u00cdN", - -72.8547188388432, - 6.45987982891506 - ], - "68684": [ - "SAN JOS\u00c9 DE MIRANDA", - -72.7397642356542, - 6.62940019147664 - ], - "68686": [ - "SAN MIGUEL", - -72.6432249768973, - 6.56812154804423 - ], - "68689": [ - "SAN VICENTE DE CHUCURI", - -73.5390033408705, - 6.89429234977564 - ], - "68705": [ - "SANTA BARBARA", - -72.8960893408119, - 6.98808471598551 - ], - "68720": [ - "SANTA HELENA DEL OP\u00d3N", - -73.5820660945781, - 6.40890734460396 - ], - "68745": [ - "SIMACOTA", - -73.6901169393433, - 6.64810044367411 - ], - "68755": [ - "SOCORRO", - -73.2443600159345, - 6.46208824600034 - ], - "68770": [ - "SUAITA", - -73.3662118360809, - 6.11476305141166 - ], - "68773": [ - "SUCRE", - -73.9593623596499, - 5.98320373844776 - ], - "68780": [ - "SURAT\u00c1", - -72.9877996636388, - 7.47540206686478 - ], - "68820": [ - "TONA", - -72.9397044388516, - 7.17089110329036 - ], - "68855": [ - "VALLE DE SAN JOSE", - -73.1099717171434, - 6.43457892476708 - ], - "68861": [ - "V\u00c9LEZ", - -73.7024486988392, - 6.22056233264845 - ], - "68867": [ - "VETAS", - -72.8815690106761, - 7.32221956718159 - ], - "68872": [ - "VILLANUEVA", - -73.1639691669083, - 6.68586733097617 - ], - "68895": [ - "ZAPATOCA", - -73.2797597918648, - 6.83462670962668 - ], - "70110": [ - "BUENAVISTA", - -74.9520443811613, - 9.3200452869502 - ], - "70124": [ - "CAIMITO", - -75.1319106225321, - 8.79231159344945 - ], - "70204": [ - "RICAURTE (COLOSO)", - -75.3644714888622, - 9.52794989721093 - ], - "70215": [ - "COROZAL", - -75.2505245597565, - 9.20402672726258 - ], - "70221": [ - "COVE\u00d1AS", - -75.6574913917041, - 9.39445011730328 - ], - "70230": [ - "CHAL\u00c1N", - -75.3242090659353, - 9.56958458950007 - ], - "70233": [ - "EL ROBLE", - -75.1381861284343, - 9.07100905350062 - ], - "70235": [ - "GALERAS", - -74.9813470501689, - 9.1351690899799 - ], - "70265": [ - "GUARANDA", - -74.6761916221848, - 8.38390752820399 - ], - "70400": [ - "LA UNI\u00d3N", - -75.2832221090486, - 8.81199779248522 - ], - "70418": [ - "LOS PALMITOS", - -75.2130281216225, - 9.42238052784966 - ], - "70429": [ - "MAJAGUAL", - -74.7103736167995, - 8.54614285559377 - ], - "70473": [ - "MORROA", - -75.3271881440007, - 9.39249726977648 - ], - "70508": [ - "OVEJAS", - -75.188559151933, - 9.5496552630361 - ], - "70523": [ - "PALMITO", - -75.5619883409484, - 9.33493887776933 - ], - "70670": [ - "SAMPU\u00c9S", - -75.3602732848624, - 9.16518829926991 - ], - "70678": [ - "SAN BENITO ABAD", - -74.9646939775401, - 8.83563491409675 - ], - "70702": [ - "SAN JUAN DE BETULIA", - -75.2136354168949, - 9.29202317747212 - ], - "70708": [ - "SAN MARCOS", - -75.1724995432902, - 8.58922009686498 - ], - "70713": [ - "SAN ONOFRE", - -75.5052291390921, - 9.81459936196076 - ], - "70717": [ - "SAN PEDRO", - -75.0374217561142, - 9.39683661211438 - ], - "70742": [ - "SAN LUIS DE SINC\u00c9", - -75.0939708813151, - 9.25629904093542 - ], - "70771": [ - "SUCRE", - -74.7475313072745, - 8.81433347232864 - ], - "70820": [ - "SANTIAGO DE TOL\u00da", - -75.5354349299616, - 9.53381021132404 - ], - "70823": [ - "TOL\u00da VIEJO", - -75.4445111876362, - 9.49029759493564 - ], - "73024": [ - "ALPUJARRA", - -74.9407823348759, - 3.39001507181413 - ], - "73026": [ - "ALVARADO", - -74.9863068627545, - 4.58262578929672 - ], - "73030": [ - "AMBALEMA", - -74.804418133763, - 4.82491185748635 - ], - "73043": [ - "ANZO\u00c1TEGUI", - -75.1911774928716, - 4.63178404121414 - ], - "73055": [ - "ARMERO", - -74.8475009544105, - 5.00675896083905 - ], - "73067": [ - "ATACO", - -75.482275428792, - 3.42843089854935 - ], - "73124": [ - "CAJAMARCA", - -75.4974598510344, - 4.40697042761936 - ], - "73148": [ - "CARMEN DE APICALA", - -74.7470024662573, - 4.12341680202729 - ], - "73152": [ - "CASABIANCA", - -75.1888002801832, - 5.01675120345889 - ], - "73168": [ - "CHAPARRAL", - -75.5898663485941, - 3.74369309002053 - ], - "73200": [ - "COELLO", - -74.911474537009, - 4.35416232656661 - ], - "73217": [ - "COYAIMA", - -75.1485373706151, - 3.73862556066427 - ], - "73226": [ - "CUNDAY", - -74.6893690865657, - 3.98252395752543 - ], - "73236": [ - "DOLORES", - -74.8025667449119, - 3.59786328196267 - ], - "73268": [ - "ESPINAL", - -74.893529416203, - 4.16647697555474 - ], - "73270": [ - "FALAN", - -74.9570337222186, - 5.0792566024582 - ], - "73275": [ - "FLANDES", - -74.8370863870679, - 4.2428132631392 - ], - "73283": [ - "FRESNO", - -75.0522877015986, - 5.18669771414389 - ], - "73319": [ - "GUAMO", - -74.97660088163, - 4.07650675395799 - ], - "73347": [ - "HERVEO", - -75.2432161696375, - 5.06855745481266 - ], - "73349": [ - "HONDA", - -74.7830310368983, - 5.17941685364673 - ], - "73352": [ - "ICONONZO", - -74.5396424262845, - 4.13327421776658 - ], - "73408": [ - "L\u00c9RIDA", - -74.9233717897718, - 4.86603459615099 - ], - "73411": [ - "LIBANO", - -75.0476307625333, - 4.87793675977161 - ], - "73443": [ - "SAN SEBASTI\u00c1N DE MARIQUITA", - -74.9066776850577, - 5.23532239730827 - ], - "73449": [ - "MELGAR", - -74.637830944494, - 4.18605626751841 - ], - "73461": [ - "MURILLO", - -75.2199398700534, - 4.82673447219991 - ], - "73483": [ - "NATAGAIMA", - -75.1220100025927, - 3.54051821017455 - ], - "73504": [ - "ORTEGA", - -75.2782320511481, - 3.93778417630939 - ], - "73520": [ - "PALOCABILDO", - -75.018450499937, - 5.09403574074543 - ], - "73547": [ - "PIEDRAS", - -74.9208960303731, - 4.48500414912118 - ], - "73555": [ - "PLANADAS", - -75.8168441383498, - 3.0989734367019 - ], - "73563": [ - "PRADO", - -74.8724770653348, - 3.72916665671735 - ], - "73585": [ - "PURIFICACI\u00d3N", - -74.8745115563316, - 3.85428162147509 - ], - "73616": [ - "RIOBLANCO", - -75.854811031793, - 3.46807755329381 - ], - "73622": [ - "RONCESVALLES", - -75.5942802737106, - 4.09786118573243 - ], - "73624": [ - "ROVIRA", - -75.347585518998, - 4.21672584206948 - ], - "73671": [ - "SALDA\u00d1A", - -75.0185976233206, - 3.91254279336934 - ], - "73675": [ - "SAN ANTONIO", - -75.4990700143494, - 3.95515810900406 - ], - "73678": [ - "SAN LUIS", - -75.1124479295726, - 4.12861849605011 - ], - "73686": [ - "SANTA ISABEL", - -75.2071286242889, - 4.72910762213881 - ], - "73770": [ - "SUAR\u00c9Z", - -74.8185878725374, - 4.04894005691181 - ], - "73854": [ - "VALLE DE SAN JUAN", - -75.1714823749913, - 4.18212565203609 - ], - "73861": [ - "VENADILLO", - -74.9208988636235, - 4.70988172488821 - ], - "73870": [ - "VILLAHERMOSA", - -75.1559296959121, - 4.96575346428605 - ], - "73873": [ - "VILLARRICA", - -74.6189662405203, - 3.85438410480357 - ], - "76020": [ - "ALCAL\u00c1", - -75.782979320555, - 4.67889710189075 - ], - "76036": [ - "ANDALUC\u00cdA", - -76.1647046095276, - 4.14485360314687 - ], - "76041": [ - "ANSERMANUEVO", - -76.0296304902253, - 4.79592729367179 - ], - "76054": [ - "ARGELIA", - -76.1416499874319, - 4.70428786588445 - ], - "76100": [ - "BOL\u00cdVAR", - -76.3648595494933, - 4.36368169893846 - ], - "76111": [ - "BUGA", - -76.1051444045495, - 3.85524552901928 - ], - "76113": [ - "BUGALAGRANDE", - -76.0896103068615, - 4.19685299412505 - ], - "76122": [ - "CAICEDONIA", - -75.8367256721695, - 4.30899797566684 - ], - "76126": [ - "CALIMA", - -76.6277829484718, - 3.94438662179385 - ], - "76001": [ - "CALI", - -76.5764924841505, - 3.39904444118103 - ], - "76243": [ - "EL \u00c1GUILA", - -76.0660100091826, - 4.91756287415768 - ], - "76246": [ - "EL CAIRO", - -76.2150282591478, - 4.75606370198849 - ], - "76248": [ - "EL CERRITO", - -76.2091580956403, - 3.67598883429976 - ], - "76250": [ - "EL DOVIO", - -76.2876270150912, - 4.5399797302058 - ], - "76275": [ - "FLORIDA", - -76.1647746553006, - 3.30410494216863 - ], - "76306": [ - "GINEBRA", - -76.1908200447785, - 3.7441044142077 - ], - "76318": [ - "GUACAR\u00cd", - -76.2944883090247, - 3.78377992590389 - ], - "76364": [ - "JAMUND\u00cd", - -76.6276042734923, - 3.21389692841007 - ], - "76377": [ - "LA CUMBRE", - -76.5898990550419, - 3.6943031091043 - ], - "76400": [ - "LA UNI\u00d3N", - -76.1032961351688, - 4.53792924874794 - ], - "76403": [ - "LA VICTORIA", - -75.9667730302271, - 4.48351114454868 - ], - "76497": [ - "OBANDO", - -75.9491997006917, - 4.59758866800445 - ], - "76520": [ - "PALMIRA", - -76.2278025103617, - 3.5583916329393 - ], - "76563": [ - "PRADERA", - -76.1784184180208, - 3.42063665477863 - ], - "76606": [ - "RESTREPO", - -76.5348985363949, - 3.8064949759284 - ], - "76616": [ - "RIOFR\u00cdO", - -76.3710544361048, - 4.1095003006953 - ], - "76622": [ - "ROLDANILLO", - -76.1682424951759, - 4.44357185067411 - ], - "76670": [ - "SAN PEDRO", - -76.2083656501915, - 3.98143119006224 - ], - "76736": [ - "SEVILLA", - -75.8881816376471, - 4.19341192705735 - ], - "76823": [ - "TORO", - -76.0810597622352, - 4.6384163330794 - ], - "76828": [ - "TRUJILLO", - -76.3429269911606, - 4.23326811841769 - ], - "76834": [ - "TULU\u00c1", - -76.0325037966983, - 4.02840797410613 - ], - "76845": [ - "ULLOA", - -75.778359029538, - 4.70771894941179 - ], - "76863": [ - "VERSALLES", - -76.2178961043146, - 4.622590221659 - ], - "76869": [ - "VIJES", - -76.4706471785297, - 3.74365889338229 - ], - "76890": [ - "YOTOCO", - -76.390804352015, - 3.90413035650948 - ], - "76892": [ - "YUMBO", - -76.5109871537073, - 3.5959146007278 - ], - "76895": [ - "ZARZAL", - -76.0506533708321, - 4.35359875091473 - ], - "81220": [ - "CRAVO NORTE", - -70.0698292709628, - 6.34671879410653 - ], - "81300": [ - "FORTUL", - -71.8294520126409, - 6.70531596216437 - ], - "81794": [ - "TAME", - -71.7917864809209, - 6.3906504889575 - ], - "85015": [ - "CHAMEZA", - -72.864968048557, - 5.22845341426911 - ], - "85136": [ - "LA SALINA", - -72.3469337835271, - 6.17828238167186 - ], - "85139": [ - "MAN\u00cd", - -72.2128027428228, - 4.67576950125763 - ], - "85225": [ - "NUNCHIA", - -72.0925193844609, - 5.52918124652795 - ], - "85230": [ - "OROCU\u00c9", - -71.5987396748516, - 4.91513914812058 - ], - "85250": [ - "PAZ DE ARIPORO", - -70.8694703879007, - 5.77991529631332 - ], - "85279": [ - "RECETOR", - -72.7708183193417, - 5.26306851731143 - ], - "85300": [ - "SABANALARGA", - -72.9958065630601, - 4.81119012020166 - ], - "85315": [ - "SACAMA", - -72.2107616437452, - 6.04990644441807 - ], - "85325": [ - "SAN LUIS DE PALENQUE", - -71.5935464134396, - 5.23183624232203 - ], - "85400": [ - "TAMARA", - -72.2006782331841, - 5.87892743392227 - ], - "85410": [ - "TAURAMENA", - -72.6292243712394, - 4.6974637029731 - ], - "85440": [ - "VILLANUEVA", - -72.823142823975, - 4.52830773090375 - ], - "86219": [ - "COL\u00d3N", - -76.9667296308459, - 1.22321782600665 - ], - "86569": [ - "PUERTO CAICEDO", - -76.4809940628293, - 0.72507124033472 - ], - "86749": [ - "SIBUNDOY", - -76.9130758627636, - 1.22874693026224 - ], - "86760": [ - "SANTIAGO", - -77.0056290168186, - 1.08581286409137 - ], - "86865": [ - "VALLE DEL GUAMUEZ", - -76.884092907151, - 0.412963697967737 - ], - "88001": [ - "SAN ANDR\u00c9S", - -81.7176233247739, - 12.5431173169422 - ], - "91540": [ - "PUERTO NARI\u00d1O", - -70.4719904407293, - -3.63132318277368 - ], - "91001": [ - "LETICIA", - -70.0451258937784, - -3.53014220956782 - ], - "91798": [ - "TARAPAC\u00c1", - -70.0065153997597, - -2.45179422585488 - ], - "91263": [ - "EL ENCANTO", - -72.7236156893291, - -1.9972347660928 - ], - "91536": [ - "PUERTO ARICA", - -71.1484049352326, - -1.91085402689743 - ], - "91530": [ - "PUERTO ALEGR\u00cdA", - -73.757227504815, - -0.952145050133594 - ], - "91407": [ - "LA PEDRERA", - -70.038304490364, - -1.4271429650747 - ], - "91405": [ - "LA CHORRERA", - -72.7604834388358, - -1.24049477211654 - ], - "91669": [ - "SANTANDER (Araracuara)", - -71.9389336165356, - -1.10103259571505 - ], - "97666": [ - "TARAIRA", - -69.9077620562773, - -0.719822175102562 - ], - "91460": [ - "MIRIT\u00cd-PARAN\u00c1 (Campoamor)", - -71.1855046343179, - -0.687037523423289 - ], - "91430": [ - "LA VICTORIA (Pacoa)", - -71.1048780819859, - -0.12501635203059 - ], - "86757": [ - "SAN MIGUEL (La Dorada)", - -76.8577578900925, - 0.305873838208945 - ], - "86568": [ - "PUERTO AS\u00cdS", - -76.3282001625417, - 0.47861147504222 - ], - "86573": [ - "PUERTO LEGU\u00cdZAMO", - -75.0647932908853, - 0.0594719862427428 - ], - "52560": [ - "POTOS\u00cd", - -77.4248076185956, - 0.722678317622712 - ], - "97511": [ - "PACOA (Cor. Departamental)", - -70.9364723248578, - 0.194770033531573 - ], - "52356": [ - "IPIALES", - -77.3703586663639, - 0.558615706888978 - ], - "86320": [ - "ORITO", - -76.9431392395129, - 0.673756331614186 - ], - "52022": [ - "ALDANA", - -77.6953873144255, - 0.913431922714205 - ], - "18785": [ - "SOLITA", - -75.6384004691742, - 0.909265468917757 - ], - "52317": [ - "GUACHUCAL", - -77.7375894213705, - 0.975037910325969 - ], - "52506": [ - "OSPINA", - -77.5523494430039, - 1.02981585999152 - ], - "86571": [ - "PUERTO GUZM\u00c1N", - -75.8802298002907, - 0.746432227498304 - ], - "86885": [ - "VILLAGARZ\u00d3N", - -76.7449544839608, - 0.911149523512247 - ], - "97889": [ - "YAVARAT\u00c9 (Cor. Departamental)", - -69.6186775818307, - 0.833312272253112 - ], - "18205": [ - "CURILLO", - -75.9517850697292, - 1.05966317569991 - ], - "18756": [ - "SOLANO", - -73.1238679251089, - 0.211280866741806 - ], - "86755": [ - "SAN FRANCISCO", - -76.8472666152902, - 1.13607110385061 - ], - "52001": [ - "PASTO", - -77.2061007521395, - 1.08360550424476 - ], - "52683": [ - "SANDON\u00c1", - -77.4567006904749, - 1.28810541488625 - ], - "52435": [ - "MALLAMA (Piedrancha)", - -77.8466441740002, - 1.15594630344244 - ], - "52381": [ - "LA FLORIDA", - -77.3882284436309, - 1.33392589539207 - ], - "86001": [ - "MOCOA", - -76.6843621933914, - 1.22857500333442 - ], - "52019": [ - "ALB\u00c1N (San Jos\u00e9)", - -77.068809480034, - 1.46985409114344 - ], - "52260": [ - "EL TAMBO", - -77.3831159804109, - 1.43026376574257 - ], - "18150": [ - "CARTAGENA DEL CHAIR\u00c1", - -74.2723550110034, - 0.647693098121983 - ], - "52678": [ - "SAMANIEGO", - -77.6917955975711, - 1.4305552668544 - ], - "94885": [ - "LA GUADALUPE", - -67.0015178954294, - 1.40453922453643 - ], - "52693": [ - "SAN PABLO", - -76.9752798009179, - 1.68157663331146 - ], - "97161": [ - "CARUR\u00da", - -71.3309303803579, - 1.05276233953332 - ], - "97001": [ - "MIT\u00da", - -70.4175529099028, - 1.01557187861269 - ], - "52079": [ - "BARBACOAS", - -78.1562107282471, - 1.44563774314057 - ], - "52540": [ - "POLICARPA", - -77.4813435961709, - 1.73535420659732 - ], - "95200": [ - "MIRAFLORES", - -72.0181089918651, - 1.36397541847788 - ], - "52835": [ - "TUMACO", - -78.615403652831, - 1.57453291870233 - ], - "5615": [ - "RIONEGRO", - -75.4107605410477, - 6.15078581596337 - ], - "20443": [ - "MANAURE BALC\u00d3N DEL CESAR", - -72.9916853907644, - 10.3909550697316 - ], - "94001": [ - "IN\u00cdRIDA", - -68.4572366275969, - 3.31940501244988 - ], - "27580": [ - "RIO IR\u00d3 (Santa Rita)", - -76.4844611858334, - 5.17267254486006 - ], - "95025": [ - "EL RETORNO", - -71.5365663462041, - 2.08611552646703 - ], - "94887": [ - "PAN\u00c1-PAN\u00c1 (Campo Alegre)", - -69.1144003923692, - 1.98105532373156 - ], - "94883": [ - "SAN FELIPE", - -67.3398854747294, - 2.15590867522329 - ], - "27413": [ - "LLOR\u00d3", - -76.3854444868162, - 5.58510117710063 - ], - "97777": [ - "PAPUNAUA(Cor. Departamental)", - -70.7061876416715, - 1.68161140678982 - ], - "54344": [ - "HACAR\u00cd", - -73.078263300285, - 8.36183198836341 - ], - "54720": [ - "SARDINATA", - -72.8063153778925, - 8.26412848642615 - ], - "66075": [ - "BALBOA", - -75.9427369485759, - 4.9183440036724 - ], - "85001": [ - "YOPAL", - -72.2580285844532, - 5.24274477245549 - ], - "85430": [ - "TRINIDAD", - -71.1941635039417, - 5.36742028703525 - ], - "15001": [ - "TUNJA", - -73.3780184827387, - 5.51847283262008 - ], - "52427": [ - "MAG\u00dc\u00cd (Pay\u00e1n)", - -78.0447364416625, - 1.90685843237727 - ], - "52405": [ - "LEIVA", - -77.3119443284164, - 1.93897699655214 - ], - "95015": [ - "CALAMAR", - -73.0342635767425, - 1.6136338731624 - ], - "52621": [ - "ROBERTO PAY\u00c1N (San Jos\u00e9)", - -78.3811163028275, - 1.89758115769307 - ], - "52520": [ - "FRANCISCO PIZARRO (Salahonda)", - -78.5919309880733, - 2.08853192636164 - ], - "50350": [ - "LA MACARENA", - -74.0948807727111, - 2.16186393051835 - ], - "52473": [ - "MOSQUERA", - -78.4388270047687, - 2.44249369810235 - ], - "52490": [ - "OLAYA HERRERA (Bocas de Satinga)", - -78.2947162291451, - 2.28989293509034 - ], - "52696": [ - "SANTA B\u00c1RBARA (Iscuand\u00e9)", - -77.8743722952122, - 2.30215518273664 - ], - "52390": [ - "LA TOLA", - -78.2099103512471, - 2.41930643131804 - ], - "41349": [ - "HOBO", - -75.4478108412933, - 2.54165417010993 - ], - "52250": [ - "EL CHARCO", - -77.7957381617229, - 2.18315717256031 - ], - "19318": [ - "GUAPI", - -77.6904753083515, - 2.41326696293003 - ], - "94888": [ - "MORICHAL (Morichal Nuevo)", - -69.8400158825363, - 2.42144483198788 - ], - "95001": [ - "SAN JOS\u00c9 DEL GUAVIARE", - -71.9191699499047, - 2.48428611007408 - ], - "19809": [ - "TIMBIQU\u00cd", - -77.4913157685796, - 2.69947513000209 - ], - "18753": [ - "SAN VICENTE DEL CAGU\u00c1N", - -74.2629775325759, - 1.56780171050782 - ], - "50450": [ - "PUERTO CONCORDIA", - -72.7210939669887, - 2.75226024555104 - ], - "50590": [ - "PUERTO RICO", - -73.1378016532004, - 2.75808362691234 - ], - "94884": [ - "PUERTO COLOMBIA", - -68.2089871913376, - 2.50757986711764 - ], - "50711": [ - "VISTAHERMOSA", - -73.6665223520341, - 2.81161671153047 - ], - "19418": [ - "L\u00d3PEZ", - -77.2184120922945, - 3.00153896459703 - ], - "94663": [ - "MAPIRIPANA", - -70.2693256646371, - 2.80888224700436 - ], - "50325": [ - "MAPIRIP\u00c1N", - -71.9380569377516, - 3.11752337878108 - ], - "50577": [ - "PUERTO LLERAS", - -73.2367143805048, - 3.19309293825458 - ], - "94343": [ - "BARRANCO MINA", - -69.3987704142537, - 3.31350794239487 - ], - "94886": [ - "CACAHUAL", - -67.5850800247707, - 3.38616247920617 - ], - "76233": [ - "DAGUA", - -76.7203934684793, - 3.64982222098374 - ], - "76109": [ - "BUENAVENTURA", - -77.0858602904002, - 3.61142738860289 - ], - "50001": [ - "VILLAVICENCIO", - -73.4929036676635, - 4.09166560580672 - ], - "27250": [ - "EL LITORAL DEL SAN JU\u00c1N (Docord\u00f3)", - -76.9626014267759, - 4.24716134420683 - ], - "73001": [ - "IBAGU\u00c9", - -75.2525914431848, - 4.45192162282818 - ], - "27745": [ - "SIP\u00cd", - -76.5419445943782, - 4.59441515798386 - ], - "11001": [ - "BOGOT\u00c1, D.C.", - -74.1810727121648, - 4.31610770770964 - ], - "47001": [ - "SANTA MARTA", - -73.8852785425603, - 11.1218943494222 - ], - "44001": [ - "RIOHACHA", - -72.958763452783, - 11.2429721652636 - ], - "44847": [ - "URIBIA", - -71.748826611936, - 11.9997198515333 - ], - "88564": [ - "PROVIDENCIA (Santa Isabel)", - -81.3739045071033, - 13.3510872412013 - ], - "85162": [ - "MONTERREY", - -72.8473434112946, - 4.84130865249997 - ], - "50568": [ - "PUERTO GAIT\u00c1N", - -71.6315743057569, - 4.00503448329886 - ], - "20045": [ - "BECERRILL", - -73.2525052199717, - 9.72773293678681 - ], - "27361": [ - "ISTMINA", - -76.869157946662, - 4.73983990350881 - ], - "70001": [ - "SINCELEJO", - -75.4317489142069, - 9.31667419811157 - ], - "5001": [ - "MEDELL\u00cdN", - -75.6110318154478, - 6.25759027927781 - ], - "5240": [ - "EB\u00c9JICO", - -75.7833117468959, - 6.32644492034068 - ], - "5212": [ - "COPACABANA", - -75.5007563899799, - 6.35188288303013 - ], - "5088": [ - "BELLO", - -75.5897361212797, - 6.35884130425212 - ], - "5308": [ - "GIRARDOTA", - -75.4479574418141, - 6.37974589397232 - ], - "27073": [ - "BAGAD\u00d3", - -76.1979690645945, - 5.50311977166016 - ], - "27600": [ - "RIO QUITO (Paimad\u00f3)", - -76.811570841105, - 5.56753333394981 - ], - "27050": [ - "ATRATO (Yuto)", - -76.6061156603528, - 5.56064017691179 - ], - "20400": [ - "LA JAGUA DE IBIRICO", - -73.3206839908035, - 9.5513404635256 - ], - "85263": [ - "PORE", - -71.9258080721371, - 5.66319496469501 - ], - "5631": [ - "SABANETA", - -75.6088068214257, - 6.1383051898155 - ], - "5380": [ - "LA ESTRELLA", - -75.6489557520394, - 6.13759745201204 - ], - "5266": [ - "ENVIGADO", - -75.5468678844621, - 6.15439487963027 - ], - "5360": [ - "ITAG\u00dc\u00cd", - -75.614203758093, - 6.17927953587734 - ], - "27425": [ - "MEDIO ATRATO (Bet\u00e9)", - -76.6734696989035, - 6.03388009470954 - ], - "99524": [ - "LA PRIMAVERA", - -69.6104814221852, - 5.52156133544763 - ], - "5364": [ - "JARD\u00cdN", - -75.8184257490815, - 5.57444433889827 - ], - "27491": [ - "N\u00d3VITA", - -76.6182366846726, - 4.85338662637614 - ], - "27450": [ - "MEDIO SAN JUAN (Andagoya)", - -76.8040867874648, - 4.8152497853864 - ], - "27660": [ - "SAN JOS\u00c9 DEL PALMAR", - -76.2800236066466, - 4.95874134555278 - ], - "27205": [ - "CONDOTO", - -76.5275063192796, - 5.07371598671011 - ], - "85010": [ - "AGUAZUL", - -72.5482101798784, - 5.12612189734283 - ], - "54874": [ - "VILLA DEL ROSARIO", - -72.4820253436446, - 7.75628153917833 - ], - "27430": [ - "MEDIO BAUD\u00d3(Boca de Pep\u00e9)", - -76.9959307501775, - 5.11039224087519 - ], - "27810": [ - "UNI\u00d3N PANAMERICANA ( Animas)", - -76.6453978118744, - 5.28527811630467 - ], - "27787": [ - "TAD\u00d3", - -76.3310954716138, - 5.26610157919395 - ], - "27160": [ - "C\u00c9RTEGUI", - -76.5226423669519, - 5.38982822741278 - ], - "27135": [ - "EL CANT\u00d3N DEL SAN PABLO (Managr\u00fa)", - -76.7725562421308, - 5.35966196503003 - ], - "99773": [ - "CUMARIBO", - -69.5214048630649, - 4.26245476896286 - ], - "17614": [ - "RIOSUCIO", - -75.7522049913097, - 5.44227541841857 - ], - "27077": [ - "BAJO BAUD\u00d3 (Pizarro)", - -77.2176709368131, - 5.01184155360104 - ], - "66456": [ - "MISTRAT\u00d3", - -75.9613538664987, - 5.41407814090334 - ], - "27495": [ - "NUQU\u00cd", - -77.2929821964817, - 5.69005866682803 - ], - "27245": [ - "EL CARMEN", - -76.191894422318, - 5.81093836276449 - ], - "27025": [ - "ALTO BAUD\u00d3 (Pie de Pato)", - -77.0842153949924, - 5.6367409849906 - ], - "5376": [ - "LA CEJA", - -75.4308693484935, - 5.99252484280165 - ], - "5129": [ - "CALDAS", - -75.6264270590994, - 6.05444790125748 - ], - "99001": [ - "PUERTO CARRE\u00d1O", - -68.1412223646833, - 5.83652969170975 - ], - "27001": [ - "QUIBD\u00d3", - -76.6636784426314, - 5.93895298203189 - ], - "5656": [ - "SAN JER\u00d3NIMO", - -75.7031072708239, - 6.43830040728274 - ], - "5079": [ - "BARBOSA", - -75.3292408541209, - 6.44341793394612 - ], - "5690": [ - "SANTO DOMINGO", - -75.1426011214504, - 6.48104488832084 - ], - "5847": [ - "URRAO", - -76.2590648159411, - 6.3353413368287 - ], - "81591": [ - "PUERTO ROND\u00d3N", - -70.9667896582008, - 6.41176184194564 - ], - "5042": [ - "SANTA FE DE ANTIOQUIA", - -75.9042665765195, - 6.53571157326466 - ], - "5086": [ - "BELMIRA", - -75.6538511972741, - 6.65366277343804 - ], - "5411": [ - "LIBORINA", - -75.7830004552565, - 6.72399093199725 - ], - "27075": [ - "BAH\u00cdA SOLANO (Mutis)", - -77.3538273555337, - 6.29015280806262 - ], - "5873": [ - "VIGIA DEL FUERTE", - -76.6950480122219, - 6.45335132983483 - ], - "5310": [ - "G\u00d3MEZ PLATA", - -75.1927028445246, - 6.70956272291333 - ], - "27099": [ - "BOJAY\u00c1 (Bellavista)", - -77.0993302441192, - 6.47466687986461 - ], - "5686": [ - "SANTA ROSA DE OSOS", - -75.4381433307364, - 6.67582782323308 - ], - "5315": [ - "GUADALUPE", - -75.2259130261863, - 6.86157632379804 - ], - "5138": [ - "CA\u00d1ASGORDAS", - -76.0268963134722, - 6.81494993190947 - ], - "5475": [ - "MURIND\u00d3", - -76.7086134850865, - 6.82877385010423 - ], - "81065": [ - "ARAUQUITA", - -71.2982787797043, - 6.79934768092054 - ], - "81736": [ - "SARAVENA", - -71.8507069572085, - 6.90694222417478 - ], - "5819": [ - "TOLEDO", - -75.7136338168172, - 7.01639706537736 - ], - "81001": [ - "ARAUCA", - -70.5092115449055, - 6.79628083769089 - ], - "5234": [ - "DABEIBA", - -76.3142632790316, - 6.9922437775019 - ], - "68307": [ - "GIR\u00d3N", - -73.2487276682708, - 7.03668038220745 - ], - "68001": [ - "BUCARAMANGA", - -73.1115708186079, - 7.15583563057971 - ], - "5031": [ - "AMALFI", - -74.9812392979002, - 6.97778884155151 - ], - "5893": [ - "YOND\u00d3 (Casabe)", - -74.1582404166825, - 6.92515931952782 - ], - "27150": [ - "CARMEN DEL DARI\u00c9N (Curbarad\u00f3)", - -76.9742299257902, - 7.03364684378232 - ], - "54377": [ - "LABATECA", - -72.5226631182318, - 7.26551535169111 - ], - "54518": [ - "PAMPLONA", - -72.6759034815185, - 7.37905762827304 - ], - "54820": [ - "TOLEDO", - -72.3059341854604, - 7.22586496754912 - ], - "27372": [ - "JURAD\u00d3", - -77.679736611303, - 7.10333885922346 - ], - "5480": [ - "MUTAT\u00c1", - -76.4630656889439, - 7.32955784215167 - ], - "54099": [ - "BOCHALEMA", - -72.6578138033945, - 7.6334617011378 - ], - "54239": [ - "DURANIA", - -72.6720807246393, - 7.74699320960249 - ], - "54128": [ - "C\u00c1CHIRA", - -73.1293948155259, - 7.68418889912774 - ], - "54405": [ - "LOS PATIOS", - -72.5268075680049, - 7.74229164074377 - ], - "5147": [ - "CAREPA", - -76.6566818821936, - 7.78916610631167 - ], - "27615": [ - "RIOSUCIO", - -77.240675043324, - 7.38988796446408 - ], - "54313": [ - "GRAMALOTE", - -72.807055819569, - 7.90652299368694 - ], - "23580": [ - "PUERTO LIBERTADOR", - -75.7712322330942, - 7.71151573147781 - ], - "5045": [ - "APARTAD\u00d3", - -76.5669525667911, - 7.89613637599579 - ], - "5154": [ - "CAUCASIA", - -75.0350182360644, - 7.86794178924285 - ], - "54109": [ - "BUCARASICA", - -72.9291992580851, - 8.07980224162345 - ], - "54261": [ - "EL ZULIA", - -72.6315211800934, - 8.08120009501508 - ], - "23807": [ - "TIERRALTA", - -76.168466773399, - 7.81389682204426 - ], - "27800": [ - "UNGU\u00cdA", - -77.1037272190744, - 8.11728106996894 - ], - "54498": [ - "OCA\u00d1A", - -73.3376503339912, - 8.20663752740703 - ], - "5837": [ - "TURBO", - -76.7238908845009, - 7.99806221446287 - ], - "27006": [ - "ACAND\u00cd", - -77.2896737234012, - 8.43419375650918 - ], - "5490": [ - "NECOCL\u00cd", - -76.6769958735666, - 8.49372854180601 - ], - "5051": [ - "ARBOLETES", - -76.4147831343717, - 8.61139516346007 - ], - "13001": [ - "CARTAGENA DE INDIAS", - -75.4588996435526, - 10.4634301173375 - ], - "20570": [ - "PUEBLO BELLO", - -73.5885513571899, - 10.466961925301 - ], - "20001": [ - "VALLEDUPAR", - -73.4632629287968, - 10.3820362782724 - ], - "47053": [ - "ARACATACA", - -73.8797235541476, - 10.6449085797412 - ], - "99624": [ - "SANTA ROSAL\u00cdA", - -70.6517556116396, - 4.97899584411043 - ], - "54001": [ - "C\u00daCUTA", - -72.4886286102344, - 8.112098310885 - ], - "66170": [ - "DOSQUEBRADAS", - -75.6699392769122, - 4.84202908609559 - ], - "15491": [ - "NOBSA", - -72.932683246904, - 5.77875985933814 - ], - "15806": [ - "TIBASOSA", - -73.0111472536737, - 5.74732939668316 - ], - "76130": [ - "CANDELARIA", - -76.3831744307878, - 3.38208884867239 - ], - "76147": [ - "CARTAGO", - -75.9179084619454, - 4.70684716255301 - ], - "85125": [ - "HATO COROZAL", - -71.1364550186505, - 6.10902143524283 - ], - "13650": [ - "SAN FERNANDO", - -74.3587016981625, - 9.09126117863051 - ] - }, - "mun_code_place_name": { - "5002": [ - "ABEJORRAL", - "ANTIOQUIA" - ], - "5004": [ - "ABRIAQU\u00cd", - "ANTIOQUIA" - ], - "5021": [ - "ALEJANDR\u00cdA", - "ANTIOQUIA" - ], - "5030": [ - "AMAG\u00c1", - "ANTIOQUIA" - ], - "5034": [ - "ANDES", - "ANTIOQUIA" - ], - "5036": [ - "ANGEL\u00d3POLIS", - "ANTIOQUIA" - ], - "5038": [ - "ANGOSTURA", - "ANTIOQUIA" - ], - "5040": [ - "ANOR\u00cd", - "ANTIOQUIA" - ], - "5044": [ - "ANZ\u00c1", - "ANTIOQUIA" - ], - "5055": [ - "ARGELIA", - "ANTIOQUIA" - ], - "5059": [ - "ARMENIA", - "ANTIOQUIA" - ], - "5091": [ - "BETANIA", - "ANTIOQUIA" - ], - "5093": [ - "BETULIA", - "ANTIOQUIA" - ], - "5101": [ - "CIUDAD BOL\u00cdVAR", - "ANTIOQUIA" - ], - "5107": [ - "BRICE\u00d1O", - "ANTIOQUIA" - ], - "5113": [ - "BURITIC\u00c1", - "ANTIOQUIA" - ], - "5120": [ - "C\u00c1CERES", - "ANTIOQUIA" - ], - "5125": [ - "CAICEDO", - "ANTIOQUIA" - ], - "5134": [ - "CAMPAMENTO", - "ANTIOQUIA" - ], - "5142": [ - "CARACOL\u00cd", - "ANTIOQUIA" - ], - "5145": [ - "CARAMANTA", - "ANTIOQUIA" - ], - "5148": [ - "EL CARMEN DE VIBORAL", - "ANTIOQUIA" - ], - "5150": [ - "CAROLINA", - "ANTIOQUIA" - ], - "5172": [ - "CHIGOROD\u00d3", - "ANTIOQUIA" - ], - "5190": [ - "CISNEROS", - "ANTIOQUIA" - ], - "5197": [ - "COCORN\u00c1", - "ANTIOQUIA" - ], - "5206": [ - "CONCEPCI\u00d3N", - "ANTIOQUIA" - ], - "5209": [ - "CONCORDIA", - "ANTIOQUIA" - ], - "5237": [ - "DON MAT\u00cdAS", - "ANTIOQUIA" - ], - "5250": [ - "EL BAGRE", - "ANTIOQUIA" - ], - "5264": [ - "ENTRERRIOS", - "ANTIOQUIA" - ], - "5282": [ - "FREDONIA", - "ANTIOQUIA" - ], - "5284": [ - "FRONTINO", - "ANTIOQUIA" - ], - "5306": [ - "GIRALDO", - "ANTIOQUIA" - ], - "5313": [ - "GRANADA", - "ANTIOQUIA" - ], - "5318": [ - "GUARNE", - "ANTIOQUIA" - ], - "5321": [ - "GUATAP\u00c9", - "ANTIOQUIA" - ], - "5347": [ - "HELICONIA", - "ANTIOQUIA" - ], - "5353": [ - "HISPANIA", - "ANTIOQUIA" - ], - "5361": [ - "ITUANGO", - "ANTIOQUIA" - ], - "5368": [ - "JERIC\u00d3", - "ANTIOQUIA" - ], - "5390": [ - "LA PINTADA", - "ANTIOQUIA" - ], - "5400": [ - "LA UNI\u00d3N", - "ANTIOQUIA" - ], - "5425": [ - "MACEO", - "ANTIOQUIA" - ], - "5440": [ - "MARINILLA", - "ANTIOQUIA" - ], - "5467": [ - "MONTEBELLO", - "ANTIOQUIA" - ], - "5483": [ - "NARI\u00d1O", - "ANTIOQUIA" - ], - "5495": [ - "NECH\u00cd", - "ANTIOQUIA" - ], - "5501": [ - "OLAYA", - "ANTIOQUIA" - ], - "5541": [ - "PE\u00d1OL", - "ANTIOQUIA" - ], - "5543": [ - "PEQUE", - "ANTIOQUIA" - ], - "5576": [ - "PUEBLORRICO", - "ANTIOQUIA" - ], - "5579": [ - "PUERTO BERR\u00cdO", - "ANTIOQUIA" - ], - "5585": [ - "PUERTO NARE", - "ANTIOQUIA" - ], - "5591": [ - "PUERTO TRIUNFO", - "ANTIOQUIA" - ], - "5604": [ - "REMEDIOS", - "ANTIOQUIA" - ], - "5607": [ - "RETIRO", - "ANTIOQUIA" - ], - "5628": [ - "SABANALARGA", - "ANTIOQUIA" - ], - "5642": [ - "SALGAR", - "ANTIOQUIA" - ], - "5647": [ - "SAN ANDR\u00c8S", - "ANTIOQUIA" - ], - "5649": [ - "SAN CARLOS", - "ANTIOQUIA" - ], - "5652": [ - "SAN FRANCISCO", - "ANTIOQUIA" - ], - "5658": [ - "SAN JOS\u00c9 DE LA MONTA\u00d1A", - "ANTIOQUIA" - ], - "5659": [ - "SAN JUAN DE URAB\u00c1", - "ANTIOQUIA" - ], - "5660": [ - "SAN LUIS", - "ANTIOQUIA" - ], - "5664": [ - "SAN PEDRO", - "ANTIOQUIA" - ], - "5665": [ - "SAN PEDRO DE URABA", - "ANTIOQUIA" - ], - "5667": [ - "SAN RAFAEL", - "ANTIOQUIA" - ], - "5670": [ - "SAN ROQUE", - "ANTIOQUIA" - ], - "5674": [ - "SAN VICENTE", - "ANTIOQUIA" - ], - "5679": [ - "SANTA B\u00c1RBARA", - "ANTIOQUIA" - ], - "5697": [ - "SANTUARIO", - "ANTIOQUIA" - ], - "5736": [ - "SEGOVIA", - "ANTIOQUIA" - ], - "5756": [ - "SONS\u00d3N", - "ANTIOQUIA" - ], - "5761": [ - "SOPETR\u00c1N", - "ANTIOQUIA" - ], - "5789": [ - "T\u00c1MESIS", - "ANTIOQUIA" - ], - "5790": [ - "TARAZ\u00c1", - "ANTIOQUIA" - ], - "5792": [ - "TARSO", - "ANTIOQUIA" - ], - "5809": [ - "TITIRIB\u00cd", - "ANTIOQUIA" - ], - "5842": [ - "URAMITA", - "ANTIOQUIA" - ], - "5854": [ - "VALDIVIA", - "ANTIOQUIA" - ], - "5856": [ - "VALPARA\u00cdSO", - "ANTIOQUIA" - ], - "5858": [ - "VEGACH\u00cd", - "ANTIOQUIA" - ], - "5861": [ - "VENECIA", - "ANTIOQUIA" - ], - "5885": [ - "YALI", - "ANTIOQUIA" - ], - "5887": [ - "YARUMAL", - "ANTIOQUIA" - ], - "5890": [ - "YOLOMB\u00d3", - "ANTIOQUIA" - ], - "5895": [ - "ZARAGOZA", - "ANTIOQUIA" - ], - "8001": [ - "BARRANQUILLA", - "ATL\u00c1NTICO" - ], - "8078": [ - "BARANOA", - "ATL\u00c1NTICO" - ], - "8137": [ - "CAMPO DE LA CRUZ", - "ATL\u00c1NTICO" - ], - "8141": [ - "CANDELARIA", - "ATL\u00c1NTICO" - ], - "8296": [ - "GALAPA", - "ATL\u00c1NTICO" - ], - "8372": [ - "JUAN DE ACOSTA", - "ATL\u00c1NTICO" - ], - "8421": [ - "LURUACO", - "ATL\u00c1NTICO" - ], - "8433": [ - "MALAMBO", - "ATL\u00c1NTICO" - ], - "8436": [ - "MANAT\u00cd", - "ATL\u00c1NTICO" - ], - "8520": [ - "PALMAR DE VARELA", - "ATL\u00c1NTICO" - ], - "8549": [ - "PIOJ\u00d3", - "ATL\u00c1NTICO" - ], - "8558": [ - "POLONUEVO", - "ATL\u00c1NTICO" - ], - "8560": [ - "PONEDERA", - "ATL\u00c1NTICO" - ], - "8573": [ - "PUERTO COLOMBIA", - "ATL\u00c1NTICO" - ], - "8606": [ - "REPEL\u00d3N", - "ATL\u00c1NTICO" - ], - "8634": [ - "SABANAGRANDE", - "ATL\u00c1NTICO" - ], - "8638": [ - "SABANALARGA", - "ATL\u00c1NTICO" - ], - "8675": [ - "SANTA LUC\u00cdA", - "ATL\u00c1NTICO" - ], - "8685": [ - "SANTO TOM\u00c1S", - "ATL\u00c1NTICO" - ], - "8758": [ - "SOLEDAD", - "ATL\u00c1NTICO" - ], - "8770": [ - "SUAN", - "ATL\u00c1NTICO" - ], - "8832": [ - "TUBAR\u00c1", - "ATL\u00c1NTICO" - ], - "8849": [ - "USIACUR\u00cd", - "ATL\u00c1NTICO" - ], - "13006": [ - "ACH\u00cd", - "BOL\u00cdVAR" - ], - "13030": [ - "ALTOS DEL ROSARIO", - "BOL\u00cdVAR" - ], - "13042": [ - "ARENAL", - "BOL\u00cdVAR" - ], - "13052": [ - "ARJONA", - "BOL\u00cdVAR" - ], - "13062": [ - "ARROYOHONDO", - "BOL\u00cdVAR" - ], - "13074": [ - "BARRANCO DE LOBA", - "BOL\u00cdVAR" - ], - "13140": [ - "CALAMAR", - "BOL\u00cdVAR" - ], - "13160": [ - "CANTAGALLO", - "BOL\u00cdVAR" - ], - "13188": [ - "CICUCO", - "BOL\u00cdVAR" - ], - "13212": [ - "C\u00d3RDOBA", - "BOL\u00cdVAR" - ], - "13222": [ - "CLEMENCIA", - "BOL\u00cdVAR" - ], - "13244": [ - "EL CARMEN DE BOL\u00cdVAR", - "BOL\u00cdVAR" - ], - "13248": [ - "EL GUAMO", - "BOL\u00cdVAR" - ], - "13268": [ - "EL PE\u00d1ON", - "BOL\u00cdVAR" - ], - "13300": [ - "HATILLO DE LOBA", - "BOL\u00cdVAR" - ], - "13430": [ - "MAGANGU\u00c9", - "BOL\u00cdVAR" - ], - "13433": [ - "MAHATES", - "BOL\u00cdVAR" - ], - "13440": [ - "MARGARITA", - "BOL\u00cdVAR" - ], - "13442": [ - "MARIA LA BAJA", - "BOL\u00cdVAR" - ], - "13458": [ - "MONTECRISTO", - "BOL\u00cdVAR" - ], - "13468": [ - "MOMP\u00d3S", - "BOL\u00cdVAR" - ], - "13473": [ - "MORALES", - "BOL\u00cdVAR" - ], - "13490": [ - "NOROSI", - "BOL\u00cdVAR" - ], - "13549": [ - "PINILLOS", - "BOL\u00cdVAR" - ], - "13580": [ - "REGIDOR", - "BOL\u00cdVAR" - ], - "13600": [ - "RIOVIEJO", - "BOL\u00cdVAR" - ], - "13620": [ - "SAN CRIST\u00d3BAL", - "BOL\u00cdVAR" - ], - "13647": [ - "SAN ESTANISLAO", - "BOL\u00cdVAR" - ], - "13654": [ - "SAN JACINTO", - "BOL\u00cdVAR" - ], - "13655": [ - "SAN JACINTO DEL CAUCA", - "BOL\u00cdVAR" - ], - "13657": [ - "SAN JUAN NEPOMUCENO", - "BOL\u00cdVAR" - ], - "13667": [ - "SAN MART\u00cdN DE LOBA", - "BOL\u00cdVAR" - ], - "13670": [ - "SAN PABLO", - "BOL\u00cdVAR" - ], - "13673": [ - "SANTA CATALINA", - "BOL\u00cdVAR" - ], - "13683": [ - "SANTA ROSA", - "BOL\u00cdVAR" - ], - "13688": [ - "SANTA ROSA DEL SUR", - "BOL\u00cdVAR" - ], - "13744": [ - "SIMIT\u00cd", - "BOL\u00cdVAR" - ], - "13760": [ - "SOPLAVIENTO", - "BOL\u00cdVAR" - ], - "13780": [ - "TALAIGUA NUEVO", - "BOL\u00cdVAR" - ], - "13810": [ - "TIQUISO", - "BOL\u00cdVAR" - ], - "13836": [ - "TURBACO", - "BOL\u00cdVAR" - ], - "13838": [ - "TURBANA", - "BOL\u00cdVAR" - ], - "13873": [ - "VILLANUEVA", - "BOL\u00cdVAR" - ], - "13894": [ - "ZAMBRANO", - "BOL\u00cdVAR" - ], - "15022": [ - "ALMEIDA", - "BOYAC\u00c1" - ], - "15047": [ - "AQUITANIA", - "BOYAC\u00c1" - ], - "15051": [ - "ARCABUCO", - "BOYAC\u00c1" - ], - "15087": [ - "BEL\u00c9N", - "BOYAC\u00c1" - ], - "15090": [ - "BERBEO", - "BOYAC\u00c1" - ], - "15092": [ - "BET\u00c9ITIVA", - "BOYAC\u00c1" - ], - "15097": [ - "BOAVITA", - "BOYAC\u00c1" - ], - "15104": [ - "BOYAC\u00c1", - "BOYAC\u00c1" - ], - "15106": [ - "BRICE\u00d1O", - "BOYAC\u00c1" - ], - "15109": [ - "BUENAVISTA", - "BOYAC\u00c1" - ], - "15114": [ - "BUSBANZ\u00c1", - "BOYAC\u00c1" - ], - "15131": [ - "CALDAS", - "BOYAC\u00c1" - ], - "15135": [ - "CAMPOHERMOSO", - "BOYAC\u00c1" - ], - "15162": [ - "CERINZA", - "BOYAC\u00c1" - ], - "15172": [ - "CHINAVITA", - "BOYAC\u00c1" - ], - "15176": [ - "CHIQUINQUIR\u00c1", - "BOYAC\u00c1" - ], - "15180": [ - "CHISCAS", - "BOYAC\u00c1" - ], - "15183": [ - "CHITA", - "BOYAC\u00c1" - ], - "15185": [ - "CHITARAQUE", - "BOYAC\u00c1" - ], - "15187": [ - "CHIVAT\u00c1", - "BOYAC\u00c1" - ], - "15189": [ - "CI\u00c9NEGA", - "BOYAC\u00c1" - ], - "15204": [ - "COMBITA", - "BOYAC\u00c1" - ], - "15212": [ - "COPER", - "BOYAC\u00c1" - ], - "15215": [ - "CORRALES", - "BOYAC\u00c1" - ], - "15218": [ - "COVARACHIA", - "BOYAC\u00c1" - ], - "15223": [ - "CUBAR\u00c1", - "BOYAC\u00c1" - ], - "15224": [ - "CUCAITA", - "BOYAC\u00c1" - ], - "15226": [ - "CU\u00ccTIVA", - "BOYAC\u00c1" - ], - "15232": [ - "CH\u00cdQUIZA", - "BOYAC\u00c1" - ], - "15236": [ - "CHIVOR", - "BOYAC\u00c1" - ], - "15238": [ - "DUITAMA", - "BOYAC\u00c1" - ], - "15244": [ - "EL COCUY", - "BOYAC\u00c1" - ], - "15248": [ - "EL ESPINO", - "BOYAC\u00c1" - ], - "15272": [ - "FIRAVITOBA", - "BOYAC\u00c1" - ], - "15276": [ - "FLORESTA", - "BOYAC\u00c1" - ], - "15293": [ - "GACHANTIV\u00c1", - "BOYAC\u00c1" - ], - "15296": [ - "GAMEZA", - "BOYAC\u00c1" - ], - "15299": [ - "GARAGOA", - "BOYAC\u00c1" - ], - "15317": [ - "GUACAMAYAS", - "BOYAC\u00c1" - ], - "15322": [ - "GUATEQUE", - "BOYAC\u00c1" - ], - "15325": [ - "GUAYAT\u00c1", - "BOYAC\u00c1" - ], - "15332": [ - "G\u00dcIC\u00c1N", - "BOYAC\u00c1" - ], - "15362": [ - "IZA", - "BOYAC\u00c1" - ], - "15367": [ - "JENESANO", - "BOYAC\u00c1" - ], - "15368": [ - "JERIC\u00d3", - "BOYAC\u00c1" - ], - "15377": [ - "LABRANZA GRANDE", - "BOYAC\u00c1" - ], - "15380": [ - "LA CAPILLA", - "BOYAC\u00c1" - ], - "15401": [ - "LA VICTORIA", - "BOYAC\u00c1" - ], - "15403": [ - "LA UVITA", - "BOYAC\u00c1" - ], - "15407": [ - "VILLA DE LEYVA", - "BOYAC\u00c1" - ], - "15425": [ - "MACANAL", - "BOYAC\u00c1" - ], - "15442": [ - "MARIP\u00cd", - "BOYAC\u00c1" - ], - "15455": [ - "MIRAFLORES", - "BOYAC\u00c1" - ], - "15464": [ - "MONGUA", - "BOYAC\u00c1" - ], - "15466": [ - "MONGU\u00cc", - "BOYAC\u00c1" - ], - "15469": [ - "MONIQUIRA", - "BOYAC\u00c1" - ], - "15476": [ - "MOTAVITA", - "BOYAC\u00c1" - ], - "15480": [ - "MUZO", - "BOYAC\u00c1" - ], - "15494": [ - "NUEVO COL\u00d3N", - "BOYAC\u00c1" - ], - "15500": [ - "OICATA", - "BOYAC\u00c1" - ], - "15507": [ - "OTANCHE", - "BOYAC\u00c1" - ], - "15511": [ - "PACHAVITA", - "BOYAC\u00c1" - ], - "15514": [ - "P\u00c1EZ", - "BOYAC\u00c1" - ], - "15516": [ - "PAIPA", - "BOYAC\u00c1" - ], - "15518": [ - "PAJARITO", - "BOYAC\u00c1" - ], - "15522": [ - "PANQUEBA", - "BOYAC\u00c1" - ], - "15531": [ - "PAUNA", - "BOYAC\u00c1" - ], - "15533": [ - "PAYA", - "BOYAC\u00c1" - ], - "15537": [ - "PAZ DE R\u00cdO", - "BOYAC\u00c1" - ], - "15542": [ - "PESCA", - "BOYAC\u00c1" - ], - "15550": [ - "PISBA", - "BOYAC\u00c1" - ], - "15572": [ - "PUERTO BOYAC\u00c1", - "BOYAC\u00c1" - ], - "15580": [ - "QU\u00cdPAMA", - "BOYAC\u00c1" - ], - "15599": [ - "RAMIRIQU\u00cd", - "BOYAC\u00c1" - ], - "15600": [ - "R\u00c1QUIRA", - "BOYAC\u00c1" - ], - "15621": [ - "ROND\u00d3N", - "BOYAC\u00c1" - ], - "15632": [ - "SABOY\u00c1", - "BOYAC\u00c1" - ], - "15638": [ - "S\u00c1CHICA", - "BOYAC\u00c1" - ], - "15646": [ - "SAMAC\u00c1", - "BOYAC\u00c1" - ], - "15660": [ - "SAN EDUARDO", - "BOYAC\u00c1" - ], - "15664": [ - "SAN JOS\u00c9 DE PARE", - "BOYAC\u00c1" - ], - "15667": [ - "SAN LUIS DE GACENO", - "BOYAC\u00c1" - ], - "15673": [ - "SAN MATEO", - "BOYAC\u00c1" - ], - "15676": [ - "SAN MIGUEL DE SEMA", - "BOYAC\u00c1" - ], - "15681": [ - "SAN PABLO DE BORBUR", - "BOYAC\u00c1" - ], - "15686": [ - "SANTANA", - "BOYAC\u00c1" - ], - "15690": [ - "SANTA MAR\u00cdA", - "BOYAC\u00c1" - ], - "15693": [ - "SANTA ROSA DE VITERBO", - "BOYAC\u00c1" - ], - "15696": [ - "SANTA SOF\u00cdA", - "BOYAC\u00c1" - ], - "15720": [ - "SATIVANORTE", - "BOYAC\u00c1" - ], - "15723": [ - "SATIVASUR", - "BOYAC\u00c1" - ], - "15740": [ - "SIACHOQUE", - "BOYAC\u00c1" - ], - "15753": [ - "SOAT\u00c1", - "BOYAC\u00c1" - ], - "15755": [ - "SOCOT\u00c1", - "BOYAC\u00c1" - ], - "15757": [ - "SOCHA", - "BOYAC\u00c1" - ], - "15759": [ - "SOGAMOSO", - "BOYAC\u00c1" - ], - "15761": [ - "SOMONDOCO", - "BOYAC\u00c1" - ], - "15762": [ - "SORA", - "BOYAC\u00c1" - ], - "15763": [ - "SOTAQUIR\u00c1", - "BOYAC\u00c1" - ], - "15764": [ - "SORAC\u00c1", - "BOYAC\u00c1" - ], - "15774": [ - "SUSAC\u00d3N", - "BOYAC\u00c1" - ], - "15776": [ - "SUTAMARCH\u00c0N", - "BOYAC\u00c1" - ], - "15778": [ - "SUTATENZA", - "BOYAC\u00c1" - ], - "15790": [ - "TASCO", - "BOYAC\u00c1" - ], - "15798": [ - "TENZA", - "BOYAC\u00c1" - ], - "15804": [ - "TIBANA", - "BOYAC\u00c1" - ], - "15808": [ - "TINJAC\u00c1", - "BOYAC\u00c1" - ], - "15810": [ - "TIPACOQUE", - "BOYAC\u00c1" - ], - "15814": [ - "TOCA", - "BOYAC\u00c1" - ], - "15816": [ - "TOG\u00dc\u00cd", - "BOYAC\u00c1" - ], - "15820": [ - "T\u00d3PAGA", - "BOYAC\u00c1" - ], - "15822": [ - "TOTA", - "BOYAC\u00c1" - ], - "15832": [ - "TUNUNGU\u00c1", - "BOYAC\u00c1" - ], - "15835": [ - "TURMEQU\u00c9", - "BOYAC\u00c1" - ], - "15837": [ - "TUTA", - "BOYAC\u00c1" - ], - "15839": [ - "TUTAZ\u00c1", - "BOYAC\u00c1" - ], - "15842": [ - "UMBITA", - "BOYAC\u00c1" - ], - "15861": [ - "VENTAQUEMADA", - "BOYAC\u00c1" - ], - "15879": [ - "VIRACACH\u00c1", - "BOYAC\u00c1" - ], - "15897": [ - "ZETAQUIR\u00c1", - "BOYAC\u00c1" - ], - "17001": [ - "MANIZALES", - "CALDAS" - ], - "17013": [ - "AGUADAS", - "CALDAS" - ], - "17042": [ - "ANSERMA", - "CALDAS" - ], - "17050": [ - "ARANZAZU", - "CALDAS" - ], - "17088": [ - "BELALC\u00c1ZAR", - "CALDAS" - ], - "17174": [ - "CHINCHIN\u00c1", - "CALDAS" - ], - "17272": [ - "FILADELFIA", - "CALDAS" - ], - "17380": [ - "LA DORADA", - "CALDAS" - ], - "17388": [ - "LA MERCED", - "CALDAS" - ], - "17433": [ - "MANZANARES", - "CALDAS" - ], - "17442": [ - "MARMATO", - "CALDAS" - ], - "17444": [ - "MARQUETALIA", - "CALDAS" - ], - "17446": [ - "MARULANDA", - "CALDAS" - ], - "17486": [ - "NEIRA", - "CALDAS" - ], - "17495": [ - "NORCASIA", - "CALDAS" - ], - "17513": [ - "P\u00c1CORA", - "CALDAS" - ], - "17524": [ - "PALESTINA", - "CALDAS" - ], - "17541": [ - "PENSILVANIA", - "CALDAS" - ], - "17616": [ - "RISARALDA", - "CALDAS" - ], - "17653": [ - "SALAMINA", - "CALDAS" - ], - "17662": [ - "SAMAN\u00c1", - "CALDAS" - ], - "17665": [ - "SAN JOS\u00c9", - "CALDAS" - ], - "17777": [ - "SUPIA", - "CALDAS" - ], - "17867": [ - "VICTORIA", - "CALDAS" - ], - "17873": [ - "VILLAMARIA", - "CALDAS" - ], - "17877": [ - "VITERBO", - "CALDAS" - ], - "18001": [ - "FLORENCIA", - "CAQUET\u00c1" - ], - "18029": [ - "ALBANIA", - "CAQUET\u00c1" - ], - "18094": [ - "BEL\u00c9N DE LOS ANDAQU\u00cdES", - "CAQUET\u00c1" - ], - "18247": [ - "EL DONCELLO", - "CAQUET\u00c1" - ], - "18256": [ - "EL PAUJIL", - "CAQUET\u00c1" - ], - "18410": [ - "LA MONTA\u00d1ITA", - "CAQUET\u00c1" - ], - "18460": [ - "MIL\u00c1N", - "CAQUET\u00c1" - ], - "18479": [ - "MORELIA", - "CAQUET\u00c1" - ], - "18592": [ - "PUERTO RICO", - "CAQUET\u00c1" - ], - "18610": [ - "SAN JOS\u00c9 DEL FRAGUA", - "CAQUET\u00c1" - ], - "18860": [ - "VALPARA\u00cdSO", - "CAQUET\u00c1" - ], - "19001": [ - "POPAY\u00c1N", - "CAUCA" - ], - "19022": [ - "ALMAGUER", - "CAUCA" - ], - "19050": [ - "ARGELIA", - "CAUCA" - ], - "19075": [ - "BALBOA", - "CAUCA" - ], - "19100": [ - "BOL\u00cdVAR", - "CAUCA" - ], - "19110": [ - "BUENOS AIRES", - "CAUCA" - ], - "19130": [ - "CAJIB\u00cdO", - "CAUCA" - ], - "19137": [ - "CALDONO", - "CAUCA" - ], - "19142": [ - "CALOTO", - "CAUCA" - ], - "19212": [ - "CORINTO", - "CAUCA" - ], - "19256": [ - "EL TAMBO", - "CAUCA" - ], - "19290": [ - "FLORENCIA", - "CAUCA" - ], - "19300": [ - "GUACHEN\u00c9", - "CAUCA" - ], - "19355": [ - "INZA", - "CAUCA" - ], - "19364": [ - "JAMBAL\u00d3", - "CAUCA" - ], - "19392": [ - "LA SIERRA", - "CAUCA" - ], - "19397": [ - "LA VEGA", - "CAUCA" - ], - "19450": [ - "MERCADERES", - "CAUCA" - ], - "19455": [ - "MIRANDA", - "CAUCA" - ], - "19473": [ - "MORALES", - "CAUCA" - ], - "19513": [ - "PADILLA", - "CAUCA" - ], - "19517": [ - "P\u00c1EZ", - "CAUCA" - ], - "19532": [ - "PAT\u00cdA", - "CAUCA" - ], - "19533": [ - "PIAMONTE", - "CAUCA" - ], - "19548": [ - "PIENDAM\u00d3", - "CAUCA" - ], - "19573": [ - "PUERTO TEJADA", - "CAUCA" - ], - "19585": [ - "PURAC\u00c9 (COCONUCO)", - "CAUCA" - ], - "19622": [ - "ROSAS", - "CAUCA" - ], - "19693": [ - "SAN SEBASTI\u00c1N", - "CAUCA" - ], - "19698": [ - "SANTANDER DE QUILICHAO", - "CAUCA" - ], - "19701": [ - "SANTA ROSA", - "CAUCA" - ], - "19743": [ - "SILVIA", - "CAUCA" - ], - "19760": [ - "SOTAR\u00c1 (Paispamba)", - "CAUCA" - ], - "19780": [ - "SU\u00c1REZ", - "CAUCA" - ], - "19785": [ - "SUCRE", - "CAUCA" - ], - "19807": [ - "TIMB\u00cdO", - "CAUCA" - ], - "19821": [ - "TORIB\u00cdO", - "CAUCA" - ], - "19824": [ - "TOTOR\u00d3", - "CAUCA" - ], - "19845": [ - "VILLA RICA", - "CAUCA" - ], - "20011": [ - "AGUACHICA", - "CESAR" - ], - "20013": [ - "AGUST\u00cdN CODAZZI", - "CESAR" - ], - "20032": [ - "ASTREA", - "CESAR" - ], - "20060": [ - "BOSCONIA", - "CESAR" - ], - "20175": [ - "CHIMICHAGUA", - "CESAR" - ], - "20178": [ - "CHIRIGUAN\u00c1", - "CESAR" - ], - "20228": [ - "CURUMAN\u00cd", - "CESAR" - ], - "20238": [ - "EL COPEY", - "CESAR" - ], - "20250": [ - "EL PASO", - "CESAR" - ], - "20295": [ - "GAMARRA", - "CESAR" - ], - "20310": [ - "GONZALEZ", - "CESAR" - ], - "20383": [ - "LA GLORIA", - "CESAR" - ], - "20517": [ - "PAILITAS", - "CESAR" - ], - "20550": [ - "PELAYA", - "CESAR" - ], - "20614": [ - "R\u00cdO DE ORO", - "CESAR" - ], - "20621": [ - "LA PAZ", - "CESAR" - ], - "20710": [ - "SAN ALBERTO", - "CESAR" - ], - "20750": [ - "SAN DIEGO", - "CESAR" - ], - "20770": [ - "SAN MART\u00cdN", - "CESAR" - ], - "20787": [ - "TAMALAMEQUE", - "CESAR" - ], - "23001": [ - "MONTER\u00cdA", - "C\u00d3RDOBA" - ], - "23068": [ - "AYAPEL", - "C\u00d3RDOBA" - ], - "23079": [ - "BUENAVISTA", - "C\u00d3RDOBA" - ], - "23090": [ - "CANALETE", - "C\u00d3RDOBA" - ], - "23162": [ - "CERET\u00c9", - "C\u00d3RDOBA" - ], - "23168": [ - "CHIM\u00c1", - "C\u00d3RDOBA" - ], - "23182": [ - "CHIN\u00da", - "C\u00d3RDOBA" - ], - "23189": [ - "CIENAGA DE ORO", - "C\u00d3RDOBA" - ], - "23300": [ - "COTORRA", - "C\u00d3RDOBA" - ], - "23350": [ - "LA APARTADA", - "C\u00d3RDOBA" - ], - "23417": [ - "LORICA", - "C\u00d3RDOBA" - ], - "23419": [ - "LOS C\u00d3RDOBAS", - "C\u00d3RDOBA" - ], - "23464": [ - "MOMIL", - "C\u00d3RDOBA" - ], - "23466": [ - "MONTEL\u00cdBANO", - "C\u00d3RDOBA" - ], - "23500": [ - "MO\u00d1ITOS", - "C\u00d3RDOBA" - ], - "23555": [ - "PLANETA RICA", - "C\u00d3RDOBA" - ], - "23570": [ - "PUEBLO NUEVO", - "C\u00d3RDOBA" - ], - "23574": [ - "PUERTO ESCONDIDO", - "C\u00d3RDOBA" - ], - "23586": [ - "PUR\u00cdSIMA", - "C\u00d3RDOBA" - ], - "23660": [ - "SAHAG\u00daN", - "C\u00d3RDOBA" - ], - "23670": [ - "SAN ANDRES DE SOTAVENTO", - "C\u00d3RDOBA" - ], - "23672": [ - "SAN ANTERO", - "C\u00d3RDOBA" - ], - "23675": [ - "SAN BERNARDO DEL VIENTO", - "C\u00d3RDOBA" - ], - "23678": [ - "SAN CARLOS", - "C\u00d3RDOBA" - ], - "23682": [ - "SAN JOS\u00c9 DE UR\u00c9", - "C\u00d3RDOBA" - ], - "23686": [ - "SAN PELAYO", - "C\u00d3RDOBA" - ], - "23815": [ - "TUCHIN", - "C\u00d3RDOBA" - ], - "23855": [ - "VALENCIA", - "C\u00d3RDOBA" - ], - "25001": [ - "AGUA DE DIOS", - "CUNDINAMARCA" - ], - "25019": [ - "ALB\u00c1N", - "CUNDINAMARCA" - ], - "25035": [ - "ANAPOIMA", - "CUNDINAMARCA" - ], - "25040": [ - "ANOLAIMA", - "CUNDINAMARCA" - ], - "25053": [ - "ARBEL\u00c1EZ", - "CUNDINAMARCA" - ], - "25086": [ - "BELTR\u00c1N", - "CUNDINAMARCA" - ], - "25095": [ - "BITUIMA", - "CUNDINAMARCA" - ], - "25099": [ - "BOJAC\u00c1", - "CUNDINAMARCA" - ], - "25120": [ - "CABRERA", - "CUNDINAMARCA" - ], - "25123": [ - "CACHIPAY", - "CUNDINAMARCA" - ], - "25126": [ - "CAJIC\u00c1", - "CUNDINAMARCA" - ], - "25148": [ - "CAPARRAPI", - "CUNDINAMARCA" - ], - "25151": [ - "C\u00c1QUEZA", - "CUNDINAMARCA" - ], - "25154": [ - "CARMEN DE CARUPA", - "CUNDINAMARCA" - ], - "25168": [ - "CHAGUAN\u00cd", - "CUNDINAMARCA" - ], - "25175": [ - "CH\u00cdA", - "CUNDINAMARCA" - ], - "25178": [ - "CHIPAQUE", - "CUNDINAMARCA" - ], - "25181": [ - "CHOACH\u00cd", - "CUNDINAMARCA" - ], - "25183": [ - "CHOCONT\u00c1", - "CUNDINAMARCA" - ], - "25200": [ - "COGUA", - "CUNDINAMARCA" - ], - "25214": [ - "COTA", - "CUNDINAMARCA" - ], - "25224": [ - "CUCUNUB\u00c1", - "CUNDINAMARCA" - ], - "25245": [ - "EL COLEGIO", - "CUNDINAMARCA" - ], - "25258": [ - "EL PE\u00d1ON", - "CUNDINAMARCA" - ], - "25260": [ - "EL ROSAL", - "CUNDINAMARCA" - ], - "25269": [ - "FACATATIV\u00c1", - "CUNDINAMARCA" - ], - "25279": [ - "F\u00d3MEQUE", - "CUNDINAMARCA" - ], - "25281": [ - "FOSCA", - "CUNDINAMARCA" - ], - "25286": [ - "FUNZA", - "CUNDINAMARCA" - ], - "25288": [ - "FUQUENE", - "CUNDINAMARCA" - ], - "25290": [ - "FUSAGASUG\u00c1", - "CUNDINAMARCA" - ], - "25293": [ - "GACHAL\u00c1", - "CUNDINAMARCA" - ], - "25295": [ - "GACHANCIP\u00c1", - "CUNDINAMARCA" - ], - "25297": [ - "GACHET\u00c1", - "CUNDINAMARCA" - ], - "25299": [ - "GAMA", - "CUNDINAMARCA" - ], - "25307": [ - "GIRARDOT", - "CUNDINAMARCA" - ], - "25312": [ - "GRANADA", - "CUNDINAMARCA" - ], - "25317": [ - "GUACHET\u00c1", - "CUNDINAMARCA" - ], - "25320": [ - "GUADUAS", - "CUNDINAMARCA" - ], - "25322": [ - "GUASCA", - "CUNDINAMARCA" - ], - "25324": [ - "GUATAQU\u00cd", - "CUNDINAMARCA" - ], - "25326": [ - "GUATAVITA", - "CUNDINAMARCA" - ], - "25328": [ - "GUAYABAL DE S\u00cdQUIMA", - "CUNDINAMARCA" - ], - "25335": [ - "GUAYABETAL", - "CUNDINAMARCA" - ], - "25339": [ - "GUTIERREZ", - "CUNDINAMARCA" - ], - "25368": [ - "JERUSAL\u00c9N", - "CUNDINAMARCA" - ], - "25372": [ - "JUN\u00cdN", - "CUNDINAMARCA" - ], - "25377": [ - "LA CALERA", - "CUNDINAMARCA" - ], - "25386": [ - "LA MESA", - "CUNDINAMARCA" - ], - "25394": [ - "LA PALMA", - "CUNDINAMARCA" - ], - "25398": [ - "LA PE\u00d1A", - "CUNDINAMARCA" - ], - "25402": [ - "LA VEGA", - "CUNDINAMARCA" - ], - "25407": [ - "LENGUAZAQUE", - "CUNDINAMARCA" - ], - "25426": [ - "MACHET\u00c1", - "CUNDINAMARCA" - ], - "25430": [ - "MADRID", - "CUNDINAMARCA" - ], - "25436": [ - "MANTA", - "CUNDINAMARCA" - ], - "25438": [ - "MEDINA", - "CUNDINAMARCA" - ], - "25473": [ - "MOSQUERA", - "CUNDINAMARCA" - ], - "25483": [ - "NARI\u00d1O", - "CUNDINAMARCA" - ], - "25486": [ - "NEMOC\u00d3N", - "CUNDINAMARCA" - ], - "25488": [ - "NILO", - "CUNDINAMARCA" - ], - "25489": [ - "NIMAIMA", - "CUNDINAMARCA" - ], - "25491": [ - "NOCAIMA", - "CUNDINAMARCA" - ], - "25506": [ - "VENECIA", - "CUNDINAMARCA" - ], - "25513": [ - "PACHO", - "CUNDINAMARCA" - ], - "25518": [ - "PAIME", - "CUNDINAMARCA" - ], - "25524": [ - "PANDI", - "CUNDINAMARCA" - ], - "25530": [ - "PARATEBUENO", - "CUNDINAMARCA" - ], - "25535": [ - "PASCA", - "CUNDINAMARCA" - ], - "25572": [ - "PUERTO SALGAR", - "CUNDINAMARCA" - ], - "25580": [ - "PUL\u00cd", - "CUNDINAMARCA" - ], - "25592": [ - "QUEBRADANEGRA", - "CUNDINAMARCA" - ], - "25594": [ - "QUETAME", - "CUNDINAMARCA" - ], - "25596": [ - "QUIPILE", - "CUNDINAMARCA" - ], - "25599": [ - "APULO", - "CUNDINAMARCA" - ], - "25612": [ - "RICAURTE", - "CUNDINAMARCA" - ], - "25645": [ - "SAN ANTONIO DEL TEQUENDAMA", - "CUNDINAMARCA" - ], - "25649": [ - "SAN BERNARDO", - "CUNDINAMARCA" - ], - "25653": [ - "SAN CAYETANO", - "CUNDINAMARCA" - ], - "25658": [ - "SAN FRANCISCO", - "CUNDINAMARCA" - ], - "25662": [ - "SAN JUAN DE RIO SECO", - "CUNDINAMARCA" - ], - "25718": [ - "SASAIMA", - "CUNDINAMARCA" - ], - "25736": [ - "SESQUIL\u00c9", - "CUNDINAMARCA" - ], - "25740": [ - "SIBAT\u00c9", - "CUNDINAMARCA" - ], - "25743": [ - "SILVANIA", - "CUNDINAMARCA" - ], - "25745": [ - "SIMIJACA", - "CUNDINAMARCA" - ], - "25754": [ - "SOACHA", - "CUNDINAMARCA" - ], - "25758": [ - "SOPO", - "CUNDINAMARCA" - ], - "25769": [ - "SUBACHOQUE", - "CUNDINAMARCA" - ], - "25772": [ - "SUESCA", - "CUNDINAMARCA" - ], - "25777": [ - "SUPAT\u00c1", - "CUNDINAMARCA" - ], - "25779": [ - "SUSA", - "CUNDINAMARCA" - ], - "25781": [ - "SUTATAUSA", - "CUNDINAMARCA" - ], - "25785": [ - "TABIO", - "CUNDINAMARCA" - ], - "25793": [ - "TAUSA", - "CUNDINAMARCA" - ], - "25797": [ - "TENA", - "CUNDINAMARCA" - ], - "25799": [ - "TENJO", - "CUNDINAMARCA" - ], - "25805": [ - "TIBACUY", - "CUNDINAMARCA" - ], - "25807": [ - "TIBIRITA", - "CUNDINAMARCA" - ], - "25815": [ - "TOCAIMA", - "CUNDINAMARCA" - ], - "25817": [ - "TOCANCIP\u00c1", - "CUNDINAMARCA" - ], - "25823": [ - "TOPAIP\u00cd", - "CUNDINAMARCA" - ], - "25839": [ - "UBAL\u00c1", - "CUNDINAMARCA" - ], - "25841": [ - "UBAQUE", - "CUNDINAMARCA" - ], - "25843": [ - "UBATE", - "CUNDINAMARCA" - ], - "25845": [ - "UNE", - "CUNDINAMARCA" - ], - "25851": [ - "\u00daTICA", - "CUNDINAMARCA" - ], - "25862": [ - "VERGARA", - "CUNDINAMARCA" - ], - "25867": [ - "VIAN\u00cd", - "CUNDINAMARCA" - ], - "25871": [ - "VILLA G\u00d3MEZ", - "CUNDINAMARCA" - ], - "25873": [ - "VILLAPINZ\u00d3N", - "CUNDINAMARCA" - ], - "25875": [ - "VILLETA", - "CUNDINAMARCA" - ], - "25878": [ - "VIOT\u00c1", - "CUNDINAMARCA" - ], - "25885": [ - "YACOP\u00cd", - "CUNDINAMARCA" - ], - "25898": [ - "ZIPAC\u00d3N", - "CUNDINAMARCA" - ], - "25899": [ - "ZIPAQUIRA", - "CUNDINAMARCA" - ], - "41001": [ - "NEIVA", - "HUILA" - ], - "41006": [ - "ACEVEDO", - "HUILA" - ], - "41013": [ - "AGRADO", - "HUILA" - ], - "41016": [ - "AIPE", - "HUILA" - ], - "41020": [ - "ALGECIRAS", - "HUILA" - ], - "41026": [ - "ALTAMIRA", - "HUILA" - ], - "41078": [ - "BARAYA", - "HUILA" - ], - "41132": [ - "CAMPOALEGRE", - "HUILA" - ], - "41206": [ - "COLOMBIA", - "HUILA" - ], - "41244": [ - "EL\u00cdAS", - "HUILA" - ], - "41298": [ - "GARZ\u00d3N", - "HUILA" - ], - "41306": [ - "GIGANTE", - "HUILA" - ], - "41319": [ - "GUADALUPE", - "HUILA" - ], - "41357": [ - "\u00cdQUIRA", - "HUILA" - ], - "41359": [ - "ISNOS", - "HUILA" - ], - "41378": [ - "LA ARGENTINA", - "HUILA" - ], - "41396": [ - "LA PLATA", - "HUILA" - ], - "41483": [ - "N\u00c1TAGA", - "HUILA" - ], - "41503": [ - "OPORAPA", - "HUILA" - ], - "41518": [ - "PAICOL", - "HUILA" - ], - "41524": [ - "PALERMO", - "HUILA" - ], - "41530": [ - "PALESTINA", - "HUILA" - ], - "41548": [ - "PITAL", - "HUILA" - ], - "41551": [ - "PITALITO", - "HUILA" - ], - "41615": [ - "RIVERA", - "HUILA" - ], - "41660": [ - "SALADOBLANCO", - "HUILA" - ], - "41668": [ - "SAN AGUST\u00cdN", - "HUILA" - ], - "41676": [ - "SANTA MAR\u00cdA", - "HUILA" - ], - "41770": [ - "SUAZA", - "HUILA" - ], - "41791": [ - "TARQUI", - "HUILA" - ], - "41797": [ - "TESALIA", - "HUILA" - ], - "41799": [ - "TELLO", - "HUILA" - ], - "41801": [ - "TERUEL", - "HUILA" - ], - "41807": [ - "TIMAN\u00c1", - "HUILA" - ], - "41872": [ - "VILLAVIEJA", - "HUILA" - ], - "41885": [ - "YAGUAR\u00c1", - "HUILA" - ], - "44035": [ - "ALBANIA", - "LA GUAJIRA" - ], - "44078": [ - "BARRANCAS", - "LA GUAJIRA" - ], - "44090": [ - "DIBULLA", - "LA GUAJIRA" - ], - "44098": [ - "DISTRACCI\u00d3N", - "LA GUAJIRA" - ], - "44110": [ - "EL MOLINO", - "LA GUAJIRA" - ], - "44279": [ - "FONSECA", - "LA GUAJIRA" - ], - "44378": [ - "HATONUEVO", - "LA GUAJIRA" - ], - "44420": [ - "LA JAGUA DEL PILAR", - "LA GUAJIRA" - ], - "44430": [ - "MAICAO", - "LA GUAJIRA" - ], - "44560": [ - "MANAURE", - "LA GUAJIRA" - ], - "44650": [ - "SAN JUAN DEL CESAR", - "LA GUAJIRA" - ], - "44855": [ - "URUMITA", - "LA GUAJIRA" - ], - "44874": [ - "VILLANUEVA", - "LA GUAJIRA" - ], - "47030": [ - "ALGARROBO", - "MAGDALENA" - ], - "47058": [ - "ARIGUAN\u00cd", - "MAGDALENA" - ], - "47161": [ - "CERRO DE SAN ANTONIO", - "MAGDALENA" - ], - "47170": [ - "CHIVOLO", - "MAGDALENA" - ], - "47189": [ - "CI\u00c9NAGA", - "MAGDALENA" - ], - "47205": [ - "CONCORDIA", - "MAGDALENA" - ], - "47245": [ - "EL BANCO", - "MAGDALENA" - ], - "47258": [ - "EL PI\u00d1\u00d3N", - "MAGDALENA" - ], - "47268": [ - "EL RET\u00c9N", - "MAGDALENA" - ], - "47288": [ - "FUNDACI\u00d3N", - "MAGDALENA" - ], - "47318": [ - "GUAMAL", - "MAGDALENA" - ], - "47460": [ - "NUEVA GRANADA", - "MAGDALENA" - ], - "47541": [ - "PEDRAZA", - "MAGDALENA" - ], - "47545": [ - "PIJI\u00d1O DEL CARMEN", - "MAGDALENA" - ], - "47551": [ - "PIVIJAY", - "MAGDALENA" - ], - "47555": [ - "PLATO", - "MAGDALENA" - ], - "47570": [ - "PUEBLO VIEJO", - "MAGDALENA" - ], - "47605": [ - "REMOLINO", - "MAGDALENA" - ], - "47660": [ - "SABANAS DE SAN ANGEL", - "MAGDALENA" - ], - "47675": [ - "SALAMINA", - "MAGDALENA" - ], - "47692": [ - "SAN SEBASTIAN DE BUENAVISTA", - "MAGDALENA" - ], - "47703": [ - "SAN ZEN\u00d3N", - "MAGDALENA" - ], - "47707": [ - "SANTA ANA", - "MAGDALENA" - ], - "47720": [ - "SANTA B\u00c1RBARA DE PINTO", - "MAGDALENA" - ], - "47745": [ - "SITIONUEVO", - "MAGDALENA" - ], - "47798": [ - "TENERIFE", - "MAGDALENA" - ], - "47960": [ - "ZAPAY\u00c1N", - "MAGDALENA" - ], - "47980": [ - "ZONA BANANERA", - "MAGDALENA" - ], - "50006": [ - "ACAC\u00cdAS", - "META" - ], - "50110": [ - "BARRANCA DE UPIA", - "META" - ], - "50124": [ - "CABUYARO", - "META" - ], - "50150": [ - "CASTILLA LA NUEVA", - "META" - ], - "50223": [ - "CUBARRAL", - "META" - ], - "50226": [ - "CUMARAL", - "META" - ], - "50245": [ - "EL CALVARIO", - "META" - ], - "50251": [ - "EL CASTILLO", - "META" - ], - "50270": [ - "EL DORADO", - "META" - ], - "50287": [ - "FUENTE DE ORO", - "META" - ], - "50313": [ - "GRANADA", - "META" - ], - "50318": [ - "GUAMAL", - "META" - ], - "50330": [ - "MESETAS", - "META" - ], - "50370": [ - "URIBE", - "META" - ], - "50400": [ - "LEJAN\u00cdAS", - "META" - ], - "50573": [ - "PUERTO L\u00d3PEZ", - "META" - ], - "50606": [ - "RESTREPO", - "META" - ], - "50680": [ - "SAN CARLOS DE GUAROA", - "META" - ], - "50683": [ - "SAN JUAN DE ARAMA", - "META" - ], - "50686": [ - "SAN JUANITO", - "META" - ], - "50689": [ - "SAN MART\u00cdN", - "META" - ], - "52036": [ - "ANCUYA", - "NARI\u00d1O" - ], - "52051": [ - "ARBOLEDA", - "NARI\u00d1O" - ], - "52083": [ - "BELEN", - "NARI\u00d1O" - ], - "52110": [ - "BUESACO", - "NARI\u00d1O" - ], - "52203": [ - "COLON", - "NARI\u00d1O" - ], - "52207": [ - "CONSAC\u00c1", - "NARI\u00d1O" - ], - "52210": [ - "CONTADERO", - "NARI\u00d1O" - ], - "52215": [ - "C\u00d3RDOBA", - "NARI\u00d1O" - ], - "52224": [ - "CUASPUD", - "NARI\u00d1O" - ], - "52227": [ - "CUMBAL", - "NARI\u00d1O" - ], - "52233": [ - "CUMBITARA", - "NARI\u00d1O" - ], - "52240": [ - "CHACHAG\u00dc\u00cd", - "NARI\u00d1O" - ], - "52254": [ - "EL PE\u00d1OL", - "NARI\u00d1O" - ], - "52256": [ - "EL ROSARIO", - "NARI\u00d1O" - ], - "52258": [ - "EL TABL\u00d3N DE G\u00d3MEZ", - "NARI\u00d1O" - ], - "52287": [ - "FUNES", - "NARI\u00d1O" - ], - "52320": [ - "GUAITARILLA", - "NARI\u00d1O" - ], - "52323": [ - "GUALMAT\u00c1N", - "NARI\u00d1O" - ], - "52352": [ - "ILES", - "NARI\u00d1O" - ], - "52354": [ - "IMUES", - "NARI\u00d1O" - ], - "52378": [ - "LA CRUZ", - "NARI\u00d1O" - ], - "52385": [ - "LA LLANADA", - "NARI\u00d1O" - ], - "52399": [ - "LA UNI\u00d3N", - "NARI\u00d1O" - ], - "52411": [ - "LINARES", - "NARI\u00d1O" - ], - "52418": [ - "LOS ANDES", - "NARI\u00d1O" - ], - "52480": [ - "NARI\u00d1O", - "NARI\u00d1O" - ], - "52565": [ - "PROVIDENCIA", - "NARI\u00d1O" - ], - "52573": [ - "PUERRES", - "NARI\u00d1O" - ], - "52585": [ - "PUPIALES", - "NARI\u00d1O" - ], - "52612": [ - "RICAURTE", - "NARI\u00d1O" - ], - "52685": [ - "SAN BERNARDO", - "NARI\u00d1O" - ], - "52687": [ - "SAN LORENZO", - "NARI\u00d1O" - ], - "52694": [ - "SAN PEDRO DE CARTAGO", - "NARI\u00d1O" - ], - "52699": [ - "SANTA CRUZ (Guachav\u00e9s)", - "NARI\u00d1O" - ], - "52720": [ - "SAPUYES", - "NARI\u00d1O" - ], - "52786": [ - "TAMINANGO", - "NARI\u00d1O" - ], - "52788": [ - "TANGUA", - "NARI\u00d1O" - ], - "52838": [ - "TUQUERRES", - "NARI\u00d1O" - ], - "52885": [ - "YACUANQUER", - "NARI\u00d1O" - ], - "54003": [ - "ABREGO", - "NORTE DE SANTANDER" - ], - "54051": [ - "ARBOLEDAS", - "NORTE DE SANTANDER" - ], - "54125": [ - "C\u00c1COTA", - "NORTE DE SANTANDER" - ], - "54172": [ - "CHIN\u00c1COTA", - "NORTE DE SANTANDER" - ], - "54174": [ - "CHITAG\u00c0", - "NORTE DE SANTANDER" - ], - "54206": [ - "CONVENCI\u00d3N", - "NORTE DE SANTANDER" - ], - "54223": [ - "CUCUTILLA", - "NORTE DE SANTANDER" - ], - "54245": [ - "EL CARMEN", - "NORTE DE SANTANDER" - ], - "54250": [ - "EL TARRA", - "NORTE DE SANTANDER" - ], - "54347": [ - "HERR\u00c1N", - "NORTE DE SANTANDER" - ], - "54385": [ - "LA ESPERANZA", - "NORTE DE SANTANDER" - ], - "54398": [ - "LA PLAYA", - "NORTE DE SANTANDER" - ], - "54418": [ - "LOURDES", - "NORTE DE SANTANDER" - ], - "54480": [ - "MUTISCUA", - "NORTE DE SANTANDER" - ], - "54520": [ - "PAMPLONITA", - "NORTE DE SANTANDER" - ], - "54553": [ - "PUERTO SANTANDER", - "NORTE DE SANTANDER" - ], - "54599": [ - "RAGONVALIA", - "NORTE DE SANTANDER" - ], - "54660": [ - "SALAZAR", - "NORTE DE SANTANDER" - ], - "54670": [ - "SAN CALIXTO", - "NORTE DE SANTANDER" - ], - "54673": [ - "SAN CAYETANO", - "NORTE DE SANTANDER" - ], - "54680": [ - "SANTIAGO", - "NORTE DE SANTANDER" - ], - "54743": [ - "SILOS", - "NORTE DE SANTANDER" - ], - "54800": [ - "TEORAMA", - "NORTE DE SANTANDER" - ], - "54810": [ - "TIB\u00da", - "NORTE DE SANTANDER" - ], - "54871": [ - "VILLA CARO", - "NORTE DE SANTANDER" - ], - "63001": [ - "ARMENIA", - "QUIND\u00cdO" - ], - "63111": [ - "BUENAVISTA", - "QUIND\u00cdO" - ], - "63130": [ - "CALARCA", - "QUIND\u00cdO" - ], - "63190": [ - "CIRCASIA", - "QUIND\u00cdO" - ], - "63212": [ - "C\u00d3RDOBA", - "QUIND\u00cdO" - ], - "63272": [ - "FILANDIA", - "QUIND\u00cdO" - ], - "63302": [ - "G\u00c9NOVA", - "QUIND\u00cdO" - ], - "63401": [ - "LA TEBAIDA", - "QUIND\u00cdO" - ], - "63470": [ - "MONTENEGRO", - "QUIND\u00cdO" - ], - "63548": [ - "PIJAO", - "QUIND\u00cdO" - ], - "63594": [ - "QUIMBAYA", - "QUIND\u00cdO" - ], - "63690": [ - "SALENTO", - "QUIND\u00cdO" - ], - "66001": [ - "PEREIRA", - "RISARALDA" - ], - "66045": [ - "AP\u00cdA", - "RISARALDA" - ], - "66088": [ - "BEL\u00c9N DE UMBR\u00cdA", - "RISARALDA" - ], - "66318": [ - "GU\u00c1TICA", - "RISARALDA" - ], - "66383": [ - "LA CELIA", - "RISARALDA" - ], - "66400": [ - "LA VIRGINIA", - "RISARALDA" - ], - "66440": [ - "MARSELLA", - "RISARALDA" - ], - "66572": [ - "PUEBLO RICO", - "RISARALDA" - ], - "66594": [ - "QUINCHIA", - "RISARALDA" - ], - "66682": [ - "SANTA ROSA DE CABAL", - "RISARALDA" - ], - "66687": [ - "SANTUARIO", - "RISARALDA" - ], - "68013": [ - "AGUADA", - "SANTANDER" - ], - "68020": [ - "ALBANIA", - "SANTANDER" - ], - "68051": [ - "ARATOCA", - "SANTANDER" - ], - "68077": [ - "BARBOSA", - "SANTANDER" - ], - "68079": [ - "BARICHARA", - "SANTANDER" - ], - "68081": [ - "BARRANCABERMEJA", - "SANTANDER" - ], - "68092": [ - "BETULIA", - "SANTANDER" - ], - "68101": [ - "BOLIVAR", - "SANTANDER" - ], - "68121": [ - "CABRERA", - "SANTANDER" - ], - "68132": [ - "CALIFORNIA", - "SANTANDER" - ], - "68147": [ - "CAPITANEJO", - "SANTANDER" - ], - "68152": [ - "CARCAS\u00cd", - "SANTANDER" - ], - "68160": [ - "CEPIT\u00c1", - "SANTANDER" - ], - "68162": [ - "CERRITO", - "SANTANDER" - ], - "68167": [ - "CHARALA", - "SANTANDER" - ], - "68169": [ - "CHARTA", - "SANTANDER" - ], - "68176": [ - "CHIMA", - "SANTANDER" - ], - "68179": [ - "CHIPAT\u00c1", - "SANTANDER" - ], - "68190": [ - "CIMITARRA", - "SANTANDER" - ], - "68207": [ - "CONCEPCI\u00d3N", - "SANTANDER" - ], - "68209": [ - "CONFINES", - "SANTANDER" - ], - "68211": [ - "CONTRATACI\u00d3N", - "SANTANDER" - ], - "68217": [ - "COROMORO", - "SANTANDER" - ], - "68229": [ - "CURIT\u00cd", - "SANTANDER" - ], - "68235": [ - "EL CARMEN DE CHUCURI", - "SANTANDER" - ], - "68245": [ - "EL GUACAMAYO", - "SANTANDER" - ], - "68250": [ - "EL PE\u00d1\u00d3N", - "SANTANDER" - ], - "68255": [ - "EL PLAY\u00d3N", - "SANTANDER" - ], - "68264": [ - "ENCINO", - "SANTANDER" - ], - "68266": [ - "ENCISO", - "SANTANDER" - ], - "68271": [ - "FLORI\u00c1N", - "SANTANDER" - ], - "68276": [ - "FLORIDABLANCA", - "SANTANDER" - ], - "68296": [ - "GAL\u00c1N", - "SANTANDER" - ], - "68298": [ - "G\u00c1MBITA", - "SANTANDER" - ], - "68318": [ - "GUACA", - "SANTANDER" - ], - "68320": [ - "GUADALUPE", - "SANTANDER" - ], - "68322": [ - "GUAPOT\u00c1", - "SANTANDER" - ], - "68324": [ - "GUAVAT\u00c1", - "SANTANDER" - ], - "68327": [ - "G\u00dcEPSA", - "SANTANDER" - ], - "68344": [ - "HATO", - "SANTANDER" - ], - "68368": [ - "JES\u00daS MAR\u00cdA", - "SANTANDER" - ], - "68370": [ - "JORD\u00c1N SUBE", - "SANTANDER" - ], - "68377": [ - "LA BELLEZA", - "SANTANDER" - ], - "68385": [ - "LAND\u00c1ZURI", - "SANTANDER" - ], - "68397": [ - "LA PAZ", - "SANTANDER" - ], - "68406": [ - "LEBR\u00cdJA", - "SANTANDER" - ], - "68418": [ - "LOS SANTOS", - "SANTANDER" - ], - "68425": [ - "MACARAVITA", - "SANTANDER" - ], - "68432": [ - "M\u00c1LAGA", - "SANTANDER" - ], - "68444": [ - "MATANZA", - "SANTANDER" - ], - "68464": [ - "MOGOTES", - "SANTANDER" - ], - "68468": [ - "MOLAGAVITA", - "SANTANDER" - ], - "68498": [ - "OCAMONTE", - "SANTANDER" - ], - "68500": [ - "OIBA", - "SANTANDER" - ], - "68502": [ - "ONZAGA", - "SANTANDER" - ], - "68522": [ - "PALMAR", - "SANTANDER" - ], - "68524": [ - "PALMAS DEL SOCORRO", - "SANTANDER" - ], - "68533": [ - "P\u00c1RAMO", - "SANTANDER" - ], - "68547": [ - "PIEDECUESTA", - "SANTANDER" - ], - "68549": [ - "PINCHOTE", - "SANTANDER" - ], - "68572": [ - "PUENTE NACIONAL", - "SANTANDER" - ], - "68573": [ - "PUERTO PARRA", - "SANTANDER" - ], - "68575": [ - "PUERTO WILCHES", - "SANTANDER" - ], - "68615": [ - "RIONEGRO", - "SANTANDER" - ], - "68655": [ - "SABANA DE TORRES", - "SANTANDER" - ], - "68669": [ - "SAN ANDRES", - "SANTANDER" - ], - "68673": [ - "SAN BENITO", - "SANTANDER" - ], - "68679": [ - "SAN GIL", - "SANTANDER" - ], - "68682": [ - "SAN JOAQU\u00cdN", - "SANTANDER" - ], - "68684": [ - "SAN JOS\u00c9 DE MIRANDA", - "SANTANDER" - ], - "68686": [ - "SAN MIGUEL", - "SANTANDER" - ], - "68689": [ - "SAN VICENTE DE CHUCURI", - "SANTANDER" - ], - "68705": [ - "SANTA BARBARA", - "SANTANDER" - ], - "68720": [ - "SANTA HELENA DEL OP\u00d3N", - "SANTANDER" - ], - "68745": [ - "SIMACOTA", - "SANTANDER" - ], - "68755": [ - "SOCORRO", - "SANTANDER" - ], - "68770": [ - "SUAITA", - "SANTANDER" - ], - "68773": [ - "SUCRE", - "SANTANDER" - ], - "68780": [ - "SURAT\u00c1", - "SANTANDER" - ], - "68820": [ - "TONA", - "SANTANDER" - ], - "68855": [ - "VALLE DE SAN JOSE", - "SANTANDER" - ], - "68861": [ - "V\u00c9LEZ", - "SANTANDER" - ], - "68867": [ - "VETAS", - "SANTANDER" - ], - "68872": [ - "VILLANUEVA", - "SANTANDER" - ], - "68895": [ - "ZAPATOCA", - "SANTANDER" - ], - "70110": [ - "BUENAVISTA", - "SUCRE" - ], - "70124": [ - "CAIMITO", - "SUCRE" - ], - "70204": [ - "RICAURTE (COLOSO)", - "SUCRE" - ], - "70215": [ - "COROZAL", - "SUCRE" - ], - "70221": [ - "COVE\u00d1AS", - "SUCRE" - ], - "70230": [ - "CHAL\u00c1N", - "SUCRE" - ], - "70233": [ - "EL ROBLE", - "SUCRE" - ], - "70235": [ - "GALERAS", - "SUCRE" - ], - "70265": [ - "GUARANDA", - "SUCRE" - ], - "70400": [ - "LA UNI\u00d3N", - "SUCRE" - ], - "70418": [ - "LOS PALMITOS", - "SUCRE" - ], - "70429": [ - "MAJAGUAL", - "SUCRE" - ], - "70473": [ - "MORROA", - "SUCRE" - ], - "70508": [ - "OVEJAS", - "SUCRE" - ], - "70523": [ - "PALMITO", - "SUCRE" - ], - "70670": [ - "SAMPU\u00c9S", - "SUCRE" - ], - "70678": [ - "SAN BENITO ABAD", - "SUCRE" - ], - "70702": [ - "SAN JUAN DE BETULIA", - "SUCRE" - ], - "70708": [ - "SAN MARCOS", - "SUCRE" - ], - "70713": [ - "SAN ONOFRE", - "SUCRE" - ], - "70717": [ - "SAN PEDRO", - "SUCRE" - ], - "70742": [ - "SAN LUIS DE SINC\u00c9", - "SUCRE" - ], - "70771": [ - "SUCRE", - "SUCRE" - ], - "70820": [ - "SANTIAGO DE TOL\u00da", - "SUCRE" - ], - "70823": [ - "TOL\u00da VIEJO", - "SUCRE" - ], - "73024": [ - "ALPUJARRA", - "TOLIMA" - ], - "73026": [ - "ALVARADO", - "TOLIMA" - ], - "73030": [ - "AMBALEMA", - "TOLIMA" - ], - "73043": [ - "ANZO\u00c1TEGUI", - "TOLIMA" - ], - "73055": [ - "ARMERO", - "TOLIMA" - ], - "73067": [ - "ATACO", - "TOLIMA" - ], - "73124": [ - "CAJAMARCA", - "TOLIMA" - ], - "73148": [ - "CARMEN DE APICALA", - "TOLIMA" - ], - "73152": [ - "CASABIANCA", - "TOLIMA" - ], - "73168": [ - "CHAPARRAL", - "TOLIMA" - ], - "73200": [ - "COELLO", - "TOLIMA" - ], - "73217": [ - "COYAIMA", - "TOLIMA" - ], - "73226": [ - "CUNDAY", - "TOLIMA" - ], - "73236": [ - "DOLORES", - "TOLIMA" - ], - "73268": [ - "ESPINAL", - "TOLIMA" - ], - "73270": [ - "FALAN", - "TOLIMA" - ], - "73275": [ - "FLANDES", - "TOLIMA" - ], - "73283": [ - "FRESNO", - "TOLIMA" - ], - "73319": [ - "GUAMO", - "TOLIMA" - ], - "73347": [ - "HERVEO", - "TOLIMA" - ], - "73349": [ - "HONDA", - "TOLIMA" - ], - "73352": [ - "ICONONZO", - "TOLIMA" - ], - "73408": [ - "L\u00c9RIDA", - "TOLIMA" - ], - "73411": [ - "LIBANO", - "TOLIMA" - ], - "73443": [ - "SAN SEBASTI\u00c1N DE MARIQUITA", - "TOLIMA" - ], - "73449": [ - "MELGAR", - "TOLIMA" - ], - "73461": [ - "MURILLO", - "TOLIMA" - ], - "73483": [ - "NATAGAIMA", - "TOLIMA" - ], - "73504": [ - "ORTEGA", - "TOLIMA" - ], - "73520": [ - "PALOCABILDO", - "TOLIMA" - ], - "73547": [ - "PIEDRAS", - "TOLIMA" - ], - "73555": [ - "PLANADAS", - "TOLIMA" - ], - "73563": [ - "PRADO", - "TOLIMA" - ], - "73585": [ - "PURIFICACI\u00d3N", - "TOLIMA" - ], - "73616": [ - "RIOBLANCO", - "TOLIMA" - ], - "73622": [ - "RONCESVALLES", - "TOLIMA" - ], - "73624": [ - "ROVIRA", - "TOLIMA" - ], - "73671": [ - "SALDA\u00d1A", - "TOLIMA" - ], - "73675": [ - "SAN ANTONIO", - "TOLIMA" - ], - "73678": [ - "SAN LUIS", - "TOLIMA" - ], - "73686": [ - "SANTA ISABEL", - "TOLIMA" - ], - "73770": [ - "SUAR\u00c9Z", - "TOLIMA" - ], - "73854": [ - "VALLE DE SAN JUAN", - "TOLIMA" - ], - "73861": [ - "VENADILLO", - "TOLIMA" - ], - "73870": [ - "VILLAHERMOSA", - "TOLIMA" - ], - "73873": [ - "VILLARRICA", - "TOLIMA" - ], - "76020": [ - "ALCAL\u00c1", - "VALLE DEL CAUCA" - ], - "76036": [ - "ANDALUC\u00cdA", - "VALLE DEL CAUCA" - ], - "76041": [ - "ANSERMANUEVO", - "VALLE DEL CAUCA" - ], - "76054": [ - "ARGELIA", - "VALLE DEL CAUCA" - ], - "76100": [ - "BOL\u00cdVAR", - "VALLE DEL CAUCA" - ], - "76111": [ - "BUGA", - "VALLE DEL CAUCA" - ], - "76113": [ - "BUGALAGRANDE", - "VALLE DEL CAUCA" - ], - "76122": [ - "CAICEDONIA", - "VALLE DEL CAUCA" - ], - "76126": [ - "CALIMA", - "VALLE DEL CAUCA" - ], - "76001": [ - "CALI", - "VALLE DEL CAUCA" - ], - "76243": [ - "EL \u00c1GUILA", - "VALLE DEL CAUCA" - ], - "76246": [ - "EL CAIRO", - "VALLE DEL CAUCA" - ], - "76248": [ - "EL CERRITO", - "VALLE DEL CAUCA" - ], - "76250": [ - "EL DOVIO", - "VALLE DEL CAUCA" - ], - "76275": [ - "FLORIDA", - "VALLE DEL CAUCA" - ], - "76306": [ - "GINEBRA", - "VALLE DEL CAUCA" - ], - "76318": [ - "GUACAR\u00cd", - "VALLE DEL CAUCA" - ], - "76364": [ - "JAMUND\u00cd", - "VALLE DEL CAUCA" - ], - "76377": [ - "LA CUMBRE", - "VALLE DEL CAUCA" - ], - "76400": [ - "LA UNI\u00d3N", - "VALLE DEL CAUCA" - ], - "76403": [ - "LA VICTORIA", - "VALLE DEL CAUCA" - ], - "76497": [ - "OBANDO", - "VALLE DEL CAUCA" - ], - "76520": [ - "PALMIRA", - "VALLE DEL CAUCA" - ], - "76563": [ - "PRADERA", - "VALLE DEL CAUCA" - ], - "76606": [ - "RESTREPO", - "VALLE DEL CAUCA" - ], - "76616": [ - "RIOFR\u00cdO", - "VALLE DEL CAUCA" - ], - "76622": [ - "ROLDANILLO", - "VALLE DEL CAUCA" - ], - "76670": [ - "SAN PEDRO", - "VALLE DEL CAUCA" - ], - "76736": [ - "SEVILLA", - "VALLE DEL CAUCA" - ], - "76823": [ - "TORO", - "VALLE DEL CAUCA" - ], - "76828": [ - "TRUJILLO", - "VALLE DEL CAUCA" - ], - "76834": [ - "TULU\u00c1", - "VALLE DEL CAUCA" - ], - "76845": [ - "ULLOA", - "VALLE DEL CAUCA" - ], - "76863": [ - "VERSALLES", - "VALLE DEL CAUCA" - ], - "76869": [ - "VIJES", - "VALLE DEL CAUCA" - ], - "76890": [ - "YOTOCO", - "VALLE DEL CAUCA" - ], - "76892": [ - "YUMBO", - "VALLE DEL CAUCA" - ], - "76895": [ - "ZARZAL", - "VALLE DEL CAUCA" - ], - "81220": [ - "CRAVO NORTE", - "ARAUCA" - ], - "81300": [ - "FORTUL", - "ARAUCA" - ], - "81794": [ - "TAME", - "ARAUCA" - ], - "85015": [ - "CHAMEZA", - "CASANARE" - ], - "85136": [ - "LA SALINA", - "CASANARE" - ], - "85139": [ - "MAN\u00cd", - "CASANARE" - ], - "85225": [ - "NUNCHIA", - "CASANARE" - ], - "85230": [ - "OROCU\u00c9", - "CASANARE" - ], - "85250": [ - "PAZ DE ARIPORO", - "CASANARE" - ], - "85279": [ - "RECETOR", - "CASANARE" - ], - "85300": [ - "SABANALARGA", - "CASANARE" - ], - "85315": [ - "SACAMA", - "CASANARE" - ], - "85325": [ - "SAN LUIS DE PALENQUE", - "CASANARE" - ], - "85400": [ - "TAMARA", - "CASANARE" - ], - "85410": [ - "TAURAMENA", - "CASANARE" - ], - "85440": [ - "VILLANUEVA", - "CASANARE" - ], - "86219": [ - "COL\u00d3N", - "PUTUMAYO" - ], - "86569": [ - "PUERTO CAICEDO", - "PUTUMAYO" - ], - "86749": [ - "SIBUNDOY", - "PUTUMAYO" - ], - "86760": [ - "SANTIAGO", - "PUTUMAYO" - ], - "86865": [ - "VALLE DEL GUAMUEZ", - "PUTUMAYO" - ], - "88001": [ - "SAN ANDR\u00c9S", - "ARCHIPI\u00c9LAGO DE SAN ANDR\u00c9S, PROVIDENCIA Y SANTA CATALINA" - ], - "91540": [ - "PUERTO NARI\u00d1O", - "AMAZONAS" - ], - "91001": [ - "LETICIA", - "AMAZONAS" - ], - "91798": [ - "TARAPAC\u00c1", - "AMAZONAS" - ], - "91263": [ - "EL ENCANTO", - "AMAZONAS" - ], - "91536": [ - "PUERTO ARICA", - "AMAZONAS" - ], - "91530": [ - "PUERTO ALEGR\u00cdA", - "AMAZONAS" - ], - "91407": [ - "LA PEDRERA", - "AMAZONAS" - ], - "91405": [ - "LA CHORRERA", - "AMAZONAS" - ], - "91669": [ - "SANTANDER (Araracuara)", - "AMAZONAS" - ], - "97666": [ - "TARAIRA", - "VAUP\u00c9S" - ], - "91460": [ - "MIRIT\u00cd-PARAN\u00c1 (Campoamor)", - "AMAZONAS" - ], - "91430": [ - "LA VICTORIA (Pacoa)", - "AMAZONAS" - ], - "86757": [ - "SAN MIGUEL (La Dorada)", - "PUTUMAYO" - ], - "86568": [ - "PUERTO AS\u00cdS", - "PUTUMAYO" - ], - "86573": [ - "PUERTO LEGU\u00cdZAMO", - "PUTUMAYO" - ], - "52560": [ - "POTOS\u00cd", - "NARI\u00d1O" - ], - "97511": [ - "PACOA (Cor. Departamental)", - "VAUP\u00c9S" - ], - "52356": [ - "IPIALES", - "NARI\u00d1O" - ], - "86320": [ - "ORITO", - "PUTUMAYO" - ], - "52022": [ - "ALDANA", - "NARI\u00d1O" - ], - "18785": [ - "SOLITA", - "CAQUET\u00c1" - ], - "52317": [ - "GUACHUCAL", - "NARI\u00d1O" - ], - "52506": [ - "OSPINA", - "NARI\u00d1O" - ], - "86571": [ - "PUERTO GUZM\u00c1N", - "PUTUMAYO" - ], - "86885": [ - "VILLAGARZ\u00d3N", - "PUTUMAYO" - ], - "97889": [ - "YAVARAT\u00c9 (Cor. Departamental)", - "VAUP\u00c9S" - ], - "18205": [ - "CURILLO", - "CAQUET\u00c1" - ], - "18756": [ - "SOLANO", - "CAQUET\u00c1" - ], - "86755": [ - "SAN FRANCISCO", - "PUTUMAYO" - ], - "52001": [ - "PASTO", - "NARI\u00d1O" - ], - "52683": [ - "SANDON\u00c1", - "NARI\u00d1O" - ], - "52435": [ - "MALLAMA (Piedrancha)", - "NARI\u00d1O" - ], - "52381": [ - "LA FLORIDA", - "NARI\u00d1O" - ], - "86001": [ - "MOCOA", - "PUTUMAYO" - ], - "52019": [ - "ALB\u00c1N (San Jos\u00e9)", - "NARI\u00d1O" - ], - "52260": [ - "EL TAMBO", - "NARI\u00d1O" - ], - "18150": [ - "CARTAGENA DEL CHAIR\u00c1", - "CAQUET\u00c1" - ], - "52678": [ - "SAMANIEGO", - "NARI\u00d1O" - ], - "94885": [ - "LA GUADALUPE", - "GUAIN\u00cdA" - ], - "52693": [ - "SAN PABLO", - "NARI\u00d1O" - ], - "97161": [ - "CARUR\u00da", - "VAUP\u00c9S" - ], - "97001": [ - "MIT\u00da", - "VAUP\u00c9S" - ], - "52079": [ - "BARBACOAS", - "NARI\u00d1O" - ], - "52540": [ - "POLICARPA", - "NARI\u00d1O" - ], - "95200": [ - "MIRAFLORES", - "GUAVIARE" - ], - "52835": [ - "TUMACO", - "NARI\u00d1O" - ], - "5615": [ - "RIONEGRO", - "ANTIOQUIA" - ], - "20443": [ - "MANAURE BALC\u00d3N DEL CESAR", - "CESAR" - ], - "94001": [ - "IN\u00cdRIDA", - "GUAIN\u00cdA" - ], - "27580": [ - "RIO IR\u00d3 (Santa Rita)", - "CHOC\u00d3" - ], - "95025": [ - "EL RETORNO", - "GUAVIARE" - ], - "94887": [ - "PAN\u00c1-PAN\u00c1 (Campo Alegre)", - "GUAIN\u00cdA" - ], - "94883": [ - "SAN FELIPE", - "GUAIN\u00cdA" - ], - "27413": [ - "LLOR\u00d3", - "CHOC\u00d3" - ], - "97777": [ - "PAPUNAUA(Cor. Departamental)", - "VAUP\u00c9S" - ], - "54344": [ - "HACAR\u00cd", - "NORTE DE SANTANDER" - ], - "54720": [ - "SARDINATA", - "NORTE DE SANTANDER" - ], - "66075": [ - "BALBOA", - "RISARALDA" - ], - "85001": [ - "YOPAL", - "CASANARE" - ], - "85430": [ - "TRINIDAD", - "CASANARE" - ], - "15001": [ - "TUNJA", - "BOYAC\u00c1" - ], - "52427": [ - "MAG\u00dc\u00cd (Pay\u00e1n)", - "NARI\u00d1O" - ], - "52405": [ - "LEIVA", - "NARI\u00d1O" - ], - "95015": [ - "CALAMAR", - "GUAVIARE" - ], - "52621": [ - "ROBERTO PAY\u00c1N (San Jos\u00e9)", - "NARI\u00d1O" - ], - "52520": [ - "FRANCISCO PIZARRO (Salahonda)", - "NARI\u00d1O" - ], - "50350": [ - "LA MACARENA", - "META" - ], - "52473": [ - "MOSQUERA", - "NARI\u00d1O" - ], - "52490": [ - "OLAYA HERRERA (Bocas de Satinga)", - "NARI\u00d1O" - ], - "52696": [ - "SANTA B\u00c1RBARA (Iscuand\u00e9)", - "NARI\u00d1O" - ], - "52390": [ - "LA TOLA", - "NARI\u00d1O" - ], - "41349": [ - "HOBO", - "HUILA" - ], - "52250": [ - "EL CHARCO", - "NARI\u00d1O" - ], - "19318": [ - "GUAPI", - "CAUCA" - ], - "94888": [ - "MORICHAL (Morichal Nuevo)", - "GUAIN\u00cdA" - ], - "95001": [ - "SAN JOS\u00c9 DEL GUAVIARE", - "GUAVIARE" - ], - "19809": [ - "TIMBIQU\u00cd", - "CAUCA" - ], - "18753": [ - "SAN VICENTE DEL CAGU\u00c1N", - "CAQUET\u00c1" - ], - "50450": [ - "PUERTO CONCORDIA", - "META" - ], - "50590": [ - "PUERTO RICO", - "META" - ], - "94884": [ - "PUERTO COLOMBIA", - "GUAIN\u00cdA" - ], - "50711": [ - "VISTAHERMOSA", - "META" - ], - "19418": [ - "L\u00d3PEZ", - "CAUCA" - ], - "94663": [ - "MAPIRIPANA", - "GUAIN\u00cdA" - ], - "50325": [ - "MAPIRIP\u00c1N", - "META" - ], - "50577": [ - "PUERTO LLERAS", - "META" - ], - "94343": [ - "BARRANCO MINA", - "GUAIN\u00cdA" - ], - "94886": [ - "CACAHUAL", - "GUAIN\u00cdA" - ], - "76233": [ - "DAGUA", - "VALLE DEL CAUCA" - ], - "76109": [ - "BUENAVENTURA", - "VALLE DEL CAUCA" - ], - "50001": [ - "VILLAVICENCIO", - "META" - ], - "27250": [ - "EL LITORAL DEL SAN JU\u00c1N (Docord\u00f3)", - "CHOC\u00d3" - ], - "73001": [ - "IBAGU\u00c9", - "TOLIMA" - ], - "27745": [ - "SIP\u00cd", - "CHOC\u00d3" - ], - "11001": [ - "BOGOT\u00c1, D.C.", - "BOGOT\u00c1, D.C." - ], - "47001": [ - "SANTA MARTA", - "MAGDALENA" - ], - "44001": [ - "RIOHACHA", - "LA GUAJIRA" - ], - "44847": [ - "URIBIA", - "LA GUAJIRA" - ], - "88564": [ - "PROVIDENCIA (Santa Isabel)", - "ARCHIPI\u00c9LAGO DE SAN ANDR\u00c9S, PROVIDENCIA Y SANTA CATALINA" - ], - "85162": [ - "MONTERREY", - "CASANARE" - ], - "50568": [ - "PUERTO GAIT\u00c1N", - "META" - ], - "20045": [ - "BECERRILL", - "CESAR" - ], - "27361": [ - "ISTMINA", - "CHOC\u00d3" - ], - "70001": [ - "SINCELEJO", - "SUCRE" - ], - "5001": [ - "MEDELL\u00cdN", - "ANTIOQUIA" - ], - "5240": [ - "EB\u00c9JICO", - "ANTIOQUIA" - ], - "5212": [ - "COPACABANA", - "ANTIOQUIA" - ], - "5088": [ - "BELLO", - "ANTIOQUIA" - ], - "5308": [ - "GIRARDOTA", - "ANTIOQUIA" - ], - "27073": [ - "BAGAD\u00d3", - "CHOC\u00d3" - ], - "27600": [ - "RIO QUITO (Paimad\u00f3)", - "CHOC\u00d3" - ], - "27050": [ - "ATRATO (Yuto)", - "CHOC\u00d3" - ], - "20400": [ - "LA JAGUA DE IBIRICO", - "CESAR" - ], - "85263": [ - "PORE", - "CASANARE" - ], - "5631": [ - "SABANETA", - "ANTIOQUIA" - ], - "5380": [ - "LA ESTRELLA", - "ANTIOQUIA" - ], - "5266": [ - "ENVIGADO", - "ANTIOQUIA" - ], - "5360": [ - "ITAG\u00dc\u00cd", - "ANTIOQUIA" - ], - "27425": [ - "MEDIO ATRATO (Bet\u00e9)", - "CHOC\u00d3" - ], - "99524": [ - "LA PRIMAVERA", - "VICHADA" - ], - "5364": [ - "JARD\u00cdN", - "ANTIOQUIA" - ], - "27491": [ - "N\u00d3VITA", - "CHOC\u00d3" - ], - "27450": [ - "MEDIO SAN JUAN (Andagoya)", - "CHOC\u00d3" - ], - "27660": [ - "SAN JOS\u00c9 DEL PALMAR", - "CHOC\u00d3" - ], - "27205": [ - "CONDOTO", - "CHOC\u00d3" - ], - "85010": [ - "AGUAZUL", - "CASANARE" - ], - "54874": [ - "VILLA DEL ROSARIO", - "NORTE DE SANTANDER" - ], - "27430": [ - "MEDIO BAUD\u00d3(Boca de Pep\u00e9)", - "CHOC\u00d3" - ], - "27810": [ - "UNI\u00d3N PANAMERICANA ( Animas)", - "CHOC\u00d3" - ], - "27787": [ - "TAD\u00d3", - "CHOC\u00d3" - ], - "27160": [ - "C\u00c9RTEGUI", - "CHOC\u00d3" - ], - "27135": [ - "EL CANT\u00d3N DEL SAN PABLO (Managr\u00fa)", - "CHOC\u00d3" - ], - "99773": [ - "CUMARIBO", - "VICHADA" - ], - "17614": [ - "RIOSUCIO", - "CALDAS" - ], - "27077": [ - "BAJO BAUD\u00d3 (Pizarro)", - "CHOC\u00d3" - ], - "66456": [ - "MISTRAT\u00d3", - "RISARALDA" - ], - "27495": [ - "NUQU\u00cd", - "CHOC\u00d3" - ], - "27245": [ - "EL CARMEN", - "CHOC\u00d3" - ], - "27025": [ - "ALTO BAUD\u00d3 (Pie de Pato)", - "CHOC\u00d3" - ], - "5376": [ - "LA CEJA", - "ANTIOQUIA" - ], - "5129": [ - "CALDAS", - "ANTIOQUIA" - ], - "99001": [ - "PUERTO CARRE\u00d1O", - "VICHADA" - ], - "27001": [ - "QUIBD\u00d3", - "CHOC\u00d3" - ], - "5656": [ - "SAN JER\u00d3NIMO", - "ANTIOQUIA" - ], - "5079": [ - "BARBOSA", - "ANTIOQUIA" - ], - "5690": [ - "SANTO DOMINGO", - "ANTIOQUIA" - ], - "5847": [ - "URRAO", - "ANTIOQUIA" - ], - "81591": [ - "PUERTO ROND\u00d3N", - "ARAUCA" - ], - "5042": [ - "SANTA FE DE ANTIOQUIA", - "ANTIOQUIA" - ], - "5086": [ - "BELMIRA", - "ANTIOQUIA" - ], - "5411": [ - "LIBORINA", - "ANTIOQUIA" - ], - "27075": [ - "BAH\u00cdA SOLANO (Mutis)", - "CHOC\u00d3" - ], - "5873": [ - "VIGIA DEL FUERTE", - "ANTIOQUIA" - ], - "5310": [ - "G\u00d3MEZ PLATA", - "ANTIOQUIA" - ], - "27099": [ - "BOJAY\u00c1 (Bellavista)", - "CHOC\u00d3" - ], - "5686": [ - "SANTA ROSA DE OSOS", - "ANTIOQUIA" - ], - "5315": [ - "GUADALUPE", - "ANTIOQUIA" - ], - "5138": [ - "CA\u00d1ASGORDAS", - "ANTIOQUIA" - ], - "5475": [ - "MURIND\u00d3", - "ANTIOQUIA" - ], - "81065": [ - "ARAUQUITA", - "ARAUCA" - ], - "81736": [ - "SARAVENA", - "ARAUCA" - ], - "5819": [ - "TOLEDO", - "ANTIOQUIA" - ], - "81001": [ - "ARAUCA", - "ARAUCA" - ], - "5234": [ - "DABEIBA", - "ANTIOQUIA" - ], - "68307": [ - "GIR\u00d3N", - "SANTANDER" - ], - "68001": [ - "BUCARAMANGA", - "SANTANDER" - ], - "5031": [ - "AMALFI", - "ANTIOQUIA" - ], - "5893": [ - "YOND\u00d3 (Casabe)", - "ANTIOQUIA" - ], - "27150": [ - "CARMEN DEL DARI\u00c9N (Curbarad\u00f3)", - "CHOC\u00d3" - ], - "54377": [ - "LABATECA", - "NORTE DE SANTANDER" - ], - "54518": [ - "PAMPLONA", - "NORTE DE SANTANDER" - ], - "54820": [ - "TOLEDO", - "NORTE DE SANTANDER" - ], - "27372": [ - "JURAD\u00d3", - "CHOC\u00d3" - ], - "5480": [ - "MUTAT\u00c1", - "ANTIOQUIA" - ], - "54099": [ - "BOCHALEMA", - "NORTE DE SANTANDER" - ], - "54239": [ - "DURANIA", - "NORTE DE SANTANDER" - ], - "54128": [ - "C\u00c1CHIRA", - "NORTE DE SANTANDER" - ], - "54405": [ - "LOS PATIOS", - "NORTE DE SANTANDER" - ], - "5147": [ - "CAREPA", - "ANTIOQUIA" - ], - "27615": [ - "RIOSUCIO", - "CHOC\u00d3" - ], - "54313": [ - "GRAMALOTE", - "NORTE DE SANTANDER" - ], - "23580": [ - "PUERTO LIBERTADOR", - "C\u00d3RDOBA" - ], - "5045": [ - "APARTAD\u00d3", - "ANTIOQUIA" - ], - "5154": [ - "CAUCASIA", - "ANTIOQUIA" - ], - "54109": [ - "BUCARASICA", - "NORTE DE SANTANDER" - ], - "54261": [ - "EL ZULIA", - "NORTE DE SANTANDER" - ], - "23807": [ - "TIERRALTA", - "C\u00d3RDOBA" - ], - "27800": [ - "UNGU\u00cdA", - "CHOC\u00d3" - ], - "54498": [ - "OCA\u00d1A", - "NORTE DE SANTANDER" - ], - "5837": [ - "TURBO", - "ANTIOQUIA" - ], - "27006": [ - "ACAND\u00cd", - "CHOC\u00d3" - ], - "5490": [ - "NECOCL\u00cd", - "ANTIOQUIA" - ], - "5051": [ - "ARBOLETES", - "ANTIOQUIA" - ], - "13001": [ - "CARTAGENA DE INDIAS", - "BOL\u00cdVAR" - ], - "20570": [ - "PUEBLO BELLO", - "CESAR" - ], - "20001": [ - "VALLEDUPAR", - "CESAR" - ], - "47053": [ - "ARACATACA", - "MAGDALENA" - ], - "99624": [ - "SANTA ROSAL\u00cdA", - "VICHADA" - ], - "54001": [ - "C\u00daCUTA", - "NORTE DE SANTANDER" - ], - "66170": [ - "DOSQUEBRADAS", - "RISARALDA" - ], - "15491": [ - "NOBSA", - "BOYAC\u00c1" - ], - "15806": [ - "TIBASOSA", - "BOYAC\u00c1" - ], - "76130": [ - "CANDELARIA", - "VALLE DEL CAUCA" - ], - "76147": [ - "CARTAGO", - "VALLE DEL CAUCA" - ], - "85125": [ - "HATO COROZAL", - "CASANARE" - ], - "13650": [ - "SAN FERNANDO", - "BOL\u00cdVAR" - ] - }, - "spanish_country_code_dict": { - "afganist\u00e1n": "AF", - "albania": "AL", - "alemania": "DE", - "andorra": "AD", - "angola": "AO", - "anguila": "AI", - "ant\u00e1rtida": "AQ", - "antigua y barbuda": "AG", - "arabia saud\u00ed": "SA", - "argelia": "DZ", - "argentina": "AR", - "armenia": "AM", - "aruba": "AW", - "australia": "AU", - "austria": "AT", - "azerbaiy\u00e1n": "AZ", - "bahamas": "BS", - "banglad\u00e9s": "BD", - "barbados": "BB", - "bar\u00e9in": "BH", - "b\u00e9lgica": "BE", - "belice": "BZ", - "ben\u00edn": "BJ", - "bermudas": "BM", - "bielorrusia": "BY", - "bolivia": "BO", - "bosnia y herzegovina": "BA", - "botsuana": "BW", - "brasil": "BR", - "brun\u00e9i": "BN", - "bulgaria": "BG", - "burkina faso": "BF", - "burundi": "BI", - "but\u00e1n": "BT", - "cabo verde": "CV", - "camboya": "KH", - "camer\u00fan": "CM", - "canad\u00e1": "CA", - "caribe neerland\u00e9s": "BQ", - "catar": "QA", - "chad": "TD", - "chequia": "CZ", - "chile": "CL", - "china": "CN", - "chipre": "CY", - "ciudad del vaticano": "VA", - "colombia": "CO", - "comoras": "KM", - "congo": "CG", - "corea del norte": "KP", - "corea del sur": "KR", - "costa rica": "CR", - "c\u00f4te d\u2019ivoire": "CI", - "croacia": "HR", - "cuba": "CU", - "curazao": "CW", - "dinamarca": "DK", - "dominica": "DM", - "ecuador": "EC", - "egipto": "EG", - "el salvador": "SV", - "emiratos \u00e1rabes unidos": "AE", - "eritrea": "ER", - "eslovaquia": "SK", - "eslovenia": "SI", - "espa\u00f1a": "ES", - "estados unidos": "US", - "estonia": "EE", - "esuatini": "SZ", - "etiop\u00eda": "ET", - "filipinas": "PH", - "finlandia": "FI", - "fiyi": "FJ", - "francia": "FR", - "gab\u00f3n": "GA", - "gambia": "GM", - "georgia": "GE", - "ghana": "GH", - "gibraltar": "GI", - "granada": "GD", - "grecia": "GR", - "groenlandia": "GL", - "guadalupe": "GP", - "guam": "GU", - "guatemala": "GT", - "guayana francesa": "GF", - "guernsey": "GG", - "guinea": "GN", - "guinea ecuatorial": "GQ", - "guinea-bis\u00e1u": "GW", - "guyana": "GY", - "hait\u00ed": "HT", - "honduras": "HN", - "hungr\u00eda": "HU", - "india": "IN", - "indonesia": "ID", - "irak": "IQ", - "ir\u00e1n": "IR", - "irlanda": "IE", - "isla bouvet": "BV", - "isla de man": "IM", - "isla de navidad": "CX", - "isla norfolk": "NF", - "islandia": "IS", - "islas \u00e5land": "AX", - "islas caim\u00e1n": "KY", - "islas cocos": "CC", - "islas cook": "CK", - "islas feroe": "FO", - "islas georgia del sur y sandwich del sur": "GS", - "islas heard y mcdonald": "HM", - "islas malvinas": "FK", - "islas marianas del norte": "MP", - "islas marshall": "MH", - "islas menores alejadas de ee. uu.": "UM", - "islas pitcairn": "PN", - "islas salom\u00f3n": "SB", - "islas turcas y caicos": "TC", - "islas v\u00edrgenes brit\u00e1nicas": "VG", - "islas v\u00edrgenes de ee. uu.": "VI", - "israel": "IL", - "italia": "IT", - "jamaica": "JM", - "jap\u00f3n": "JP", - "jersey": "JE", - "jordania": "JO", - "kazajist\u00e1n": "KZ", - "kenia": "KE", - "kirguist\u00e1n": "KG", - "kiribati": "KI", - "kuwait": "KW", - "laos": "LA", - "lesoto": "LS", - "letonia": "LV", - "l\u00edbano": "LB", - "liberia": "LR", - "libia": "LY", - "liechtenstein": "LI", - "lituania": "LT", - "luxemburgo": "LU", - "macedonia del norte": "MK", - "madagascar": "MG", - "malasia": "MY", - "malaui": "MW", - "maldivas": "MV", - "mali": "ML", - "malta": "MT", - "marruecos": "MA", - "martinica": "MQ", - "mauricio": "MU", - "mauritania": "MR", - "mayotte": "YT", - "m\u00e9xico": "MX", - "micronesia": "FM", - "moldavia": "MD", - "m\u00f3naco": "MC", - "mongolia": "MN", - "montenegro": "ME", - "montserrat": "MS", - "mozambique": "MZ", - "myanmar (birmania)": "MM", - "namibia": NaN, - "nauru": "NR", - "nepal": "NP", - "nicaragua": "NI", - "n\u00edger": "NE", - "nigeria": "NG", - "niue": "NU", - "noruega": "NO", - "nueva caledonia": "NC", - "nueva zelanda": "NZ", - "om\u00e1n": "OM", - "pa\u00edses bajos": "NL", - "pakist\u00e1n": "PK", - "palaos": "PW", - "panam\u00e1": "PA", - "pap\u00faa nueva guinea": "PG", - "paraguay": "PY", - "per\u00fa": "PE", - "polinesia francesa": "PF", - "polonia": "PL", - "portugal": "PT", - "puerto rico": "PR", - "rae de hong kong (china)": "HK", - "rae de macao (china)": "MO", - "reino unido": "GB", - "rep\u00fablica centroafricana": "CF", - "rep\u00fablica democr\u00e1tica del congo": "CD", - "rep\u00fablica dominicana": "DO", - "reuni\u00f3n": "RE", - "ruanda": "RW", - "ruman\u00eda": "RO", - "rusia": "RU", - "s\u00e1hara occidental": "EH", - "samoa": "WS", - "samoa americana": "AS", - "san bartolom\u00e9": "BL", - "san crist\u00f3bal y nieves": "KN", - "san marino": "SM", - "san mart\u00edn": "MF", - "san pedro y miquel\u00f3n": "PM", - "san vicente y las granadinas": "VC", - "santa elena": "SH", - "santa luc\u00eda": "LC", - "santo tom\u00e9 y pr\u00edncipe": "ST", - "senegal": "SN", - "serbia": "RS", - "seychelles": "SC", - "sierra leona": "SL", - "singapur": "SG", - "sint maarten": "SX", - "siria": "SY", - "somalia": "SO", - "sri lanka": "LK", - "sud\u00e1frica": "ZA", - "sud\u00e1n": "SD", - "sud\u00e1n del sur": "SS", - "suecia": "SE", - "suiza": "CH", - "surinam": "SR", - "svalbard y jan mayen": "SJ", - "tailandia": "TH", - "taiw\u00e1n": "TW", - "tanzania": "TZ", - "tayikist\u00e1n": "TJ", - "territorio brit\u00e1nico del oc\u00e9ano \u00edndico": "IO", - "territorios australes franceses": "TF", - "territorios palestinos": "PS", - "timor-leste": "TL", - "togo": "TG", - "tokelau": "TK", - "tonga": "TO", - "trinidad y tobago": "TT", - "t\u00fanez": "TN", - "turkmenist\u00e1n": "TM", - "turqu\u00eda": "TR", - "tuvalu": "TV", - "ucrania": "UA", - "uganda": "UG", - "uruguay": "UY", - "uzbekist\u00e1n": "UZ", - "vanuatu": "VU", - "venezuela": "VE", - "vietnam": "VN", - "wallis y futuna": "WF", - "yemen": "YE", - "yibuti": "DJ", - "zambia": "ZM", - "zimbabue": "ZW", - "afganistan": "AF", - "antartida": "AQ", - "arabia saudi": "SA", - "azerbaiyan": "AZ", - "banglades": "BD", - "barein": "BH", - "belgica": "BE", - "benin": "BJ", - "brunei": "BN", - "butan": "BT", - "camerun": "CM", - "canada": "CA", - "caribe neerlandes": "BQ", - "cote d'ivoire": "CI", - "emiratos arabes unidos": "AE", - "espana": "ES", - "etiopia": "ET", - "gabon": "GA", - "guinea-bisau": "GW", - "haiti": "HT", - "hungria": "HU", - "iran": "IR", - "islas aland": "AX", - "islas caiman": "KY", - "islas salomon": "SB", - "islas virgenes britanicas": "VG", - "islas virgenes de ee. uu.": "VI", - "japon": "JP", - "kazajistan": "KZ", - "kirguistan": "KG", - "libano": "LB", - "mexico": "MX", - "monaco": "MC", - "niger": "NE", - "oman": "OM", - "paises bajos": "NL", - "pakistan": "PK", - "panama": "PA", - "papua nueva guinea": "PG", - "peru": "PE", - "republica centroafricana": "CF", - "republica democratica del congo": "CD", - "republica dominicana": "DO", - "reunion": "RE", - "rumania": "RO", - "sahara occidental": "EH", - "san bartolome": "BL", - "san cristobal y nieves": "KN", - "san martin": "MF", - "san pedro y miquelon": "PM", - "santa lucia": "LC", - "santo tome y principe": "ST", - "sudafrica": "ZA", - "sudan": "SD", - "sudan del sur": "SS", - "taiwan": "TW", - "tayikistan": "TJ", - "territorio britanico del oceano indico": "IO", - "tunez": "TN", - "turkmenistan": "TM", - "turquia": "TR", - "uzbekistan": "UZ", - "rep\u00fablica \u00e1rabe siria": "SY", - "rep\u00fablica de corea": "KR", - "arabia saudita": "SA", - "belarusia": "BY", - "estados unidos de am\u00e9rica": "US", - "islas v\u00edrgenes de los estados unidos": "VI", - "federaci\u00f3n de rusia": "RU", - "reino unido de gran breta\u00f1a e irlanda del norte": "GB", - "rep\u00fablica docimincana": "DO", - "santa helena": "SH", - "veneuela": "VE", - "kenya": "KE", - "qatar": "QA", - "antillas neerlandesas": "BQ" - } -} diff --git a/ingestion/functions/parsing/colombia/input_event.json b/ingestion/functions/parsing/colombia/input_event.json deleted file mode 100644 index 3d23c9ed9..000000000 --- a/ingestion/functions/parsing/colombia/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "test/colombia/Colombia_Mar17_head5k.csv", - "sourceUrl": "https://www.datos.gov.co/api/views/gt2j-8ykr/rows.csv?accessType=DOWNLOAD", - "sourceId": "60019f21bed728005b7d5cc7" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/colombia/sample_data.csv b/ingestion/functions/parsing/colombia/sample_data.csv deleted file mode 100644 index cdfbf1ac0..000000000 --- a/ingestion/functions/parsing/colombia/sample_data.csv +++ /dev/null @@ -1,21 +0,0 @@ -fecha reporte web,ID de caso,Fecha de notificación,Código DIVIPOLA departamento,Nombre departamento,Código DIVIPOLA municipio,Nombre municipio,Edad,Unidad de medida de edad,Sexo,Tipo de contagio,Ubicación del caso,Estado,Código ISO del país,Nombre del país,Recuperado,Fecha de inicio de síntomas,Fecha de muerte,Fecha de diagnóstico,Fecha de recuperación,Tipo de recuperación,Pertenencia étnica,Nombre del grupo étnico -2020-03-06 00:00:00,1,2020-03-02 00:00:00,11,BOGOTA,11001,BOGOTA,19,1,F,Importado,Casa,Leve,380.0,ITALIA,Recuperado,2020-02-27 00:00:00,,2020-03-06 00:00:00,2020-03-13 00:00:00,PCR,6, -2020-03-09 00:00:00,2,2020-03-06 00:00:00,76,VALLE,76111,BUGA,34,1,M,Importado,Casa,Leve,724.0,ESPAÑA,Recuperado,2020-03-04 00:00:00,,2020-03-09 00:00:00,2020-03-19 00:00:00,PCR,5, -2020-03-09 00:00:00,3,2020-03-07 00:00:00,5,ANTIOQUIA,5001,MEDELLIN,50,1,F,Importado,Casa,Leve,724.0,ESPAÑA,Recuperado,2020-02-29 00:00:00,,2020-03-09 00:00:00,2020-03-15 00:00:00,PCR,6, -2020-03-11 00:00:00,4,2020-03-09 00:00:00,5,ANTIOQUIA,5001,MEDELLIN,55,1,M,Relacionado,Casa,Leve,,,Recuperado,2020-03-06 00:00:00,,2020-03-11 00:00:00,2020-03-26 00:00:00,PCR,6, -2020-03-11 00:00:00,5,2020-03-09 00:00:00,5,ANTIOQUIA,5001,MEDELLIN,25,1,M,Relacionado,Casa,Leve,,,Recuperado,2020-03-08 00:00:00,,2020-03-11 00:00:00,2020-03-23 00:00:00,PCR,6, -2020-03-11 00:00:00,6,2020-03-10 00:00:00,5,ANTIOQUIA,5360,ITAGUI,27,1,F,Relacionado,Casa,Leve,,,Recuperado,2020-03-06 00:00:00,,2020-03-11 00:00:00,2020-03-26 00:00:00,PCR,6, -2020-03-11 00:00:00,7,2020-03-08 00:00:00,13001,CARTAGENA,13001,CARTAGENA,85,1,F,Importado,Casa,Leve,840.0,ESTADOS UNIDOS DE AMÉRICA,Recuperado,2020-03-02 00:00:00,,2020-03-11 00:00:00,2020-03-17 00:00:00,PCR,6, -2020-03-11 00:00:00,8,2020-03-09 00:00:00,11,BOGOTA,11001,BOGOTA,22,1,F,Importado,Casa,Leve,724.0,ESPAÑA,Recuperado,2020-03-06 00:00:00,,2020-03-11 00:00:00,2020-03-21 00:00:00,PCR,6, -2020-03-11 00:00:00,9,2020-03-08 00:00:00,11,BOGOTA,11001,BOGOTA,28,1,F,Importado,Casa,Leve,724.0,ESPAÑA,Recuperado,2020-03-07 00:00:00,,2020-03-11 00:00:00,2020-03-23 00:00:00,PCR,6, -2020-03-12 00:00:00,10,2020-03-12 00:00:00,11,BOGOTA,11001,BOGOTA,36,1,F,Importado,Casa,Leve,724.0,ESPAÑA,Recuperado,2020-03-06 00:00:00,,2020-03-12 00:00:00,2020-03-21 00:00:00,PCR,6, -2020-03-12 00:00:00,11,2020-03-11 00:00:00,11,BOGOTA,11001,BOGOTA,42,1,F,Importado,Casa,Leve,724.0,ESPAÑA,Recuperado,2020-03-06 00:00:00,,2020-03-12 00:00:00,2020-03-31 00:00:00,PCR,6, -2020-03-12 00:00:00,12,2020-03-10 00:00:00,41,HUILA,41001,NEIVA,74,1,F,Importado,Casa,Leve,380.0,ITALIA,Recuperado,2020-03-06 00:00:00,,2020-03-12 00:00:00,2020-04-09 00:00:00,PCR,6, -2020-03-12 00:00:00,13,2020-03-10 00:00:00,41,HUILA,41001,NEIVA,68,1,F,Relacionado,Casa,Leve,,,Recuperado,2020-03-06 00:00:00,,2020-03-12 00:00:00,2020-03-30 00:00:00,PCR,6, -2020-03-13 00:00:00,14,2020-03-10 00:00:00,76,VALLE,76520,PALMIRA,48,1,M,Importado,Casa,Leve,724.0,ESPAÑA,Recuperado,2020-03-07 00:00:00,,2020-03-13 00:00:00,2020-03-21 00:00:00,PCR,5, -2020-03-13 00:00:00,15,2020-03-13 00:00:00,50,META,50001,VILLAVICENCIO,30,1,F,Importado,Casa,Leve,724.0,ESPAÑA,Recuperado,2020-03-09 00:00:00,,2020-03-13 00:00:00,2020-03-23 00:00:00,PCR,6, -2020-03-13 00:00:00,16,2020-03-11 00:00:00,11,BOGOTA,11001,BOGOTA,61,1,F,Importado,Casa,Leve,380.0,ITALIA,Recuperado,2020-03-08 00:00:00,,2020-03-13 00:00:00,2020-03-23 00:00:00,PCR,5, -2020-03-14 00:00:00,17,2020-03-11 00:00:00,11,BOGOTA,11001,BOGOTA,73,1,F,Importado,Casa,Leve,724.0,ESPAÑA,Recuperado,2020-02-28 00:00:00,,2020-03-14 00:00:00,2020-03-14 00:00:00,PCR,6, -2020-03-14 00:00:00,18,2020-03-11 00:00:00,11,BOGOTA,11001,BOGOTA,54,1,M,Importado,Casa,Leve,724.0,ESPAÑA,Recuperado,2020-03-07 00:00:00,,2020-03-14 00:00:00,2020-04-07 00:00:00,Tiempo,6, -2020-03-14 00:00:00,19,2020-03-12 00:00:00,11,BOGOTA,11001,BOGOTA,54,1,F,Relacionado,Casa,Leve,,,Recuperado,2020-03-09 00:00:00,,2020-03-14 00:00:00,2020-03-24 00:00:00,PCR,6, -2020-03-14 00:00:00,20,2020-03-11 00:00:00,5,ANTIOQUIA,5001,MEDELLIN,26,1,F,Relacionado,Casa,Leve,,,Recuperado,2020-03-09 00:00:00,,2020-03-14 00:00:00,2020-03-24 00:00:00,PCR,6, diff --git a/ingestion/functions/parsing/cuba/__init__.py b/ingestion/functions/parsing/cuba/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/cuba/cuba.py b/ingestion/functions/parsing/cuba/cuba.py deleted file mode 100644 index 46d667739..000000000 --- a/ingestion/functions/parsing/cuba/cuba.py +++ /dev/null @@ -1,276 +0,0 @@ -import os -import sys -import csv -import copy -from datetime import datetime -import json -from pathlib import Path -import common.ingestion_logging as logging - -import pycountry - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - -logger = logging.getLogger(__name__) - -_PROVINCES = {} -_MUNICIPALITIES = {} -province_set = set() - -_CU = parsing_lib.geocode_country('CU') - -def _drop_admin2(municipality_location): - "Drops admin2 info and uses same data for province location" - newloc = copy.deepcopy(municipality_location) - newloc['name'] = newloc['administrativeAreaLevel1'] - del newloc['administrativeAreaLevel2'] - newloc['geoResolution'] = "Admin1" - return newloc - -# Geocoding data is from Wikipedia: -# Municipalities of Cuba, -# https://en.wikipedia.org/w/index.php?title=Municipalities_of_Cuba&oldid=1010874027 -# (version as of 21 August 2021) - -with (Path(__file__).parent / 'geocodes.csv').open() as geof: - reader = csv.DictReader(geof) - for r in reader: - province_set.add(r['code_province']) - _MUNICIPALITIES[r['code_municipality']] = { - "name": r['municipality'], - "administrativeAreaLevel1": r['province'], - "administrativeAreaLevel2": r['municipality'], - "country": "Cuba", - "geoResolution": "Admin2", - "geometry": { - "latitude": float(r['latitude']), - "longitude": float(r['longitude']) - } - } - if r['province'] == r['municipality']: - # Add to province map in case municipality doesn't exist - _PROVINCES[r['code_province']] = { - "name": r['province'], - "administrativeAreaLevel1": r['province'], - "country": "Cuba", - "geoResolution": "Admin1", - "geometry": { - "latitude": float(r['latitude']), - "longitude": float(r['longitude']) - } - } - - # For provinces without municipalities having the same name - # assign the .01 municipality geocode to the province - # As an example Villa Clara (26) will get assigned the - # geocode of Corralillo (26.01) - for p in province_set - set(_PROVINCES.keys()): - _PROVINCES[p] = _drop_admin2(_MUNICIPALITIES[p + '.01']) - - -def convert_date(raw_date, dataserver=True): - """ - Convert raw date field into a value interpretable by the dataserver. - Dates are listed in YYYY/mm/dd format - """ - try: - date = datetime.strptime(raw_date, "%Y/%m/%d") - if not dataserver: - return date.strftime("%m/%d/%Y") - return date.strftime("%m/%d/%YZ") - except BaseException: - pass - - -def convert_gender(raw_gender): - if raw_gender == "hombre": - return "Male" - if raw_gender == "mujer": - return "Female" - - -def convert_location(raw_entry): - code_municipality = raw_entry.get('dpacode_municipio_deteccion', None) - code_province = raw_entry.get('dpacode_provincia_deteccion', None) - try: - if code_municipality != "00.00": - return _MUNICIPALITIES[code_municipality] - if code_province != "00": - return _PROVINCES[code_province] - return _CU - except KeyError: - logger.error(f"Location not found: {raw_entry}") - return None - - -def convert_nationality(two_letter_country_code): - if two_letter_country_code == 'cu': - return "Cuban" - else: - try: - return pycountry.countries.get( - alpha_2=two_letter_country_code).name - except BaseException: - pass - - -def convert_demographics(raw_entry, case_keys): - demo = {} - if 'edad' in case_keys and raw_entry['edad']: - demo["ageRange"] = { - "start": float( - raw_entry["edad"]), - "end": float( - raw_entry["edad"])} - if 'sexo' in case_keys and raw_entry['sexo']: - demo["gender"] = convert_gender( - raw_entry["sexo"]) - if 'pais' in case_keys and raw_entry['pais']: - demo["nationalities"] = [convert_nationality(raw_entry['pais'])] - - return demo or None - - -def parse_cases(raw_data_file, source_id, source_url): - """ - Parses G.h-format case data from raw API data. - - Nationality of case is provided in two letter country codes, so using pycountry package to parse these - - The field 'posible_procedencia_contagio' is generally populated by two letter country codes. Case is assumed to have travelled - from one of these countries in last 30 days if populated. - - Diagnostic centre and treatment hospital are both included in notes for now, could be geocoded in future. - - Currently no parsing of symptoms, as field is always left empty - worth rechecking this in future in case this field - becomes populated. No disease outcome data is provided either. - - """ - with open(raw_data_file, "r") as f: - json_data = json.load(f) - # First make dict mapping code names of diagnostic and treament centers - # to actual locations - hospital_map = {} - try: - for centre_type in ['centros_aislamiento', 'centros_diagnostico']: - for centre in json_data[centre_type]: - hospital_map[centre] = json_data[centre_type][centre]['nombre'] + \ - ", " + json_data[centre_type][centre]['provincia'] - except KeyError: - logger.error(f"KeyError in Cuba parser") - - # Get schema_version - try: - schema_version = json_data['schema-version'] - if schema_version != 7: - logger.warning( - f'Schema version has been updated from 7 to {schema_version}') - except: - schema_version = "(undef)" - - for day in json_data['casos']['dias']: - if 'diagnosticados' in json_data['casos']['dias'][day]: - fecha = json_data['casos']['dias'][day]['fecha'] - for entry in json_data['casos']['dias'][day]['diagnosticados']: - case_keys = entry.keys() - notes = [] - if 'id' in entry: - case = { - "caseReference": { - "sourceId": source_id, - "sourceEntryId": entry["id"], - "sourceUrl": source_url}, - "location": convert_location(entry), - "events": [ - { - "name": "confirmed", - "dateRange": { - "start": convert_date(fecha), - "end": convert_date(fecha)}}]} - - case["demographics"] = convert_demographics( - entry, case_keys) - - if entry.get("consulta_medico", ""): - case["events"].append({ - "name": "firstClinicalConsultation", - "dateRange": { - "start": convert_date(entry["consulta_medico"]), - "end": convert_date(entry["consulta_medico"]) - }} - ) - - if entry.get('posible_procedencia_contagio', ""): - if 'crucero' in entry['posible_procedencia_contagio']: - case["transmission"] = { - "places": "Cruise Ship"} - - elif len(entry['posible_procedencia_contagio'][0]) == 2: - case["travelHistory"] = { - "traveledPrior30Days": True, - "travel": [] - } - for two_letter_country_code in entry['posible_procedencia_contagio']: - if len(two_letter_country_code) != 2: - continue - if pycountry.countries.get( - alpha_2=two_letter_country_code): - country = pycountry.countries.get( - alpha_2=two_letter_country_code).name - case["travelHistory"]["travel"].append({ - "location": parsing_lib.geocode_country(two_letter_country_code) - }) - if arrival_date := entry.get('arribo_a_cuba_foco', ""): - notes.append( - f"Case arrived in Cuba from {country} on {convert_date(arrival_date)}") - - if entry.get('contagio', "") == 'introducido': - notes.append( - "Case was transmitted from another confirmed case within Cuba.") - elif entry.get('contagio', "") == 'importado': - notes.append( - "Case was contracted abroad and brought into Cuba.") - - if '-1' in entry['id']: - notes.append( - "First patient from this country in Cuba.") - - if entry.get("centro_diagnostico", ""): - notes.append( - f"Case diagnostic test was performed at {hospital_map.get(entry['centro_diagnostico'],'Unknown Centre')}.") - if entry.get("centro_aislamiento", ""): - notes.append( - f"Case was treated at {hospital_map.get(entry['centro_aislamiento'],'Unknown Hospital')}.") - - if entry.get("contacto_focal", ""): - notes.append( - f"A further {entry['contacto_focal']} people who this case was in contact with are being monitored for symptoms") - - if 'info' in case_keys and entry['info']: - notes.append( - f"Notes provided are as follows: \n {entry['info']}") - - notes.append(f'Using schema version {schema_version}') - - case["notes"] = ",".join(notes) - - yield case - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/cuba/cuba_test.py b/ingestion/functions/parsing/cuba/cuba_test.py deleted file mode 100644 index 4ddcd64cd..000000000 --- a/ingestion/functions/parsing/cuba/cuba_test.py +++ /dev/null @@ -1,80 +0,0 @@ -import os -import unittest -from datetime import date -from cuba import cuba - - -_SOURCE_ID = "placeholder_ID" -_SOURCE_URL = "placeholder_URL" -_TRINIDAD = { - "name": "Trinidad", - "administrativeAreaLevel1": "Sancti Spíritus", - "administrativeAreaLevel2": "Trinidad", - "country": "Cuba", - "geoResolution": "Admin2", - "geometry": { - "latitude": 21.80444, - "longitude": -79.98278 - } -} -_ITALY = { - "name": "Italy", - "country": "IT", - "geoResolution": "Country", - "geometry": {"latitude": 41.87194, "longitude": 12.56738} -} - -class CubaTest(unittest.TestCase): - def setUp(self): - self.maxDiff = 15000 - - def test_parse(self): - ''' - Includes imported and internally transmitted cases - ''' - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.json") - result = cuba.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), - [{'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': 'it-1', - 'sourceUrl': 'placeholder_URL'}, - 'location': _TRINIDAD, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '03/11/2020Z', 'end': '03/11/2020Z'}}, - {'name': 'firstClinicalConsultation', - 'dateRange': {'start': '03/10/2020Z', 'end': '03/10/2020Z'}}], - 'demographics': {'ageRange': {'start': 61.0, 'end': 61.0}, - 'gender': 'Male', - 'nationalities': ['Italy']}, - 'travelHistory': {'traveledPrior30Days': True, - 'travel': [{'location': _ITALY}]}, - 'notes': "Case arrived in Cuba from Italy on 03/10/2020Z,Case was contracted abroad and brought into Cuba.,First patient from this country in Cuba.,Case diagnostic test was performed at Instituto de Medicina Tropical 'Pedro Kourí', La Habana.,Case was treated at Instituto de Medicina Tropical 'Pedro Kourí', La Habana.,Notes provided are as follows: \n Hoy 11 de marzo de 2020 el Laboratorio Nacional de Referencia del IPK, informa que tres de los cuatro turistas aislados desde el día de ayer resultaron positivos al Nuevo Coronavirus SARS CoV-2. Procedentes de la región italiana de Lombardía con sintomatología respiratoria, se encontraban hospedados en un hostal en la ciudad de Trinidad, provincia Sancti Spíritus, y que habían arribado por el aeropuerto internacional “José Martí” de La Habana en días recientes. De forma inmediata fueron ingresados en el Instituto de Medicina Tropical Pedro Kourí,Using schema version 7"}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': 'it-2', - 'sourceUrl': 'placeholder_URL'}, - 'location': _TRINIDAD, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '03/11/2020Z', 'end': '03/11/2020Z'}}, - {'name': 'firstClinicalConsultation', - 'dateRange': {'start': '03/10/2020Z', 'end': '03/10/2020Z'}}], - 'demographics': {'ageRange': {'start': 57.0, 'end': 57.0}, - 'gender': 'Female', - 'nationalities': ['Italy']}, - 'travelHistory': {'traveledPrior30Days': True, - 'travel': [{'location': _ITALY}]}, - 'notes': "Case arrived in Cuba from Italy on 03/10/2020Z,Case was contracted abroad and brought into Cuba.,Case diagnostic test was performed at Instituto de Medicina Tropical 'Pedro Kourí', La Habana.,Case was treated at Instituto de Medicina Tropical 'Pedro Kourí', La Habana.,Notes provided are as follows: \n Hoy 11 de marzo de 2020 el Laboratorio Nacional de Referencia del IPK, informa que tres de los cuatro turistas aislados desde el día de ayer resultaron positivos al Nuevo Coronavirus SARS CoV-2. Procedentes de la región italiana de Lombardía con sintomatología respiratoria, se encontraban hospedados en un hostal en la ciudad de Trinidad, provincia Sancti Spíritus, y que habían arribado por el aeropuerto internacional “José Martí” de La Habana en días recientes. De forma inmediata fueron ingresados en el Instituto de Medicina Tropical Pedro Kourí,Using schema version 7"}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': 'it-3', - 'sourceUrl': 'placeholder_URL'}, - 'location': _TRINIDAD, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '03/11/2020Z', 'end': '03/11/2020Z'}}, - {'name': 'firstClinicalConsultation', - 'dateRange': {'start': '03/10/2020Z', 'end': '03/10/2020Z'}}], - 'demographics': {'ageRange': {'start': 60.0, 'end': 60.0}, - 'gender': 'Female', - 'nationalities': ['Italy']}, - 'travelHistory': {'traveledPrior30Days': True, - 'travel': [{'location': _ITALY}]}, - 'notes': "Case arrived in Cuba from Italy on 03/10/2020Z,Case was contracted abroad and brought into Cuba.,Case diagnostic test was performed at Instituto de Medicina Tropical 'Pedro Kourí', La Habana.,Case was treated at Instituto de Medicina Tropical 'Pedro Kourí', La Habana.,A further 5 people who this case was in contact with are being monitored for symptoms,Notes provided are as follows: \n Hoy 11 de marzo de 2020 el Laboratorio Nacional de Referencia del IPK, informa que tres de los cuatro turistas aislados desde el día de ayer resultaron positivos al Nuevo Coronavirus SARS CoV-2. Procedentes de la región italiana de Lombardía con sintomatología respiratoria, se encontraban hospedados en un hostal en la ciudad de Trinidad, provincia Sancti Spíritus, y que habían arribado por el aeropuerto internacional “José Martí” de La Habana en días recientes. De forma inmediata fueron ingresados en el Instituto de Medicina Tropical Pedro Kourí,Using schema version 7"}]) diff --git a/ingestion/functions/parsing/cuba/geocodes.csv b/ingestion/functions/parsing/cuba/geocodes.csv deleted file mode 100644 index 8d1e7b398..000000000 --- a/ingestion/functions/parsing/cuba/geocodes.csv +++ /dev/null @@ -1,169 +0,0 @@ -code_province,code_municipality,province,municipality,latitude,longitude -22,22.08,Artemisa,Alquízar,22.80667,-82.58278 -22,22.09,Artemisa,Artemisa,22.81361,-82.76333 -22,22.01,Artemisa,Bahía Honda,22.90639,-83.16361 -22,22.05,Artemisa,Bauta,22.99194,-82.54917 -22,22.04,Artemisa,Caimito,22.95778,-82.59639 -22,22.10,Artemisa,Candelaria,22.74444,-82.96583 -22,22.03,Artemisa,Guanajay,22.93056,-82.68778 -22,22.07,Artemisa,Güira de Melena,22.80222,-82.50472 -22,22.02,Artemisa,Mariel,22.99389,-82.75389 -22,22.06,Artemisa,San Antonio de los Baños,22.88889,-82.49861 -22,22.11,Artemisa,San Cristóbal,22.71694,-83.05111 -30,30.08,Camagüey,Camagüey,21.38389,-77.90722 -30,30.01,Camagüey,Carlos Manuel de Céspedes,21.57694,-78.2775 -30,30.02,Camagüey,Esmeralda,21.85611,-78.11111 -30,30.09,Camagüey,Florida,21.52944,-78.2225 -30,30.06,Camagüey,Guáimaro,21.05889,-77.34778 -30,30.11,Camagüey,Jimaguayú,21.26667,-77.83028 -30,30.04,Camagüey,Minas,21.48944,-77.60472 -30,30.12,Camagüey,Najasa,21.08389,-77.74694 -30,30.05,Camagüey,Nuevitas,21.54028,-77.26444 -30,30.13,Camagüey,Santa Cruz del Sur,20.71944,-77.99083 -30,30.07,Camagüey,Sibanicú,21.23917,-77.52083 -30,30.03,Camagüey,Sierra de Cubitas,21.73306,-77.77056 -30,30.10,Camagüey,Vertientes,21.25722,-78.14889 -29,29.10,Ciego de Ávila,Baraguá,21.68222,-78.62444 -29,29.03,Ciego de Ávila,Bolivia,22.075,-78.35028 -29,29.01,Ciego de Ávila,Chambas,22.19667,-78.91306 -29,29.08,Ciego de Ávila,Ciego de Ávila,21.84806,-78.76278 -29,29.05,Ciego de Ávila,Ciro Redondo,22.01889,-78.70278 -29,29.06,Ciego de Ávila,Florencia,22.1475,-78.96694 -29,29.07,Ciego de Ávila,Majagua,21.92444,-78.99056 -29,29.02,Ciego de Ávila,Morón,22.11083,-78.62778 -29,29.04,Ciego de Ávila,Primero de Enero,21.94528,-78.41889 -29,29.09,Ciego de Ávila,Venezuela,21.75111,-78.77889 -27,27.08,Cienfuegos,Abreus,22.28056,-80.56778 -27,27.01,Cienfuegos,Aguada de Pasajeros,22.38472,-80.84611 -27,27.07,Cienfuegos,Cienfuegos,22.14583,-80.43639 -27,27.05,Cienfuegos,Cruces,22.34222,-80.27611 -27,27.06,Cienfuegos,Cumanayagua,22.1525,-80.20111 -27,27.04,Cienfuegos,Lajas,22.41639,-80.29056 -27,27.03,Cienfuegos,Palmira,22.24444,-80.39417 -27,27.02,Cienfuegos,Rodas,22.34278,-80.55528 -33,33.11,Granma,Bartolomé Masó,20.16861,-76.9425 -33,33.04,Granma,Bayamo,20.38167,-76.6425 -33,33.12,Granma,Buey Arriba,20.17361,-76.74917 -33,33.07,Granma,Campechuela,20.23333,-77.27889 -33,33.02,Granma,Cauto Cristo,20.56222,-76.46944 -33,33.13,Granma,Guisa,20.26111,-76.53806 -33,33.03,Granma,Jiguaní,20.37333,-76.42222 -33,33.06,Granma,Manzanillo,20.33972,-77.10861 -33,33.08,Granma,Media Luna,20.14444,-77.43611 -33,33.09,Granma,Niquero,20.04722,-77.57806 -33,33.10,Granma,Pilón,19.90556,-77.32083 -33,33.01,Granma,Río Cauto,20.56389,-76.91722 -33,33.05,Granma,Yara,20.27694,-76.94694 -35,35.04,Guantánamo,Baracoa,20.35056,-74.51028 -35,35.08,Guantánamo,Caimanera,19.995,-75.15972 -35,35.01,Guantánamo,El Salvador,20.20972,-75.22278 -35,35.09,Guantánamo,Guantánamo,20.13694,-75.21389 -35,35.06,Guantánamo,Imías,20.07694,-74.65167 -35,35.05,Guantánamo,Maisí,20.24333,-74.15583 -35,35.02,Guantánamo,Manuel Tames,20.18056,-75.05139 -35,35.10,Guantánamo,Niceto Pérez,20.12778,-75.34194 -35,35.07,Guantánamo,San Antonio del Sur,20.05694,-74.80778 -35,35.03,Guantánamo,Yateras,20.35028,-74.92417 -23,23.14,La Habana,Arroyo Naranjo,23.04361,-82.33278 -23,23.13,La Habana,Boyeros,23.00722,-82.40167 -23,23.03,La Habana,Centro Habana,23.13333,-82.38333 -23,23.10,La Habana,Cerro,23.11361,-82.36333 -23,23.15,La Habana,Cotorro,23.02611,-82.2475 -23,23.09,La Habana,Diez de Octubre,23.08806,-82.35972 -23,23.07,La Habana,Guanabacoa,23.06111,-82.28972 -23,23.06,La Habana,Habana del Este,23.15694,-82.29694 -23,23.04,La Habana,La Habana Vieja,23.13889,-82.35556 -23,23.12,La Habana,La Lisa,23.02472,-82.46306 -23,23.11,La Habana,Marianao,23.08417,-82.42972 -23,23.01,La Habana,Playa,23.09417,-82.44889 -23,23.02,La Habana,Plaza de la Revolución,23.12444,-82.38611 -23,23.05,La Habana,Regla,23.12556,-82.31528 -23,23.08,La Habana,San Miguel del Padrón,23.09639,-82.32667 -32,32.04,Holguín,Antilla,20.84861,-75.7525 -32,32.05,Holguín,Báguanos,20.76306,-76.02944 -32,32.03,Holguín,Banes,20.97,-75.71139 -32,32.08,Holguín,Cacocum,20.74389,-76.32417 -32,32.07,Holguín,Calixto García,20.85417,-76.60194 -32,32.10,Holguín,Cueto,20.64833,-75.93167 -32,32.12,Holguín,Frank País,20.66472,-75.28139 -32,32.01,Holguín,Gibara,21.10722,-76.13667 -32,32.06,Holguín,Holguín,20.88889,-76.25722 -32,32.11,Holguín,Mayarí,20.65944,-75.67778 -32,32.14,Holguín,Moa,20.64,-74.9175 -32,32.02,Holguín,Rafael Freyre,21.02833,-75.99639 -32,32.13,Holguín,Sagua de Tánamo,20.58611,-75.24167 -32,32.09,Holguín,Urbano Noris,20.60139,-76.1325 -40,40.01,Isla de la Juventud,Isla de la Juventud,21.88472,-82.86583 -31,31.08,Las Tunas,Amancio,20.81972,-77.58417 -31,31.07,Las Tunas,Colombia,20.99083,-77.41583 -31,31.03,Las Tunas,Jesús Menéndez,21.16361,-76.47722 -31,31.06,Las Tunas,Jobabo,20.90806,-77.28306 -31,31.05,Las Tunas,Las Tunas,20.96,-76.95444 -31,31.04,Las Tunas,Majibacoa,20.91722,-76.87611 -31,31.01,Las Tunas,Manatí,21.31472,-76.9375 -31,31.02,Las Tunas,Puerto Padre,21.19528,-76.60139 -25,25.12,Matanzas,Calimete,22.53389,-80.90972 -25,25.02,Matanzas,Cárdenas,23.04278,-81.20361 -25,25.10,Matanzas,Cienaga de Zapata,22.28806,-81.1975 -25,25.04,Matanzas,Colón,22.7225,-80.90639 -25,25.11,Matanzas,Jagüey Grande,22.52944,-81.1325 -25,25.06,Matanzas,Jovellanos,22.81056,-81.19778 -25,25.08,Matanzas,Limonar,22.95611,-81.40861 -25,25.13,Matanzas,Los Arabos,22.74,-80.71583 -25,25.03,Matanzas,Martí,22.9525,-80.91667 -25,25.01,Matanzas,Matanzas,23.05139,-81.575 -25,25.07,Matanzas,Pedro Betancourt,22.73056,-81.29083 -25,25.05,Matanzas,Perico,22.77528,-81.015 -25,25.09,Matanzas,Unión de Reyes,22.80056,-81.53694 -24,24.10,Mayabeque,Batabanó,22.72472,-82.28972 -24,24.01,Mayabeque,Bejucal,22.93278,-82.38694 -24,24.08,Mayabeque,Güines,22.84778,-82.02361 -24,24.03,Mayabeque,Jaruco,23.04278,-82.00917 -24,24.05,Mayabeque,Madruga,22.91639,-81.85694 -24,24.09,Mayabeque,Melena del Sur,22.78167,-82.14833 -24,24.06,Mayabeque,Nueva Paz,22.76333,-81.75806 -24,24.11,Mayabeque,Quivicán,22.82472,-82.35583 -24,24.02,Mayabeque,San José de las Lajas,22.96806,-82.15583 -24,24.07,Mayabeque,San Nicolás,22.78194,-81.90667 -24,24.04,Mayabeque,Santa Cruz del Norte,23.15583,-81.92639 -21,21.07,Pinar del Río,Consolación del Sur,22.5,-83.51528 -21,21.11,Pinar del Río,Guane,22.20056,-84.08361 -21,21.05,Pinar del Río,La Palma,22.75611,-83.55333 -21,21.06,Pinar del Río,Los Palacios,22.5825,-83.24889 -21,21.02,Pinar del Río,Mantua,22.29083,-84.28722 -21,21.03,Pinar del Río,Minas de Matahambre,22.5825,-83.94917 -21,21.08,Pinar del Río,Pinar del Río,22.42583,-83.68833 -21,21.10,Pinar del Río,San Juan y Martínez,22.26667,-83.83389 -21,21.09,Pinar del Río,San Luis,22.28306,-83.76778 -21,21.01,Pinar del Río,Sandino,22.08111,-84.22167 -21,21.04,Pinar del Río,Viñales,22.61528,-83.71583 -28,28.04,Sancti Spíritus,Cabaiguán,22.08389,-79.49528 -28,28.05,Sancti Spíritus,Fomento,22.10528,-79.72 -28,28.02,Sancti Spíritus,Jatibonico,21.94639,-79.1675 -28,28.08,Sancti Spíritus,La Sierpe,21.76083,-79.24333 -28,28.07,Sancti Spíritus,Sancti Spíritus,21.93417,-79.44361 -28,28.03,Sancti Spíritus,Taguasco,22.00528,-79.265 -28,28.06,Sancti Spíritus,Trinidad,21.80444,-79.98278 -28,28.01,Sancti Spíritus,Yaguajay,22.33056,-79.23694 -34,34.01,Santiago de Cuba,Contramaestre,20.3,-76.25056 -34,34.09,Santiago de Cuba,Guamá,19.95361,-76.74944 -34,34.02,Santiago de Cuba,Mella,20.36944,-75.91083 -34,34.07,Santiago de Cuba,Palma Soriano,20.21417,-75.99167 -34,34.03,Santiago de Cuba,San Luis,20.18806,-75.84861 -34,34.06,Santiago de Cuba,Santiago de Cuba,20.04028,-75.81472 -34,34.04,Santiago de Cuba,Segundo Frente,20.41194,-75.52861 -34,34.05,Santiago de Cuba,Songo La Maya,20.17333,-75.64611 -34,34.08,Santiago de Cuba,Tercer Frente,20.17194,-76.32722 -26,26.06,Villa Clara,Caibarién,22.51583,-79.47222 -26,26.05,Villa Clara,Camajuaní,22.46806,-79.72361 -26,26.10,Villa Clara,Cifuentes,22.62083,-80.06583 -26,26.01,Villa Clara,Corralillo,22.98583,-80.58278 -26,26.04,Villa Clara,Encrucijada,22.61722,-79.86611 -26,26.13,Villa Clara,Manicaragua,22.15028,-79.97611 -26,26.08,Villa Clara,Placetas,22.31611,-79.65528 -26,26.02,Villa Clara,Quemado de Güines,22.79,-80.25583 -26,26.12,Villa Clara,Ranchuelo,22.33611,-80.11278 -26,26.07,Villa Clara,Remedios,22.49222,-79.54556 -26,26.03,Villa Clara,Sagua La Grande,22.80889,-80.07083 -26,26.09,Villa Clara,Santa Clara,22.40556,-79.95389 -26,26.11,Villa Clara,Santo Domingo,22.58361,-80.23833 diff --git a/ingestion/functions/parsing/cuba/input_event.json b/ingestion/functions/parsing/cuba/input_event.json deleted file mode 100644 index 50f675bd9..000000000 --- a/ingestion/functions/parsing/cuba/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "test/cuba/test_content.json", - "sourceUrl": "https://covid19cubadata.github.io/data/covid19-cuba.json", - "sourceId": "602e2b2d9ffe9d0039e92063" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/cuba/sample_data.json b/ingestion/functions/parsing/cuba/sample_data.json deleted file mode 100644 index c1569e3c2..000000000 --- a/ingestion/functions/parsing/cuba/sample_data.json +++ /dev/null @@ -1,244 +0,0 @@ -{ - "schema-version": 7, - "note-text": "Por un error de codificaci\u00f3n el mes de la fecha es incorrecto pues deber\u00eda decir julio. Esto ser\u00e1 subsanado en la pr\u00f3xima versi\u00f3n.", - "centros_aislamiento": { - "hal": { - "id": "hsa", - "nombre": "Hospital 'Salvador Allende'", - "provincia": "La Habana", - "dpacode_provincia": "23"}, - "ipk": { - "id": "ipk", - "nombre": "Instituto de Medicina Tropical 'Pedro Kour\u00ed'", - "provincia": "La Habana", - "dpacode_provincia": "23"}, - "has": { - "id": "has", - "nombre": "Hospital 'Amalia Simoni'", - "provincia": "Camag\u00fcey", - "dpacode_provincia": "30"}, - "hmf": { - "id": "hmf", - "nombre": "Hospital 'Manuel Piti Fajardo'", - "provincia": "Villa Clara", - "dpacode_provincia": "26"}, - "cvc": { - "id": "cvc", - "nombre": "Centro de Aislamiento 'La Granjita''", - "provincia": "Villa Clara", - "dpacode_provincia": "26"}, - "cho": { - "id": "cho", - "nombre": "Cl\u00ednica Internacional 'El Cocal'", - "provincia": "Holgu\u00edn", - "dpacode_provincia": "32"}, - "csc": { - "id": "csa", - "nombre": "Centro de Aislamiento Villa Colibr\u00ed", - "provincia": "Santiago de Cuba", - "dpacode_provincia": "34"}, - "cpr": { - "id": "csa", - "nombre": "Centro de Aislamiento de Pinar del R\u00edo", - "provincia": "Pinar del R\u00edo", - "dpacode_provincia": "21"}, - "hmm": { - "id": "hmm", - "nombre": "Hospital 'Dr. Mario Mu\u00f1oz'", - "provincia": "Matanzas", - "dpacode_provincia": "25"}, - "hld": { - "id": "hld", - "nombre": "Hospital 'Luis D\u00edaz Soto'", - "provincia": "La Habana", - "dpacode_provincia": "23"}, - "hjc": { - "id": "hjc", - "nombre": "Hospital 'Joaqu\u00edn Castillo Duany'", - "provincia": "Santiago de Cuba", - "dpacode_provincia": "34"}, - "hag": { - "id": "hag", - "nombre": "Hospital 'Ambrosio Grillo'", - "provincia": "Santiago de Cuba", - "dpacode_provincia": "34"}, - "hlc": { - "id": "hlc", - "nombre": "Hospital 'Le\u00f3n Cuervo'", - "provincia": "Pinar del R\u00edo", - "dpacode_provincia": "21"}, - "hfp": { - "id": "hfp", - "nombre": "Hospital 'Faustino P\u00e9rez'", - "provincia": "Matanzas", - "dpacode_provincia": "25"}, - "hrf": { - "id": "hrf", - "nombre": "Hospital de Rehabilitaci\u00f3n 'Faustino P\u00e9rez'", - "provincia": "Sancti Sp\u00edritus", - "dpacode_provincia": "28"}, - "hdo": { - "id": "hdo", - "nombre": "Hospital Cl\u00ednico Quir\u00fargico de Diez de Octubre", - "provincia": "La Habana", - "dpacode_provincia": "23"}, - "hfv": { - "id": "hfv", - "nombre": "Hospital 'Ferm\u00edn Vald\u00e9s Dom\u00ednguez'", - "provincia": "Holgu\u00edn", - "dpacode_provincia": "32"}, - "cnv": { - "id": "cnv", - "nombre": "Centro de Aislamiento 'Nguyen Van Troi'", - "provincia": "Ciego de \u00c1vila", - "dpacode_provincia": "29"}, - "hoc": { - "id": "cnv", - "nombre": "Hospital 'Octavio de la Concepci\u00f3n y de la Pedraja'", - "provincia": "Camag\u00fcey", - "dpacode_provincia": "30"}, - "ham": { - "id": "ham", - "nombre": "Hospital 'Amalia Simoni'", - "provincia": "Camag\u00fcey", - "dpacode_provincia": "30"}, - "hhb": { - "id": "hhb", - "nombre": "Hospital 'H\u00e9roes del Baire'", - "provincia": "Isla de la Juventud", - "dpacode_provincia": "40.01"}, - "crm": { - "id": "crm", - "nombre": "Regi\u00f3n Militar de Pinar del R\u00edo", - "provincia": "Pinar del R\u00edo", - "dpacode_provincia": "21"}, - "cas": { - "id": "cas", - "nombre": "Hospital 'Antonio Jos\u00e9 de Sucre'", - "provincia": "Matanzas", - "dpacode_provincia": "25"}, - "cmj": { - "id": "cas", - "nombre": "Motel 'Jamaica'", - "provincia": "Mayabeque", - "dpacode_provincia": "24"}, - "cmc": { - "id": "cmc", - "nombre": "Motel 'Canimao'", - "provincia": "Matanzas", - "dpacode_provincia": "25"}, - "cme": { - "id": "cme", - "nombre": "Motel 'EPAS'", - "provincia": "Matanzas", - "dpacode_provincia": "25"}, - "cac": { - "id": "cac", - "nombre": "Villa 'Perla Az\u00facar'", - "provincia": "Cienfuegos", - "dpacode_provincia": "27"}, - "cpc": { - "id": "cpc", - "nombre": "Centro de Aislamiento 'Punta Cuevas'", - "provincia": "Cienfuegos", - "dpacode_provincia": "27"}, - "cco": { - "id": "cco", - "nombre": "Motel 'Cornito'", - "provincia": "Las Tunas", - "dpacode_provincia": "31"}, - "ccu": { - "id": "ccu", - "nombre": "Villa Cautillo", - "provincia": "Granma", - "dpacode_provincia": "33"}, - "cso": { - "id": "cso", - "nombre": "Cl\u00ednica Internacional 'Colibr\u00ed'", - "provincia": "Santiago de Cuba", - "dpacode_provincia": "34"}, - "cvl": { - "id": "cvl", - "nombre": "Villa Lupe", - "provincia": "Guant\u00e1namo", - "dpacode_provincia": "35"}}, - "centros_diagnostico": { - "ipk": { - "id": "ipk", - "nombre": "Instituto de Medicina Tropical 'Pedro Kour\u00ed'", - "provincia": "La Habana", - "dpacode_provincia": "23"}, - "lvc": { - "id": "lvc", - "nombre": "Laboratorio del Centro Provincial de Higiene Epidemiolog\u00eda y Microbiolog\u00eda de Villa Clara", - "provincia": "Villa Clara", - "dpacode_provincia": "26"}, - "lsc": { - "id": "lsc", - "nombre": "Laboratorio de biolog\u00eda molecular del Centro Provincial de Higiene Epidemiolog\u00eda y Microbiolog\u00eda de Santiago de Cuba", - "provincia": "Santiago de Cuba", - "dpacode_provincia": "34"}}, - "casos": { - "dias": { - "1": { - "fecha": "2020/03/11", - "diagnosticados": [ - { - "id": "it-1", - "pais": "it", - "edad": 61, - "sexo": "hombre", - "arribo_a_cuba_foco": "2020/03/10", - "consulta_medico": "2020/03/10", - "municipio_detecci\u00f3n": "Trinidad", - "provincia_detecci\u00f3n": "Sancti Sp\u00edritus", - "dpacode_municipio_deteccion": "28.06", - "dpacode_provincia_deteccion": "28", - "contagio": "importado", - "contacto_focal": null, - "centro_aislamiento": "ipk", - "centro_diagnostico": "ipk", - "posible_procedencia_contagio": ["it"], - "info": "Hoy 11 de marzo de 2020 el Laboratorio Nacional de Referencia del IPK, informa que tres de los cuatro turistas aislados desde el d\u00eda de ayer resultaron positivos al Nuevo Coronavirus SARS CoV-2. Procedentes de la regi\u00f3n italiana de Lombard\u00eda con sintomatolog\u00eda respiratoria, se encontraban hospedados en un hostal en la ciudad de Trinidad, provincia Sancti Sp\u00edritus, y que hab\u00edan arribado por el aeropuerto internacional \u201cJos\u00e9 Mart\u00ed\u201d de La Habana en d\u00edas recientes. De forma inmediata fueron ingresados en el Instituto de Medicina Tropical Pedro Kour\u00ed", - "provincias_visitadas": [], - "dpacode_provincias_visitadas": []}, - { - "id": "it-2", - "pais": "it", - "edad": 57, - "sexo": "mujer", - "arribo_a_cuba_foco": "2020/03/10", - "consulta_medico": "2020/03/10", - "municipio_detecci\u00f3n": "Trinidad", - "provincia_detecci\u00f3n": "Sancti Sp\u00edritus", - "dpacode_municipio_deteccion": "28.06", - "dpacode_provincia_deteccion": "28", - "contagio": "importado", - "contacto_focal": null, - "centro_aislamiento": "ipk", - "centro_diagnostico": "ipk", - "posible_procedencia_contagio": ["it"], - "info": "Hoy 11 de marzo de 2020 el Laboratorio Nacional de Referencia del IPK, informa que tres de los cuatro turistas aislados desde el d\u00eda de ayer resultaron positivos al Nuevo Coronavirus SARS CoV-2. Procedentes de la regi\u00f3n italiana de Lombard\u00eda con sintomatolog\u00eda respiratoria, se encontraban hospedados en un hostal en la ciudad de Trinidad, provincia Sancti Sp\u00edritus, y que hab\u00edan arribado por el aeropuerto internacional \u201cJos\u00e9 Mart\u00ed\u201d de La Habana en d\u00edas recientes. De forma inmediata fueron ingresados en el Instituto de Medicina Tropical Pedro Kour\u00ed", - "provincias_visitadas": [], - "dpacode_provincias_visitadas": []}, - { - "id": "it-3", - "pais": "it", - "edad": 60, - "sexo": "mujer", - "arribo_a_cuba_foco": "2020/03/10", - "consulta_medico": "2020/03/10", - "municipio_detecci\u00f3n": "Trinidad", - "provincia_detecci\u00f3n": "Sancti Sp\u00edritus", - "dpacode_municipio_deteccion": "28.06", - "dpacode_provincia_deteccion": "28", - "contagio": "importado", - "contacto_focal": 5, - "centro_aislamiento": "ipk", - "centro_diagnostico": "ipk", - "posible_procedencia_contagio": ["it"], - "info": "Hoy 11 de marzo de 2020 el Laboratorio Nacional de Referencia del IPK, informa que tres de los cuatro turistas aislados desde el d\u00eda de ayer resultaron positivos al Nuevo Coronavirus SARS CoV-2. Procedentes de la regi\u00f3n italiana de Lombard\u00eda con sintomatolog\u00eda respiratoria, se encontraban hospedados en un hostal en la ciudad de Trinidad, provincia Sancti Sp\u00edritus, y que hab\u00edan arribado por el aeropuerto internacional \u201cJos\u00e9 Mart\u00ed\u201d de La Habana en d\u00edas recientes. De forma inmediata fueron ingresados en el Instituto de Medicina Tropical Pedro Kour\u00ed", - "provincias_visitadas": [], - "dpacode_provincias_visitadas": []}], - "sujetos_riesgo": 30, - "asintomaticos_numero": 0}}}} diff --git a/ingestion/functions/parsing/czechia/__init__.py b/ingestion/functions/parsing/czechia/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/czechia/czechia.py b/ingestion/functions/parsing/czechia/czechia.py deleted file mode 100644 index 8e2090d0d..000000000 --- a/ingestion/functions/parsing/czechia/czechia.py +++ /dev/null @@ -1,124 +0,0 @@ -import json -import os -import sys -import csv -from pathlib import Path -from datetime import datetime - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - -_CZ = parsing_lib.geocode_country('CZ') - -_AGE = "vek" -_GENDER = "pohlavi" -_DATE_CONFIRMED = "datum" -_REGION = "kraj_nuts_kod" -_DISTRICT = "okres_lau_kod" -_TRAVEL_YN = "nakaza_v_zahranici" -_TRAVEL_LOCATION = "nakaza_zeme_csu_kod" - -_GENDER_MAP = {"M": "Male", "Z": "Female"} - -# Geocode data © OpenStreetMap contributors https://www.openstreetmap.org/copyright -with (Path(__file__).parent / 'geocodes.json').open() as geof: - _GEOCODES = json.load(geof) - - -def convert_date(raw_date): - "Convert raw date field into a value interpretable by the dataserver" - try: - return datetime.fromisoformat(raw_date).strftime("%m/%d/%YZ") - except ValueError: - return None - - -def convert_events(date_confirmed): - return [ - { - "name": "confirmed", - "dateRange": { - "start": convert_date(date_confirmed), - "end": convert_date(date_confirmed) - } - } - ] - - -def convert_demographics(gender: str, age: str): - demo = {} - if gender: - demo["gender"] = _GENDER_MAP.get(gender, None) - if age: - demo["ageRange"] = {"start": int(age), "end": int(age)} - return demo - - -def convert_location(region, district): - # Both the regions and districts are entered in a slighty - # altered ISO 3166-2 format, where the '-' is replaced with a '0' - # Try locations in these order, falling back to country geocoding - return ( - _GEOCODES.get(district.replace("0", "-", 1), None) - or _GEOCODES.get(region.replace("0", "-", 1), None) - or _CZ - ) - - -def convert_travel(travel_yn, travel_history: str): - if travel_yn == "1": - travel = {"traveledPrior30Days": True} - else: - return None - if travel_history: - if travel_history in parsing_lib.COUNTRY_ISO2: - travel["travel"] = [ - {"location": parsing_lib.geocode_country(travel_history)} - ] - else: - travel["travel"] = [] - return travel or None - - -def parse_cases(raw_data_file: str, source_id: str, source_url: str): - """ - Parses G.h-format case data from raw API data. - """ - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f, delimiter=",") - for row in reader: - confirmation_date = convert_date(row[_DATE_CONFIRMED]) - if confirmation_date is not None: - try: - case = { - "caseReference": { - "sourceId": source_id, - "sourceUrl": source_url - }, - "location": convert_location(row[_REGION], row[_DISTRICT]), - "demographics": convert_demographics( - row[_GENDER], row[_AGE] - ), - "events": convert_events(row[_DATE_CONFIRMED]), - "travelHistory": convert_travel(row[_TRAVEL_YN], row[_TRAVEL_LOCATION]) - } - yield case - except ValueError as ve: - raise ValueError(f"error converting case: {ve}") - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/czechia/czechia_test.py b/ingestion/functions/parsing/czechia/czechia_test.py deleted file mode 100644 index c61fe43dd..000000000 --- a/ingestion/functions/parsing/czechia/czechia_test.py +++ /dev/null @@ -1,100 +0,0 @@ -import os -import unittest - -from czechia import czechia - -_SOURCE_ID = "abc123" -_SOURCE_URL = "foo.bar" - -_UA = { - "location": { - "name": "Ukraine", - "country": "UA", - "geoResolution": "Country", - "geometry": {"latitude": 48.379433, "longitude": 31.16558}, - } -} -_Semily = { - "administrativeAreaLevel1": "Liberecký kraj", - "administrativeAreaLevel2": "Semily", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": {"latitude": 50.602249, "longitude": 15.33526}, - "name": "Semily", -} -_Praha = { - "administrativeAreaLevel1": "Praha, Hlavní mešto", - "country": "Czech Republic", - "geoResolution": "Admin1", - "geometry": {"latitude": 50.0596288, "longitude": 14.446459273258009}, - "name": "Praha", -} -_Moravskoslezský_kraj = { - "administrativeAreaLevel1": "Moravskoslezský kraj", - "country": "Czech Republic", - "geoResolution": "Admin1", - "geometry": {"latitude": 49.860275, "longitude": 18.038654134727693}, - "name": "Moravskoslezský kraj", -} -_Hradec_Králové = { - "administrativeAreaLevel1": "Královéhradecký kraj", - "administrativeAreaLevel2": "Hradec Králové", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": {"latitude": 50.2092113, "longitude": 15.8327512}, - "name": "Hradec Králové", -} - - -def _c(location, age, gender, confirmed_date, travel_history=None): - return { - "caseReference": {"sourceId": _SOURCE_ID, "sourceUrl": _SOURCE_URL}, - "location": location, - "demographics": { - "gender": gender, - "ageRange": { - "start": age, - "end": age, - }, - }, - "events": [ - { - "name": "confirmed", - "dateRange": {"start": confirmed_date, "end": confirmed_date}, - } - ], - "travelHistory": travel_history, - } - - -_CASES = [ - _c(_Semily, 57, "Female", "11/01/2020Z"), - _c( - _Praha, - 38, - "Female", - "10/10/2020Z", - {"traveledPrior30Days": True, "travel": [_UA]}, - ), - _c( - _Hradec_Králové, - 23, - "Female", - "11/23/2020Z", - {"traveledPrior30Days": True}, - ), - _c(_Moravskoslezský_kraj, 27, "Male", "06/11/2020Z"), -] - - -class CzechiaTest(unittest.TestCase): - def setUp(self): - # Default of 1500 is not enough to show diffs when there is one. - self.maxDiff = 10000 - - def test_parse(self): - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = czechia.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), _CASES) diff --git a/ingestion/functions/parsing/czechia/geocodes.json b/ingestion/functions/parsing/czechia/geocodes.json deleted file mode 100644 index f5812dc9a..000000000 --- a/ingestion/functions/parsing/czechia/geocodes.json +++ /dev/null @@ -1,1220 +0,0 @@ -{ - "CZ-10": { - "administrativeAreaLevel1": "Praha, Hlavní mešto", - "country": "Czech Republic", - "geoResolution": "Admin1", - "geometry": { - "latitude": 50.0596288, - "longitude": 14.446459273258009 - }, - "name": "Praha" - }, - "CZ-101": { - "administrativeAreaLevel1": "Praha, Hlavní mešto", - "administrativeAreaLevel2": "Praha 1", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.0596288, - "longitude": 14.446459273258009 - }, - "name": "Praha" - }, - "CZ-102": { - "administrativeAreaLevel1": "Praha, Hlavní mešto", - "administrativeAreaLevel2": "Praha 2", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.0596288, - "longitude": 14.446459273258009 - }, - "name": "Praha" - }, - "CZ-103": { - "administrativeAreaLevel1": "Praha, Hlavní mešto", - "administrativeAreaLevel2": "Praha 3", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.0596288, - "longitude": 14.446459273258009 - }, - "name": "Praha" - }, - "CZ-104": { - "administrativeAreaLevel1": "Praha, Hlavní mešto", - "administrativeAreaLevel2": "Praha 4", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.0596288, - "longitude": 14.446459273258009 - }, - "name": "Praha" - }, - "CZ-105": { - "administrativeAreaLevel1": "Praha, Hlavní mešto", - "administrativeAreaLevel2": "Praha 5", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.0596288, - "longitude": 14.446459273258009 - }, - "name": "Praha" - }, - "CZ-106": { - "administrativeAreaLevel1": "Praha, Hlavní mešto", - "administrativeAreaLevel2": "Praha 6", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.0596288, - "longitude": 14.446459273258009 - }, - "name": "Praha" - }, - "CZ-107": { - "administrativeAreaLevel1": "Praha, Hlavní mešto", - "administrativeAreaLevel2": "Praha 7", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.0596288, - "longitude": 14.446459273258009 - }, - "name": "Praha" - }, - "CZ-108": { - "administrativeAreaLevel1": "Praha, Hlavní mešto", - "administrativeAreaLevel2": "Praha 8", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.0596288, - "longitude": 14.446459273258009 - }, - "name": "Praha" - }, - "CZ-109": { - "administrativeAreaLevel1": "Praha, Hlavní mešto", - "administrativeAreaLevel2": "Praha 9", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.0596288, - "longitude": 14.446459273258009 - }, - "name": "Praha" - }, - "CZ-110": { - "administrativeAreaLevel1": "Praha, Hlavní mešto", - "administrativeAreaLevel2": "Praha 10", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.0596288, - "longitude": 14.446459273258009 - }, - "name": "Praha" - }, - "CZ-111": { - "administrativeAreaLevel1": "Praha, Hlavní mešto", - "administrativeAreaLevel2": "Praha 11", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.0596288, - "longitude": 14.446459273258009 - }, - "name": "Praha" - }, - "CZ-112": { - "administrativeAreaLevel1": "Praha, Hlavní mešto", - "administrativeAreaLevel2": "Praha 12", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.970095549999996, - "longitude": 14.362816733188176 - }, - "name": "Praha" - }, - "CZ-113": { - "administrativeAreaLevel1": "Praha, Hlavní mešto", - "administrativeAreaLevel2": "Praha 13", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.0596288, - "longitude": 14.446459273258009 - }, - "name": "Praha" - }, - "CZ-114": { - "administrativeAreaLevel1": "Praha, Hlavní mešto", - "administrativeAreaLevel2": "Praha 14", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.96834385, - "longitude": 14.357606169512195 - }, - "name": "Praha" - }, - "CZ-115": { - "administrativeAreaLevel1": "Praha, Hlavní mešto", - "administrativeAreaLevel2": "Praha 15", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.095166899999995, - "longitude": 14.391605402358492 - }, - "name": "Praha" - }, - "CZ-116": { - "administrativeAreaLevel1": "Praha, Hlavní mešto", - "administrativeAreaLevel2": "Praha 16", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.97172105, - "longitude": 14.366313220196087 - }, - "name": "Praha" - }, - "CZ-117": { - "administrativeAreaLevel1": "Praha, Hlavní mešto", - "administrativeAreaLevel2": "Praha 17", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.971766849999995, - "longitude": 14.370643217050015 - }, - "name": "Praha" - }, - "CZ-118": { - "administrativeAreaLevel1": "Praha, Hlavní mešto", - "administrativeAreaLevel2": "Praha 18", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.969911100000004, - "longitude": 14.372591294072043 - }, - "name": "Praha" - }, - "CZ-119": { - "administrativeAreaLevel1": "Praha, Hlavní mešto", - "administrativeAreaLevel2": "Praha 19", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.1019412, - "longitude": 14.3584619 - }, - "name": "Praha" - }, - "CZ-120": { - "administrativeAreaLevel1": "Praha, Hlavní mešto", - "administrativeAreaLevel2": "Praha 20", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.1021063, - "longitude": 14.358431 - }, - "name": "Praha" - }, - "CZ-121": { - "administrativeAreaLevel1": "Praha, Hlavní mešto", - "administrativeAreaLevel2": "Praha 21", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.0596288, - "longitude": 14.446459273258009 - }, - "name": "Praha" - }, - "CZ-122": { - "administrativeAreaLevel1": "Praha, Hlavní mešto", - "administrativeAreaLevel2": "Praha 22", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.1064312, - "longitude": 14.2621914 - }, - "name": "Praha" - }, - "CZ-20": { - "administrativeAreaLevel1": "Středočeský kraj", - "country": "Czech Republic", - "geoResolution": "Admin1", - "geometry": { - "latitude": 50.0601579, - "longitude": 13.83074794209991 - }, - "name": "Středočeský kraj" - }, - "CZ-201": { - "administrativeAreaLevel1": "Středočeský kraj", - "administrativeAreaLevel2": "Benešov", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.7818921, - "longitude": 14.6869121 - }, - "name": "Benešov" - }, - "CZ-202": { - "administrativeAreaLevel1": "Středočeský kraj", - "administrativeAreaLevel2": "Beroun", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.9640292, - "longitude": 14.0733907 - }, - "name": "Beroun" - }, - "CZ-203": { - "administrativeAreaLevel1": "Středočeský kraj", - "administrativeAreaLevel2": "Kladno", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.1478497, - "longitude": 14.1025379 - }, - "name": "Kladno" - }, - "CZ-204": { - "administrativeAreaLevel1": "Středočeský kraj", - "administrativeAreaLevel2": "Kolín", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.0288894, - "longitude": 15.2011571 - }, - "name": "Kolín" - }, - "CZ-205": { - "administrativeAreaLevel1": "Středočeský kraj", - "administrativeAreaLevel2": "Kutná Hora", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.9486561, - "longitude": 15.2681123 - }, - "name": "Kutná Hora" - }, - "CZ-206": { - "administrativeAreaLevel1": "Středočeský kraj", - "administrativeAreaLevel2": "Mělník", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.3520785, - "longitude": 14.4748281 - }, - "name": "Mělník" - }, - "CZ-207": { - "administrativeAreaLevel1": "Středočeský kraj", - "administrativeAreaLevel2": "Mladá Boleslav", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.4116187, - "longitude": 14.9031301 - }, - "name": "Mladá Boleslav" - }, - "CZ-208": { - "administrativeAreaLevel1": "Středočeský kraj", - "administrativeAreaLevel2": "Nymburk", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.186331, - "longitude": 15.0417306 - }, - "name": "Nymburk" - }, - "CZ-209": { - "administrativeAreaLevel1": "Středočeský kraj", - "administrativeAreaLevel2": "Praha-východ", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.0828112, - "longitude": 14.71921794867766 - }, - "name": "Praha-východ" - }, - "CZ-20A": { - "administrativeAreaLevel1": "Středočeský kraj", - "administrativeAreaLevel2": "Praha-západ", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.0557651, - "longitude": 14.4356643 - }, - "name": "Praha-západ" - }, - "CZ-20B": { - "administrativeAreaLevel1": "Středočeský kraj", - "administrativeAreaLevel2": "Příbram", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.6901444, - "longitude": 14.0103663 - }, - "name": "Příbram" - }, - "CZ-20C": { - "administrativeAreaLevel1": "Středočeský kraj", - "administrativeAreaLevel2": "Rakovník", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.10407415, - "longitude": 13.722328073788379 - }, - "name": "Rakovník" - }, - "CZ-31": { - "administrativeAreaLevel1": "Jihočeský kraj", - "country": "Czech Republic", - "geoResolution": "Admin1", - "geometry": { - "latitude": 49.0864548, - "longitude": 14.600172741470452 - }, - "name": "Jihočeský kraj" - }, - "CZ-311": { - "administrativeAreaLevel1": "Jihočeský kraj", - "administrativeAreaLevel2": "České Budějovice", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 48.9747357, - "longitude": 14.474285 - }, - "name": "České Budějovice" - }, - "CZ-312": { - "administrativeAreaLevel1": "Jihočeský kraj", - "administrativeAreaLevel2": "Český Krumlov", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 48.8106526, - "longitude": 14.3150586 - }, - "name": "Český Krumlov" - }, - "CZ-313": { - "administrativeAreaLevel1": "Jihočeský kraj", - "administrativeAreaLevel2": "Jindřichův Hradec", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.1443265, - "longitude": 15.003354 - }, - "name": "Jindřichův Hradec" - }, - "CZ-314": { - "administrativeAreaLevel1": "Jihočeský kraj", - "administrativeAreaLevel2": "Písek", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.3089887, - "longitude": 14.147769 - }, - "name": "Písek" - }, - "CZ-315": { - "administrativeAreaLevel1": "Jihočeský kraj", - "administrativeAreaLevel2": "Prachatice", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.0131123, - "longitude": 13.9977479 - }, - "name": "Prachatice" - }, - "CZ-316": { - "administrativeAreaLevel1": "Jihočeský kraj", - "administrativeAreaLevel2": "Strakonice", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.261277, - "longitude": 13.9025043 - }, - "name": "Strakonice" - }, - "CZ-317": { - "administrativeAreaLevel1": "Jihočeský kraj", - "administrativeAreaLevel2": "Tábor", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.4141533, - "longitude": 14.6587234 - }, - "name": "Tábor" - }, - "CZ-32": { - "administrativeAreaLevel1": "Plzeňský kraj", - "country": "Czech Republic", - "geoResolution": "Admin1", - "geometry": { - "latitude": 49.522810199999995, - "longitude": 13.206311785137638 - }, - "name": "Plzeňský kraj" - }, - "CZ-321": { - "administrativeAreaLevel1": "Plzeňský kraj", - "administrativeAreaLevel2": "Domažlice", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.4407069, - "longitude": 12.9298338 - }, - "name": "Domažlice" - }, - "CZ-322": { - "administrativeAreaLevel1": "Plzeňský kraj", - "administrativeAreaLevel2": "Klatovy", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.3951183, - "longitude": 13.2935954 - }, - "name": "Klatovy" - }, - "CZ-323": { - "administrativeAreaLevel1": "Plzeňský kraj", - "administrativeAreaLevel2": "Plzeň-město", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.7477415, - "longitude": 13.3775249 - }, - "name": "Plzeň-město" - }, - "CZ-324": { - "administrativeAreaLevel1": "Plzeňský kraj", - "administrativeAreaLevel2": "Plzeň-jih", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.5604755, - "longitude": 13.6679349 - }, - "name": "Plzeň-jih" - }, - "CZ-325": { - "administrativeAreaLevel1": "Plzeňský kraj", - "administrativeAreaLevel2": "Plzeň-sever", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.8814234, - "longitude": 13.28128812312578 - }, - "name": "Plzeň-sever" - }, - "CZ-326": { - "administrativeAreaLevel1": "Plzeňský kraj", - "administrativeAreaLevel2": "Rokycany", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.7429636, - "longitude": 13.5945245 - }, - "name": "Rokycany" - }, - "CZ-327": { - "administrativeAreaLevel1": "Plzeňský kraj", - "administrativeAreaLevel2": "Tachov", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.7955449, - "longitude": 12.6329861 - }, - "name": "Tachov" - }, - "CZ-41": { - "administrativeAreaLevel1": "Karlovarský kraj", - "country": "Czech Republic", - "geoResolution": "Admin1", - "geometry": { - "latitude": 50.1753532, - "longitude": 12.806086309968043 - }, - "name": "Karlovarský kraj" - }, - "CZ-411": { - "administrativeAreaLevel1": "Karlovarský kraj", - "administrativeAreaLevel2": "Cheb", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.0793511, - "longitude": 12.3703526 - }, - "name": "Cheb" - }, - "CZ-412": { - "administrativeAreaLevel1": "Karlovarský kraj", - "administrativeAreaLevel2": "Karlovy Vary", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.2304694, - "longitude": 12.8710769 - }, - "name": "Karlovy Vary" - }, - "CZ-413": { - "administrativeAreaLevel1": "Karlovarský kraj", - "administrativeAreaLevel2": "Sokolov", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.1815641, - "longitude": 12.640035 - }, - "name": "Sokolov" - }, - "CZ-42": { - "administrativeAreaLevel1": "Ústecký kraj", - "country": "Czech Republic", - "geoResolution": "Admin1", - "geometry": { - "latitude": 50.5663266, - "longitude": 13.820670539566608 - }, - "name": "Ústecký kraj" - }, - "CZ-421": { - "administrativeAreaLevel1": "Ústecký kraj", - "administrativeAreaLevel2": "Děčín", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.7824196, - "longitude": 14.2147221 - }, - "name": "Děčín" - }, - "CZ-422": { - "administrativeAreaLevel1": "Ústecký kraj", - "administrativeAreaLevel2": "Chomutov", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.4606456, - "longitude": 13.4178324 - }, - "name": "Chomutov" - }, - "CZ-423": { - "administrativeAreaLevel1": "Ústecký kraj", - "administrativeAreaLevel2": "Litoměřice", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.5340795, - "longitude": 14.1317985 - }, - "name": "Litoměřice" - }, - "CZ-424": { - "administrativeAreaLevel1": "Ústecký kraj", - "administrativeAreaLevel2": "Louny", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.3572914, - "longitude": 13.7969195 - }, - "name": "Louny" - }, - "CZ-425": { - "administrativeAreaLevel1": "Ústecký kraj", - "administrativeAreaLevel2": "Most", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.5032737, - "longitude": 13.636112 - }, - "name": "Most" - }, - "CZ-426": { - "administrativeAreaLevel1": "Ústecký kraj", - "administrativeAreaLevel2": "Teplice", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.6406644, - "longitude": 13.8244461 - }, - "name": "Teplice" - }, - "CZ-427": { - "administrativeAreaLevel1": "Ústecký kraj", - "administrativeAreaLevel2": "Ústí nad Labem", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.6603327, - "longitude": 14.0381357 - }, - "name": "Ústí nad Labem" - }, - "CZ-51": { - "administrativeAreaLevel1": "Liberecký kraj", - "country": "Czech Republic", - "geoResolution": "Admin1", - "geometry": { - "latitude": 50.670618649999994, - "longitude": 15.094905279098455 - }, - "name": "Liberecký kraj" - }, - "CZ-511": { - "administrativeAreaLevel1": "Liberecký kraj", - "administrativeAreaLevel2": "Česká Lípa", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.6865452, - "longitude": 14.5372974 - }, - "name": "Česká Lípa" - }, - "CZ-512": { - "administrativeAreaLevel1": "Liberecký kraj", - "administrativeAreaLevel2": "Jablonec nad Nisou", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.7240899, - "longitude": 15.1710958 - }, - "name": "Jablonec nad Nisou" - }, - "CZ-513": { - "administrativeAreaLevel1": "Liberecký kraj", - "administrativeAreaLevel2": "Liberec", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.670618649999994, - "longitude": 15.094905279098455 - }, - "name": "Liberec" - }, - "CZ-514": { - "administrativeAreaLevel1": "Liberecký kraj", - "administrativeAreaLevel2": "Semily", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.602249, - "longitude": 15.33526 - }, - "name": "Semily" - }, - "CZ-52": { - "administrativeAreaLevel1": "Královéhradecký kraj", - "country": "Czech Republic", - "geoResolution": "Admin1", - "geometry": { - "latitude": 50.40939265, - "longitude": 15.68500539430977 - }, - "name": "Královéhradecký kraj" - }, - "CZ-521": { - "administrativeAreaLevel1": "Královéhradecký kraj", - "administrativeAreaLevel2": "Hradec Králové", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.2092113, - "longitude": 15.8327512 - }, - "name": "Hradec Králové" - }, - "CZ-522": { - "administrativeAreaLevel1": "Královéhradecký kraj", - "administrativeAreaLevel2": "Jičín", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.4370452, - "longitude": 15.3516528 - }, - "name": "Jičín" - }, - "CZ-523": { - "administrativeAreaLevel1": "Královéhradecký kraj", - "administrativeAreaLevel2": "Náchod", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.4167811, - "longitude": 16.1630918 - }, - "name": "Náchod" - }, - "CZ-524": { - "administrativeAreaLevel1": "Královéhradecký kraj", - "administrativeAreaLevel2": "Rychnov nad Kněžnou", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.1631069, - "longitude": 16.274837 - }, - "name": "Rychnov nad Kněžnou" - }, - "CZ-525": { - "administrativeAreaLevel1": "Královéhradecký kraj", - "administrativeAreaLevel2": "Trutnov", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.5650371, - "longitude": 15.916961395515788 - }, - "name": "Trutnov" - }, - "CZ-53": { - "administrativeAreaLevel1": "Pardubický kraj", - "country": "Czech Republic", - "geoResolution": "Admin1", - "geometry": { - "latitude": 49.889818950000006, - "longitude": 16.128325371948733 - }, - "name": "Pardubický kraj" - }, - "CZ-531": { - "administrativeAreaLevel1": "Pardubický kraj", - "administrativeAreaLevel2": "Chrudim", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.9511458, - "longitude": 15.7947559 - }, - "name": "Chrudim" - }, - "CZ-532": { - "administrativeAreaLevel1": "Pardubický kraj", - "administrativeAreaLevel2": "Pardubice", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.0385812, - "longitude": 15.7791356 - }, - "name": "Pardubice" - }, - "CZ-533": { - "administrativeAreaLevel1": "Pardubický kraj", - "administrativeAreaLevel2": "Svitavy", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.7562053, - "longitude": 16.4688995 - }, - "name": "Svitavy" - }, - "CZ-534": { - "administrativeAreaLevel1": "Pardubický kraj", - "administrativeAreaLevel2": "Ústí nad Orlicí", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.9737603, - "longitude": 16.3941695 - }, - "name": "Ústí nad Orlicí" - }, - "CZ-63": { - "administrativeAreaLevel1": "Kraj Vysočina", - "country": "Czech Republic", - "geoResolution": "Admin1", - "geometry": { - "latitude": 49.399409750000004, - "longitude": 15.570468337643561 - }, - "name": "Kraj Vysočina" - }, - "CZ-631": { - "administrativeAreaLevel1": "Kraj Vysočina", - "administrativeAreaLevel2": "Havlíčkův Brod", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.607079, - "longitude": 15.5794883 - }, - "name": "Havlíčkův Brod" - }, - "CZ-632": { - "administrativeAreaLevel1": "Kraj Vysočina", - "administrativeAreaLevel2": "Jihlava", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.396064, - "longitude": 15.5903065 - }, - "name": "Jihlava" - }, - "CZ-633": { - "administrativeAreaLevel1": "Kraj Vysočina", - "administrativeAreaLevel2": "Pelhřimov", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.4308737, - "longitude": 15.2232341 - }, - "name": "Pelhřimov" - }, - "CZ-634": { - "administrativeAreaLevel1": "Kraj Vysočina", - "administrativeAreaLevel2": "Třebíč", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.2151907, - "longitude": 15.8816091 - }, - "name": "Třebíč" - }, - "CZ-635": { - "administrativeAreaLevel1": "Kraj Vysočina", - "administrativeAreaLevel2": "Žďár nad Sázavou", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.5629014, - "longitude": 15.9391924 - }, - "name": "Žďár nad Sázavou" - }, - "CZ-64": { - "administrativeAreaLevel1": "Jihomoravský kraj", - "country": "Czech Republic", - "geoResolution": "Admin1", - "geometry": { - "latitude": 49.2125608, - "longitude": 16.6266277 - }, - "name": "Jihomoravský kraj" - }, - "CZ-641": { - "administrativeAreaLevel1": "Jihomoravský kraj", - "administrativeAreaLevel2": "Blansko", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.36021865, - "longitude": 16.652847141110076 - }, - "name": "Blansko" - }, - "CZ-642": { - "administrativeAreaLevel1": "Jihomoravský kraj", - "administrativeAreaLevel2": "Brno-město", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.2125608, - "longitude": 16.6266277 - }, - "name": "Brno-město" - }, - "CZ-643": { - "administrativeAreaLevel1": "Jihomoravský kraj", - "administrativeAreaLevel2": "Brno-venkov", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.2435916, - "longitude": 16.7130573 - }, - "name": "Brno-venkov" - }, - "CZ-644": { - "administrativeAreaLevel1": "Jihomoravský kraj", - "administrativeAreaLevel2": "Břeclav", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 48.7594008, - "longitude": 16.8813137 - }, - "name": "Břeclav" - }, - "CZ-645": { - "administrativeAreaLevel1": "Jihomoravský kraj", - "administrativeAreaLevel2": "Hodonín", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 48.8552594, - "longitude": 17.1219127 - }, - "name": "Hodonín" - }, - "CZ-646": { - "administrativeAreaLevel1": "Jihomoravský kraj", - "administrativeAreaLevel2": "Vyškov", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.2778194, - "longitude": 16.9994446 - }, - "name": "Vyškov" - }, - "CZ-647": { - "administrativeAreaLevel1": "Jihomoravský kraj", - "administrativeAreaLevel2": "Znojmo", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 48.8554341, - "longitude": 16.0489457 - }, - "name": "Znojmo" - }, - "CZ-71": { - "administrativeAreaLevel1": "Olomoucký kraj", - "country": "Czech Republic", - "geoResolution": "Admin1", - "geometry": { - "latitude": 49.859105799999995, - "longitude": 16.956126746749305 - }, - "name": "Olomoucký kraj" - }, - "CZ-711": { - "administrativeAreaLevel1": "Olomoucký kraj", - "administrativeAreaLevel2": "Jeseník", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 50.2296385, - "longitude": 17.2046012 - }, - "name": "Jeseník" - }, - "CZ-712": { - "administrativeAreaLevel1": "Olomoucký kraj", - "administrativeAreaLevel2": "Olomouc", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.5940567, - "longitude": 17.251143 - }, - "name": "Olomouc" - }, - "CZ-713": { - "administrativeAreaLevel1": "Olomoucký kraj", - "administrativeAreaLevel2": "Prostějov", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.4721467, - "longitude": 17.1117979 - }, - "name": "Prostějov" - }, - "CZ-714": { - "administrativeAreaLevel1": "Olomoucký kraj", - "administrativeAreaLevel2": "Přerov", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.4553775, - "longitude": 17.4508621 - }, - "name": "Přerov" - }, - "CZ-715": { - "administrativeAreaLevel1": "Olomoucký kraj", - "administrativeAreaLevel2": "Šumperk", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.9655521, - "longitude": 16.9705651 - }, - "name": "Šumperk" - }, - "CZ-72": { - "administrativeAreaLevel1": "Zlínský kraj", - "country": "Czech Republic", - "geoResolution": "Admin1", - "geometry": { - "latitude": 49.05838715, - "longitude": 17.46020049249254 - }, - "name": "Zlínský kraj" - }, - "CZ-721": { - "administrativeAreaLevel1": "Zlínský kraj", - "administrativeAreaLevel2": "Kroměříž", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.2984191, - "longitude": 17.3929804 - }, - "name": "Kroměříž" - }, - "CZ-722": { - "administrativeAreaLevel1": "Zlínský kraj", - "administrativeAreaLevel2": "Uherské Hradiště", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.05838715, - "longitude": 17.46020049249254 - }, - "name": "Uherské Hradiště" - }, - "CZ-723": { - "administrativeAreaLevel1": "Zlínský kraj", - "administrativeAreaLevel2": "Vsetín", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.3389775, - "longitude": 17.9961534 - }, - "name": "Vsetín" - }, - "CZ-724": { - "administrativeAreaLevel1": "Zlínský kraj", - "administrativeAreaLevel2": "Zlín", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.05838715, - "longitude": 17.46020049249254 - }, - "name": "Zlín" - }, - "CZ-80": { - "administrativeAreaLevel1": "Moravskoslezský kraj", - "country": "Czech Republic", - "geoResolution": "Admin1", - "geometry": { - "latitude": 49.860275, - "longitude": 18.038654134727693 - }, - "name": "Moravskoslezský kraj" - }, - "CZ-801": { - "administrativeAreaLevel1": "Moravskoslezský kraj", - "administrativeAreaLevel2": "Bruntál", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.9885113, - "longitude": 17.4652901 - }, - "name": "Bruntál" - }, - "CZ-802": { - "administrativeAreaLevel1": "Moravskoslezský kraj", - "administrativeAreaLevel2": "Frýdek Místek", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.685635, - "longitude": 18.3483416 - }, - "name": "Frýdek Místek" - }, - "CZ-803": { - "administrativeAreaLevel1": "Moravskoslezský kraj", - "administrativeAreaLevel2": "Karviná", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.8542719, - "longitude": 18.5416556 - }, - "name": "Karviná" - }, - "CZ-804": { - "administrativeAreaLevel1": "Moravskoslezský kraj", - "administrativeAreaLevel2": "Nový Jičín", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.594881, - "longitude": 18.0102584 - }, - "name": "Nový Jičín" - }, - "CZ-805": { - "administrativeAreaLevel1": "Moravskoslezský kraj", - "administrativeAreaLevel2": "Opava", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.9389004, - "longitude": 17.9024174 - }, - "name": "Opava" - }, - "CZ-806": { - "administrativeAreaLevel1": "Moravskoslezský kraj", - "administrativeAreaLevel2": "Ostrava-město", - "country": "Czech Republic", - "geoResolution": "Admin2", - "geometry": { - "latitude": 49.8349139, - "longitude": 18.2820084 - }, - "name": "Ostrava-město" - } -} diff --git a/ingestion/functions/parsing/czechia/get_geocodes.py b/ingestion/functions/parsing/czechia/get_geocodes.py deleted file mode 100644 index f8d88f929..000000000 --- a/ingestion/functions/parsing/czechia/get_geocodes.py +++ /dev/null @@ -1,84 +0,0 @@ -# Retrieve geocodes for Admin1 and Admin2 from OSM -import re -import json -import time -import pycountry -from urllib.parse import urlencode -from pathlib import Path -from pprint import pprint - -import requests - -OSM = "https://nominatim.openstreetmap.org/search?" -CZ = pycountry.subdivisions.get(country_code="CZ") - -Path("geo").mkdir(exist_ok=True) - - -def get_geocode(place): - query = urlencode( - { - "q": f"{place}, Czechia", - "format": "geojson", - "countrycodes": "cz", - "limit": 1, - } - ) - r = requests.get(f"{OSM}{query}") - j = r.json() - pprint(j) - try: - lon, lat = r.json()["features"][0]["geometry"]["coordinates"] - except (ValueError, KeyError, IndexError): - return None - return {"latitude": lat, "longitude": lon} - - -parent = {s.code: s.parent_code for s in CZ} -name = {s.code: s.name for s in CZ} - -for s in CZ: - fn = Path("geo") / (s.code + ".json") - _type = s.type - L = {} - if fn.exists(): - print("skip", fn, s.name) - continue - print(s.code, s.name) - n = s.name if s.type != "capital city" else "Praha" - # Match Praha districts to Praha - if re.match(r"Praha \d{1,2}$", n): - n = "Praha" - L[s.code] = { - "name": n, - "country": "Czech Republic", - "geoResolution": "Admin2" if _type == "district" else "Admin1", - "geometry": get_geocode(n), - } - if L[s.code]["geometry"] is None: - continue - if s.type == "district": - L[s.code]["administrativeAreaLevel2"] = s.name - L[s.code]["administrativeAreaLevel1"] = name[parent[s.code]] - else: - L[s.code]["administrativeAreaLevel1"] = s.name - (Path("geo") / (s.code + ".json")).write_text(json.dumps(L, indent=2)) - print(" ok", fn, s.name) - time.sleep(3) # requests should be limited to 1/second - -L = {} -geos = list(Path("geo").glob("*.json")) -if len(CZ) == len(geos): - for i in geos: - with i.open() as f: - d = json.load(f) - k = next(iter(d.keys())) - if isinstance(d[k]["name"], list): - d[k]["name"] = d[k]["name"][0] - L.update(d) - geocode_txt = json.dumps(L, indent=2, sort_keys=True, ensure_ascii=False) - for i in geocode_txt.split("\n"): - print("G:", i) - print("| grep ^G: | cut -c 4- to get JSON output") -else: - print("Missing certain geocodes, run script again") diff --git a/ingestion/functions/parsing/czechia/input_event.json b/ingestion/functions/parsing/czechia/input_event.json deleted file mode 100644 index 27d9575e8..000000000 --- a/ingestion/functions/parsing/czechia/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "5fd8b57dc6f7cd002f570721/2020/12/15/1316/content.csv", - "sourceUrl": "https://onemocneni-aktualne.mzcr.cz/api/v2/covid-19/osoby.csv", - "sourceId": "5fd8b57dc6f7cd002f570721" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/czechia/sample_data.csv b/ingestion/functions/parsing/czechia/sample_data.csv deleted file mode 100644 index 6afcbd972..000000000 --- a/ingestion/functions/parsing/czechia/sample_data.csv +++ /dev/null @@ -1,5 +0,0 @@ -datum,vek,pohlavi,kraj_nuts_kod,okres_lau_kod,nakaza_v_zahranici,nakaza_zeme_csu_kod -2020-11-01,57,Z,CZ051,CZ0514,, -2020-10-10,38,Z,CZ010,CZ0100,1,UA -2020-11-23,23,Z,CZ052,CZ0521,1, -2020-06-11,27,M,CZ080,CZ099Y,, diff --git a/ingestion/functions/parsing/england/README.md b/ingestion/functions/parsing/england/README.md deleted file mode 100644 index 766c43f15..000000000 --- a/ingestion/functions/parsing/england/README.md +++ /dev/null @@ -1,3 +0,0 @@ -This code runs on the england dataset file which was downloaded locally. This dataset is static (not regularly updated), and this code converts this dataset into JSON format for one-time manual import. - -This parser therefore doesn't need to be run on a schedule, or at all. We are including it just for reproducibility purposes. diff --git a/ingestion/functions/parsing/england/england.py b/ingestion/functions/parsing/england/england.py deleted file mode 100644 index 9c229ed45..000000000 --- a/ingestion/functions/parsing/england/england.py +++ /dev/null @@ -1,195 +0,0 @@ -import os -import sys -from datetime import datetime -import csv -import json -import common.ingestion_logging as logging - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.dirname(os.path.abspath(__file__))), - 'common/python')) - import parsing_lib - -logger = logging.getLogger(__name__) - -with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "geocoding_dictionaries.json")) as json_file: - uk_ltla_map = json.load(json_file) - - -def convert_date(raw_date: str, dataserver=True): - """ - Convert raw date field into a value interpretable by the dataserver. - - Set dataserver to False in order to return version appropriate for notes. - """ - try: - date = datetime.strptime(raw_date, "%Y-%m-%d") - except BaseException: - return None - if not dataserver: - return date.strftime("%m/%d/%Y") - return date.strftime("%m/%d/%YZ") - - -def convert_location(raw_entry): - ''' - Uses a dict from here https://geoportal.statistics.gov.uk/datasets/local-authority-districts-december-2019-boundaries-uk-bfe-1?geometry=-33.523%2C51.101%2C28.660%2C59.782 - This maps LTLA to coordinates. We provide UTLA as Admin2 and NHSER_name as Admin1 (1 of 9 English Regions). - LTLA is Admin3, so we have Admin3 resolution data for all cases except 5k, for which no location is provided. - ''' - try: - coords = uk_ltla_map.get(raw_entry['LTLA_name'], "") - geometry = {'latitude': coords[0], - 'longitude': coords[1]} - location = {} - location["country"] = "United Kingdom" - location["geoResolution"] = "Admin3" - location["name"] = place_name = f"{raw_entry['LTLA_name']}, {raw_entry['UTLA_name']}, United Kingdom" - location["geometry"] = geometry - location["administrativeAreaLevel1"] = raw_entry['NHSER_name'] - location["administrativeAreaLevel2"] = raw_entry['UTLA_name'] - location["administrativeAreaLevel3"] = raw_entry['LTLA_name'] - - return location - - except BaseException: - logger.error(raw_entry) - return None - - -def convert_demographics(entry): - ''' - Currently just converting age and sex directly. There are 45k cases with age < 5 and 9k cases of Age=0; not filtering these out. - Mapping ethnicity using dict. - ''' - - ethnicity_dict = {'A': 'Asian', 'W': 'White', 'B': 'Black', 'O': 'Other'} - - demo = {} - if entry['age']: - demo["ageRange"] = { - "start": float(entry['age']), - "end": float(entry['age'])} - - if entry['sex']: - demo["gender"] = entry['sex'] - - if entry['ethnicity_final.x']: - demo["ethnicity"] = ethnicity_dict[entry['ethnicity_final.x']] - - return demo or None - - -def parse_cases(raw_data_file, source_id, source_url): - """ - Parses G.h-format case data from raw API data. - - Out of 24k deaths, 20k have COVID-19 as cause of death (covidcod==1.0), 23k within 60 days (death_type60cod), - 20k within 28 days. - Has index of multiple deprivation (imd_decile), which we add to notes. - 5k out of 2.3M cases don't have any location info, so we'll leave these out. - Currently ignoring P2CH1CQ percentages as not clear how to interpret. - """ - - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f) - cases = [] - count = 0 - for entry in reader: - location = convert_location(entry) - if entry["specimen_date.x"]: - confirmation_date = convert_date(entry["specimen_date.x"]) - if location and confirmation_date: - notes = [] - case = { - "caseReference": { - "sourceId": source_id, - "sourceEntryId": entry["FINALID"], - "sourceUrl": source_url - }, - "location": location, - "demographics": convert_demographics(entry) - } - - - case["events"] = [ - { - "name": "confirmed", - "value": "PCR test", - "dateRange": - { - "start": confirmation_date, - "end": confirmation_date - } - }, - ] - if entry["asymptomatic_indicator"]: - if entry["asymptomatic_indicator"] == 'N': - case["symptoms"] = { - "status": "Symptomatic", - } - elif entry["asymptomatic_indicator"] == 'Y': - case["symptoms"] = { - "status": "Asymptomatic", - } - - if entry["dod"]: - case["events"].append({ - "name": "outcome", - "value": "Death", - "dateRange": { - "start": convert_date(entry['dod']), - "end": convert_date(entry['dod']), - } - }) - if not entry["covidcod"]: - notes.append( - "COVID-19 not reported as cause of death.") - - if entry['cat'] == 'Care/Nursing home': - case['transmission'] = ['Care home'] - - if entry['imd_decile']: - notes.append( - f"Case was in an area with an Index of Multiple Deprivation = {entry['imd_decile']}.") - if not entry['death_type28'] and entry['covidcod']: - notes.append( - f"Death was not within 28 days but was considered a result of COVID-19 infection.") - elif entry['death_type28'] and entry['covidcod']: - notes.append( - f"Death was within 28 days and considered a result of COVID-19 infection.") - - if entry['sgtf']!= '': - sgtf = float(entry['sgtf']) - if sgtf == 0.0: - notes.append('SGTF negative') - elif sgtf == 1.0: - notes.append('SGTF positive') - - if entry['sgtf_under30CT']!= '': - sgtf_ct = float(entry['sgtf_under30CT']) - if sgtf_ct == 0.0: - notes.append('SGTF under 30 CT negative') - elif sgtf_ct == 1.0: - notes.append('SGTF under 30 CT positive') - - if notes: - case["notes"] = ", ".join(notes) - - yield case - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/england/england_test.py b/ingestion/functions/parsing/england/england_test.py deleted file mode 100644 index 50bdce7c9..000000000 --- a/ingestion/functions/parsing/england/england_test.py +++ /dev/null @@ -1,202 +0,0 @@ -import os -import unittest -import england - -_SOURCE_ID = "placeholder_ID" -_SOURCE_URL = "placeholder_URL" - - -class EnglandTest(unittest.TestCase): - def setUp(self): - self.maxDiff = 5000 - - def test_parse(self): - ''' - Includes a row where province and district are unspecified, where it should return just - the department and country - ''' - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = england.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), - [{'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '2877343', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'United Kingdom', - 'geoResolution': 'Admin3', - 'name': 'Bristol, City of, Bristol, City of, United Kingdom', - 'geometry': {'latitude': 51.47115, 'longitude': -2.57742}, - 'administrativeAreaLevel1': 'South West', - 'administrativeAreaLevel2': 'Bristol, City of', - 'administrativeAreaLevel3': 'Bristol, City of'}, - 'demographics': {'ageRange': {'start': 24.0, 'end': 24.0}, - 'gender': 'Female', - 'ethnicity': 'White'}, - 'events': [{'name': 'confirmed', - 'value': 'PCR test', - 'dateRange': {'start': '02/24/2021Z', 'end': '02/24/2021Z'}}], - 'symptoms': {'status': 'Asymptomatic'}, - 'notes': 'Case was in an area with an Index of Multiple Deprivation = 9.0.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '1819443', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'United Kingdom', - 'geoResolution': 'Admin3', - 'name': 'Cheltenham, Gloucestershire, United Kingdom', - 'geometry': {'latitude': 51.89861, 'longitude': -2.07515}, - 'administrativeAreaLevel1': 'South West', - 'administrativeAreaLevel2': 'Gloucestershire', - 'administrativeAreaLevel3': 'Cheltenham'}, - 'demographics': {'ageRange': {'start': 35.0, 'end': 35.0}, - 'gender': 'Female', - 'ethnicity': 'White'}, - 'events': [{'name': 'confirmed', - 'value': 'PCR test', - 'dateRange': {'start': '02/24/2021Z', 'end': '02/24/2021Z'}}], - 'symptoms': {'status': 'Symptomatic'}, - 'notes': 'Case was in an area with an Index of Multiple Deprivation = 2.0.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '2271302', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'United Kingdom', - 'geoResolution': 'Admin3', - 'name': 'Bristol, City of, Bristol, City of, United Kingdom', - 'geometry': {'latitude': 51.47115, 'longitude': -2.57742}, - 'administrativeAreaLevel1': 'South West', - 'administrativeAreaLevel2': 'Bristol, City of', - 'administrativeAreaLevel3': 'Bristol, City of'}, - 'demographics': {'ageRange': {'start': 30.0, 'end': 30.0}, - 'gender': 'Male', - 'ethnicity': 'White'}, - 'events': [{'name': 'confirmed', - 'value': 'PCR test', - 'dateRange': {'start': '02/24/2021Z', 'end': '02/24/2021Z'}}], - 'symptoms': {'status': 'Symptomatic'}, - 'notes': 'Case was in an area with an Index of Multiple Deprivation = 1.0.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '384704', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'United Kingdom', - 'geoResolution': 'Admin3', - 'name': 'Plymouth, Plymouth, United Kingdom', - 'geometry': {'latitude': 50.40494, 'longitude': -4.11297}, - 'administrativeAreaLevel1': 'South West', - 'administrativeAreaLevel2': 'Plymouth', - 'administrativeAreaLevel3': 'Plymouth'}, - 'demographics': {'ageRange': {'start': 49.0, 'end': 49.0}, - 'gender': 'Male', - 'ethnicity': 'White'}, - 'events': [{'name': 'confirmed', - 'value': 'PCR test', - 'dateRange': {'start': '02/24/2021Z', 'end': '02/24/2021Z'}}], - 'symptoms': {'status': 'Asymptomatic'}, - 'notes': 'Case was in an area with an Index of Multiple Deprivation = 4.0.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '1342437', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'United Kingdom', - 'geoResolution': 'Admin3', - 'name': 'South Somerset, Somerset, United Kingdom', - 'geometry': {'latitude': 50.98399, 'longitude': -2.77588}, - 'administrativeAreaLevel1': 'South West', - 'administrativeAreaLevel2': 'Somerset', - 'administrativeAreaLevel3': 'South Somerset'}, - 'demographics': {'ageRange': {'start': 42.0, 'end': 42.0}, - 'gender': 'Female', - 'ethnicity': 'White'}, - 'events': [{'name': 'confirmed', - 'value': 'PCR test', - 'dateRange': {'start': '02/24/2021Z', 'end': '02/24/2021Z'}}], - 'symptoms': {'status': 'Asymptomatic'}, - 'notes': 'Case was in an area with an Index of Multiple Deprivation = 5.0.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '1841863', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'United Kingdom', - 'geoResolution': 'Admin3', - 'name': 'South Gloucestershire, South Gloucestershire, United Kingdom', - 'geometry': {'latitude': 51.54673, 'longitude': -2.46922}, - 'administrativeAreaLevel1': 'South West', - 'administrativeAreaLevel2': 'South Gloucestershire', - 'administrativeAreaLevel3': 'South Gloucestershire'}, - 'demographics': {'ageRange': {'start': 55.0, 'end': 55.0}, - 'gender': 'Female', - 'ethnicity': 'White'}, - 'events': [{'name': 'confirmed', - 'value': 'PCR test', - 'dateRange': {'start': '02/24/2021Z', 'end': '02/24/2021Z'}}], - 'symptoms': {'status': 'Asymptomatic'}, - 'notes': 'Case was in an area with an Index of Multiple Deprivation = 9.0.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '2576349', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'United Kingdom', - 'geoResolution': 'Admin3', - 'name': 'Mendip, Somerset, United Kingdom', - 'geometry': {'latitude': 51.19476, 'longitude': -2.54178}, - 'administrativeAreaLevel1': 'South West', - 'administrativeAreaLevel2': 'Somerset', - 'administrativeAreaLevel3': 'Mendip'}, - 'demographics': {'ageRange': {'start': 35.0, 'end': 35.0}, - 'gender': 'Female', - 'ethnicity': 'White'}, - 'events': [{'name': 'confirmed', - 'value': 'PCR test', - 'dateRange': {'start': '02/24/2021Z', 'end': '02/24/2021Z'}}], - 'symptoms': {'status': 'Symptomatic'}, - 'notes': 'Case was in an area with an Index of Multiple Deprivation = 7.0.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '2429985', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'United Kingdom', - 'geoResolution': 'Admin3', - 'name': 'Wiltshire, Wiltshire, United Kingdom', - 'geometry': {'latitude': 51.32883, 'longitude': -1.92661}, - 'administrativeAreaLevel1': 'South West', - 'administrativeAreaLevel2': 'Wiltshire', - 'administrativeAreaLevel3': 'Wiltshire'}, - 'demographics': {'ageRange': {'start': 58.0, 'end': 58.0}, - 'gender': 'Male', - 'ethnicity': 'White'}, - 'events': [{'name': 'confirmed', - 'value': 'PCR test', - 'dateRange': {'start': '02/24/2021Z', 'end': '02/24/2021Z'}}], - 'symptoms': {'status': 'Asymptomatic'}, - 'notes': 'Case was in an area with an Index of Multiple Deprivation = 7.0.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '597503', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'United Kingdom', - 'geoResolution': 'Admin3', - 'name': 'Cheltenham, Gloucestershire, United Kingdom', - 'geometry': {'latitude': 51.89861, 'longitude': -2.07515}, - 'administrativeAreaLevel1': 'South West', - 'administrativeAreaLevel2': 'Gloucestershire', - 'administrativeAreaLevel3': 'Cheltenham'}, - 'demographics': {'ageRange': {'start': 6.0, 'end': 6.0}, - 'gender': 'Female', - 'ethnicity': 'White'}, - 'events': [{'name': 'confirmed', - 'value': 'PCR test', - 'dateRange': {'start': '02/24/2021Z', 'end': '02/24/2021Z'}}], - 'symptoms': {'status': 'Symptomatic'}, - 'notes': 'Case was in an area with an Index of Multiple Deprivation = 10.0.'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '238701', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'country': 'United Kingdom', - 'geoResolution': 'Admin3', - 'name': 'Swindon, Swindon, United Kingdom', - 'geometry': {'latitude': 51.57763, 'longitude': -1.73367}, - 'administrativeAreaLevel1': 'South West', - 'administrativeAreaLevel2': 'Swindon', - 'administrativeAreaLevel3': 'Swindon'}, - 'demographics': {'ageRange': {'start': 52.0, 'end': 52.0}, - 'gender': 'Female', - 'ethnicity': 'White'}, - 'events': [{'name': 'confirmed', - 'value': 'PCR test', - 'dateRange': {'start': '02/24/2021Z', 'end': '02/24/2021Z'}}], - 'symptoms': {'status': 'Asymptomatic'}, - 'notes': 'Case was in an area with an Index of Multiple Deprivation = 5.0.'}]) diff --git a/ingestion/functions/parsing/england/geocoding_dictionaries.json b/ingestion/functions/parsing/england/geocoding_dictionaries.json deleted file mode 100644 index 831dd2846..000000000 --- a/ingestion/functions/parsing/england/geocoding_dictionaries.json +++ /dev/null @@ -1 +0,0 @@ -{"Hartlepool": [54.67614, -1.27018], "Middlesbrough": [54.54467, -1.21099], "Redcar and Cleveland": [54.56752, -1.00608], "Stockton-on-Tees": [54.55691, -1.30664], "Darlington": [54.53534, -1.56835], "Halton": [53.33424, -2.68853], "Warrington": [53.39163, -2.56167], "Blackburn with Darwen": [53.7008, -2.4636], "Blackpool": [53.82164, -3.02199], "Kingston upon Hull, City of": [53.7692, -0.30382], "East Riding of Yorkshire": [53.88112, -0.66195], "North East Lincolnshire": [53.52327, -0.13911], "North Lincolnshire": [53.58643, -0.52407], "York": [53.96582, -1.07375], "Derby": [52.91464, -1.47189], "Leicester": [52.63592, -1.1304], "Rutland": [52.66765, -0.6263], "Nottingham": [52.95419, -1.16667], "Herefordshire, County of": [52.08154, -2.73931], "Telford and Wrekin": [52.71417, -2.48941], "Stoke-on-Trent": [53.01707, -2.15888], "Bath and North East Somerset": [51.35604, -2.48654], "Bristol, City of": [51.47115, -2.57742], "North Somerset": [51.39707, -2.75439], "South Gloucestershire": [51.54673, -2.46922], "Plymouth": [50.40494, -4.11297], "Torbay": [50.47092, -3.55523], "Swindon": [51.57763, -1.73367], "Peterborough": [52.59214, -0.26874], "Luton": [51.89102, -0.42319], "Southend-on-Sea": [51.54917, 0.706923], "Thurrock": [51.50998, 0.334861], "Medway": [51.44772, 0.563174], "Bracknell Forest": [51.4113, -0.73363], "West Berkshire": [51.44559, -1.27364], "Reading": [51.45302, -0.99071], "Slough": [51.5035, -0.57617], "Windsor and Maidenhead": [51.48034, -0.67541], "Wokingham": [51.42296, -0.89935], "Milton Keynes": [52.07241, -0.7407], "Brighton and Hove": [50.8465, -0.15079], "Portsmouth": [50.808, -1.07006], "Southampton": [50.9212, -1.39952], "Isle of Wight": [50.67129, -1.33366], "County Durham": [54.68513, -1.8405], "Cheshire East": [53.16793, -2.29299], "Cheshire West and Chester": [53.16336, -2.70298], "Shropshire": [52.62212, -2.73667], "Cornwall": [50.45022, -4.64254], "Isles of Scilly": [49.92332, -6.30217], "Wiltshire": [51.32883, -1.92661], "Bedford": [52.19628, -0.45463], "Central Bedfordshire": [51.99903, -0.47754], "Northumberland": [55.30037, -2.07523], "Bournemouth, Christchurch and Poole": [50.74609, -1.84807], "Dorset": [50.79697, -2.41467], "Aylesbury Vale": [51.90037, -0.87746], "Chiltern": [51.6789, -0.62112], "South Bucks": [51.55944, -0.58484], "Wycombe": [51.6662, -0.80883], "Cambridge": [52.20017, 0.126436], "East Cambridgeshire": [52.35788, 0.283149], "Fenland": [52.53544, 0.009016], "Huntingdonshire": [52.35315, -0.2247], "South Cambridgeshire": [52.10805, 0.091017], "Allerdale": [54.68524, -3.2809], "Barrow-in-Furness": [54.15731, -3.1999], "Carlisle": [54.97833, -2.80498], "Copeland": [54.46617, -3.37664], "Eden": [54.63107, -2.62678], "South Lakeland": [54.29908, -2.78108], "Amber Valley": [53.02884, -1.46219], "Bolsover": [53.23875, -1.27228], "Chesterfield": [53.25575, -1.40115], "Derbyshire Dales": [53.12326, -1.70711], "Erewash": [52.9382, -1.3509], "High Peak": [53.38569, -1.84398], "North East Derbyshire": [53.16243, -1.44253], "South Derbyshire": [52.8249, -1.5348], "East Devon": [50.7576, -3.22359], "Exeter": [50.71782, -3.51368], "Mid Devon": [50.86882, -3.59212], "North Devon": [51.07621, -3.92691], "South Hams": [50.37195, -3.81996], "Teignbridge": [50.60981, -3.65289], "Torridge": [50.90739, -4.21728], "West Devon": [50.66489, -4.03361], "Eastbourne": [50.77387, 0.258516], "Hastings": [50.86724, 0.578395], "Lewes": [50.83341, 0.007671], "Rother": [50.94871, 0.542937], "Wealden": [50.93322, 0.205156], "Basildon": [51.59036, 0.475055], "Braintree": [51.91634, 0.575911], "Brentwood": [51.64108, 0.290091], "Castle Point": [51.56159, 0.588084], "Chelmsford": [51.73503, 0.491177], "Colchester": [51.87702, 0.859777], "Epping Forest": [51.71279, 0.154147], "Harlow": [51.76614, 0.103888], "Maldon": [51.77458, 0.773106], "Rochford": [51.5909, 0.683442], "Tendring": [51.85674, 1.108981], "Uttlesford": [51.93592, 0.294485], "Cheltenham": [51.89861, -2.07515], "Cotswold": [51.77255, -1.97059], "Forest of Dean": [51.81249, -2.47755], "Gloucester": [51.84641, -2.23263], "Stroud": [51.72001, -2.30818], "Tewkesbury": [51.93485, -2.19998], "Basingstoke and Deane": [51.25937, -1.22021], "East Hampshire": [51.05765, -0.93971], "Eastleigh": [50.94872, -1.32943], "Fareham": [50.85388, -1.23742], "Gosport": [50.80636, -1.16731], "Hart": [51.28197, -0.88321], "Havant": [50.87231, -1.00398], "New Forest": [50.85748, -1.59293], "Rushmoor": [51.27815, -0.76807], "Test Valley": [51.13417, -1.50214], "Winchester": [51.03002, -1.24393], "Broxbourne": [51.7208, -0.05073], "Dacorum": [51.76845, -0.55098], "Hertsmere": [51.68017, -0.26899], "North Hertfordshire": [51.95738, -0.22314], "Three Rivers": [51.65632, -0.45005], "Watford": [51.6717, -0.40429], "Ashford": [51.13096, 0.823374], "Canterbury": [51.28102, 1.096342], "Dartford": [51.43373, 0.245276], "Dover": [51.21176, 1.276887], "Gravesham": [51.39649, 0.398744], "Maidstone": [51.23566, 0.584061], "Sevenoaks": [51.27563, 0.188936], "Folkestone and Hythe": [51.07213, 1.000795], "Swale": [51.32251, 0.776893], "Thanet": [51.35252, 1.328226], "Tonbridge and Malling": [51.26064, 0.349306], "Tunbridge Wells": [51.10254, 0.471632], "Burnley": [53.77406, -2.2308], "Chorley": [53.6724, -2.61921], "Fylde": [53.79709, -2.91914], "Hyndburn": [53.75648, -2.38964], "Lancaster": [54.07901, -2.6603], "Pendle": [53.88636, -2.18957], "Preston": [53.82202, -2.71809], "Ribble Valley": [53.9245, -2.4174], "Rossendale": [53.68478, -2.26149], "South Ribble": [53.72675, -2.72871], "West Lancashire": [53.61283, -2.86893], "Wyre": [53.89991, -2.80359], "Blaby": [52.57706, -1.19887], "Charnwood": [52.7399, -1.13694], "Harborough": [52.53766, -0.90229], "Hinckley and Bosworth": [52.60877, -1.41755], "Melton": [52.80329, -0.8544], "North West Leicestershire": [52.7425, -1.42209], "Oadby and Wigston": [52.58875, -1.093], "Boston": [52.97794, -0.11218], "East Lindsey": [53.26446, 0.020516], "Lincoln": [53.21921, -0.55848], "North Kesteven": [53.08058, -0.4767], "South Holland": [52.78758, -0.03058], "South Kesteven": [52.84885, -0.49565], "West Lindsey": [53.40044, -0.50774], "Breckland": [52.59421, 0.818716], "Broadland": [52.69622, 1.252317], "Great Yarmouth": [52.68439, 1.64951], "King's Lynn and West Norfolk": [52.71283, 0.533243], "North Norfolk": [52.83389, 1.132099], "Norwich": [52.64013, 1.284979], "South Norfolk": [52.51218, 1.373233], "Corby": [52.50697, -0.7069], "Daventry": [52.30994, -1.01447], "East Northamptonshire": [52.47909, -0.5092], "Kettering": [52.43723, -0.76773], "Northampton": [52.23775, -0.88121], "South Northamptonshire": [52.11844, -1.08129], "Wellingborough": [52.29258, -0.71425], "Craven": [54.05376, -2.16168], "Hambleton": [54.30872, -1.34049], "Harrogate": [54.07708, -1.58161], "Richmondshire": [54.35761, -1.98552], "Ryedale": [54.20021, -0.84277], "Scarborough": [54.3465, -0.52778], "Selby": [53.73327, -1.12908], "Ashfield": [53.09747, -1.25422], "Bassetlaw": [53.35604, -0.9787], "Broxtowe": [52.9721, -1.25944], "Gedling": [53.02434, -1.11907], "Mansfield": [53.16703, -1.17804], "Newark and Sherwood": [53.1096, -0.94643], "Rushcliffe": [52.9124, -1.01097], "Cherwell": [51.8872, -1.28506], "Oxford": [51.75357, -1.24405], "South Oxfordshire": [51.62288, -1.07847], "Vale of White Horse": [51.65443, -1.48543], "West Oxfordshire": [51.8399, -1.50292], "Mendip": [51.19476, -2.54178], "Sedgemoor": [51.19186, -2.88246], "South Somerset": [50.98399, -2.77588], "Cannock Chase": [52.70166, -1.98277], "East Staffordshire": [52.83651, -1.81438], "Lichfield": [52.69615, -1.76049], "Newcastle-under-Lyme": [53.00345, -2.32631], "South Staffordshire": [52.69692, -2.15495], "Stafford": [52.84792, -2.16475], "Staffordshire Moorlands": [53.06924, -1.99334], "Tamworth": [52.62031, -1.68451], "Babergh": [52.0645, 0.916149], "Ipswich": [52.05592, 1.166145], "Mid Suffolk": [52.21859, 1.096953], "Elmbridge": [51.36098, -0.39441], "Epsom and Ewell": [51.33945, -0.26172], "Guildford": [51.25366, -0.56257], "Mole Valley": [51.22749, -0.30603], "Reigate and Banstead": [51.25846, -0.19871], "Runnymede": [51.39273, -0.53855], "Spelthorne": [51.41552, -0.46254], "Surrey Heath": [51.3361, -0.68986], "Tandridge": [51.23581, -0.04805], "Waverley": [51.15686, -0.62343], "Woking": [51.30837, -0.57982], "North Warwickshire": [52.56484, -1.6242], "Nuneaton and Bedworth": [52.50094, -1.47965], "Rugby": [52.38228, -1.31828], "Stratford-on-Avon": [52.16154, -1.63565], "Warwick": [52.30142, -1.58369], "Adur": [50.84572, -0.32417], "Arun": [50.84321, -0.64999], "Chichester": [50.94177, -0.7163], "Crawley": [51.12357, -0.19533], "Horsham": [51.00272, -0.38126], "Mid Sussex": [51.05953, -0.10272], "Worthing": [50.8331, -0.40127], "Bromsgrove": [52.36169, -2.00376], "Malvern Hills": [52.16758, -2.33089], "Redditch": [52.28541, -1.9471], "Worcester": [52.19482, -2.21025], "Wychavon": [52.12886, -2.01614], "Wyre Forest": [52.3853, -2.23494], "St Albans": [51.77356, -0.3407], "Welwyn Hatfield": [51.76087, -0.18518], "East Hertfordshire": [51.86485, 0.002739], "Stevenage": [51.90539, -0.18987], "East Suffolk": [52.24399, 1.456186], "West Suffolk": [52.30842, 0.652769], "Somerset West and Taunton": [51.06348, -3.35766], "Bolton": [53.58449, -2.47952], "Bury": [53.5931, -2.3088], "Manchester": [53.47009, -2.23359], "Oldham": [53.55768, -2.05274], "Rochdale": [53.60741, -2.14784], "Salford": [53.47927, -2.38485], "Stockport": [53.39116, -2.12467], "Tameside": [53.47867, -2.077], "Trafford": [53.41671, -2.36572], "Wigan": [53.51445, -2.57247], "Knowsley": [53.43788, -2.83297], "Liverpool": [53.4083, -2.91364], "St. Helens": [53.45862, -2.7031], "Sefton": [53.4821, -2.99177], "Wirral": [53.37478, -3.06701], "Barnsley": [53.52577, -1.54925], "Doncaster": [53.52697, -1.10894], "Rotherham": [53.39553, -1.28651], "Sheffield": [53.40358, -1.54254], "Newcastle upon Tyne": [55.02101, -1.65297], "North Tyneside": [55.02896, -1.50923], "South Tyneside": [54.96988, -1.44679], "Sunderland": [54.85719, -1.43344], "Birmingham": [52.48404, -1.88141], "Coventry": [52.41423, -1.51908], "Dudley": [52.49513, -2.10171], "Sandwell": [52.51477, -2.00771], "Solihull": [52.431, -1.71558], "Walsall": [52.60503, -1.97044], "Wolverhampton": [52.59788, -2.12746], "Bradford": [53.84382, -1.87389], "Calderdale": [53.72048, -1.96182], "Kirklees": [53.64233, -1.78085], "Leeds": [53.82273, -1.50736], "Wakefield": [53.65922, -1.42092], "Gateshead": [54.9312, -1.6868], "City of London": [51.51565, -0.09353], "Barking and Dagenham": [51.54555, 0.129479], "Barnet": [51.61108, -0.21821], "Bexley": [51.45823, 0.146227], "Brent": [51.56441, -0.27568], "Bromley": [51.37267, 0.039246], "Camden": [51.54306, -0.16289], "Croydon": [51.36598, -0.07761], "Ealing": [51.52443, -0.31407], "Enfield": [51.64888, -0.08147], "Greenwich": [51.46393, 0.050107], "Hackney": [51.55492, -0.06045], "Hammersmith and Fulham": [51.48733, -0.21735], "Haringey": [51.58771, -0.10667], "Harrow": [51.59467, -0.33603], "Havering": [51.56519, 0.235368], "Hillingdon": [51.53663, -0.44182], "Hounslow": [51.46243, -0.37847], "Islington": [51.54548, -0.10992], "Kensington and Chelsea": [51.49644, -0.18976], "Kingston upon Thames": [51.39296, -0.28367], "Lambeth": [51.46445, -0.11385], "Lewisham": [51.44231, -0.01733], "Merton": [51.41057, -0.18867], "Newham": [51.53147, 0.027289], "Redbridge": [51.58589, 0.070071], "Richmond upon Thames": [51.44035, -0.28914], "Southwark": [51.46592, -0.07306], "Sutton": [51.35756, -0.17227], "Tower Hamlets": [51.51554, -0.03643], "Waltham Forest": [51.59461, -0.01881], "Wandsworth": [51.4524, -0.20023], "Westminster": [51.5122, -0.15295], "Antrim and Newtownabbey": [54.69386, -6.1776], "Armagh City, Banbridge and Craigavon": [54.3867, -6.43455], "Belfast": [54.59853, -5.92535], "Causeway Coast and Glens": [55.03962, -6.5996], "Derry City and Strabane": [54.80904, -7.42064], "Fermanagh and Omagh": [54.38521, -7.5271], "Lisburn and Castlereagh": [54.49752, -6.03545], "Mid and East Antrim": [54.86462, -6.14645], "Mid Ulster": [54.55273, -6.8889], "Newry, Mourne and Down": [54.14953, -6.08891], "Ards and North Down": [54.56409, -5.64568], "Clackmannanshire": [56.14724, -3.75344], "Dumfries and Galloway": [55.09621, -4.02863], "East Ayrshire": [55.49674, -4.29057], "East Lothian": [55.94207, -2.72435], "East Renfrewshire": [55.74868, -4.3606], "Na h-Eileanan Siar": [58.19938, -6.65722], "Falkirk": [55.99604, -3.7706], "Highland": [57.58657, -4.66103], "Inverclyde": [55.9003, -4.75387], "Midlothian": [55.82111, -3.11738], "Moray": [57.47683, -3.20187], "North Ayrshire": [55.72789, -4.7246], "Orkney Islands": [58.94334, -2.90025], "Scottish Borders": [55.52594, -2.85866], "Shetland Islands": [60.50495, -1.37344], "South Ayrshire": [55.23008, -4.72899], "South Lanarkshire": [55.60453, -3.83272], "Stirling": [56.24953, -4.32595], "Aberdeen City": [57.16697, -2.20398], "Aberdeenshire": [57.23469, -2.79208], "Argyll and Bute": [56.28944, -5.22114], "City of Edinburgh": [55.91119, -3.27826], "Renfrewshire": [55.84862, -4.56834], "West Dunbartonshire": [56.0014, -4.52074], "West Lothian": [55.8992, -3.60909], "Angus": [56.7248, -2.89189], "Dundee City": [56.4776, -2.97095], "East Dunbartonshire": [55.95829, -4.22417], "Fife": [56.23117, -2.98235], "Perth and Kinross": [56.57529, -3.8848], "Glasgow City": [55.87649, -4.21479], "North Lanarkshire": [55.86814, -3.9514], "Isle of Anglesey": [53.27942, -4.32306], "Gwynedd": [52.89883, -3.77715], "Conwy": [53.14739, -3.74646], "Denbighshire": [53.08833, -3.34761], "Flintshire": [53.21471, -3.18248], "Wrexham": [53.00167, -2.99203], "Ceredigion": [52.29795, -3.94993], "Pembrokeshire": [51.85513, -4.90818], "Carmarthenshire": [51.89495, -4.2111], "Swansea": [51.65806, -3.96723], "Neath Port Talbot": [51.6445, -3.74638], "Bridgend": [51.5606, -3.61375], "Vale of Glamorgan": [51.44836, -3.39803], "Cardiff": [51.50254, -3.22208], "Rhondda Cynon Taf": [51.62185, -3.41359], "Caerphilly": [51.65001, -3.19753], "Blaenau Gwent": [51.75364, -3.18592], "Torfaen": [51.69836, -3.05101], "Monmouthshire": [51.77827, -2.9028], "Newport": [51.58231, -2.89769], "Powys": [52.34864, -3.43531], "Merthyr Tydfil": [51.74858, -3.36425]} \ No newline at end of file diff --git a/ingestion/functions/parsing/england/input_event.json b/ingestion/functions/parsing/england/input_event.json deleted file mode 100644 index c8af2c02d..000000000 --- a/ingestion/functions/parsing/england/input_event.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "test/england/england_head5k.csv", - "sourceUrl": "https://github.com/nicholasdavies/cfrvoc/tree/main/dataset", - "sourceId": "6061e69042b7ae9c589ac9e4" -} - diff --git a/ingestion/functions/parsing/england/sample_data.csv b/ingestion/functions/parsing/england/sample_data.csv deleted file mode 100644 index 8c9e49e52..000000000 --- a/ingestion/functions/parsing/england/sample_data.csv +++ /dev/null @@ -1,11 +0,0 @@ -Unnamed: 0,FINALID,pillar,age,sex,LTLA_name,UTLA_name,NHSER_name,specimen_date.x,sgtf,sgtf_under30CT,imd_decile,ethnicity_final.x,cat,dod,P2CH1CQ,P2CH2CQ,P2CH3CQ,P2CH4CQ,asymptomatic_indicator,covidcod,death_type28,death_type60cod,data_id -2929855,2877343,Pillar 2,24,Female,"Bristol, City of","Bristol, City of",South West,2021-02-24,,,9.0,W,Other/Unknown,,,,,,Y,,,,20210225 -2929856,1819443,Pillar 2,35,Female,Cheltenham,Gloucestershire,South West,2021-02-24,,,2.0,W,Other/Unknown,,,,,,N,,,,20210225 -2929857,2271302,Pillar 2,30,Male,"Bristol, City of","Bristol, City of",South West,2021-02-24,,,1.0,W,Other/Unknown,,,,,,N,,,,20210225 -2929858,384704,Pillar 2,49,Male,Plymouth,Plymouth,South West,2021-02-24,,,4.0,W,Other/Unknown,,,,,,Y,,,,20210225 -2929859,1342437,Pillar 2,42,Female,South Somerset,Somerset,South West,2021-02-24,,,5.0,W,Other/Unknown,,,,,,Y,,,,20210225 -2929860,1841863,Pillar 2,55,Female,South Gloucestershire,South Gloucestershire,South West,2021-02-24,,,9.0,W,Other/Unknown,,,,,,Y,,,,20210225 -2929861,2576349,Pillar 2,35,Female,Mendip,Somerset,South West,2021-02-24,,,7.0,W,Other/Unknown,,,,,,N,,,,20210225 -2929862,2429985,Pillar 2,58,Male,Wiltshire,Wiltshire,South West,2021-02-24,,,7.0,W,Other/Unknown,,,,,,Y,,,,20210225 -2929863,597503,Pillar 2,6,Female,Cheltenham,Gloucestershire,South West,2021-02-24,,,10.0,W,Other/Unknown,,,,,,N,,,,20210225 -2929864,238701,Pillar 2,52,Female,Swindon,Swindon,South West,2021-02-24,,,5.0,W,Other/Unknown,,,,,,Y,,,,20210225 diff --git a/ingestion/functions/parsing/estonia/__init__.py b/ingestion/functions/parsing/estonia/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/estonia/estonia.py b/ingestion/functions/parsing/estonia/estonia.py deleted file mode 100644 index d4b45954b..000000000 --- a/ingestion/functions/parsing/estonia/estonia.py +++ /dev/null @@ -1,116 +0,0 @@ -import json -import os -import sys -from datetime import datetime -import csv - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - -# Fixed location, all cases are for Estonia and no finer location is available in the source. -_LOCATION = { - "country": "Estonia", - "geoResolution": "Country", - "name": "Estonia", - "geometry": { - "longitude": float("25.7615268448868"), - "latitude": float("58.7783968568071") - } -} - - -def convert_date(raw_date): - """ - Convert raw date field into a value interpretable by the dataserver. - - The date is listed in YYYY-mm-dd HH:MM:SS format (i.e.: 2020-03-06 18:44:00), but the date filtering API - expects mm/dd/YYYYZ format. - """ - date = datetime.strptime(raw_date, "%Y-%m-%d %H:%M:%S") - return date.strftime("%m/%d/%YZ") - - -def convert_gender(raw_gender: str): - if raw_gender.upper() == "M": - return "Male" - elif raw_gender.upper() == "N": - return "Female" - elif raw_gender.upper() == "U": - # Unknown - return None - else: - raise ValueError(f'Unhandled gender: {raw_gender}') - - -def convert_demographics(gender: str, age: str): - demo = {} - if gender: - demo["gender"] = convert_gender(gender) - if age: - # Brackets are like "35-39" or "over 85". - if '-' in age: - start, _, end = age.partition("-") - demo["ageRange"] = { - "start": float(start), - "end": float(end), - } - elif age == "over 85" or age == "üle 85": - demo["ageRange"] = { - "start": 85.0, - "end": 120.0, - } - else: - raise ValueError(f'Unhandled age: {age}') - return demo or None - - -def parse_cases(raw_data_file: str, source_id: str, source_url: str): - """Parses G.h-format case data from raw API data.""" - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f) - next(reader) # Skip the header. - for row in reader: - # Skip negative cases. - if row['ResultValue'] != "P": - continue - case = { - "caseReference": { - "sourceId": source_id, - "sourceUrl": source_url, - "sourceEntryId": row["id"], - }, - "location": _LOCATION, - "events": [ - { - "name": "confirmed", - "dateRange": - { - "start": convert_date(row['ResultTime']), - "end": convert_date(row['ResultTime']), - }, - }, - ], - "demographics": convert_demographics( - row['Gender'], row['AgeGroup']), - "notes": f"Case residence: {row['Country']} {row['County']}".strip(), - } - yield case - - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) \ No newline at end of file diff --git a/ingestion/functions/parsing/estonia/estonia_test.py b/ingestion/functions/parsing/estonia/estonia_test.py deleted file mode 100644 index fa95e28db..000000000 --- a/ingestion/functions/parsing/estonia/estonia_test.py +++ /dev/null @@ -1,45 +0,0 @@ -import os -import unittest - -from estonia import estonia - -_SOURCE_ID = "abc123" -_SOURCE_URL = "https://esto.nia" -_PARSED_CASE = ( - { - "caseReference": { - "sourceId": _SOURCE_ID, - "sourceUrl": _SOURCE_URL, - "sourceEntryId": "95013b64dd5ff18548a92eb5375d9c4a1881467390fed4a1c084253ef72be9ea", - }, - "location": estonia._LOCATION, - "events": [ - { - "name": "confirmed", - "dateRange": - { - "start": "03/06/2020Z", - "end": "03/06/2020Z", - }, - }, - ], - "demographics": { - "ageRange": { - "start": 10.0, - "end": 14.0, - }, - "gender": "Male", - }, - "notes": "Case residence: Eesti Tartu maakond", - }) - - -class EstoniaTest(unittest.TestCase): - def test_parse(self): - # Default of 1500 is not enough to show diffs when there is one. - self.maxDiff = 5000 - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = estonia.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertEqual(next(result), _PARSED_CASE) diff --git a/ingestion/functions/parsing/estonia/input_event.json b/ingestion/functions/parsing/estonia/input_event.json deleted file mode 100644 index 277640b17..000000000 --- a/ingestion/functions/parsing/estonia/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "5f59e8c47ef66004bc9c91ce/2020/09/10/0855/content.csv", - "sourceUrl": "https://opendata.digilugu.ee/opendata_covid19_test_results.csv", - "sourceId": "5f59e8c47ef66004bc9c91ce" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/estonia/sample_data.csv b/ingestion/functions/parsing/estonia/sample_data.csv deleted file mode 100644 index 9970f1df4..000000000 --- a/ingestion/functions/parsing/estonia/sample_data.csv +++ /dev/null @@ -1,3 +0,0 @@ -id,Gender,AgeGroup,Country,County,ResultValue,StatisticsDate,ResultTime,AnalysisInsertTime -negative,M,10-14,Eesti,"Tartu maakond",N,2020-03-10,"2020-03-06 18:44:00","2020-03-10 16:01:55" -95013b64dd5ff18548a92eb5375d9c4a1881467390fed4a1c084253ef72be9ea,M,10-14,Eesti,"Tartu maakond",P,2020-03-10,"2020-03-06 18:44:00","2020-03-10 16:01:55" \ No newline at end of file diff --git a/ingestion/functions/parsing/example/README.md b/ingestion/functions/parsing/example/README.md deleted file mode 100644 index aa283288e..000000000 --- a/ingestion/functions/parsing/example/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Example minimal line list case parser - -Used as a reference in the [documentation](/ingestion/functions/README.md). diff --git a/ingestion/functions/parsing/example/__init__.py b/ingestion/functions/parsing/example/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/example/example.py b/ingestion/functions/parsing/example/example.py deleted file mode 100644 index 43edb8248..000000000 --- a/ingestion/functions/parsing/example/example.py +++ /dev/null @@ -1,52 +0,0 @@ -import os -import sys -import csv -import json - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.dirname(os.path.abspath(__file__))), - 'common/python')) - import parsing_lib - - -def parse_cases(raw_data_file: str, source_id: str, source_url: str): - """Example parsing code for a CSV source.""" - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f) - for row in reader: - case = { - "caseReference": { - "sourceId": source_id, - "sourceUrl": source_url, - }, - "location": { - "query": "Some district, Some country" - }, - "events": [ - { - "name": "confirmed", - "dateRange": - { - "start": "03/06/2020Z", - "end": "03/06/2020Z", - }, - }, - ], - } - yield case - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/example/example_test.py b/ingestion/functions/parsing/example/example_test.py deleted file mode 100644 index 20372468e..000000000 --- a/ingestion/functions/parsing/example/example_test.py +++ /dev/null @@ -1,36 +0,0 @@ -import os -import unittest - -from example import example - -_SOURCE_ID = "abc123" -_SOURCE_URL = "https://some.url" -_PARSED_CASE = ( - { - "caseReference": { - "sourceId": _SOURCE_ID, - "sourceUrl": _SOURCE_URL, - }, - "location": { - "query": "Some district, Some country", - }, - "events": [ - { - "name": "confirmed", - "dateRange": - { - "start": "03/06/2020Z", - "end": "03/06/2020Z", - }, - }, - ], - }) - - -class ExampleTest(unittest.TestCase): - def test_parse(self): - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = example.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertEqual(next(result), _PARSED_CASE) diff --git a/ingestion/functions/parsing/example/input_event.json b/ingestion/functions/parsing/example/input_event.json deleted file mode 100644 index 5eb89629f..000000000 --- a/ingestion/functions/parsing/example/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "5f59e8c47ef66004bc9c91ce/2020/09/10/0855/content.csv", - "sourceUrl": "http://foobar.com", - "sourceId": "5f59e8c47ef66004bc9c91ce" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/example/sample_data.csv b/ingestion/functions/parsing/example/sample_data.csv deleted file mode 100644 index 1670741b5..000000000 --- a/ingestion/functions/parsing/example/sample_data.csv +++ /dev/null @@ -1,2 +0,0 @@ -id,Gender,AgeGroup,Country,County,ResultValue,StatisticsDate,ResultTime,AnalysisInsertTime -negative,M,10-14,Eesti,"Tartu maakond",N,2020-03-10,"2020-03-06 18:44:00","2020-03-10 16:01:55" \ No newline at end of file diff --git a/ingestion/functions/parsing/germany/.vscode/settings.json b/ingestion/functions/parsing/germany/.vscode/settings.json deleted file mode 100644 index de288e1ea..000000000 --- a/ingestion/functions/parsing/germany/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "python.formatting.provider": "black" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/germany/__init__.py b/ingestion/functions/parsing/germany/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/germany/dictionaries.json b/ingestion/functions/parsing/germany/dictionaries.json deleted file mode 100644 index caf70f741..000000000 --- a/ingestion/functions/parsing/germany/dictionaries.json +++ /dev/null @@ -1,2011 +0,0 @@ -{ - "name_id_dict": { - "1001": "Flensburg", - "1002": "Kiel", - "1003": "Lübeck", - "1004": "Neumünster", - "1051": "Dithmarschen", - "1053": "Herzogtum Lauenburg", - "1054": "Nordfriesland", - "1055": "Ostholstein", - "1056": "Pinneberg", - "1057": "Plön", - "1058": "Rendsburg-Eckernförde", - "1059": "Schleswig-Flensburg", - "1060": "Segeberg", - "1061": "Steinburg", - "1062": "Stormarn", - "2000": "Hamburg", - "3101": "Braunschweig", - "3102": "Salzgitter", - "3103": "Wolfsburg", - "3151": "Gifhorn", - "3153": "Goslar", - "3154": "Helmstedt", - "3155": "Northeim", - "3157": "Peine", - "3158": "Wolfenbüttel", - "3159": "Göttingen", - "3241": "Region Hannover", - "3251": "Diepholz", - "3252": "Hameln-Pyrmont", - "3254": "Hildesheim", - "3255": "Holzminden", - "3256": "Nienburg (Weser)", - "3257": "Schaumburg", - "3351": "Celle", - "3352": "Cuxhaven", - "3353": "Harburg", - "3354": "Lüchow-Dannenberg", - "3355": "Lüneburg", - "3356": "Osterholz", - "3357": "Rotenburg (Wümme)", - "3358": "Heidekreis", - "3359": "Stade", - "3360": "Uelzen", - "3361": "Verden", - "3401": "Delmenhorst", - "3402": "Emden", - "3403": "Oldenburg (Oldb)", - "3404": "Osnabrück", - "3405": "Wilhelmshaven", - "3451": "Ammerland", - "3452": "Aurich", - "3453": "Cloppenburg", - "3454": "Emsland", - "3455": "Friesland", - "3456": "Grafschaft Bentheim", - "3457": "Leer", - "3458": "Oldenburg", - "3459": "Osnabrück", - "3460": "Vechta", - "3461": "Wesermarsch", - "3462": "Wittmund", - "4011": "Bremen", - "4012": "Bremerhaven", - "5111": "Düsseldorf", - "5112": "Duisburg", - "5113": "Essen", - "5114": "Krefeld", - "5116": "Mönchengladbach", - "5117": "Mülheim an der Ruhr", - "5119": "Oberhausen", - "5120": "Remscheid", - "5122": "Solingen", - "5124": "Wuppertal", - "5154": "Kleve", - "5158": "Mettmann", - "5162": "Rhein-Kreis Neuss", - "5166": "Viersen", - "5170": "Wesel", - "5314": "Bonn", - "5315": "Köln", - "5316": "Leverkusen", - "5334": "Städteregion Aachen", - "5358": "Düren", - "5362": "Rhein-Erft-Kreis", - "5366": "Euskirchen", - "5370": "Heinsberg", - "5374": "Oberbergischer Kreis", - "5378": "Rheinisch-Bergischer Kreis", - "5382": "Rhein-Sieg-Kreis", - "5512": "Bottrop", - "5513": "Gelsenkirchen", - "5515": "Münster", - "5554": "Borken", - "5558": "Coesfeld", - "5562": "Recklinghausen", - "5566": "Steinfurt", - "5570": "Warendorf", - "5711": "Bielefeld", - "5754": "Gütersloh", - "5758": "Herford", - "5762": "Höxter", - "5766": "Lippe", - "5770": "Minden-Lübbecke", - "5774": "Paderborn", - "5911": "Bochum", - "5913": "Dortmund", - "5914": "Hagen", - "5915": "Hamm", - "5916": "Herne", - "5954": "Ennepe-Ruhr-Kreis", - "5958": "Hochsauerlandkreis", - "5962": "Märkischer Kreis", - "5966": "Olpe", - "5970": "Siegen-Wittgenstein", - "5974": "Soest", - "5978": "Unna", - "6411": "Darmstadt", - "6412": "Frankfurt am Main", - "6413": "Offenbach am Main", - "6414": "Wiesbaden", - "6431": "Bergstraße", - "6432": "Darmstadt-Dieburg", - "6433": "Groß-Gerau", - "6434": "Hochtaunuskreis", - "6435": "Main-Kinzig-Kreis", - "6436": "Main-Taunus-Kreis", - "6437": "Odenwaldkreis", - "6438": "Offenbach", - "6439": "Rheingau-Taunus-Kreis", - "6440": "Wetteraukreis", - "6531": "Gießen", - "6532": "Lahn-Dill-Kreis", - "6533": "Limburg-Weilburg", - "6534": "Marburg-Biedenkopf", - "6535": "Vogelsbergkreis", - "6611": "Kassel", - "6631": "Fulda", - "6632": "Hersfeld-Rotenburg", - "6633": "Kassel", - "6634": "Schwalm-Eder-Kreis", - "6635": "Waldeck-Frankenberg", - "6636": "Werra-Meißner-Kreis", - "7111": "Koblenz", - "7131": "Ahrweiler", - "7132": "Altenkirchen (Westerwald)", - "7133": "Bad Kreuznach", - "7134": "Birkenfeld", - "7135": "Cochem-Zell", - "7137": "Mayen-Koblenz", - "7138": "Neuwied", - "7140": "Rhein-Hunsrück-Kreis", - "7141": "Rhein-Lahn-Kreis", - "7143": "Westerwaldkreis", - "7211": "Trier", - "7231": "Bernkastel-Wittlich", - "7232": "Eifelkreis Bitburg-Prüm", - "7233": "Vulkaneifel", - "7235": "Trier-Saarburg", - "7311": "Frankenthal (Pfalz)", - "7312": "Kaiserslautern", - "7313": "Landau in der Pfalz", - "7314": "Ludwigshafen am Rhein", - "7315": "Mainz", - "7316": "Neustadt an der Weinstraße", - "7317": "Pirmasens", - "7318": "Speyer", - "7319": "Worms", - "7320": "Zweibrücken", - "7331": "Alzey-Worms", - "7332": "Bad Dürkheim", - "7333": "Donnersbergkreis", - "7334": "Germersheim", - "7335": "Kaiserslautern", - "7336": "Kusel", - "7337": "Südliche Weinstraße", - "7338": "Rhein-Pfalz-Kreis", - "7339": "Mainz-Bingen", - "7340": "Südwestpfalz", - "8111": "Stuttgart", - "8115": "Böblingen", - "8116": "Esslingen", - "8117": "Göppingen", - "8118": "Ludwigsburg", - "8119": "Rems-Murr-Kreis", - "8121": "Heilbronn", - "8125": "Heilbronn", - "8126": "Hohenlohekreis", - "8127": "Schwäbisch Hall", - "8128": "Main-Tauber-Kreis", - "8135": "Heidenheim", - "8136": "Ostalbkreis", - "8211": "Baden-Baden", - "8212": "Karlsruhe", - "8215": "Karlsruhe", - "8216": "Rastatt", - "8221": "Heidelberg", - "8222": "Mannheim", - "8225": "Neckar-Odenwald-Kreis", - "8226": "Rhein-Neckar-Kreis", - "8231": "Pforzheim", - "8235": "Calw", - "8236": "Enzkreis", - "8237": "Freudenstadt", - "8311": "Freiburg im Breisgau", - "8315": "Breisgau-Hochschwarzwald", - "8316": "Emmendingen", - "8317": "Ortenaukreis", - "8325": "Rottweil", - "8326": "Schwarzwald-Baar-Kreis", - "8327": "Tuttlingen", - "8335": "Konstanz", - "8336": "Lörrach", - "8337": "Waldshut", - "8415": "Reutlingen", - "8416": "Tübingen", - "8417": "Zollernalbkreis", - "8421": "Ulm", - "8425": "Alb-Donau-Kreis", - "8426": "Biberach", - "8435": "Bodenseekreis", - "8436": "Ravensburg", - "8437": "Sigmaringen", - "9161": "Ingolstadt", - "9162": "München", - "9163": "Rosenheim", - "9171": "Altötting", - "9172": "Berchtesgadener Land", - "9173": "Bad Tölz-Wolfratshausen", - "9174": "Dachau", - "9175": "Ebersberg", - "9176": "Eichstätt", - "9177": "Erding", - "9178": "Freising", - "9179": "Fürstenfeldbruck", - "9180": "Garmisch-Partenkirchen", - "9181": "Landsberg am Lech", - "9182": "Miesbach", - "9183": "Mühldorf a. Inn", - "9184": "München", - "9185": "Neuburg-Schrobenhausen", - "9186": "Pfaffenhofen a.d. Ilm", - "9187": "Rosenheim", - "9188": "Starnberg", - "9189": "Traunstein", - "9190": "Weilheim-Schongau", - "9261": "Landshut", - "9262": "Passau", - "9263": "Straubing", - "9271": "Deggendorf", - "9272": "Freyung-Grafenau", - "9273": "Kelheim", - "9274": "Landshut", - "9275": "Passau", - "9276": "Regen", - "9277": "Rottal-Inn", - "9278": "Straubing-Bogen", - "9279": "Dingolfing-Landau", - "9361": "Amberg", - "9362": "Regensburg", - "9363": "Weiden i.d. OPf.", - "9371": "Amberg-Sulzbach", - "9372": "Cham", - "9373": "Neumarkt i.d. OPf.", - "9374": "Neustadt a.d. Waldnaab", - "9375": "Regensburg", - "9376": "Schwandorf", - "9377": "Tirschenreuth", - "9461": "Bamberg", - "9462": "Bayreuth", - "9463": "Coburg", - "9464": "Hof", - "9471": "Bamberg", - "9472": "Bayreuth", - "9473": "Coburg", - "9474": "Forchheim", - "9475": "Hof", - "9476": "Kronach", - "9477": "Kulmbach", - "9478": "Lichtenfels", - "9479": "Wunsiedel i. Fichtelgebirge", - "9561": "Ansbach", - "9562": "Erlangen", - "9563": "Fürth", - "9564": "Nürnberg", - "9565": "Schwabach", - "9571": "Ansbach", - "9572": "Erlangen-Höchstadt", - "9573": "Fürth", - "9574": "Nürnberger Land", - "9575": "Neustadt a.d. Aisch-Bad Windsheim", - "9576": "Roth", - "9577": "Weißenburg-Gunzenhausen", - "9661": "Aschaffenburg", - "9662": "Schweinfurt", - "9663": "Würzburg", - "9671": "Aschaffenburg", - "9672": "Bad Kissingen", - "9673": "Rhön-Grabfeld", - "9674": "Haßberge", - "9675": "Kitzingen", - "9676": "Miltenberg", - "9677": "Main-Spessart", - "9678": "Schweinfurt", - "9679": "Würzburg", - "9761": "Augsburg", - "9762": "Kaufbeuren", - "9763": "Kempten (Allgäu)", - "9764": "Memmingen", - "9771": "Aichach-Friedberg", - "9772": "Augsburg", - "9773": "Dillingen a.d. Donau", - "9774": "Günzburg", - "9775": "Neu-Ulm", - "9776": "Lindau (Bodensee)", - "9777": "Ostallgäu", - "9778": "Unterallgäu", - "9779": "Donau-Ries", - "9780": "Oberallgäu", - "10041": "Regionalverband Saarbrücken", - "10042": "Merzig-Wadern", - "10043": "Neunkirchen", - "10044": "Saarlouis", - "10045": "Saarpfalz-Kreis", - "10046": "St. Wendel", - "11000": "Berlin", - "12051": "Brandenburg an der Havel", - "12052": "Cottbus", - "12053": "Frankfurt (Oder)", - "12054": "Potsdam", - "12060": "Barnim", - "12061": "Dahme-Spreewald", - "12062": "Elbe-Elster", - "12063": "Havelland", - "12064": "Märkisch-Oderland", - "12065": "Oberhavel", - "12066": "Oberspreewald-Lausitz", - "12067": "Oder-Spree", - "12068": "Ostprignitz-Ruppin", - "12069": "Potsdam-Mittelmark", - "12070": "Prignitz", - "12071": "Spree-Neiße", - "12072": "Teltow-Fläming", - "12073": "Uckermark", - "13003": "Rostock", - "13004": "Schwerin", - "13071": "Mecklenburgische Seenplatte", - "13072": "Rostock", - "13073": "Vorpommern-Rügen", - "13074": "Nordwestmecklenburg", - "13075": "Vorpommern-Greifswald", - "13076": "Ludwigslust-Parchim", - "14511": "Chemnitz", - "14521": "Erzgebirgskreis", - "14522": "Mittelsachsen", - "14523": "Vogtlandkreis", - "14524": "Zwickau", - "14612": "Dresden", - "14625": "Bautzen", - "14626": "Görlitz", - "14627": "Meißen", - "14628": "Sächsische Schweiz-Osterzgebirge", - "14713": "Leipzig", - "14729": "Leipzig", - "14730": "Nordsachsen", - "15001": "Dessau-Roßlau", - "15002": "Halle (Saale)", - "15003": "Magdeburg", - "15081": "Altmarkkreis Salzwedel", - "15082": "Anhalt-Bitterfeld", - "15083": "Börde", - "15084": "Burgenlandkreis", - "15085": "Harz", - "15086": "Jerichower Land", - "15087": "Mansfeld-Südharz", - "15088": "Saalekreis", - "15089": "Salzlandkreis", - "15090": "Stendal", - "15091": "Wittenberg", - "16051": "Erfurt", - "16052": "Gera", - "16053": "Jena", - "16054": "Suhl", - "16055": "Weimar", - "16056": "Eisenach", - "16061": "Eichsfeld", - "16062": "Nordhausen", - "16063": "Wartburgkreis", - "16064": "Unstrut-Hainich-Kreis", - "16065": "Kyffhäuserkreis", - "16066": "Schmalkalden-Meiningen", - "16067": "Gotha", - "16068": "Sömmerda", - "16069": "Hildburghausen", - "16070": "Ilm-Kreis", - "16071": "Weimarer Land", - "16072": "Sonneberg", - "16073": "Saalfeld-Rudolstadt", - "16074": "Saale-Holzland-Kreis", - "16075": "Saale-Orla-Kreis", - "16076": "Greiz", - "16077": "Altenburger Land" - }, - "id_long_lat_dict": { - "1001": { - "latitude": 54.78499143, - "longitude": 9.438526276 - }, - "1002": { - "latitude": 54.32478117, - "longitude": 10.13238827 - }, - "1003": { - "latitude": 53.87247398, - "longitude": 10.72754193 - }, - "1004": { - "latitude": 54.08112825, - "longitude": 9.984472136 - }, - "1051": { - "latitude": 54.13430838, - "longitude": 9.108279622 - }, - "1053": { - "latitude": 53.58901689, - "longitude": 10.60189618 - }, - "1054": { - "latitude": 54.61241677, - "longitude": 8.930415473 - }, - "1055": { - "latitude": 54.14715442, - "longitude": 10.76860626 - }, - "1056": { - "latitude": 53.7168105, - "longitude": 9.746151964 - }, - "1057": { - "latitude": 54.24333641, - "longitude": 10.36365486 - }, - "1058": { - "latitude": 54.28956768, - "longitude": 9.781657852 - }, - "1059": { - "latitude": 54.62329178, - "longitude": 9.498582469 - }, - "1060": { - "latitude": 53.91998066, - "longitude": 10.14090709 - }, - "1061": { - "latitude": 53.9290805, - "longitude": 9.519591646 - }, - "1062": { - "latitude": 53.72083528, - "longitude": 10.33191288 - }, - "2000": { - "latitude": 53.54464806, - "longitude": 10.02779711 - }, - "3101": { - "latitude": 52.27524539, - "longitude": 10.52407882 - }, - "3102": { - "latitude": 52.12443692, - "longitude": 10.37072343 - }, - "3103": { - "latitude": 52.41075772, - "longitude": 10.78489283 - }, - "3151": { - "latitude": 52.58026868, - "longitude": 10.60417648 - }, - "3153": { - "latitude": 51.87468173, - "longitude": 10.40042627 - }, - "3154": { - "latitude": 52.26074431, - "longitude": 10.88883072 - }, - "3155": { - "latitude": 51.74347469, - "longitude": 9.84904081 - }, - "3157": { - "latitude": 52.3041907, - "longitude": 10.25528367 - }, - "3158": { - "latitude": 52.13537991, - "longitude": 10.64707205 - }, - "3159": { - "latitude": 51.56400468, - "longitude": 10.08802527 - }, - "3241": { - "latitude": 52.42192535, - "longitude": 9.71976028 - }, - "3251": { - "latitude": 52.72847629, - "longitude": 8.70180596 - }, - "3252": { - "latitude": 52.09511169, - "longitude": 9.389887585 - }, - "3254": { - "latitude": 52.09022258, - "longitude": 9.943475625 - }, - "3255": { - "latitude": 51.88063792, - "longitude": 9.551417644 - }, - "3256": { - "latitude": 52.60922339, - "longitude": 9.114314017 - }, - "3257": { - "latitude": 52.29278741, - "longitude": 9.206557721 - }, - "3351": { - "latitude": 52.71332799, - "longitude": 10.10355554 - }, - "3352": { - "latitude": 53.61665215, - "longitude": 8.812362156 - }, - "3353": { - "latitude": 53.3157952, - "longitude": 9.962776462 - }, - "3354": { - "latitude": 53.01987092, - "longitude": 11.12291993 - }, - "3355": { - "latitude": 53.23258054, - "longitude": 10.57325595 - }, - "3356": { - "latitude": 53.25100694, - "longitude": 8.808081902 - }, - "3357": { - "latitude": 53.25075085, - "longitude": 9.306590359 - }, - "3358": { - "latitude": 52.92833235, - "longitude": 9.769417193 - }, - "3359": { - "latitude": 53.57859177, - "longitude": 9.417552462 - }, - "3360": { - "latitude": 52.98355365, - "longitude": 10.54807769 - }, - "3361": { - "latitude": 52.97321175, - "longitude": 9.175504504 - }, - "3401": { - "latitude": 53.04938787, - "longitude": 8.645647565 - }, - "3402": { - "latitude": 53.36106506, - "longitude": 7.180596161 - }, - "3403": { - "latitude": 53.14457286, - "longitude": 8.22434673 - }, - "3404": { - "latitude": 52.27768727, - "longitude": 8.047023139 - }, - "3405": { - "latitude": 53.56689069, - "longitude": 8.087481694 - }, - "3451": { - "latitude": 53.21849764, - "longitude": 8.013284201 - }, - "3452": { - "latitude": 53.48898786, - "longitude": 7.37770411 - }, - "3453": { - "latitude": 52.91100883, - "longitude": 7.904692894 - }, - "3454": { - "latitude": 52.7382944, - "longitude": 7.402692394 - }, - "3455": { - "latitude": 53.50538917, - "longitude": 7.983639254 - }, - "3456": { - "latitude": 52.47605658, - "longitude": 7.019858332 - }, - "3457": { - "latitude": 53.23033873, - "longitude": 7.501005926 - }, - "3458": { - "latitude": 52.98807436, - "longitude": 8.389377501 - }, - "3459": { - "latitude": 52.38158057, - "longitude": 8.045109543 - }, - "3460": { - "latitude": 52.66019319, - "longitude": 8.223054929 - }, - "3461": { - "latitude": 53.35583736, - "longitude": 8.390154673 - }, - "3462": { - "latitude": 53.56465268, - "longitude": 7.710416629 - }, - "4011": { - "latitude": 53.10864765, - "longitude": 8.786053351 - }, - "4012": { - "latitude": 53.53760742, - "longitude": 8.585909614 - }, - "5111": { - "latitude": 51.23549702, - "longitude": 6.810112154 - }, - "5112": { - "latitude": 51.43963151, - "longitude": 6.734695141 - }, - "5113": { - "latitude": 51.43384363, - "longitude": 7.017118099 - }, - "5114": { - "latitude": 51.34524742, - "longitude": 6.579680193 - }, - "5116": { - "latitude": 51.16719272, - "longitude": 6.411956263 - }, - "5117": { - "latitude": 51.4137612, - "longitude": 6.878444796 - }, - "5119": { - "latitude": 51.51315177, - "longitude": 6.847110075 - }, - "5120": { - "latitude": 51.18270152, - "longitude": 7.224042512 - }, - "5122": { - "latitude": 51.16245671, - "longitude": 7.066093293 - }, - "5124": { - "latitude": 51.25064786, - "longitude": 7.168898777 - }, - "5154": { - "latitude": 51.65236955, - "longitude": 6.258811596 - }, - "5158": { - "latitude": 51.25707712, - "longitude": 6.969038878 - }, - "5162": { - "latitude": 51.14358626, - "longitude": 6.649333949 - }, - "5166": { - "latitude": 51.28282025, - "longitude": 6.326141652 - }, - "5170": { - "latitude": 51.62703131, - "longitude": 6.61836304 - }, - "5314": { - "latitude": 50.70581236, - "longitude": 7.109812436 - }, - "5315": { - "latitude": 50.94563178, - "longitude": 6.973329047 - }, - "5316": { - "latitude": 51.05307708, - "longitude": 7.015448384 - }, - "5334": { - "latitude": 50.73271433, - "longitude": 6.216943675 - }, - "5358": { - "latitude": 50.81795399, - "longitude": 6.445573696 - }, - "5362": { - "latitude": 50.90502138, - "longitude": 6.716423978 - }, - "5366": { - "latitude": 50.53644657, - "longitude": 6.644139311 - }, - "5370": { - "latitude": 51.04936412, - "longitude": 6.164056908 - }, - "5374": { - "latitude": 51.01270438, - "longitude": 7.516635988 - }, - "5378": { - "latitude": 51.02304111, - "longitude": 7.194871374 - }, - "5382": { - "latitude": 50.76062399, - "longitude": 7.234527874 - }, - "5512": { - "latitude": 51.57170411, - "longitude": 6.920109665 - }, - "5513": { - "latitude": 51.55393402, - "longitude": 7.071173476 - }, - "5515": { - "latitude": 51.95431708, - "longitude": 7.623650206 - }, - "5554": { - "latitude": 51.96131968, - "longitude": 6.899622827 - }, - "5558": { - "latitude": 51.86685307, - "longitude": 7.366004765 - }, - "5562": { - "latitude": 51.67246189, - "longitude": 7.159238658 - }, - "5566": { - "latitude": 52.21154118, - "longitude": 7.579458979 - }, - "5570": { - "latitude": 51.87021706, - "longitude": 7.958306779 - }, - "5711": { - "latitude": 52.01093837, - "longitude": 8.540748874 - }, - "5754": { - "latitude": 51.9317135, - "longitude": 8.351386393 - }, - "5758": { - "latitude": 52.16757825, - "longitude": 8.64391673 - }, - "5762": { - "latitude": 51.68494697, - "longitude": 9.178096865 - }, - "5766": { - "latitude": 51.98142544, - "longitude": 8.950840398 - }, - "5770": { - "latitude": 52.35248116, - "longitude": 8.739306612 - }, - "5774": { - "latitude": 51.66417547, - "longitude": 8.719642014 - }, - "5911": { - "latitude": 51.4699074, - "longitude": 7.224971144 - }, - "5913": { - "latitude": 51.51607333, - "longitude": 7.474891619 - }, - "5914": { - "latitude": 51.34804052, - "longitude": 7.497555819 - }, - "5915": { - "latitude": 51.6651745, - "longitude": 7.823585935 - }, - "5916": { - "latitude": 51.53753118, - "longitude": 7.208558212 - }, - "5954": { - "latitude": 51.3468136, - "longitude": 7.324043514 - }, - "5958": { - "latitude": 51.30682718, - "longitude": 8.38507291 - }, - "5962": { - "latitude": 51.26256356, - "longitude": 7.713035558 - }, - "5966": { - "latitude": 51.08615726, - "longitude": 7.976553382 - }, - "5970": { - "latitude": 50.9377125, - "longitude": 8.195148231 - }, - "5974": { - "latitude": 51.56442398, - "longitude": 8.217448271 - }, - "5978": { - "latitude": 51.5785655, - "longitude": 7.636438665 - }, - "6411": { - "latitude": 49.88146898, - "longitude": 8.664710629 - }, - "6412": { - "latitude": 50.11795975, - "longitude": 8.644191898 - }, - "6413": { - "latitude": 50.09107954, - "longitude": 8.780963136 - }, - "6414": { - "latitude": 50.07918214, - "longitude": 8.26036399 - }, - "6431": { - "latitude": 49.6315255, - "longitude": 8.643315997 - }, - "6432": { - "latitude": 49.8555076, - "longitude": 8.795508986 - }, - "6433": { - "latitude": 49.90444677, - "longitude": 8.470258715 - }, - "6434": { - "latitude": 50.28160567, - "longitude": 8.504665277 - }, - "6435": { - "latitude": 50.2438568, - "longitude": 9.286248162 - }, - "6436": { - "latitude": 50.10258339, - "longitude": 8.434545053 - }, - "6437": { - "latitude": 49.67160004, - "longitude": 8.979518316 - }, - "6438": { - "latitude": 50.0216799, - "longitude": 8.81138751 - }, - "6439": { - "latitude": 50.14198446, - "longitude": 8.081146235 - }, - "6440": { - "latitude": 50.35476863, - "longitude": 8.907686801 - }, - "6531": { - "latitude": 50.5702658, - "longitude": 8.807509665 - }, - "6532": { - "latitude": 50.6482606, - "longitude": 8.365314623 - }, - "6533": { - "latitude": 50.42743701, - "longitude": 8.199443166 - }, - "6534": { - "latitude": 50.83686289, - "longitude": 8.738042772 - }, - "6535": { - "latitude": 50.63811826, - "longitude": 9.271369961 - }, - "6611": { - "latitude": 51.31111837, - "longitude": 9.459667461 - }, - "6631": { - "latitude": 50.56388719, - "longitude": 9.759138835 - }, - "6632": { - "latitude": 50.90619473, - "longitude": 9.752957654 - }, - "6633": { - "latitude": 51.40131123, - "longitude": 9.407000496 - }, - "6634": { - "latitude": 51.02377742, - "longitude": 9.373661649 - }, - "6635": { - "latitude": 51.19067688, - "longitude": 8.88887926 - }, - "6636": { - "latitude": 51.19076781, - "longitude": 9.928894625 - }, - "7111": { - "latitude": 50.3485287, - "longitude": 7.57953565 - }, - "7131": { - "latitude": 50.4675902, - "longitude": 7.0449864 - }, - "7132": { - "latitude": 50.7507597, - "longitude": 7.744144543 - }, - "7133": { - "latitude": 49.82480979, - "longitude": 7.686668845 - }, - "7134": { - "latitude": 49.7125422, - "longitude": 7.277641646 - }, - "7135": { - "latitude": 50.1328709, - "longitude": 7.174300256 - }, - "7137": { - "latitude": 50.33160337, - "longitude": 7.332182423 - }, - "7138": { - "latitude": 50.55762661, - "longitude": 7.468654055 - }, - "7140": { - "latitude": 50.04422496, - "longitude": 7.500111918 - }, - "7141": { - "latitude": 50.26330132, - "longitude": 7.842716188 - }, - "7143": { - "latitude": 50.55240974, - "longitude": 7.865548684 - }, - "7211": { - "latitude": 49.76267249, - "longitude": 6.654939575 - }, - "7231": { - "latitude": 49.92464924, - "longitude": 6.967288147 - }, - "7232": { - "latitude": 50.06215092, - "longitude": 6.410157651 - }, - "7233": { - "latitude": 50.23833782, - "longitude": 6.74863957 - }, - "7235": { - "latitude": 49.70283715, - "longitude": 6.691385285 - }, - "7311": { - "latitude": 49.5330493, - "longitude": 8.356870852 - }, - "7312": { - "latitude": 49.43285405, - "longitude": 7.760678418 - }, - "7313": { - "latitude": 49.19621993, - "longitude": 8.110007989 - }, - "7314": { - "latitude": 49.4821073, - "longitude": 8.396851247 - }, - "7315": { - "latitude": 49.97420419, - "longitude": 8.241504929 - }, - "7316": { - "latitude": 49.3418748, - "longitude": 8.152293845 - }, - "7317": { - "latitude": 49.19716522, - "longitude": 7.594466358 - }, - "7318": { - "latitude": 49.32969817, - "longitude": 8.434998626 - }, - "7319": { - "latitude": 49.6494338, - "longitude": 8.32451399 - }, - "7320": { - "latitude": 49.24818998, - "longitude": 7.365396083 - }, - "7331": { - "latitude": 49.75943872, - "longitude": 8.157198177 - }, - "7332": { - "latitude": 49.45301655, - "longitude": 8.110309282 - }, - "7333": { - "latitude": 49.63196661, - "longitude": 7.915031005 - }, - "7334": { - "latitude": 49.11590051, - "longitude": 8.246200708 - }, - "7335": { - "latitude": 49.44622254, - "longitude": 7.684952761 - }, - "7336": { - "latitude": 49.5498302, - "longitude": 7.471312528 - }, - "7337": { - "latitude": 49.19085905, - "longitude": 8.053039261 - }, - "7338": { - "latitude": 49.41666735, - "longitude": 8.360674808 - }, - "7339": { - "latitude": 49.92203265, - "longitude": 8.079571357 - }, - "7340": { - "latitude": 49.20759963, - "longitude": 7.654937969 - }, - "8111": { - "latitude": 48.77457498, - "longitude": 9.172065297 - }, - "8115": { - "latitude": 48.67821584, - "longitude": 8.942758983 - }, - "8116": { - "latitude": 48.6480568, - "longitude": 9.369156679 - }, - "8117": { - "latitude": 48.66319807, - "longitude": 9.717528039 - }, - "8118": { - "latitude": 48.94004962, - "longitude": 9.123031952 - }, - "8119": { - "latitude": 48.89899498, - "longitude": 9.501238799 - }, - "8121": { - "latitude": 49.15273179, - "longitude": 9.182309139 - }, - "8125": { - "latitude": 49.17514098, - "longitude": 9.190078174 - }, - "8126": { - "latitude": 49.27154214, - "longitude": 9.614137776 - }, - "8127": { - "latitude": 49.14447453, - "longitude": 9.908938449 - }, - "8128": { - "latitude": 49.56069626, - "longitude": 9.725083737 - }, - "8135": { - "latitude": 48.66234869, - "longitude": 10.18212653 - }, - "8136": { - "latitude": 48.87758722, - "longitude": 10.0902538 - }, - "8211": { - "latitude": 48.7483584, - "longitude": 8.232095159 - }, - "8212": { - "latitude": 49.01130384, - "longitude": 8.412726432 - }, - "8215": { - "latitude": 49.0820589, - "longitude": 8.562917221 - }, - "8216": { - "latitude": 48.75959185, - "longitude": 8.239384415 - }, - "8221": { - "latitude": 49.40550878, - "longitude": 8.694169669 - }, - "8222": { - "latitude": 49.49941964, - "longitude": 8.500322697 - }, - "8225": { - "latitude": 49.4666103, - "longitude": 9.280108116 - }, - "8226": { - "latitude": 49.36820804, - "longitude": 8.766457917 - }, - "8231": { - "latitude": 48.87645555, - "longitude": 8.712640829 - }, - "8235": { - "latitude": 48.67900424, - "longitude": 8.635764109 - }, - "8236": { - "latitude": 48.9144673, - "longitude": 8.737092173 - }, - "8237": { - "latitude": 48.47439268, - "longitude": 8.465302987 - }, - "8311": { - "latitude": 47.99257309, - "longitude": 7.818044583 - }, - "8315": { - "latitude": 47.9249, - "longitude": 7.924958305 - }, - "8316": { - "latitude": 48.14849866, - "longitude": 7.897579821 - }, - "8317": { - "latitude": 48.42070763, - "longitude": 8.016193841 - }, - "8325": { - "latitude": 48.25421807, - "longitude": 8.532365445 - }, - "8326": { - "latitude": 48.01911195, - "longitude": 8.410979278 - }, - "8327": { - "latitude": 48.01119886, - "longitude": 8.794126433 - }, - "8335": { - "latitude": 47.79922178, - "longitude": 8.912063282 - }, - "8336": { - "latitude": 47.7035043, - "longitude": 7.774026581 - }, - "8337": { - "latitude": 47.69713061, - "longitude": 8.218883991 - }, - "8415": { - "latitude": 48.40648612, - "longitude": 9.365681378 - }, - "8416": { - "latitude": 48.48177349, - "longitude": 8.987667094 - }, - "8417": { - "latitude": 48.26724973, - "longitude": 8.937460166 - }, - "8421": { - "latitude": 48.39083769, - "longitude": 9.949976287 - }, - "8425": { - "latitude": 48.40171329, - "longitude": 9.827430036 - }, - "8426": { - "latitude": 48.10757541, - "longitude": 9.774282197 - }, - "8435": { - "latitude": 47.73344928, - "longitude": 9.400789224 - }, - "8436": { - "latitude": 47.82504636, - "longitude": 9.779891491 - }, - "8437": { - "latitude": 48.03910937, - "longitude": 9.241020288 - }, - "9161": { - "latitude": 48.75511759, - "longitude": 11.39493046 - }, - "9162": { - "latitude": 48.15321126, - "longitude": 11.54725483 - }, - "9163": { - "latitude": 47.84445498, - "longitude": 12.10926148 - }, - "9171": { - "latitude": 48.20980376, - "longitude": 12.7052813 - }, - "9172": { - "latitude": 47.6985204, - "longitude": 12.9018428 - }, - "9173": { - "latitude": 47.72748205, - "longitude": 11.48311528 - }, - "9174": { - "latitude": 48.33454593, - "longitude": 11.35711068 - }, - "9175": { - "latitude": 48.07617727, - "longitude": 11.91317409 - }, - "9176": { - "latitude": 48.89808256, - "longitude": 11.37043114 - }, - "9177": { - "latitude": 48.3004063, - "longitude": 12.0006394 - }, - "9178": { - "latitude": 48.44735332, - "longitude": 11.74065799 - }, - "9179": { - "latitude": 48.18779189, - "longitude": 11.20107331 - }, - "9180": { - "latitude": 47.55635599, - "longitude": 11.12959614 - }, - "9181": { - "latitude": 48.02444572, - "longitude": 10.94873714 - }, - "9182": { - "latitude": 47.74163065, - "longitude": 11.80899896 - }, - "9183": { - "latitude": 48.23933709, - "longitude": 12.38185189 - }, - "9184": { - "latitude": 48.07446399, - "longitude": 11.63136477 - }, - "9185": { - "latitude": 48.6644226, - "longitude": 11.1972131 - }, - "9186": { - "latitude": 48.59623387, - "longitude": 11.52424651 - }, - "9187": { - "latitude": 47.87759815, - "longitude": 12.16100052 - }, - "9188": { - "latitude": 48.00604516, - "longitude": 11.28172991 - }, - "9189": { - "latitude": 47.89448577, - "longitude": 12.57922742 - }, - "9190": { - "latitude": 47.78753573, - "longitude": 11.04831763 - }, - "9261": { - "latitude": 48.5447166, - "longitude": 12.1594713 - }, - "9262": { - "latitude": 48.58208839, - "longitude": 13.41504248 - }, - "9263": { - "latitude": 48.88079176, - "longitude": 12.57357072 - }, - "9271": { - "latitude": 48.77870397, - "longitude": 13.00069574 - }, - "9272": { - "latitude": 48.826878, - "longitude": 13.51327762 - }, - "9273": { - "latitude": 48.82493162, - "longitude": 11.85757577 - }, - "9274": { - "latitude": 48.55713937, - "longitude": 12.19371651 - }, - "9275": { - "latitude": 48.55868039, - "longitude": 13.36660507 - }, - "9276": { - "latitude": 49.02280754, - "longitude": 13.09978486 - }, - "9277": { - "latitude": 48.42450937, - "longitude": 12.86736073 - }, - "9278": { - "latitude": 48.89870419, - "longitude": 12.58192164 - }, - "9279": { - "latitude": 48.64116257, - "longitude": 12.61048287 - }, - "9361": { - "latitude": 49.45092776, - "longitude": 11.84537238 - }, - "9362": { - "latitude": 49.01304178, - "longitude": 12.1136698 - }, - "9363": { - "latitude": 49.66925363, - "longitude": 12.15453331 - }, - "9371": { - "latitude": 49.4853708, - "longitude": 11.8026684 - }, - "9372": { - "latitude": 49.23710323, - "longitude": 12.69425443 - }, - "9373": { - "latitude": 49.21596486, - "longitude": 11.56655699 - }, - "9374": { - "latitude": 49.68577445, - "longitude": 12.10088618 - }, - "9375": { - "latitude": 49.02090162, - "longitude": 12.1207451 - }, - "9376": { - "latitude": 49.36854145, - "longitude": 12.2524909 - }, - "9377": { - "latitude": 49.8993859, - "longitude": 12.20038102 - }, - "9461": { - "latitude": 49.88724017, - "longitude": 10.89891168 - }, - "9462": { - "latitude": 49.93760716, - "longitude": 11.58541791 - }, - "9463": { - "latitude": 50.26393528, - "longitude": 10.96446161 - }, - "9464": { - "latitude": 50.31079544, - "longitude": 11.89726316 - }, - "9471": { - "latitude": 49.89320206, - "longitude": 10.88435009 - }, - "9472": { - "latitude": 49.88646998, - "longitude": 11.55665121 - }, - "9473": { - "latitude": 50.26759516, - "longitude": 10.94398405 - }, - "9474": { - "latitude": 49.72099297, - "longitude": 11.17312728 - }, - "9475": { - "latitude": 50.27551107, - "longitude": 11.82396983 - }, - "9476": { - "latitude": 50.32796177, - "longitude": 11.37204305 - }, - "9477": { - "latitude": 50.10263762, - "longitude": 11.48228845 - }, - "9478": { - "latitude": 50.10933445, - "longitude": 11.116915 - }, - "9479": { - "latitude": 50.09014557, - "longitude": 12.04187953 - }, - "9561": { - "latitude": 49.29218205, - "longitude": 10.56367918 - }, - "9562": { - "latitude": 49.58233615, - "longitude": 10.97814784 - }, - "9563": { - "latitude": 49.49141911, - "longitude": 10.96548145 - }, - "9564": { - "latitude": 49.4364161, - "longitude": 11.07928128 - }, - "9565": { - "latitude": 49.3356278, - "longitude": 11.02350756 - }, - "9571": { - "latitude": 49.25027754, - "longitude": 10.47274533 - }, - "9572": { - "latitude": 49.64013313, - "longitude": 10.91483917 - }, - "9573": { - "latitude": 49.44669215, - "longitude": 10.84969119 - }, - "9574": { - "latitude": 49.49161682, - "longitude": 11.36893423 - }, - "9575": { - "latitude": 49.56947034, - "longitude": 10.46527247 - }, - "9576": { - "latitude": 49.20292191, - "longitude": 11.12356141 - }, - "9577": { - "latitude": 49.03268078, - "longitude": 10.89365078 - }, - "9661": { - "latitude": 49.96385669, - "longitude": 9.145838215 - }, - "9662": { - "latitude": 50.04701402, - "longitude": 10.22086754 - }, - "9663": { - "latitude": 49.78466315, - "longitude": 9.940873523 - }, - "9671": { - "latitude": 50.00810837, - "longitude": 9.237993756 - }, - "9672": { - "latitude": 50.22251912, - "longitude": 9.964728711 - }, - "9673": { - "latitude": 50.3713269, - "longitude": 10.25493302 - }, - "9674": { - "latitude": 50.06289608, - "longitude": 10.60695833 - }, - "9675": { - "latitude": 49.7532309, - "longitude": 10.25605069 - }, - "9676": { - "latitude": 49.75731913, - "longitude": 9.234768469 - }, - "9677": { - "latitude": 49.99358855, - "longitude": 9.662693241 - }, - "9678": { - "latitude": 50.01806599, - "longitude": 10.25835149 - }, - "9679": { - "latitude": 49.74153416, - "longitude": 9.928483977 - }, - "9761": { - "latitude": 48.34559138, - "longitude": 10.88550435 - }, - "9762": { - "latitude": 47.87992821, - "longitude": 10.6160972 - }, - "9763": { - "latitude": 47.7382078, - "longitude": 10.30811807 - }, - "9764": { - "latitude": 47.97877001, - "longitude": 10.16302421 - }, - "9771": { - "latitude": 48.42757441, - "longitude": 11.0527562 - }, - "9772": { - "latitude": 48.35428948, - "longitude": 10.73208177 - }, - "9773": { - "latitude": 48.59642145, - "longitude": 10.52780668 - }, - "9774": { - "latitude": 48.35282377, - "longitude": 10.38112109 - }, - "9775": { - "latitude": 48.29821942, - "longitude": 10.14116253 - }, - "9776": { - "latitude": 47.60516735, - "longitude": 9.882882289 - }, - "9777": { - "latitude": 47.77309701, - "longitude": 10.63901235 - }, - "9778": { - "latitude": 48.04025698, - "longitude": 10.39146544 - }, - "9779": { - "latitude": 48.80694422, - "longitude": 10.71234094 - }, - "9780": { - "latitude": 47.57929735, - "longitude": 10.26059348 - }, - "10041": { - "latitude": 49.25137892, - "longitude": 6.95730354 - }, - "10042": { - "latitude": 49.49574562, - "longitude": 6.680496057 - }, - "10043": { - "latitude": 49.37570489, - "longitude": 7.117182518 - }, - "10044": { - "latitude": 49.35533745, - "longitude": 6.775578271 - }, - "10045": { - "latitude": 49.24870675, - "longitude": 7.242227643 - }, - "10046": { - "latitude": 49.51956734, - "longitude": 7.100432037 - }, - "11000": { - "latitude": 52.50152678, - "longitude": 13.40185884 - }, - "12051": { - "latitude": 52.40208229, - "longitude": 12.51835974 - }, - "12052": { - "latitude": 51.77261013, - "longitude": 14.36630665 - }, - "12053": { - "latitude": 52.32477632, - "longitude": 14.49030946 - }, - "12054": { - "latitude": 52.42615897, - "longitude": 13.02871262 - }, - "12060": { - "latitude": 52.82323177, - "longitude": 13.70371266 - }, - "12061": { - "latitude": 52.04234536, - "longitude": 13.81999294 - }, - "12062": { - "latitude": 51.61227178, - "longitude": 13.45958701 - }, - "12063": { - "latitude": 52.62081986, - "longitude": 12.62833849 - }, - "12064": { - "latitude": 52.60671694, - "longitude": 14.14646617 - }, - "12065": { - "latitude": 52.90682319, - "longitude": 13.20528592 - }, - "12066": { - "latitude": 51.61629334, - "longitude": 13.94364035 - }, - "12067": { - "latitude": 52.24401799, - "longitude": 14.21905384 - }, - "12068": { - "latitude": 52.99142648, - "longitude": 12.63596676 - }, - "12069": { - "latitude": 52.24630739, - "longitude": 12.68919983 - }, - "12070": { - "latitude": 53.10932738, - "longitude": 11.96181994 - }, - "12071": { - "latitude": 51.75989022, - "longitude": 14.42708466 - }, - "12072": { - "latitude": 52.07311936, - "longitude": 13.27606211 - }, - "12073": { - "latitude": 53.20589681, - "longitude": 13.86128369 - }, - "13003": { - "latitude": 54.14732681, - "longitude": 12.14323974 - }, - "13004": { - "latitude": 53.62144759, - "longitude": 11.41656508 - }, - "13071": { - "latitude": 53.54367932, - "longitude": 13.00242564 - }, - "13072": { - "latitude": 53.91197224, - "longitude": 12.22119463 - }, - "13073": { - "latitude": 54.21308189, - "longitude": 12.8143722 - }, - "13074": { - "latitude": 53.81854708, - "longitude": 11.24903258 - }, - "13075": { - "latitude": 53.76893892, - "longitude": 13.75792156 - }, - "13076": { - "latitude": 53.44997794, - "longitude": 11.53411327 - }, - "14511": { - "latitude": 50.82630306, - "longitude": 12.91182747 - }, - "14521": { - "latitude": 50.60889702, - "longitude": 12.94508712 - }, - "14522": { - "latitude": 50.95580246, - "longitude": 13.13750992 - }, - "14523": { - "latitude": 50.4567978, - "longitude": 12.23499468 - }, - "14524": { - "latitude": 50.7507535, - "longitude": 12.52580634 - }, - "14612": { - "latitude": 51.06645315, - "longitude": 13.78344382 - }, - "14625": { - "latitude": 51.26891701, - "longitude": 14.23102022 - }, - "14626": { - "latitude": 51.22561918, - "longitude": 14.75080399 - }, - "14627": { - "latitude": 51.23940811, - "longitude": 13.48291531 - }, - "14628": { - "latitude": 50.91671852, - "longitude": 13.87342203 - }, - "14713": { - "latitude": 51.34220352, - "longitude": 12.37477101 - }, - "14729": { - "latitude": 51.22143931, - "longitude": 12.59950804 - }, - "14730": { - "latitude": 51.47285639, - "longitude": 12.77939799 - }, - "15001": { - "latitude": 51.85368859, - "longitude": 12.23112296 - }, - "15002": { - "latitude": 51.47978051, - "longitude": 11.96849524 - }, - "15003": { - "latitude": 52.11654232, - "longitude": 11.64140326 - }, - "15081": { - "latitude": 52.68003809, - "longitude": 11.22701648 - }, - "15082": { - "latitude": 51.79544988, - "longitude": 12.14325164 - }, - "15083": { - "latitude": 52.22074691, - "longitude": 11.34786993 - }, - "15084": { - "latitude": 51.14721691, - "longitude": 11.8834987 - }, - "15085": { - "latitude": 51.82130296, - "longitude": 10.95855928 - }, - "15086": { - "latitude": 52.26079231, - "longitude": 12.02655479 - }, - "15087": { - "latitude": 51.53568373, - "longitude": 11.35634921 - }, - "15088": { - "latitude": 51.43038034, - "longitude": 11.87456712 - }, - "15089": { - "latitude": 51.8515954, - "longitude": 11.6426268 - }, - "15090": { - "latitude": 52.69730536, - "longitude": 11.83956221 - }, - "15091": { - "latitude": 51.82013838, - "longitude": 12.70157742 - }, - "16051": { - "latitude": 50.98325181, - "longitude": 11.02021509 - }, - "16052": { - "latitude": 50.89400185, - "longitude": 12.08268889 - }, - "16053": { - "latitude": 50.92425657, - "longitude": 11.58697051 - }, - "16054": { - "latitude": 50.61163007, - "longitude": 10.68820286 - }, - "16055": { - "latitude": 50.97833209, - "longitude": 11.31788271 - }, - "16056": { - "latitude": 50.98967169, - "longitude": 10.3001055 - }, - "16061": { - "latitude": 51.38365072, - "longitude": 10.25352594 - }, - "16062": { - "latitude": 51.50229666, - "longitude": 10.73096345 - }, - "16063": { - "latitude": 50.88578797, - "longitude": 10.21071746 - }, - "16064": { - "latitude": 51.18523423, - "longitude": 10.55179935 - }, - "16065": { - "latitude": 51.3247581, - "longitude": 10.98482499 - }, - "16066": { - "latitude": 50.63068729, - "longitude": 10.40502751 - }, - "16067": { - "latitude": 50.91066058, - "longitude": 10.69376416 - }, - "16068": { - "latitude": 51.15781365, - "longitude": 11.15481702 - }, - "16069": { - "latitude": 50.43400294, - "longitude": 10.73410087 - }, - "16070": { - "latitude": 50.73792732, - "longitude": 10.96635648 - }, - "16071": { - "latitude": 50.97222098, - "longitude": 11.36824925 - }, - "16072": { - "latitude": 50.41461675, - "longitude": 11.13294655 - }, - "16073": { - "latitude": 50.63779278, - "longitude": 11.30912626 - }, - "16074": { - "latitude": 50.90417537, - "longitude": 11.73153068 - }, - "16075": { - "latitude": 50.58085728, - "longitude": 11.71058094 - }, - "16076": { - "latitude": 50.7484495, - "longitude": 12.07407589 - }, - "16077": { - "latitude": 50.95642189, - "longitude": 12.39912125 - } - } -} \ No newline at end of file diff --git a/ingestion/functions/parsing/germany/germany.py b/ingestion/functions/parsing/germany/germany.py deleted file mode 100644 index 22b6c56d8..000000000 --- a/ingestion/functions/parsing/germany/germany.py +++ /dev/null @@ -1,172 +0,0 @@ -import os -import sys -from datetime import datetime -import csv -import json -import common.ingestion_logging as logging - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - -logger = logging.getLogger(__name__) - -_DATE_INDEX = "Meldedatum" -_AGE_INDEX = "Altersgruppe" -_GENDER_INDEX = "Geschlecht" -_CASECOUNT = "AnzahlFall" -_DEATHCOUNT = "AnzahlTodesfall" -_RECOVERYCOUNT = "AnzahlGenesen" -_ADMIN1 = "Bundesland" -_ADMIN3_ID = "IdLandkreis" -_DATE_ONSET_SYMPTOMS = "Refdatum" -_ONSET_DATE_PROVIDED = "IstErkrankungsbeginn" - -# The German admin3 entries are very often not accepted by mapbox and so need to be cross-referenced with data from Nationale Plattform für geographische Daten (https://npgeo-corona-npgeo-de.hub.arcgis.com/datasets/esri-de-content::kreisgrenzen-2019) to extract longitude and latitude information. -# This way we can collect geographic information down to admin level 3 but without relying on mapbox -# This data has been collated into two dictionaries -with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "dictionaries.json")) as json_file: - dictionaries = json.load(json_file) - -_LOCATION_ID_MAP = dictionaries["name_id_dict"] - -_LOCATION_LAT_LONG_MAP = dictionaries["id_long_lat_dict"] - - -def convert_date(raw_date): - """ - Convert raw date field into a value interpretable by the dataserver. - """ - date = datetime.strptime(raw_date.split(" ")[0], "%Y/%m/%d") - return date.strftime("%m/%d/%YZ") - - -def convert_gender(raw_gender): - if raw_gender == "M": - return "Male" - if raw_gender == "W": - return "Female" - - -def convert_age(age: str): - """ - Convert age string. - All age ranges in format AXX-AXX with X = numeric. - Exception: A80+ - """ - age_range = age.split("-") - if len(age_range) > 1: - return { - "start": float(age_range[0][1:3]), - "end": float(age_range[1][1:3]), - } - else: - return { - "start": 80.0, - "end": 120.0, - } - - -def convert_demographics(gender: str, age: str): - if not gender and not age: - return None - demo = {} - if gender: - demo["gender"] = convert_gender(gender) - if age: - demo["ageRange"] = convert_age(age) - return demo - - -def convert_location(admin1, admin3_id): - location = {} - geometry = {} - # Some entries have leading zeros which are not recognized - admin3_id = (admin3_id[1:] if admin3_id.startswith('0') else admin3_id) - if admin3_id in _LOCATION_ID_MAP.keys(): - # Matching by ID rather than name is more robust to things like formatting differences or slight differences in spelling/abbreviation - location["administrativeAreaLevel3"] = _LOCATION_ID_MAP[admin3_id] - location["country"] = "Germany" - location["administrativeAreaLevel1"] = admin1 - location["geoResolution"] = "Point" - location["name"] = ", ".join([_LOCATION_ID_MAP[admin3_id], admin1, "Germany"]) - - geometry["latitude"] = _LOCATION_LAT_LONG_MAP[admin3_id]["latitude"] - geometry["longitude"] = _LOCATION_LAT_LONG_MAP[admin3_id]["longitude"] - location["geometry"] = geometry - else: - # Some entries are still not recognized and will therefore be geocoded at admin1 level. - # In e2e testing these were limited to the subdivisions of Berlin which are officially admin level 2 and so where not present in the source data used. - logger.warning(f'Unknown administrative district: {admin3_id}') - location["query"] = ", ".join([admin1, "Germany"]) - if location: - return location - else: - return None - - -def parse_cases(raw_data_file: str, source_id: str, source_url: str): - """ - Parses G.h-format case data from raw API data. - """ - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f, delimiter=",") - for row in reader: - num_confirmed_cases = int(row[_CASECOUNT]) - if num_confirmed_cases < 1: - continue - try: - case = { - "caseReference": {"sourceId": source_id, "sourceUrl": source_url}, - "location": convert_location(row[_ADMIN1], row[_ADMIN3_ID]), - "events": [ - { - "name": "confirmed", - "dateRange": { - "start": convert_date(row[_DATE_INDEX]), - "end": convert_date(row[_DATE_INDEX]), - }, - }, - ], - "demographics": convert_demographics( - row[_GENDER_INDEX], row[_AGE_INDEX] - ), - } - # Death and recovery counts are always equal to case counts for the row. - if int(row[_DEATHCOUNT]) > 0: - case["events"].append( - {"name": "outcome", "value": "Death"}) - elif int(row[_RECOVERYCOUNT]) > 0: - case["events"].append( - {"name": "outcome", "value": "Recovered"}) - if int(row[_ONSET_DATE_PROVIDED]) == 1: - case["events"].append({ - "name": "onsetSymptoms", - "dateRange": - { - "start": convert_date(row[_DATE_ONSET_SYMPTOMS]), - "end": convert_date(row[_DATE_ONSET_SYMPTOMS]) - } - }) - for _ in range(num_confirmed_cases): - yield case - except ValueError as ve: - raise ValueError("Unhandled data: {}".format(ve)) - - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/germany/germany_test.py b/ingestion/functions/parsing/germany/germany_test.py deleted file mode 100644 index 7cebb7e34..000000000 --- a/ingestion/functions/parsing/germany/germany_test.py +++ /dev/null @@ -1,89 +0,0 @@ -import os -import unittest - -from germany import germany - -_SOURCE_ID = "abc123" -_SOURCE_URL = "foo.bar" -_PARSED_CASE = [ - { - "caseReference": { - "sourceId": "abc123", - "sourceUrl": "foo.bar" - }, - "location": { - "administrativeAreaLevel3": "Flensburg", - "country": "Germany", - "administrativeAreaLevel1": "Schleswig-Holstein", - "geoResolution": "Point", - "name": "Flensburg, Schleswig-Holstein, Germany", - "geometry": { - "latitude": 54.78499143, - "longitude": 9.438526276 - } - }, - "events": [ - { - "name": "confirmed", - "dateRange": { - "start": "08/15/2020Z", - "end": "08/15/2020Z" - } - }, - { - "name": "outcome", - "value": "Recovered" - }, - { - "name": "onsetSymptoms", - "dateRange": { - "start": "08/15/2020Z", - "end": "08/15/2020Z" - } - } - ], - "demographics": { - "gender": "Female", - "ageRange": { - "start": 5.0, - "end": 14.0 - } - } - }, - { - "caseReference": { - "sourceId": "abc123", - "sourceUrl": "foo.bar" - }, - "location": { - "query": "Berlin, Germany" - }, - "events": [ - { - "name": "confirmed", - "dateRange": { - "start": "02/07/2021Z", - "end": "02/07/2021Z" - } - } - ], - "demographics": { - "gender": "Female", - "ageRange": { - "start": 80.0, - "end": 120.0 - } - } - } -] - - -class GermanyTest(unittest.TestCase): - def test_parse(self): - # Default of 1500 is not enough to show diffs when there is one. - self.maxDiff = 5000 - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = germany.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), _PARSED_CASE) diff --git a/ingestion/functions/parsing/germany/input_event.json b/ingestion/functions/parsing/germany/input_event.json deleted file mode 100644 index 0c48cf1c2..000000000 --- a/ingestion/functions/parsing/germany/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "5fd8d2e8aaae7e00309ecd03/2020/12/15/1520/content.csv", - "sourceUrl": "https://www.arcgis.com/sharing/rest/content/items/f10774f1c63e40168479a1feb6c7ca74/data", - "sourceId": "5fd8d2e8aaae7e00309ecd03" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/germany/sample_data.csv b/ingestion/functions/parsing/germany/sample_data.csv deleted file mode 100644 index 85e1ae37e..000000000 --- a/ingestion/functions/parsing/germany/sample_data.csv +++ /dev/null @@ -1,3 +0,0 @@ -FID,IdBundesland,Bundesland,Landkreis,Altersgruppe,Geschlecht,AnzahlFall,AnzahlTodesfall,Meldedatum,IdLandkreis,Datenstand,NeuerFall,NeuerTodesfall,Refdatum,NeuGenesen,AnzahlGenesen,IstErkrankungsbeginn,Altersgruppe2 -2057,1,Schleswig-Holstein,SK Flensburg,A05-A14,W,1,0,2020/08/15 00:00:00,01001,"09.02.2021, 00:00 Uhr",0,-9,2020/08/15 00:00:00,0,1,1,Nicht übermittelt -1003854,11,Berlin,SK Berlin Reinickendorf,A80+,W,1,0,2021/02/07 00:00:00,11012,"09.02.2021, 00:00 Uhr",0,-9,2021/02/07 00:00:00,-9,0,0,Nicht übermittelt \ No newline at end of file diff --git a/ingestion/functions/parsing/hongkong/__init__.py b/ingestion/functions/parsing/hongkong/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/hongkong/hongkong.py b/ingestion/functions/parsing/hongkong/hongkong.py deleted file mode 100644 index 33c76e3cc..000000000 --- a/ingestion/functions/parsing/hongkong/hongkong.py +++ /dev/null @@ -1,184 +0,0 @@ -import json -import os -import sys -from datetime import datetime -import csv -import common.ingestion_logging as logging - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - -logger = logging.getLogger(__name__) - -# Fixed location, all cases are for Hong Kong. -_LOCATION = { - # We are using ISO codes now which are suitable for both - # countries and constituent territories - "country": "HK", - "geoResolution": "Country", - "name": "Hong Kong", - "geometry": { - "longitude": float("114.15861"), - "latitude": float("22.27833"), - }, -} - -_CASE_ID_INDEX = 0 -_CONFIRMED_INDEX = 1 -_ONSET_INDEX = 2 -_GENDER_INDEX = 3 -_AGE_INDEX = 4 -_OUTCOME_INDEX = 6 -_NOTES_INDEX = 8 -_CERTAINTY_INDEX = 9 - - -def convert_date(raw_date: str): - """ - Convert raw date field into a value interpretable by the dataserver. - """ - # The date is inconsistently listed in dd/mm/YYYY format or in d/m/yy - # we pad the latter to make it look the same and be parseable. - day, month, year = raw_date.split("/") - day = day.zfill(2) - month = month.zfill(2) - formatYear = "%Y" - if len(year) == 2: - formatYear = "%y" - date = datetime.strptime(raw_date, f"%d/%m/{formatYear}") - return date.strftime("%m/%d/%YZ") - - -def convert_gender(raw_gender: str): - if raw_gender.upper() == "M": - return "Male" - elif raw_gender.upper() == "F": - return "Female" - return None - - -def convert_age(age: str): - if age.isdecimal(): - # Ages are mostly reported in decimal years, but there are entries like '14 days' which need to be dealt with separately - return { - "start": float(age), - "end": float(age) - } - elif age == "<1": - return {"start": 0, "end": 1} - else: - try: - only_age = float("".join([i for i in age if not i.isalpha()])) - except ValueError: - return None - # 365.25 is average number of days a year - return { - "start": round(only_age / 365.25, 3), - "end": round(only_age / 365.25, 3) - } - - -def convert_demographics(gender, age): - _gender = convert_gender(gender) - _age = convert_age(age) - _demographics = {} - if _gender: - _demographics['gender'] = _gender - if _age: - _demographics['ageRange'] = _age - return _demographics - - -def parse_cases(raw_data_file: str, source_id: str, source_url: str): - """Parses G.h-format case data from raw API data.""" - with open(raw_data_file, "r") as f: - reader = csv.reader(f) - next(reader) # Skip the header. - cases = [] - for row in reader: - # CSV contains both "Probable" and "Confirmed" cases. - # We only ingest confirmed cases. - if row[_CERTAINTY_INDEX] != "Confirmed": - logger.info('Skipping probable case') - continue - case = { - "caseReference": { - "sourceId": source_id, - "sourceEntryId": row[_CASE_ID_INDEX], - "sourceUrl": source_url - }, - "location": _LOCATION, - "demographics": convert_demographics(row[_GENDER_INDEX], row[_AGE_INDEX]), - "events": [ - { - "name": "confirmed", - "dateRange": - { - "start": convert_date(row[_CONFIRMED_INDEX]), - "end": convert_date(row[_CONFIRMED_INDEX]), - }, - }, - ], - } - # Parse some specific notes or put them as is as notes. - notes = row[_NOTES_INDEX] - if notes == "Imported case": - case["travelHistory"] = { - "traveledPrior30Days": True, - } - else: - case["notes"] = notes - # If patient was symptomatic, the onset date is set otherwise they are marked - # as "Asymptomatic" in the date column in the CSV. - # There are other values as well such as "Pending" or "Unknown". - if row[_ONSET_INDEX] == "Asymptomatic": - case["symptoms"] = { - "status": "Asymptomatic", - } - elif "/" in row[_ONSET_INDEX]: - case["symptoms"] = { - "status": "Symptomatic", - } - case["events"].append({ - "name": "onsetSymptoms", - "dateRange": { - "start": convert_date(row[_ONSET_INDEX]), - "end": convert_date(row[_ONSET_INDEX]), - } - }) - # Status can be Hospitalised/Discharged/Deceased. - if row[_OUTCOME_INDEX] == "Discharged": - case["events"].append({ - "name": "outcome", - "value": "Recovered", - }) - elif row[_OUTCOME_INDEX] == "Deceased": - case["events"].append({ - "name": "outcome", - "value": "Death", - }) - elif row[_OUTCOME_INDEX] == "Hospitalized": - case["events"].append({ - "name": "hospitalAdmission", - "value": "Yes" - }) - cases.append(case) - return cases - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/hongkong/hongkong_test.py b/ingestion/functions/parsing/hongkong/hongkong_test.py deleted file mode 100644 index 670e9fe09..000000000 --- a/ingestion/functions/parsing/hongkong/hongkong_test.py +++ /dev/null @@ -1,156 +0,0 @@ -import os -import unittest - -from hongkong import hongkong - -_SOURCE_ID = "abc123" -_SOURCE_URL = "foo.bar" - - -class HongKongTest(unittest.TestCase): - def setUp(self): - # Default of 1500 is not enough to show diffs when there is one. - self.maxDiff = 5000 - - def test_parse(self): - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = hongkong.parse_cases( - sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(result, [ - { - "caseReference": { - "sourceId": _SOURCE_ID, - "sourceEntryId": "1", - "sourceUrl": _SOURCE_URL, - }, - "location": hongkong._LOCATION, - "events": [ - { - "name": "confirmed", - "dateRange": { - "start": "01/23/2020Z", - "end": "01/23/2020Z", - }, - }, { - "name": "onsetSymptoms", - "dateRange": { - "start": "01/01/2020Z", - "end": "01/01/2020Z", - }, - }, { - "name": "outcome", - "value": "Recovered", - }, - ], - "symptoms": { - "status": "Symptomatic", - }, - "travelHistory": {"traveledPrior30Days": True}, - "demographics": { - "ageRange": { - "start": 39, - "end": 39, - }, - "gender": "Male", - }, - }, { - "caseReference": { - "sourceId": _SOURCE_ID, - "sourceEntryId": "2", - "sourceUrl": _SOURCE_URL, - }, - "location": hongkong._LOCATION, - "events": [ - { - "name": "confirmed", - "dateRange": { - "start": "01/24/2020Z", - "end": "01/24/2020Z", - }, - }, { - "name": "hospitalAdmission", - "value": "Yes", - }, - ], - "symptoms": { - "status": "Asymptomatic", - }, - "travelHistory": {"traveledPrior30Days": True}, - "demographics": { - "ageRange": { - "start": 40, - "end": 40, - }, - "gender": "Female", - }, - }, { - "caseReference": { - "sourceId": _SOURCE_ID, - "sourceEntryId": "3", - "sourceUrl": _SOURCE_URL, - }, - "location": hongkong._LOCATION, - "events": [ - { - "name": "confirmed", - "dateRange": { - "start": "01/25/2020Z", - "end": "01/25/2020Z", - }, - }, { - "name": "outcome", - "value": "Death", - }, - ], - "symptoms": { - "status": "Asymptomatic", - }, - "notes": "Bad luck", - "demographics": { - "ageRange": { - "start": 40, - "end": 40, - }, - "gender": "Female", - }, - }, { - "caseReference": { - "sourceId": _SOURCE_ID, - "sourceEntryId": "5", - "sourceUrl": _SOURCE_URL, - }, - "location": hongkong._LOCATION, - "events": [ - { - "name": "confirmed", - "dateRange": { - "start": "01/05/2022Z", - "end": "01/05/2022Z", - }, - }, { - "name": "onsetSymptoms", - "dateRange": { - "start": "01/01/2022Z", - "end": "01/01/2022Z", - } - }, { - "name": "outcome", - "value": "Recovered", - }, - ], - "symptoms": { - "status": "Symptomatic", - }, - "travelHistory": {"traveledPrior30Days": True}, - "demographics": { - "ageRange": { - "start": 0, - "end": 1, - }, - "gender": "Male", - }, - }, - - ]) diff --git a/ingestion/functions/parsing/hongkong/input_event.json b/ingestion/functions/parsing/hongkong/input_event.json deleted file mode 100644 index 011e4422a..000000000 --- a/ingestion/functions/parsing/hongkong/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "5f46eda6a6a7a5002834c2a3/2020/08/26/2318/content.csv", - "sourceUrl": "http://www.chp.gov.hk/files/misc/enhanced_sur_covid_19_eng.csv", - "sourceId": "5f46eda6a6a7a5002834c2a3" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/hongkong/sample_data.csv b/ingestion/functions/parsing/hongkong/sample_data.csv deleted file mode 100644 index 9ce4245bf..000000000 --- a/ingestion/functions/parsing/hongkong/sample_data.csv +++ /dev/null @@ -1,6 +0,0 @@ -Case no.,Report date,Date of onset,Gender,Age,Name of hospital admitted,Hospitalised/Discharged/Deceased,HK/Non-HK resident,Case classification*,Confirmed/probable -1,23/01/2020,1/1/20,M,39,,Discharged,Non-HK resident,Imported case,Confirmed -2,24/01/2020,Asymptomatic,F,40,,Hospitalized,Non-HK resident,Imported case,Confirmed -3,25/01/2020,Asymptomatic,F,40,,Deceased,Non-HK resident,Bad luck,Confirmed -4,26/01/2020,Asymptomatic,F,40,,Discharged,Non-HK resident,Imported case,Probable -5,05/01/2022,01/01/2022,M,<1,,Discharged,Non-HK resident,Imported case,Confirmed diff --git a/ingestion/functions/parsing/india/__init__.py b/ingestion/functions/parsing/india/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/india/india.py b/ingestion/functions/parsing/india/india.py deleted file mode 100644 index 723969d37..000000000 --- a/ingestion/functions/parsing/india/india.py +++ /dev/null @@ -1,168 +0,0 @@ -import copy -import csv -import json -import os -import sys -from datetime import datetime - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - - - -def convert_date(raw_date): - """ - Convert raw date field into a value interpretable by the dataserver. - - The date is listed in dd/mm/YYYY format, but the data server API will - assume that ambiguous cases (e.g. "05/06/2020") are in mm/dd/YYYY format. - """ - date = datetime.strptime(raw_date, "%d/%m/%Y") - return date.strftime("%m/%d/%YZ") - - -def convert_gender(raw_gender): - if raw_gender == "M": - return "Male" - if raw_gender == "F": - return "Female" - - -def convert_location(row): - state = row["Detected State"] - district = row["Detected District"] - city = row["Detected City"] - - query_terms = ("India",) - resolutions = ["Country"] - if state: - query_terms = (state,) + query_terms - resolutions.insert(0, "Admin1") - if district: - query_terms = (district,) + query_terms - resolutions.insert(0, "Admin2") - if city: - query_terms = (city,) + query_terms - resolutions.insert(0, "Admin3") - - return { - "query": ", ".join(query_terms), - "limitToResolution": ",".join(resolutions) - } - - -def convert_demographics(row): - demo = {} - - if row["Age Bracket"]: - raw = row["Age Bracket"] - # Handle ranges, e.g. "28-35" - if "-" in raw: - parts = raw.split("-", 1) - demo["ageRange"] = { - "start": float(parts[0]), - "end": float(parts[1]) - } - # Handle months, e.g. "6 months" - elif " months" in raw.lower(): - age = float(raw.split(" ", 1)[0]) / 12 - demo["ageRange"] = { - "start": age, - "end": age - } - # Handle standard ages - else: - age = float(raw) - demo["ageRange"] = { - "start": age, - "end": age - } - if row["Gender"]: - demo["gender"] = convert_gender(row["Gender"]) - if row["Nationality"]: - demo["nationalities"] = [row["Nationality"]] - - return demo or None - - -def convert_sources(row): - # Sources must be unique, per our case schema. - included = set() - additionalSources = [{"sourceUrl": row[col]} - for col in ["Source_1", "Source_2", "Source_3"] - if row[col] and - row[col] not in included and not included.add( - row[col])] - return additionalSources or None - - -def parse_cases(raw_data_file: str, source_id: str, source_url: str): - """Parses G.h-format case data from raw API data.""" - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f) - for row in reader: - # Rows with a status of Hospitalized are new, confirmed cases. - # Unfortunately, while other statuses sometimes contain interesting - # information, we don't have a way to reliably collate these with - # their respective confirmations. - if row["Current Status"] != "Hospitalized": - continue - - # The column used to denote case UUID changes in April. - # It resets back to 1 when this happens. - # Prefix old values ("Patient Number") to distinguish. - if "Entry_ID" in row: - uuid_column = "Entry_ID" - uuid_prefix = "Entry-" - else: - uuid_column = "Patient Number" - uuid_prefix = "Patient-" - - case = { - "caseReference": { - "sourceId": source_id, - "sourceUrl": source_url, - "additionalSources": convert_sources(row) - }, - "location": convert_location(row), - # While case confirmation is represented by "Hospitalized," it - # isn't clear that this is semantically accurate for new data. - # At the onset, cases were likely confirmed via - # hospitalization, but it's now likely inaccurate to claim as - # much for the entirety of confirmed cases. - "events": [ - { - "name": "confirmed", - "dateRange": - { - "start": convert_date(row["Date Announced"]), - "end": convert_date(row["Date Announced"]) - } - } - ], - "demographics": convert_demographics(row), - "notes": row["Notes"] or None - } - for i in range(int(row["Num Cases"])): - c = copy.deepcopy(case) - c["caseReference"]["sourceEntryId"] = f"{uuid_prefix}{row[uuid_column]}-{i + 1}" - yield c - - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/india/india_test.py b/ingestion/functions/parsing/india/india_test.py deleted file mode 100644 index bb7189bce..000000000 --- a/ingestion/functions/parsing/india/india_test.py +++ /dev/null @@ -1,86 +0,0 @@ -import os -import unittest - -from india import india - -_SOURCE_ID = "abc123" -_SOURCE_URL = "https://foo.bar" -_PARSED_CASES = [ - { - "caseReference": { - "sourceId": _SOURCE_ID, - "sourceEntryId": "Entry-297649-1", - "sourceUrl": _SOURCE_URL, - "additionalSources": [ - { - "sourceUrl": "https://twitter.com/PIB_Patna/status/1308375952653611008" - } - ] - }, - "location": { - "limitToResolution": "Admin2,Admin1,Country", - "query": "Arwal, Bihar, India" - }, - "events": [ - { - "name": "confirmed", - "dateRange": - { - "start": "09/22/2020Z", - "end": "09/22/2020Z" - } - } - ], - "demographics": { - "ageRange": { - "start": 28, - "end": 35 - } - }, - "notes": None - }, - { - "caseReference": { - "sourceId": _SOURCE_ID, - "sourceEntryId": "Entry-297649-2", - "sourceUrl": _SOURCE_URL, - "additionalSources": [ - { - "sourceUrl": "https://twitter.com/PIB_Patna/status/1308375952653611008" - } - ] - }, - "location": { - "limitToResolution": "Admin2,Admin1,Country", - "query": "Arwal, Bihar, India" - }, - "events": [ - { - "name": "confirmed", - "dateRange": - { - "start": "09/22/2020Z", - "end": "09/22/2020Z" - } - } - ], - "demographics": { - "ageRange": { - "start": 28, - "end": 35 - } - }, - "notes": None - }, -] - - -class IndiaTest(unittest.TestCase): - def test_parse(self): - # Default of 1500 is not enough to show diffs when there is one. - self.maxDiff = 5000 - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = india.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), _PARSED_CASES) diff --git a/ingestion/functions/parsing/india/input_event.json b/ingestion/functions/parsing/india/input_event.json deleted file mode 100644 index eda1d88ee..000000000 --- a/ingestion/functions/parsing/india/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "5f6a9df8310dcb0a1156782c/2020/12/14/2350/content.csv", - "sourceUrl": "https://foo.bar", - "sourceId": "5f6a9df8310dcb0a1156782c" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/india/sample_data.csv b/ingestion/functions/parsing/india/sample_data.csv deleted file mode 100644 index b285742ef..000000000 --- a/ingestion/functions/parsing/india/sample_data.csv +++ /dev/null @@ -1,4 +0,0 @@ -Entry_ID,State Patient Number,Date Announced,Age Bracket,Gender,Detected City,Detected District,Detected State,State code,Num Cases,Current Status,Contracted from which Patient (Suspected),Notes,Source_1,Source_2,Source_3,Nationality,Type of transmission,Status Change Date,Patient Number -297634,OR-A-123,22/09/2020,6 Months,M,,Balasore,Odisha,OR,1,Deceased,,"was also suffering from Diabetes, hypertension.",https://twitter.com/HFWOdisha/status/1308286422281977856,https://twitter.com/HFWOdisha/status/1308286422281977856,,Bengladeshi,,, -297649,,22/09/2020,28-35,,,Arwal,Bihar,BR,2,Hospitalized,,,https://twitter.com/PIB_Patna/status/1308375952653611008,,,,,, -297649,,22/09/2020,,,,Arwal,Bihar,BR,2,Recovered,,,https://twitter.com/PIB_Patna/status/1308375952653611008,,,,,, diff --git a/ingestion/functions/parsing/india/sample_data.json b/ingestion/functions/parsing/india/sample_data.json deleted file mode 100644 index c5b91edb8..000000000 --- a/ingestion/functions/parsing/india/sample_data.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "raw_data": [ - { - "agebracket": "65", - "contractedfromwhichpatientsuspected": "", - "currentstatus": "Hospitalized", - "dateannounced": "05/06/2020", - "detectedcity": "Hanuman Nagar", - "detecteddistrict": "Darbhanga", - "detectedstate": "Bihar", - "entryid": "48765", - "gender": "M", - "nationality": "", - "notes": "", - "numcases": "1", - "patientnumber": "78135", - "source1": "https://twitter.com/BiharHealthDept/status/1268824968953057281", - "source2": "", - "source3": "", - "statecode": "BR", - "statepatientnumber": "", - "statuschangedate": "", - "typeoftransmission": "" - } - ] -} \ No newline at end of file diff --git a/ingestion/functions/parsing/japan/__init__.py b/ingestion/functions/parsing/japan/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/japan/input_event.json b/ingestion/functions/parsing/japan/input_event.json deleted file mode 100644 index 9465bf68b..000000000 --- a/ingestion/functions/parsing/japan/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "sourceUrl": "https://foo.bar", - "s3Key": "5f6209479d3e3000302d0f6c/2020/09/21/1014/content.json", - "sourceId": "5f6209479d3e3000302d0f6c" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/japan/japan.py b/ingestion/functions/parsing/japan/japan.py deleted file mode 100644 index 6767a6fb8..000000000 --- a/ingestion/functions/parsing/japan/japan.py +++ /dev/null @@ -1,145 +0,0 @@ -import json -import os -import sys -from datetime import datetime -from typing import Dict - - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - - -def convert_gender(raw_gender): - if "gender" in raw_gender: - if raw_gender["gender"] == "M": - return "Male" - if raw_gender["gender"] == "F": - return "Female" - - -def convert_age(raw_age): - if "ageBracket" not in raw_age.keys(): - return None - else: - age_range = {} - if raw_age["ageBracket"] != -1: - age_range["start"] = raw_age["ageBracket"] - age_range["end"] = raw_age["ageBracket"] + 9 - return age_range - else: - return None - - -def convert_location(raw_entry): - if raw_entry["detectedPrefecture"] == "Port Quarantine": - return {"query": "Japan"} - else: - query_terms = [ - term for term in [ - raw_entry.get("detectedCityTown", ""), - raw_entry.get("detectedPrefecture", ""), - "Japan"] - if term and term != "Unspecified"] - return {"query": ", ".join(query_terms)} - - -def detect_notes(raw_notes): - if "notes" in raw_notes: - return raw_notes["notes"] - else: - return None - - -def convert_date(raw_date: Dict): - """ - Convert raw date field into a value interpretable by the dataserver. -​ - The date filtering API expects mm/dd/YYYYZ format. - """ - date = datetime.strptime(raw_date["dateAnnounced"], "%Y-%m-%d") - return date.strftime("%m/%d/%YZ") - - -def convert_additional_sources(additional_source_url: Dict): - sources = [] - if "sourceURL" in additional_source_url: - sources.append({"sourceUrl": additional_source_url["sourceURL"]}) - if "deathSourceURL" in additional_source_url: - sources.append({"sourceUrl": additional_source_url["deathSourceURL"]}) - if "citySourceURL" in additional_source_url: - sources.append({"sourceUrl": additional_source_url["citySourceURL"]}) - if "prefectureSourceURL" in additional_source_url: - sources.append({"sourceUrl": additional_source_url["prefectureSourceURL"]}) - # Ensure only unique entries in additional sources - return list({v["sourceUrl"]: v for v in sources}.values()) or None - - -def convert_outcome(raw_outcome: Dict, raw_death_date: Dict): - if "patientStatus" in raw_outcome: - if raw_outcome["patientStatus"] == "Deceased": - death_date = datetime.strptime( - raw_death_date["deceasedDate"], "%Y-%m-%d") - return {"name": "outcome", - "dateRange": { - "start": death_date.strftime("%m/%d/%YZ"), - "end": death_date.strftime("%m/%d/%YZ") - }, - "value": "Death"} - elif raw_outcome["patientStatus"] == "Discharged" or raw_outcome["patientStatus"] == "Recovered": - return {"name": "outcome", - "value": "Recovered"} - return {"name": "outcome", - "value": "Unknown"} - - -def parse_cases(raw_data_file, source_id, source_url): - """ - Parses G.h-format case data from raw API data. - """ - with open(raw_data_file, "r") as f: - cases = json.load(f) - return ( - { - "caseReference": { - "sourceId": source_id, - "sourceEntryId": entry["patientId"], - "sourceUrl": source_url, - "additionalSources": convert_additional_sources(entry) - }, - "location": convert_location(entry), - "events": [ - { - "name": "confirmed", - "dateRange": - { - "start": convert_date(entry), - "end": convert_date(entry) - } - }, - convert_outcome(entry, entry) - ], - "demographics": { - "ageRange": convert_age(entry), - "gender": convert_gender(entry) - }, - "notes": detect_notes(entry) - } for entry in cases if (entry["patientId"] != "-1" and entry["confirmedPatient"])) - - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/japan/japan_test.py b/ingestion/functions/parsing/japan/japan_test.py deleted file mode 100644 index 0dc6f9887..000000000 --- a/ingestion/functions/parsing/japan/japan_test.py +++ /dev/null @@ -1,152 +0,0 @@ -import json -import os -import pytest -import tempfile -import unittest -from japan import japan - - -_SOURCE_ID = "abc123" -_SOURCE_URL = "https://foo.bar" -_PARSED_CASES = [ - { - "caseReference": { - "sourceId": _SOURCE_ID, - "sourceEntryId": "HKD130", - "sourceUrl": _SOURCE_URL, - "additionalSources": [ - { - "sourceUrl": "https://www3.nhk.or.jp/news/html/20200313/k10012329851000.html" - }, - { - "sourceUrl": "http://www.pref.hokkaido.lg.jp/file.jsp?id=1279351" - } - ] - }, - "location": { - "query": "Sapporo, Hokkaido, Japan" - }, - "events": [ - { - "name": "confirmed", - "dateRange": - { - "start": "03/13/2020Z", - "end": "03/13/2020Z" - } - }, - { - "name": "outcome", - "value": "Unknown" - } - ], - "demographics": { - "ageRange": { - "start": 50, - "end": 59 - }, - "gender": "Female" - }, - "notes": None - }, - # Add a case with non-unique additional sources - { - "caseReference": { - "sourceId": _SOURCE_ID, - "sourceEntryId": "1201", - "sourceUrl": _SOURCE_URL, - "additionalSources": [ - { - "sourceUrl": "https://www3.nhk.or.jp/news/html/20200323/k10012345631000.html" - }, - { - "sourceUrl": "https://www.city.okazaki.lg.jp/houdou/p025977.html" - }, - { - "sourceUrl": "https://www.pref.aichi.jp/site/covid19-aichi/pressrelease-ncov200323.html" - } - ] - }, - "location": { - "query": "Okazaki, Aichi, Japan" - }, - "events": [ - { - "name": "confirmed", - "dateRange": - { - "start": "03/23/2020Z", - "end": "03/23/2020Z" - } - }, - { - "name": "outcome", - "dateRange": - { - "start": "03/23/2020Z", - "end": "03/23/2020Z" - }, - "value": "Death" - } - ], - "demographics": { - "ageRange": { - "start": 80, - "end": 89 - }, - "gender": "Male" - }, - "notes": None - }, - # Add a case from port quarantine - { - "caseReference": { - "sourceId": _SOURCE_ID, - "sourceEntryId": "468", - "sourceUrl": _SOURCE_URL, - "additionalSources": [ - { - "sourceUrl": "https://www.pref.kanagawa.jp/osirase/1369/" - }, - { - "sourceUrl": "https://www.pref.kanagawa.jp/docs/ga4/bukanshi/occurrence.html" - } - ] - }, - "location": { - "query": "Japan" - }, - "events": [ - { - "name": "confirmed", - "dateRange": - { - "start": "02/11/2020Z", - "end": "02/11/2020Z" - } - }, - { - "name": "outcome", - "value": "Unknown" - } - ], - "demographics": { - "ageRange": { - "start": 50, - "end": 59 - }, - "gender": "Male" - }, - "notes": "Quarantine officer on Cruise ship (Kanagawa patient #2)" - } -] - - -class JapanTest(unittest.TestCase): - def test_parse(self): - self.maxDiff = 5000 - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.json") - - result = japan.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), _PARSED_CASES) \ No newline at end of file diff --git a/ingestion/functions/parsing/japan/sample_data.json b/ingestion/functions/parsing/japan/sample_data.json deleted file mode 100644 index 28f44f525..000000000 --- a/ingestion/functions/parsing/japan/sample_data.json +++ /dev/null @@ -1,50 +0,0 @@ -[ - { - "patientId": "HKD130", - "dateAnnounced": "2020-03-13", - "ageBracket": 50, - "gender": "F", - "residence": "Sapporo", - "detectedCityTown": "Sapporo", - "detectedPrefecture": "Hokkaido", - "patientStatus": "Unspecified", - "relatedPatients": "Contact with Hokkaido#109", - "prefecturePatientNumber": "Hokkaido#130", - "cityPrefectureNumber": "Sapporo#52", - "prefectureSourceURL": "http://www.pref.hokkaido.lg.jp/file.jsp?id=1279351", - "sourceURL": "https://www3.nhk.or.jp/news/html/20200313/k10012329851000.html", - "confirmedPatient": true - }, - { - "patientId": "1201", - "dateAnnounced": "2020-03-23", - "ageBracket": 80, - "gender": "M", - "residence": "Okazaki", - "detectedCityTown": "Okazaki", - "detectedPrefecture": "Aichi", - "patientStatus": "Deceased", - "prefecturePatientNumber": "Aichi#144", - "cityPrefectureNumber": "Okazaki#3", - "prefectureSourceURL": "https://www.pref.aichi.jp/site/covid19-aichi/pressrelease-ncov200323.html", - "citySourceURL": "https://www.city.okazaki.lg.jp/houdou/p025977.html", - "deathSourceURL": "https://www3.nhk.or.jp/news/html/20200323/k10012345631000.html", - "deceasedDate": "2020-03-23", - "sourceURL": "https://www3.nhk.or.jp/news/html/20200323/k10012345631000.html", - "confirmedPatient": true - }, - { - "patientId": "468", - "dateAnnounced": "2020-02-11", - "ageBracket": 50, - "gender": "M", - "residence": "Kanagawa", - "detectedPrefecture": "Port Quarantine", - "notes": "Quarantine officer on Cruise ship (Kanagawa patient #2)", - "knownCluster": "Cruise Quarantine Officer", - "prefecturePatientNumber": "Kanagawa#2", - "prefectureSourceURL": "https://www.pref.kanagawa.jp/docs/ga4/bukanshi/occurrence.html", - "sourceURL": "https://www.pref.kanagawa.jp/osirase/1369/", - "confirmedPatient": true - } -] \ No newline at end of file diff --git a/ingestion/functions/parsing/mexico/__init__.py b/ingestion/functions/parsing/mexico/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/mexico/dictionaries.json b/ingestion/functions/parsing/mexico/dictionaries.json deleted file mode 100644 index e1d383601..000000000 --- a/ingestion/functions/parsing/mexico/dictionaries.json +++ /dev/null @@ -1,12367 +0,0 @@ -{ - "comorbidities": { - "DIABETES": "diabetes mellitus", - "EPOC": "chronic obstructive pulmonary disease", - "ASMA": "asthma", - "HIPERTENSION": "hypertension", - "CARDIOVASCULAR": "cardiovascular system disease", - "OBESIDAD": "obesity", - "RENAL_CRONICA": "kidney disease" - }, - "states": { - "01": "AGUASCALIENTES", - "02": "BAJA CALIFORNIA", - "03": "BAJA CALIFORNIA SUR", - "04": "CAMPECHE", - "05": "COAHUILA DE ZARAGOZA", - "06": "COLIMA", - "07": "CHIAPAS", - "08": "CHIHUAHUA", - "09": "CIUDAD DE MÉXICO", - "10": "DURANGO", - "11": "GUANAJUATO", - "12": "GUERRERO", - "13": "HIDALGO", - "14": "JALISCO", - "15": "MÉXICO", - "16": "MICHOACÁN DE OCAMPO", - "17": "MORELOS", - "18": "NAYARIT", - "19": "NUEVO LEÓN", - "20": "OAXACA", - "21": "PUEBLA", - "22": "QUERÉTARO", - "23": "QUINTANA ROO", - "24": "SAN LUIS POTOSÍ", - "25": "SINALOA", - "26": "SONORA", - "27": "TABASCO", - "28": "TAMAULIPAS", - "29": "TLAXCALA", - "30": "VERACRUZ DE IGNACIO DE LA LLAVE", - "31": "YUCATÁN", - "32": "ZACATECAS", - "36": "ESTADOS UNIDOS MEXICANOS" - }, - "municipalities": { - "01001": "AGUASCALIENTES", - "01002": "ASIENTOS", - "01003": "CALVILLO", - "01004": "COSÍO", - "01005": "JESÚS MARÍA", - "01006": "PABELLÓN DE ARTEAGA", - "01007": "RINCÓN DE ROMOS", - "01008": "SAN JOSÉ DE GRACIA", - "01009": "TEPEZALÁ", - "01010": "EL LLANO", - "01011": "SAN FRANCISCO DE LOS ROMO", - "02001": "ENSENADA", - "02002": "MEXICALI", - "02003": "TECATE", - "02004": "TIJUANA", - "02005": "PLAYAS DE ROSARITO", - "03001": "COMONDÚ", - "03002": "MULEGÉ", - "03003": "LA PAZ", - "03008": "LOS CABOS", - "03009": "LORETO", - "04001": "CALKINÍ", - "04002": "CAMPECHE", - "04003": "CARMEN", - "04004": "CHAMPOTÓN", - "04005": "HECELCHAKÁN", - "04006": "HOPELCHÉN", - "04007": "PALIZADA", - "04008": "TENABO", - "04009": "ESCÁRCEGA", - "04010": "CALAKMUL", - "04011": "CANDELARIA", - "05001": "ABASOLO", - "05002": "ACUÑA", - "05003": "ALLENDE", - "05004": "ARTEAGA", - "05005": "CANDELA", - "05006": "CASTAÑOS", - "05007": "CUATRO CIÉNEGAS", - "05008": "ESCOBEDO", - "05009": "FRANCISCO I. MADERO", - "05010": "FRONTERA", - "05011": "GENERAL CEPEDA", - "05012": "GUERRERO", - "05013": "HIDALGO", - "05014": "JIMÉNEZ", - "05015": "JUÁREZ", - "05016": "LAMADRID", - "05017": "MATAMOROS", - "05018": "MONCLOVA", - "05019": "MORELOS", - "05020": "MÚZQUIZ", - "05021": "NADADORES", - "05022": "NAVA", - "05023": "OCAMPO", - "05024": "PARRAS", - "05025": "PIEDRAS NEGRAS", - "05026": "PROGRESO", - "05027": "RAMOS ARIZPE", - "05028": "SABINAS", - "05029": "SACRAMENTO", - "05030": "SALTILLO", - "05031": "SAN BUENAVENTURA", - "05032": "SAN JUAN DE SABINAS", - "05033": "SAN PEDRO", - "05034": "SIERRA MOJADA", - "05035": "TORREÓN", - "05036": "VIESCA", - "05037": "VILLA UNIÓN", - "05038": "ZARAGOZA", - "06001": "ARMERÍA", - "06002": "COLIMA", - "06003": "COMALA", - "06004": "COQUIMATLÁN", - "06005": "CUAUHTÉMOC", - "06006": "IXTLAHUACÁN", - "06007": "MANZANILLO", - "06008": "MINATITLÁN", - "06009": "TECOMÁN", - "06010": "VILLA DE ÁLVAREZ", - "07001": "ACACOYAGUA", - "07002": "ACALA", - "07003": "ACAPETAHUA", - "07004": "ALTAMIRANO", - "07005": "AMATÁN", - "07006": "AMATENANGO DE LA FRONTERA", - "07007": "AMATENANGO DEL VALLE", - "07008": "ANGEL ALBINO CORZO", - "07009": "ARRIAGA", - "07010": "BEJUCAL DE OCAMPO", - "07011": "BELLA VISTA", - "07012": "BERRIOZÁBAL", - "07013": "BOCHIL", - "07014": "EL BOSQUE", - "07015": "CACAHOATÁN", - "07016": "CATAZAJÁ", - "07017": "CINTALAPA", - "07018": "COAPILLA", - "07019": "COMITÁN DE DOMÍNGUEZ", - "07020": "LA CONCORDIA", - "07021": "COPAINALÁ", - "07022": "CHALCHIHUITÁN", - "07023": "CHAMULA", - "07024": "CHANAL", - "07025": "CHAPULTENANGO", - "07026": "CHENALHÓ", - "07027": "CHIAPA DE CORZO", - "07028": "CHIAPILLA", - "07029": "CHICOASÉN", - "07030": "CHICOMUSELO", - "07031": "CHILÓN", - "07032": "ESCUINTLA", - "07033": "FRANCISCO LEÓN", - "07034": "FRONTERA COMALAPA", - "07035": "FRONTERA HIDALGO", - "07036": "LA GRANDEZA", - "07037": "HUEHUETÁN", - "07038": "HUIXTÁN", - "07039": "HUITIUPÁN", - "07040": "HUIXTLA", - "07041": "LA INDEPENDENCIA", - "07042": "IXHUATÁN", - "07043": "IXTACOMITÁN", - "07044": "IXTAPA", - "07045": "IXTAPANGAJOYA", - "07046": "JIQUIPILAS", - "07047": "JITOTOL", - "07048": "JUÁREZ", - "07049": "LARRÁINZAR", - "07050": "LA LIBERTAD", - "07051": "MAPASTEPEC", - "07052": "LAS MARGARITAS", - "07053": "MAZAPA DE MADERO", - "07054": "MAZATÁN", - "07055": "METAPA", - "07056": "MITONTIC", - "07057": "MOTOZINTLA", - "07058": "NICOLÁS RUÍZ", - "07059": "OCOSINGO", - "07060": "OCOTEPEC", - "07061": "OCOZOCOAUTLA DE ESPINOSA", - "07062": "OSTUACÁN", - "07063": "OSUMACINTA", - "07064": "OXCHUC", - "07065": "PALENQUE", - "07066": "PANTELHÓ", - "07067": "PANTEPEC", - "07068": "PICHUCALCO", - "07069": "PIJIJIAPAN", - "07070": "EL PORVENIR", - "07071": "VILLA COMALTITLÁN", - "07072": "PUEBLO NUEVO SOLISTAHUACÁN", - "07073": "RAYÓN", - "07074": "REFORMA", - "07075": "LAS ROSAS", - "07076": "SABANILLA", - "07077": "SALTO DE AGUA", - "07078": "SAN CRISTÓBAL DE LAS CASAS", - "07079": "SAN FERNANDO", - "07080": "SILTEPEC", - "07081": "SIMOJOVEL", - "07082": "SITALÁ", - "07083": "SOCOLTENANGO", - "07084": "SOLOSUCHIAPA", - "07085": "SOYALÓ", - "07086": "SUCHIAPA", - "07087": "SUCHIATE", - "07088": "SUNUAPA", - "07089": "TAPACHULA", - "07090": "TAPALAPA", - "07091": "TAPILULA", - "07092": "TECPATÁN", - "07093": "TENEJAPA", - "07094": "TEOPISCA", - "07096": "TILA", - "07097": "TONALÁ", - "07098": "TOTOLAPA", - "07099": "LA TRINITARIA", - "07100": "TUMBALÁ", - "07101": "TUXTLA GUTIÉRREZ", - "07102": "TUXTLA CHICO", - "07103": "TUZANTÁN", - "07104": "TZIMOL", - "07105": "UNIÓN JUÁREZ", - "07106": "VENUSTIANO CARRANZA", - "07107": "VILLA CORZO", - "07108": "VILLAFLORES", - "07109": "YAJALÓN", - "07110": "SAN LUCAS", - "07111": "ZINACANTÁN", - "07112": "SAN JUAN CANCUC", - "07113": "ALDAMA", - "07114": "BENEMÉRITO DE LAS AMÉRICAS", - "07115": "MARAVILLA TENEJAPA", - "07116": "MARQUÉS DE COMILLAS", - "07117": "MONTECRISTO DE GUERRERO", - "07118": "SAN ANDRÉS DURAZNAL", - "07119": "SANTIAGO EL PINAR", - "07120": "CAPITÁN LUIS ÁNGEL VIDAL", - "07121": "RINCÓN CHAMULA SAN PEDRO", - "07122": "EL PARRAL", - "07123": "EMILIANO ZAPATA", - "07124": "MEZCALAPA", - "08001": "AHUMADA", - "08002": "ALDAMA", - "08003": "ALLENDE", - "08004": "AQUILES SERDÁN", - "08005": "ASCENSIÓN", - "08006": "BACHÍNIVA", - "08007": "BALLEZA", - "08008": "BATOPILAS DE MANUEL GÓMEZ MORÍN", - "08009": "BOCOYNA", - "08010": "BUENAVENTURA", - "08011": "CAMARGO", - "08012": "CARICHÍ", - "08013": "CASAS GRANDES", - "08014": "CORONADO", - "08015": "COYAME DEL SOTOL", - "08016": "LA CRUZ", - "08017": "CUAUHTÉMOC", - "08018": "CUSIHUIRIACHI", - "08019": "CHIHUAHUA", - "08020": "CHÍNIPAS", - "08021": "DELICIAS", - "08022": "DR. BELISARIO DOMÍNGUEZ", - "08023": "GALEANA", - "08024": "SANTA ISABEL", - "08025": "GÓMEZ FARÍAS", - "08026": "GRAN MORELOS", - "08027": "GUACHOCHI", - "08028": "GUADALUPE", - "08029": "GUADALUPE Y CALVO", - "08030": "GUAZAPARES", - "08031": "GUERRERO", - "08032": "HIDALGO DEL PARRAL", - "08033": "HUEJOTITÁN", - "08034": "IGNACIO ZARAGOZA", - "08035": "JANOS", - "08036": "JIMÉNEZ", - "08037": "JUÁREZ", - "08038": "JULIMES", - "08039": "LÓPEZ", - "08040": "MADERA", - "08041": "MAGUARICHI", - "08042": "MANUEL BENAVIDES", - "08043": "MATACHÍ", - "08044": "MATAMOROS", - "08045": "MEOQUI", - "08046": "MORELOS", - "08047": "MORIS", - "08048": "NAMIQUIPA", - "08049": "NONOAVA", - "08050": "NUEVO CASAS GRANDES", - "08051": "OCAMPO", - "08052": "OJINAGA", - "08053": "PRAXEDIS G. GUERRERO", - "08054": "RIVA PALACIO", - "08055": "ROSALES", - "08056": "ROSARIO", - "08057": "SAN FRANCISCO DE BORJA", - "08058": "SAN FRANCISCO DE CONCHOS", - "08059": "SAN FRANCISCO DEL ORO", - "08060": "SANTA BÁRBARA", - "08061": "SATEVÓ", - "08062": "SAUCILLO", - "08063": "TEMÓSACHIC", - "08064": "EL TULE", - "08065": "URIQUE", - "08066": "URUACHI", - "08067": "VALLE DE ZARAGOZA", - "09002": "AZCAPOTZALCO", - "09003": "COYOACÁN", - "09004": "CUAJIMALPA DE MORELOS", - "09005": "GUSTAVO A. MADERO", - "09006": "IZTACALCO", - "09007": "IZTAPALAPA", - "09008": "LA MAGDALENA CONTRERAS", - "09009": "MILPA ALTA", - "09010": "ÁLVARO OBREGÓN", - "09011": "TLÁHUAC", - "09012": "TLALPAN", - "09013": "XOCHIMILCO", - "09014": "BENITO JUÁREZ", - "09015": "CUAUHTÉMOC", - "09016": "MIGUEL HIDALGO", - "09017": "VENUSTIANO CARRANZA", - "10001": "CANATLÁN", - "10002": "CANELAS", - "10003": "CONETO DE COMONFORT", - "10004": "CUENCAMÉ", - "10005": "DURANGO", - "10006": "GENERAL SIMÓN BOLÍVAR", - "10007": "GÓMEZ PALACIO", - "10008": "GUADALUPE VICTORIA", - "10009": "GUANACEVÍ", - "10010": "HIDALGO", - "10011": "INDÉ", - "10012": "LERDO", - "10013": "MAPIMÍ", - "10014": "MEZQUITAL", - "10015": "NAZAS", - "10016": "NOMBRE DE DIOS", - "10017": "OCAMPO", - "10018": "EL ORO", - "10019": "OTÁEZ", - "10020": "PÁNUCO DE CORONADO", - "10021": "PEÑÓN BLANCO", - "10022": "POANAS", - "10023": "PUEBLO NUEVO", - "10024": "RODEO", - "10025": "SAN BERNARDO", - "10026": "SAN DIMAS", - "10027": "SAN JUAN DE GUADALUPE", - "10028": "SAN JUAN DEL RÍO", - "10029": "SAN LUIS DEL CORDERO", - "10030": "SAN PEDRO DEL GALLO", - "10031": "SANTA CLARA", - "10032": "SANTIAGO PAPASQUIARO", - "10033": "SÚCHIL", - "10034": "TAMAZULA", - "10035": "TEPEHUANES", - "10036": "TLAHUALILO", - "10037": "TOPIA", - "10038": "VICENTE GUERRERO", - "10039": "NUEVO IDEAL", - "11001": "ABASOLO", - "11002": "ACÁMBARO", - "11003": "SAN MIGUEL DE ALLENDE", - "11004": "APASEO EL ALTO", - "11005": "APASEO EL GRANDE", - "11006": "ATARJEA", - "11007": "CELAYA", - "11008": "MANUEL DOBLADO", - "11009": "COMONFORT", - "11010": "CORONEO", - "11011": "CORTAZAR", - "11012": "CUERÁMARO", - "11013": "DOCTOR MORA", - "11014": "DOLORES HIDALGO CUNA DE LA INDEPENDENCIA NACIONAL", - "11015": "GUANAJUATO", - "11016": "HUANÍMARO", - "11017": "IRAPUATO", - "11018": "JARAL DEL PROGRESO", - "11019": "JERÉCUARO", - "11020": "LEÓN", - "11021": "MOROLEÓN", - "11022": "OCAMPO", - "11023": "PÉNJAMO", - "11024": "PUEBLO NUEVO", - "11025": "PURÍSIMA DEL RINCÓN", - "11026": "ROMITA", - "11027": "SALAMANCA", - "11028": "SALVATIERRA", - "11029": "SAN DIEGO DE LA UNIÓN", - "11030": "SAN FELIPE", - "11031": "SAN FRANCISCO DEL RINCÓN", - "11032": "SAN JOSÉ ITURBIDE", - "11033": "SAN LUIS DE LA PAZ", - "11034": "SANTA CATARINA", - "11035": "SANTA CRUZ DE JUVENTINO ROSAS", - "11036": "SANTIAGO MARAVATÍO", - "11037": "SILAO DE LA VICTORIA", - "11038": "TARANDACUAO", - "11039": "TARIMORO", - "11040": "TIERRA BLANCA", - "11041": "URIANGATO", - "11042": "VALLE DE SANTIAGO", - "11043": "VICTORIA", - "11044": "VILLAGRÁN", - "11045": "XICHÚ", - "11046": "YURIRIA", - "12001": "ACAPULCO DE JUÁREZ", - "12002": "AHUACUOTZINGO", - "12003": "AJUCHITLÁN DEL PROGRESO", - "12004": "ALCOZAUCA DE GUERRERO", - "12005": "ALPOYECA", - "12006": "APAXTLA", - "12007": "ARCELIA", - "12008": "ATENANGO DEL RÍO", - "12009": "ATLAMAJALCINGO DEL MONTE", - "12010": "ATLIXTAC", - "12011": "ATOYAC DE ÁLVAREZ", - "12012": "AYUTLA DE LOS LIBRES", - "12013": "AZOYÚ", - "12014": "BENITO JUÁREZ", - "12015": "BUENAVISTA DE CUÉLLAR", - "12016": "COAHUAYUTLA DE JOSÉ MARÍA IZAZAGA", - "12017": "COCULA", - "12018": "COPALA", - "12019": "COPALILLO", - "12020": "COPANATOYAC", - "12021": "COYUCA DE BENÍTEZ", - "12022": "COYUCA DE CATALÁN", - "12023": "CUAJINICUILAPA", - "12024": "CUALÁC", - "12025": "CUAUTEPEC", - "12026": "CUETZALA DEL PROGRESO", - "12027": "CUTZAMALA DE PINZÓN", - "12028": "CHILAPA DE ÁLVAREZ", - "12029": "CHILPANCINGO DE LOS BRAVO", - "12030": "FLORENCIO VILLARREAL", - "12031": "GENERAL CANUTO A. NERI", - "12032": "GENERAL HELIODORO CASTILLO", - "12033": "HUAMUXTITLÁN", - "12034": "HUITZUCO DE LOS FIGUEROA", - "12035": "IGUALA DE LA INDEPENDENCIA", - "12036": "IGUALAPA", - "12037": "IXCATEOPAN DE CUAUHTÉMOC", - "12038": "ZIHUATANEJO DE AZUETA", - "12039": "JUAN R. ESCUDERO", - "12040": "LEONARDO BRAVO", - "12041": "MALINALTEPEC", - "12042": "MÁRTIR DE CUILAPAN", - "12043": "METLATÓNOC", - "12044": "MOCHITLÁN", - "12045": "OLINALÁ", - "12046": "OMETEPEC", - "12047": "PEDRO ASCENCIO ALQUISIRAS", - "12048": "PETATLÁN", - "12049": "PILCAYA", - "12050": "PUNGARABATO", - "12051": "QUECHULTENANGO", - "12052": "SAN LUIS ACATLÁN", - "12053": "SAN MARCOS", - "12054": "SAN MIGUEL TOTOLAPAN", - "12055": "TAXCO DE ALARCÓN", - "12056": "TECOANAPA", - "12057": "TÉCPAN DE GALEANA", - "12058": "TELOLOAPAN", - "12059": "TEPECOACUILCO DE TRUJANO", - "12060": "TETIPAC", - "12061": "TIXTLA DE GUERRERO", - "12062": "TLACOACHISTLAHUACA", - "12063": "TLACOAPA", - "12064": "TLALCHAPA", - "12065": "TLALIXTAQUILLA DE MALDONADO", - "12066": "TLAPA DE COMONFORT", - "12067": "TLAPEHUALA", - "12068": "LA UNIÓN DE ISIDORO MONTES DE OCA", - "12069": "XALPATLÁHUAC", - "12070": "XOCHIHUEHUETLÁN", - "12071": "XOCHISTLAHUACA", - "12072": "ZAPOTITLÁN TABLAS", - "12073": "ZIRÁNDARO", - "12074": "ZITLALA", - "12075": "EDUARDO NERI", - "12076": "ACATEPEC", - "12077": "MARQUELIA", - "12078": "COCHOAPA EL GRANDE", - "12079": "JOSÉ JOAQUÍN DE HERRERA", - "12080": "JUCHITÁN", - "12081": "ILIATENCO", - "13001": "ACATLÁN", - "13002": "ACAXOCHITLÁN", - "13003": "ACTOPAN", - "13004": "AGUA BLANCA DE ITURBIDE", - "13005": "AJACUBA", - "13006": "ALFAJAYUCAN", - "13007": "ALMOLOYA", - "13008": "APAN", - "13009": "EL ARENAL", - "13010": "ATITALAQUIA", - "13011": "ATLAPEXCO", - "13012": "ATOTONILCO EL GRANDE", - "13013": "ATOTONILCO DE TULA", - "13014": "CALNALI", - "13015": "CARDONAL", - "13016": "CUAUTEPEC DE HINOJOSA", - "13017": "CHAPANTONGO", - "13018": "CHAPULHUACÁN", - "13019": "CHILCUAUTLA", - "13020": "ELOXOCHITLÁN", - "13021": "EMILIANO ZAPATA", - "13022": "EPAZOYUCAN", - "13023": "FRANCISCO I. MADERO", - "13024": "HUASCA DE OCAMPO", - "13025": "HUAUTLA", - "13026": "HUAZALINGO", - "13027": "HUEHUETLA", - "13028": "HUEJUTLA DE REYES", - "13029": "HUICHAPAN", - "13030": "IXMIQUILPAN", - "13031": "JACALA DE LEDEZMA", - "13032": "JALTOCÁN", - "13033": "JUÁREZ HIDALGO", - "13034": "LOLOTLA", - "13035": "METEPEC", - "13036": "SAN AGUSTÍN METZQUITITLÁN", - "13037": "METZTITLÁN", - "13038": "MINERAL DEL CHICO", - "13039": "MINERAL DEL MONTE", - "13040": "LA MISIÓN", - "13041": "MIXQUIAHUALA DE JUÁREZ", - "13042": "MOLANGO DE ESCAMILLA", - "13043": "NICOLÁS FLORES", - "13044": "NOPALA DE VILLAGRÁN", - "13045": "OMITLÁN DE JUÁREZ", - "13046": "SAN FELIPE ORIZATLÁN", - "13047": "PACULA", - "13048": "PACHUCA DE SOTO", - "13049": "PISAFLORES", - "13050": "PROGRESO DE OBREGÓN", - "13051": "MINERAL DE LA REFORMA", - "13052": "SAN AGUSTÍN TLAXIACA", - "13053": "SAN BARTOLO TUTOTEPEC", - "13054": "SAN SALVADOR", - "13055": "SANTIAGO DE ANAYA", - "13056": "SANTIAGO TULANTEPEC DE LUGO GUERRERO", - "13057": "SINGUILUCAN", - "13058": "TASQUILLO", - "13059": "TECOZAUTLA", - "13060": "TENANGO DE DORIA", - "13061": "TEPEAPULCO", - "13062": "TEPEHUACÁN DE GUERRERO", - "13063": "TEPEJI DEL RÍO DE OCAMPO", - "13064": "TEPETITLÁN", - "13065": "TETEPANGO", - "13066": "VILLA DE TEZONTEPEC", - "13067": "TEZONTEPEC DE ALDAMA", - "13068": "TIANGUISTENGO", - "13069": "TIZAYUCA", - "13070": "TLAHUELILPAN", - "13071": "TLAHUILTEPA", - "13072": "TLANALAPA", - "13073": "TLANCHINOL", - "13074": "TLAXCOAPAN", - "13075": "TOLCAYUCA", - "13076": "TULA DE ALLENDE", - "13077": "TULANCINGO DE BRAVO", - "13078": "XOCHIATIPAN", - "13079": "XOCHICOATLÁN", - "13080": "YAHUALICA", - "13081": "ZACUALTIPÁN DE ÁNGELES", - "13082": "ZAPOTLÁN DE JUÁREZ", - "13083": "ZEMPOALA", - "13084": "ZIMAPÁN", - "14001": "ACATIC", - "14002": "ACATLÁN DE JUÁREZ", - "14003": "AHUALULCO DE MERCADO", - "14004": "AMACUECA", - "14005": "AMATITÁN", - "14006": "AMECA", - "14007": "SAN JUANITO DE ESCOBEDO", - "14008": "ARANDAS", - "14009": "EL ARENAL", - "14010": "ATEMAJAC DE BRIZUELA", - "14011": "ATENGO", - "14012": "ATENGUILLO", - "14013": "ATOTONILCO EL ALTO", - "14014": "ATOYAC", - "14015": "AUTLÁN DE NAVARRO", - "14016": "AYOTLÁN", - "14017": "AYUTLA", - "14018": "LA BARCA", - "14019": "BOLAÑOS", - "14020": "CABO CORRIENTES", - "14021": "CASIMIRO CASTILLO", - "14022": "CIHUATLÁN", - "14023": "ZAPOTLÁN EL GRANDE", - "14024": "COCULA", - "14025": "COLOTLÁN", - "14026": "CONCEPCIÓN DE BUENOS AIRES", - "14027": "CUAUTITLÁN DE GARCÍA BARRAGÁN", - "14028": "CUAUTLA", - "14029": "CUQUÍO", - "14030": "CHAPALA", - "14031": "CHIMALTITÁN", - "14032": "CHIQUILISTLÁN", - "14033": "DEGOLLADO", - "14034": "EJUTLA", - "14035": "ENCARNACIÓN DE DÍAZ", - "14036": "ETZATLÁN", - "14037": "EL GRULLO", - "14038": "GUACHINANGO", - "14039": "GUADALAJARA", - "14040": "HOSTOTIPAQUILLO", - "14041": "HUEJÚCAR", - "14042": "HUEJUQUILLA EL ALTO", - "14043": "LA HUERTA", - "14044": "IXTLAHUACÁN DE LOS MEMBRILLOS", - "14045": "IXTLAHUACÁN DEL RÍO", - "14046": "JALOSTOTITLÁN", - "14047": "JAMAY", - "14048": "JESÚS MARÍA", - "14049": "JILOTLÁN DE LOS DOLORES", - "14050": "JOCOTEPEC", - "14051": "JUANACATLÁN", - "14052": "JUCHITLÁN", - "14053": "LAGOS DE MORENO", - "14054": "EL LIMÓN", - "14055": "MAGDALENA", - "14056": "SANTA MARÍA DEL ORO", - "14057": "LA MANZANILLA DE LA PAZ", - "14058": "MASCOTA", - "14059": "MAZAMITLA", - "14060": "MEXTICACÁN", - "14061": "MEZQUITIC", - "14062": "MIXTLÁN", - "14063": "OCOTLÁN", - "14064": "OJUELOS DE JALISCO", - "14065": "PIHUAMO", - "14066": "PONCITLÁN", - "14067": "PUERTO VALLARTA", - "14068": "VILLA PURIFICACIÓN", - "14069": "QUITUPAN", - "14070": "EL SALTO", - "14071": "SAN CRISTÓBAL DE LA BARRANCA", - "14072": "SAN DIEGO DE ALEJANDRÍA", - "14073": "SAN JUAN DE LOS LAGOS", - "14074": "SAN JULIÁN", - "14075": "SAN MARCOS", - "14076": "SAN MARTÍN DE BOLAÑOS", - "14077": "SAN MARTÍN HIDALGO", - "14078": "SAN MIGUEL EL ALTO", - "14079": "GÓMEZ FARÍAS", - "14080": "SAN SEBASTIÁN DEL OESTE", - "14081": "SANTA MARÍA DE LOS ÁNGELES", - "14082": "SAYULA", - "14083": "TALA", - "14084": "TALPA DE ALLENDE", - "14085": "TAMAZULA DE GORDIANO", - "14086": "TAPALPA", - "14087": "TECALITLÁN", - "14088": "TECOLOTLÁN", - "14089": "TECHALUTA DE MONTENEGRO", - "14090": "TENAMAXTLÁN", - "14091": "TEOCALTICHE", - "14092": "TEOCUITATLÁN DE CORONA", - "14093": "TEPATITLÁN DE MORELOS", - "14094": "TEQUILA", - "14095": "TEUCHITLÁN", - "14096": "TIZAPÁN EL ALTO", - "14097": "TLAJOMULCO DE ZÚÑIGA", - "14098": "SAN PEDRO TLAQUEPAQUE", - "14099": "TOLIMÁN", - "14100": "TOMATLÁN", - "14101": "TONALÁ", - "14102": "TONAYA", - "14103": "TONILA", - "14104": "TOTATICHE", - "14105": "TOTOTLÁN", - "14106": "TUXCACUESCO", - "14107": "TUXCUECA", - "14108": "TUXPAN", - "14109": "UNIÓN DE SAN ANTONIO", - "14110": "UNIÓN DE TULA", - "14111": "VALLE DE GUADALUPE", - "14112": "VALLE DE JUÁREZ", - "14113": "SAN GABRIEL", - "14114": "VILLA CORONA", - "14115": "VILLA GUERRERO", - "14116": "VILLA HIDALGO", - "14117": "CAÑADAS DE OBREGÓN", - "14118": "YAHUALICA DE GONZÁLEZ GALLO", - "14119": "ZACOALCO DE TORRES", - "14120": "ZAPOPAN", - "14121": "ZAPOTILTIC", - "14122": "ZAPOTITLÁN DE VADILLO", - "14123": "ZAPOTLÁN DEL REY", - "14124": "ZAPOTLANEJO", - "14125": "SAN IGNACIO CERRO GORDO", - "15001": "ACAMBAY DE RUÍZ CASTAÑEDA", - "15002": "ACOLMAN", - "15003": "ACULCO", - "15004": "ALMOLOYA DE ALQUISIRAS", - "15005": "ALMOLOYA DE JUÁREZ", - "15006": "ALMOLOYA DEL RÍO", - "15007": "AMANALCO", - "15008": "AMATEPEC", - "15009": "AMECAMECA", - "15010": "APAXCO", - "15011": "ATENCO", - "15012": "ATIZAPÁN", - "15013": "ATIZAPÁN DE ZARAGOZA", - "15014": "ATLACOMULCO", - "15015": "ATLAUTLA", - "15016": "AXAPUSCO", - "15017": "AYAPANGO", - "15018": "CALIMAYA", - "15019": "CAPULHUAC", - "15020": "COACALCO DE BERRIOZÁBAL", - "15021": "COATEPEC HARINAS", - "15022": "COCOTITLÁN", - "15023": "COYOTEPEC", - "15024": "CUAUTITLÁN", - "15025": "CHALCO", - "15026": "CHAPA DE MOTA", - "15027": "CHAPULTEPEC", - "15028": "CHIAUTLA", - "15029": "CHICOLOAPAN", - "15030": "CHICONCUAC", - "15031": "CHIMALHUACÁN", - "15032": "DONATO GUERRA", - "15033": "ECATEPEC DE MORELOS", - "15034": "ECATZINGO", - "15035": "HUEHUETOCA", - "15036": "HUEYPOXTLA", - "15037": "HUIXQUILUCAN", - "15038": "ISIDRO FABELA", - "15039": "IXTAPALUCA", - "15040": "IXTAPAN DE LA SAL", - "15041": "IXTAPAN DEL ORO", - "15042": "IXTLAHUACA", - "15043": "XALATLACO", - "15044": "JALTENCO", - "15045": "JILOTEPEC", - "15046": "JILOTZINGO", - "15047": "JIQUIPILCO", - "15048": "JOCOTITLÁN", - "15049": "JOQUICINGO", - "15050": "JUCHITEPEC", - "15051": "LERMA", - "15052": "MALINALCO", - "15053": "MELCHOR OCAMPO", - "15054": "METEPEC", - "15055": "MEXICALTZINGO", - "15056": "MORELOS", - "15057": "NAUCALPAN DE JUÁREZ", - "15058": "NEZAHUALCÓYOTL", - "15059": "NEXTLALPAN", - "15060": "NICOLÁS ROMERO", - "15061": "NOPALTEPEC", - "15062": "OCOYOACAC", - "15063": "OCUILAN", - "15064": "EL ORO", - "15065": "OTUMBA", - "15066": "OTZOLOAPAN", - "15067": "OTZOLOTEPEC", - "15068": "OZUMBA", - "15069": "PAPALOTLA", - "15070": "LA PAZ", - "15071": "POLOTITLÁN", - "15072": "RAYÓN", - "15073": "SAN ANTONIO LA ISLA", - "15074": "SAN FELIPE DEL PROGRESO", - "15075": "SAN MARTÍN DE LAS PIRÁMIDES", - "15076": "SAN MATEO ATENCO", - "15077": "SAN SIMÓN DE GUERRERO", - "15078": "SANTO TOMÁS", - "15079": "SOYANIQUILPAN DE JUÁREZ", - "15080": "SULTEPEC", - "15081": "TECÁMAC", - "15082": "TEJUPILCO", - "15083": "TEMAMATLA", - "15084": "TEMASCALAPA", - "15085": "TEMASCALCINGO", - "15086": "TEMASCALTEPEC", - "15087": "TEMOAYA", - "15088": "TENANCINGO", - "15089": "TENANGO DEL AIRE", - "15090": "TENANGO DEL VALLE", - "15091": "TEOLOYUCAN", - "15092": "TEOTIHUACÁN", - "15093": "TEPETLAOXTOC", - "15094": "TEPETLIXPA", - "15095": "TEPOTZOTLÁN", - "15096": "TEQUIXQUIAC", - "15097": "TEXCALTITLÁN", - "15098": "TEXCALYACAC", - "15099": "TEXCOCO", - "15100": "TEZOYUCA", - "15101": "TIANGUISTENCO", - "15102": "TIMILPAN", - "15103": "TLALMANALCO", - "15104": "TLALNEPANTLA DE BAZ", - "15105": "TLATLAYA", - "15106": "TOLUCA", - "15107": "TONATICO", - "15108": "TULTEPEC", - "15109": "TULTITLÁN", - "15110": "VALLE DE BRAVO", - "15111": "VILLA DE ALLENDE", - "15112": "VILLA DEL CARBÓN", - "15113": "VILLA GUERRERO", - "15114": "VILLA VICTORIA", - "15115": "XONACATLÁN", - "15116": "ZACAZONAPAN", - "15117": "ZACUALPAN", - "15118": "ZINACANTEPEC", - "15119": "ZUMPAHUACÁN", - "15120": "ZUMPANGO", - "15121": "CUAUTITLÁN IZCALLI", - "15122": "VALLE DE CHALCO SOLIDARIDAD", - "15123": "LUVIANOS", - "15124": "SAN JOSÉ DEL RINCÓN", - "15125": "TONANITLA", - "16001": "ACUITZIO", - "16002": "AGUILILLA", - "16003": "ÁLVARO OBREGÓN", - "16004": "ANGAMACUTIRO", - "16005": "ANGANGUEO", - "16006": "APATZINGÁN", - "16007": "APORO", - "16008": "AQUILA", - "16009": "ARIO", - "16010": "ARTEAGA", - "16011": "BRISEÑAS", - "16012": "BUENAVISTA", - "16013": "CARÁCUARO", - "16014": "COAHUAYANA", - "16015": "COALCOMÁN DE VÁZQUEZ PALLARES", - "16016": "COENEO", - "16017": "CONTEPEC", - "16018": "COPÁNDARO", - "16019": "COTIJA", - "16020": "CUITZEO", - "16021": "CHARAPAN", - "16022": "CHARO", - "16023": "CHAVINDA", - "16024": "CHERÁN", - "16025": "CHILCHOTA", - "16026": "CHINICUILA", - "16027": "CHUCÁNDIRO", - "16028": "CHURINTZIO", - "16029": "CHURUMUCO", - "16030": "ECUANDUREO", - "16031": "EPITACIO HUERTA", - "16032": "ERONGARÍCUARO", - "16033": "GABRIEL ZAMORA", - "16034": "HIDALGO", - "16035": "LA HUACANA", - "16036": "HUANDACAREO", - "16037": "HUANIQUEO", - "16038": "HUETAMO", - "16039": "HUIRAMBA", - "16040": "INDAPARAPEO", - "16041": "IRIMBO", - "16042": "IXTLÁN", - "16043": "JACONA", - "16044": "JIMÉNEZ", - "16045": "JIQUILPAN", - "16046": "JUÁREZ", - "16047": "JUNGAPEO", - "16048": "LAGUNILLAS", - "16049": "MADERO", - "16050": "MARAVATÍO", - "16051": "MARCOS CASTELLANOS", - "16052": "LÁZARO CÁRDENAS", - "16053": "MORELIA", - "16054": "MORELOS", - "16055": "MÚGICA", - "16056": "NAHUATZEN", - "16057": "NOCUPÉTARO", - "16058": "NUEVO PARANGARICUTIRO", - "16059": "NUEVO URECHO", - "16060": "NUMARÁN", - "16061": "OCAMPO", - "16062": "PAJACUARÁN", - "16063": "PANINDÍCUARO", - "16064": "PARÁCUARO", - "16065": "PARACHO", - "16066": "PÁTZCUARO", - "16067": "PENJAMILLO", - "16068": "PERIBÁN", - "16069": "LA PIEDAD", - "16070": "PURÉPERO", - "16071": "PURUÁNDIRO", - "16072": "QUERÉNDARO", - "16073": "QUIROGA", - "16074": "COJUMATLÁN DE RÉGULES", - "16075": "LOS REYES", - "16076": "SAHUAYO", - "16077": "SAN LUCAS", - "16078": "SANTA ANA MAYA", - "16079": "SALVADOR ESCALANTE", - "16080": "SENGUIO", - "16081": "SUSUPUATO", - "16082": "TACÁMBARO", - "16083": "TANCÍTARO", - "16084": "TANGAMANDAPIO", - "16085": "TANGANCÍCUARO", - "16086": "TANHUATO", - "16087": "TARETAN", - "16088": "TARÍMBARO", - "16089": "TEPALCATEPEC", - "16090": "TINGAMBATO", - "16091": "TINGÜINDÍN", - "16092": "TIQUICHEO DE NICOLÁS ROMERO", - "16093": "TLALPUJAHUA", - "16094": "TLAZAZALCA", - "16095": "TOCUMBO", - "16096": "TUMBISCATÍO", - "16097": "TURICATO", - "16098": "TUXPAN", - "16099": "TUZANTLA", - "16100": "TZINTZUNTZAN", - "16101": "TZITZIO", - "16102": "URUAPAN", - "16103": "VENUSTIANO CARRANZA", - "16104": "VILLAMAR", - "16105": "VISTA HERMOSA", - "16106": "YURÉCUARO", - "16107": "ZACAPU", - "16108": "ZAMORA", - "16109": "ZINÁPARO", - "16110": "ZINAPÉCUARO", - "16111": "ZIRACUARETIRO", - "16112": "ZITÁCUARO", - "16113": "JOSÉ SIXTO VERDUZCO", - "17001": "AMACUZAC", - "17002": "ATLATLAHUCAN", - "17003": "AXOCHIAPAN", - "17004": "AYALA", - "17005": "COATLÁN DEL RÍO", - "17006": "CUAUTLA", - "17007": "CUERNAVACA", - "17008": "EMILIANO ZAPATA", - "17009": "HUITZILAC", - "17010": "JANTETELCO", - "17011": "JIUTEPEC", - "17012": "JOJUTLA", - "17013": "JONACATEPEC DE LEANDRO VALLE", - "17014": "MAZATEPEC", - "17015": "MIACATLÁN", - "17016": "OCUITUCO", - "17017": "PUENTE DE IXTLA", - "17018": "TEMIXCO", - "17019": "TEPALCINGO", - "17020": "TEPOZTLÁN", - "17021": "TETECALA", - "17022": "TETELA DEL VOLCÁN", - "17023": "TLALNEPANTLA", - "17024": "TLALTIZAPÁN DE ZAPATA", - "17025": "TLAQUILTENANGO", - "17026": "TLAYACAPAN", - "17027": "TOTOLAPAN", - "17028": "XOCHITEPEC", - "17029": "YAUTEPEC", - "17030": "YECAPIXTLA", - "17031": "ZACATEPEC", - "17032": "ZACUALPAN DE AMILPAS", - "17033": "TEMOAC", - "17034": "COATETELCO", - "17035": "XOXOCOTLA", - "18001": "ACAPONETA", - "18002": "AHUACATLÁN", - "18003": "AMATLÁN DE CAÑAS", - "18004": "COMPOSTELA", - "18005": "HUAJICORI", - "18006": "IXTLÁN DEL RÍO", - "18007": "JALA", - "18008": "XALISCO", - "18009": "DEL NAYAR", - "18010": "ROSAMORADA", - "18011": "RUÍZ", - "18012": "SAN BLAS", - "18013": "SAN PEDRO LAGUNILLAS", - "18014": "SANTA MARÍA DEL ORO", - "18015": "SANTIAGO IXCUINTLA", - "18016": "TECUALA", - "18017": "TEPIC", - "18018": "TUXPAN", - "18019": "LA YESCA", - "18020": "BAHÍA DE BANDERAS", - "19001": "ABASOLO", - "19002": "AGUALEGUAS", - "19003": "LOS ALDAMAS", - "19004": "ALLENDE", - "19005": "ANÁHUAC", - "19006": "APODACA", - "19007": "ARAMBERRI", - "19008": "BUSTAMANTE", - "19009": "CADEREYTA JIMÉNEZ", - "19010": "EL CARMEN", - "19011": "CERRALVO", - "19012": "CIÉNEGA DE FLORES", - "19013": "CHINA", - "19014": "DOCTOR ARROYO", - "19015": "DOCTOR COSS", - "19016": "DOCTOR GONZÁLEZ", - "19017": "GALEANA", - "19018": "GARCÍA", - "19019": "SAN PEDRO GARZA GARCÍA", - "19020": "GENERAL BRAVO", - "19021": "GENERAL ESCOBEDO", - "19022": "GENERAL TERÁN", - "19023": "GENERAL TREVIÑO", - "19024": "GENERAL ZARAGOZA", - "19025": "GENERAL ZUAZUA", - "19026": "GUADALUPE", - "19027": "LOS HERRERAS", - "19028": "HIGUERAS", - "19029": "HUALAHUISES", - "19030": "ITURBIDE", - "19031": "JUÁREZ", - "19032": "LAMPAZOS DE NARANJO", - "19033": "LINARES", - "19034": "MARÍN", - "19035": "MELCHOR OCAMPO", - "19036": "MIER Y NORIEGA", - "19037": "MINA", - "19038": "MONTEMORELOS", - "19039": "MONTERREY", - "19040": "PARÁS", - "19041": "PESQUERÍA", - "19042": "LOS RAMONES", - "19043": "RAYONES", - "19044": "SABINAS HIDALGO", - "19045": "SALINAS VICTORIA", - "19046": "SAN NICOLÁS DE LOS GARZA", - "19047": "HIDALGO", - "19048": "SANTA CATARINA", - "19049": "SANTIAGO", - "19050": "VALLECILLO", - "19051": "VILLALDAMA", - "20001": "ABEJONES", - "20002": "ACATLÁN DE PÉREZ FIGUEROA", - "20003": "ASUNCIÓN CACALOTEPEC", - "20004": "ASUNCIÓN CUYOTEPEJI", - "20005": "ASUNCIÓN IXTALTEPEC", - "20006": "ASUNCIÓN NOCHIXTLÁN", - "20007": "ASUNCIÓN OCOTLÁN", - "20008": "ASUNCIÓN TLACOLULITA", - "20009": "AYOTZINTEPEC", - "20010": "EL BARRIO DE LA SOLEDAD", - "20011": "CALIHUALÁ", - "20012": "CANDELARIA LOXICHA", - "20013": "CIÉNEGA DE ZIMATLÁN", - "20014": "CIUDAD IXTEPEC", - "20015": "COATECAS ALTAS", - "20016": "COICOYÁN DE LAS FLORES", - "20017": "LA COMPAÑÍA", - "20018": "CONCEPCIÓN BUENAVISTA", - "20019": "CONCEPCIÓN PÁPALO", - "20020": "CONSTANCIA DEL ROSARIO", - "20021": "COSOLAPA", - "20022": "COSOLTEPEC", - "20023": "CUILÁPAM DE GUERRERO", - "20024": "CUYAMECALCO VILLA DE ZARAGOZA", - "20025": "CHAHUITES", - "20026": "CHALCATONGO DE HIDALGO", - "20027": "CHIQUIHUITLÁN DE BENITO JUÁREZ", - "20028": "HEROICA CIUDAD DE EJUTLA DE CRESPO", - "20029": "ELOXOCHITLÁN DE FLORES MAGÓN", - "20030": "EL ESPINAL", - "20031": "TAMAZULÁPAM DEL ESPÍRITU SANTO", - "20032": "FRESNILLO DE TRUJANO", - "20033": "GUADALUPE ETLA", - "20034": "GUADALUPE DE RAMÍREZ", - "20035": "GUELATAO DE JUÁREZ", - "20036": "GUEVEA DE HUMBOLDT", - "20037": "MESONES HIDALGO", - "20038": "VILLA HIDALGO", - "20039": "HEROICA CIUDAD DE HUAJUAPAN DE LEÓN", - "20040": "HUAUTEPEC", - "20041": "HUAUTLA DE JIMÉNEZ", - "20042": "IXTLÁN DE JUÁREZ", - "20043": "JUCHITÁN DE ZARAGOZA", - "20044": "LOMA BONITA", - "20045": "MAGDALENA APASCO", - "20046": "MAGDALENA JALTEPEC", - "20047": "SANTA MAGDALENA JICOTLÁN", - "20048": "MAGDALENA MIXTEPEC", - "20049": "MAGDALENA OCOTLÁN", - "20050": "MAGDALENA PEÑASCO", - "20051": "MAGDALENA TEITIPAC", - "20052": "MAGDALENA TEQUISISTLÁN", - "20053": "MAGDALENA TLACOTEPEC", - "20054": "MAGDALENA ZAHUATLÁN", - "20055": "MARISCALA DE JUÁREZ", - "20056": "MÁRTIRES DE TACUBAYA", - "20057": "MATÍAS ROMERO AVENDAÑO", - "20058": "MAZATLÁN VILLA DE FLORES", - "20059": "MIAHUATLÁN DE PORFIRIO DÍAZ", - "20060": "MIXISTLÁN DE LA REFORMA", - "20061": "MONJAS", - "20062": "NATIVIDAD", - "20063": "NAZARENO ETLA", - "20064": "NEJAPA DE MADERO", - "20065": "IXPANTEPEC NIEVES", - "20066": "SANTIAGO NILTEPEC", - "20067": "OAXACA DE JUÁREZ", - "20068": "OCOTLÁN DE MORELOS", - "20069": "LA PE", - "20070": "PINOTEPA DE DON LUIS", - "20071": "PLUMA HIDALGO", - "20072": "SAN JOSÉ DEL PROGRESO", - "20073": "PUTLA VILLA DE GUERRERO", - "20074": "SANTA CATARINA QUIOQUITANI", - "20075": "REFORMA DE PINEDA", - "20076": "LA REFORMA", - "20077": "REYES ETLA", - "20078": "ROJAS DE CUAUHTÉMOC", - "20079": "SALINA CRUZ", - "20080": "SAN AGUSTÍN AMATENGO", - "20081": "SAN AGUSTÍN ATENANGO", - "20082": "SAN AGUSTÍN CHAYUCO", - "20083": "SAN AGUSTÍN DE LAS JUNTAS", - "20084": "SAN AGUSTÍN ETLA", - "20085": "SAN AGUSTÍN LOXICHA", - "20086": "SAN AGUSTÍN TLACOTEPEC", - "20087": "SAN AGUSTÍN YATARENI", - "20088": "SAN ANDRÉS CABECERA NUEVA", - "20089": "SAN ANDRÉS DINICUITI", - "20090": "SAN ANDRÉS HUAXPALTEPEC", - "20091": "SAN ANDRÉS HUAYÁPAM", - "20092": "SAN ANDRÉS IXTLAHUACA", - "20093": "SAN ANDRÉS LAGUNAS", - "20094": "SAN ANDRÉS NUXIÑO", - "20095": "SAN ANDRÉS PAXTLÁN", - "20096": "SAN ANDRÉS SINAXTLA", - "20097": "SAN ANDRÉS SOLAGA", - "20098": "SAN ANDRÉS TEOTILÁLPAM", - "20099": "SAN ANDRÉS TEPETLAPA", - "20100": "SAN ANDRÉS YAÁ", - "20101": "SAN ANDRÉS ZABACHE", - "20102": "SAN ANDRÉS ZAUTLA", - "20103": "SAN ANTONINO CASTILLO VELASCO", - "20104": "SAN ANTONINO EL ALTO", - "20105": "SAN ANTONINO MONTE VERDE", - "20106": "SAN ANTONIO ACUTLA", - "20107": "SAN ANTONIO DE LA CAL", - "20108": "SAN ANTONIO HUITEPEC", - "20109": "SAN ANTONIO NANAHUATÍPAM", - "20110": "SAN ANTONIO SINICAHUA", - "20111": "SAN ANTONIO TEPETLAPA", - "20112": "SAN BALTAZAR CHICHICÁPAM", - "20113": "SAN BALTAZAR LOXICHA", - "20114": "SAN BALTAZAR YATZACHI EL BAJO", - "20115": "SAN BARTOLO COYOTEPEC", - "20116": "SAN BARTOLOMÉ AYAUTLA", - "20117": "SAN BARTOLOMÉ LOXICHA", - "20118": "SAN BARTOLOMÉ QUIALANA", - "20119": "SAN BARTOLOMÉ YUCUAÑE", - "20120": "SAN BARTOLOMÉ ZOOGOCHO", - "20121": "SAN BARTOLO SOYALTEPEC", - "20122": "SAN BARTOLO YAUTEPEC", - "20123": "SAN BERNARDO MIXTEPEC", - "20124": "SAN BLAS ATEMPA", - "20125": "SAN CARLOS YAUTEPEC", - "20126": "SAN CRISTÓBAL AMATLÁN", - "20127": "SAN CRISTÓBAL AMOLTEPEC", - "20128": "SAN CRISTÓBAL LACHIRIOAG", - "20129": "SAN CRISTÓBAL SUCHIXTLAHUACA", - "20130": "SAN DIONISIO DEL MAR", - "20131": "SAN DIONISIO OCOTEPEC", - "20132": "SAN DIONISIO OCOTLÁN", - "20133": "SAN ESTEBAN ATATLAHUCA", - "20134": "SAN FELIPE JALAPA DE DÍAZ", - "20135": "SAN FELIPE TEJALÁPAM", - "20136": "SAN FELIPE USILA", - "20137": "SAN FRANCISCO CAHUACUÁ", - "20138": "SAN FRANCISCO CAJONOS", - "20139": "SAN FRANCISCO CHAPULAPA", - "20140": "SAN FRANCISCO CHINDÚA", - "20141": "SAN FRANCISCO DEL MAR", - "20142": "SAN FRANCISCO HUEHUETLÁN", - "20143": "SAN FRANCISCO IXHUATÁN", - "20144": "SAN FRANCISCO JALTEPETONGO", - "20145": "SAN FRANCISCO LACHIGOLÓ", - "20146": "SAN FRANCISCO LOGUECHE", - "20147": "SAN FRANCISCO NUXAÑO", - "20148": "SAN FRANCISCO OZOLOTEPEC", - "20149": "SAN FRANCISCO SOLA", - "20150": "SAN FRANCISCO TELIXTLAHUACA", - "20151": "SAN FRANCISCO TEOPAN", - "20152": "SAN FRANCISCO TLAPANCINGO", - "20153": "SAN GABRIEL MIXTEPEC", - "20154": "SAN ILDEFONSO AMATLÁN", - "20155": "SAN ILDEFONSO SOLA", - "20156": "SAN ILDEFONSO VILLA ALTA", - "20157": "SAN JACINTO AMILPAS", - "20158": "SAN JACINTO TLACOTEPEC", - "20159": "SAN JERÓNIMO COATLÁN", - "20160": "SAN JERÓNIMO SILACAYOAPILLA", - "20161": "SAN JERÓNIMO SOSOLA", - "20162": "SAN JERÓNIMO TAVICHE", - "20163": "SAN JERÓNIMO TECÓATL", - "20164": "SAN JORGE NUCHITA", - "20165": "SAN JOSÉ AYUQUILA", - "20166": "SAN JOSÉ CHILTEPEC", - "20167": "SAN JOSÉ DEL PEÑASCO", - "20168": "SAN JOSÉ ESTANCIA GRANDE", - "20169": "SAN JOSÉ INDEPENDENCIA", - "20170": "SAN JOSÉ LACHIGUIRI", - "20171": "SAN JOSÉ TENANGO", - "20172": "SAN JUAN ACHIUTLA", - "20173": "SAN JUAN ATEPEC", - "20174": "ÁNIMAS TRUJANO", - "20175": "SAN JUAN BAUTISTA ATATLAHUCA", - "20176": "SAN JUAN BAUTISTA COIXTLAHUACA", - "20177": "SAN JUAN BAUTISTA CUICATLÁN", - "20178": "SAN JUAN BAUTISTA GUELACHE", - "20179": "SAN JUAN BAUTISTA JAYACATLÁN", - "20180": "SAN JUAN BAUTISTA LO DE SOTO", - "20181": "SAN JUAN BAUTISTA SUCHITEPEC", - "20182": "SAN JUAN BAUTISTA TLACOATZINTEPEC", - "20183": "SAN JUAN BAUTISTA TLACHICHILCO", - "20184": "SAN JUAN BAUTISTA TUXTEPEC", - "20185": "SAN JUAN CACAHUATEPEC", - "20186": "SAN JUAN CIENEGUILLA", - "20187": "SAN JUAN COATZÓSPAM", - "20188": "SAN JUAN COLORADO", - "20189": "SAN JUAN COMALTEPEC", - "20190": "SAN JUAN COTZOCÓN", - "20191": "SAN JUAN CHICOMEZÚCHIL", - "20192": "SAN JUAN CHILATECA", - "20193": "SAN JUAN DEL ESTADO", - "20194": "SAN JUAN DEL RÍO", - "20195": "SAN JUAN DIUXI", - "20196": "SAN JUAN EVANGELISTA ANALCO", - "20197": "SAN JUAN GUELAVÍA", - "20198": "SAN JUAN GUICHICOVI", - "20199": "SAN JUAN IHUALTEPEC", - "20200": "SAN JUAN JUQUILA MIXES", - "20201": "SAN JUAN JUQUILA VIJANOS", - "20202": "SAN JUAN LACHAO", - "20203": "SAN JUAN LACHIGALLA", - "20204": "SAN JUAN LAJARCIA", - "20205": "SAN JUAN LALANA", - "20206": "SAN JUAN DE LOS CUÉS", - "20207": "SAN JUAN MAZATLÁN", - "20208": "SAN JUAN MIXTEPEC", - "20209": "SAN JUAN MIXTEPEC", - "20210": "SAN JUAN ÑUMÍ", - "20211": "SAN JUAN OZOLOTEPEC", - "20212": "SAN JUAN PETLAPA", - "20213": "SAN JUAN QUIAHIJE", - "20214": "SAN JUAN QUIOTEPEC", - "20215": "SAN JUAN SAYULTEPEC", - "20216": "SAN JUAN TABAÁ", - "20217": "SAN JUAN TAMAZOLA", - "20218": "SAN JUAN TEITA", - "20219": "SAN JUAN TEITIPAC", - "20220": "SAN JUAN TEPEUXILA", - "20221": "SAN JUAN TEPOSCOLULA", - "20222": "SAN JUAN YAEÉ", - "20223": "SAN JUAN YATZONA", - "20224": "SAN JUAN YUCUITA", - "20225": "SAN LORENZO", - "20226": "SAN LORENZO ALBARRADAS", - "20227": "SAN LORENZO CACAOTEPEC", - "20228": "SAN LORENZO CUAUNECUILTITLA", - "20229": "SAN LORENZO TEXMELÚCAN", - "20230": "SAN LORENZO VICTORIA", - "20231": "SAN LUCAS CAMOTLÁN", - "20232": "SAN LUCAS OJITLÁN", - "20233": "SAN LUCAS QUIAVINÍ", - "20234": "SAN LUCAS ZOQUIÁPAM", - "20235": "SAN LUIS AMATLÁN", - "20236": "SAN MARCIAL OZOLOTEPEC", - "20237": "SAN MARCOS ARTEAGA", - "20238": "SAN MARTÍN DE LOS CANSECOS", - "20239": "SAN MARTÍN HUAMELÚLPAM", - "20240": "SAN MARTÍN ITUNYOSO", - "20241": "SAN MARTÍN LACHILÁ", - "20242": "SAN MARTÍN PERAS", - "20243": "SAN MARTÍN TILCAJETE", - "20244": "SAN MARTÍN TOXPALAN", - "20245": "SAN MARTÍN ZACATEPEC", - "20246": "SAN MATEO CAJONOS", - "20247": "CAPULÁLPAM DE MÉNDEZ", - "20248": "SAN MATEO DEL MAR", - "20249": "SAN MATEO YOLOXOCHITLÁN", - "20250": "SAN MATEO ETLATONGO", - "20251": "SAN MATEO NEJÁPAM", - "20252": "SAN MATEO PEÑASCO", - "20253": "SAN MATEO PIÑAS", - "20254": "SAN MATEO RÍO HONDO", - "20255": "SAN MATEO SINDIHUI", - "20256": "SAN MATEO TLAPILTEPEC", - "20257": "SAN MELCHOR BETAZA", - "20258": "SAN MIGUEL ACHIUTLA", - "20259": "SAN MIGUEL AHUEHUETITLÁN", - "20260": "SAN MIGUEL ALOÁPAM", - "20261": "SAN MIGUEL AMATITLÁN", - "20262": "SAN MIGUEL AMATLÁN", - "20263": "SAN MIGUEL COATLÁN", - "20264": "SAN MIGUEL CHICAHUA", - "20265": "SAN MIGUEL CHIMALAPA", - "20266": "SAN MIGUEL DEL PUERTO", - "20267": "SAN MIGUEL DEL RÍO", - "20268": "SAN MIGUEL EJUTLA", - "20269": "SAN MIGUEL EL GRANDE", - "20270": "SAN MIGUEL HUAUTLA", - "20271": "SAN MIGUEL MIXTEPEC", - "20272": "SAN MIGUEL PANIXTLAHUACA", - "20273": "SAN MIGUEL PERAS", - "20274": "SAN MIGUEL PIEDRAS", - "20275": "SAN MIGUEL QUETZALTEPEC", - "20276": "SAN MIGUEL SANTA FLOR", - "20277": "VILLA SOLA DE VEGA", - "20278": "SAN MIGUEL SOYALTEPEC", - "20279": "SAN MIGUEL SUCHIXTEPEC", - "20280": "VILLA TALEA DE CASTRO", - "20281": "SAN MIGUEL TECOMATLÁN", - "20282": "SAN MIGUEL TENANGO", - "20283": "SAN MIGUEL TEQUIXTEPEC", - "20284": "SAN MIGUEL TILQUIÁPAM", - "20285": "SAN MIGUEL TLACAMAMA", - "20286": "SAN MIGUEL TLACOTEPEC", - "20287": "SAN MIGUEL TULANCINGO", - "20288": "SAN MIGUEL YOTAO", - "20289": "SAN NICOLÁS", - "20290": "SAN NICOLÁS HIDALGO", - "20291": "SAN PABLO COATLÁN", - "20292": "SAN PABLO CUATRO VENADOS", - "20293": "SAN PABLO ETLA", - "20294": "SAN PABLO HUITZO", - "20295": "SAN PABLO HUIXTEPEC", - "20296": "SAN PABLO MACUILTIANGUIS", - "20297": "SAN PABLO TIJALTEPEC", - "20298": "SAN PABLO VILLA DE MITLA", - "20299": "SAN PABLO YAGANIZA", - "20300": "SAN PEDRO AMUZGOS", - "20301": "SAN PEDRO APÓSTOL", - "20302": "SAN PEDRO ATOYAC", - "20303": "SAN PEDRO CAJONOS", - "20304": "SAN PEDRO COXCALTEPEC CÁNTAROS", - "20305": "SAN PEDRO COMITANCILLO", - "20306": "SAN PEDRO EL ALTO", - "20307": "SAN PEDRO HUAMELULA", - "20308": "SAN PEDRO HUILOTEPEC", - "20309": "SAN PEDRO IXCATLÁN", - "20310": "SAN PEDRO IXTLAHUACA", - "20311": "SAN PEDRO JALTEPETONGO", - "20312": "SAN PEDRO JICAYÁN", - "20313": "SAN PEDRO JOCOTIPAC", - "20314": "SAN PEDRO JUCHATENGO", - "20315": "SAN PEDRO MÁRTIR", - "20316": "SAN PEDRO MÁRTIR QUIECHAPA", - "20317": "SAN PEDRO MÁRTIR YUCUXACO", - "20318": "SAN PEDRO MIXTEPEC", - "20319": "SAN PEDRO MIXTEPEC", - "20320": "SAN PEDRO MOLINOS", - "20321": "SAN PEDRO NOPALA", - "20322": "SAN PEDRO OCOPETATILLO", - "20323": "SAN PEDRO OCOTEPEC", - "20324": "SAN PEDRO POCHUTLA", - "20325": "SAN PEDRO QUIATONI", - "20326": "SAN PEDRO SOCHIÁPAM", - "20327": "SAN PEDRO TAPANATEPEC", - "20328": "SAN PEDRO TAVICHE", - "20329": "SAN PEDRO TEOZACOALCO", - "20330": "SAN PEDRO TEUTILA", - "20331": "SAN PEDRO TIDAÁ", - "20332": "SAN PEDRO TOPILTEPEC", - "20333": "SAN PEDRO TOTOLÁPAM", - "20334": "VILLA DE TUTUTEPEC", - "20335": "SAN PEDRO YANERI", - "20336": "SAN PEDRO YÓLOX", - "20337": "SAN PEDRO Y SAN PABLO AYUTLA", - "20338": "VILLA DE ETLA", - "20339": "SAN PEDRO Y SAN PABLO TEPOSCOLULA", - "20340": "SAN PEDRO Y SAN PABLO TEQUIXTEPEC", - "20341": "SAN PEDRO YUCUNAMA", - "20342": "SAN RAYMUNDO JALPAN", - "20343": "SAN SEBASTIÁN ABASOLO", - "20344": "SAN SEBASTIÁN COATLÁN", - "20345": "SAN SEBASTIÁN IXCAPA", - "20346": "SAN SEBASTIÁN NICANANDUTA", - "20347": "SAN SEBASTIÁN RÍO HONDO", - "20348": "SAN SEBASTIÁN TECOMAXTLAHUACA", - "20349": "SAN SEBASTIÁN TEITIPAC", - "20350": "SAN SEBASTIÁN TUTLA", - "20351": "SAN SIMÓN ALMOLONGAS", - "20352": "SAN SIMÓN ZAHUATLÁN", - "20353": "SANTA ANA", - "20354": "SANTA ANA ATEIXTLAHUACA", - "20355": "SANTA ANA CUAUHTÉMOC", - "20356": "SANTA ANA DEL VALLE", - "20357": "SANTA ANA TAVELA", - "20358": "SANTA ANA TLAPACOYAN", - "20359": "SANTA ANA YARENI", - "20360": "SANTA ANA ZEGACHE", - "20361": "SANTA CATALINA QUIERÍ", - "20362": "SANTA CATARINA CUIXTLA", - "20363": "SANTA CATARINA IXTEPEJI", - "20364": "SANTA CATARINA JUQUILA", - "20365": "SANTA CATARINA LACHATAO", - "20366": "SANTA CATARINA LOXICHA", - "20367": "SANTA CATARINA MECHOACÁN", - "20368": "SANTA CATARINA MINAS", - "20369": "SANTA CATARINA QUIANÉ", - "20370": "SANTA CATARINA TAYATA", - "20371": "SANTA CATARINA TICUÁ", - "20372": "SANTA CATARINA YOSONOTÚ", - "20373": "SANTA CATARINA ZAPOQUILA", - "20374": "SANTA CRUZ ACATEPEC", - "20375": "SANTA CRUZ AMILPAS", - "20376": "SANTA CRUZ DE BRAVO", - "20377": "SANTA CRUZ ITUNDUJIA", - "20378": "SANTA CRUZ MIXTEPEC", - "20379": "SANTA CRUZ NUNDACO", - "20380": "SANTA CRUZ PAPALUTLA", - "20381": "SANTA CRUZ TACACHE DE MINA", - "20382": "SANTA CRUZ TACAHUA", - "20383": "SANTA CRUZ TAYATA", - "20384": "SANTA CRUZ XITLA", - "20385": "SANTA CRUZ XOXOCOTLÁN", - "20386": "SANTA CRUZ ZENZONTEPEC", - "20387": "SANTA GERTRUDIS", - "20388": "SANTA INÉS DEL MONTE", - "20389": "SANTA INÉS YATZECHE", - "20390": "SANTA LUCÍA DEL CAMINO", - "20391": "SANTA LUCÍA MIAHUATLÁN", - "20392": "SANTA LUCÍA MONTEVERDE", - "20393": "SANTA LUCÍA OCOTLÁN", - "20394": "SANTA MARÍA ALOTEPEC", - "20395": "SANTA MARÍA APAZCO", - "20396": "SANTA MARÍA LA ASUNCIÓN", - "20397": "HEROICA CIUDAD DE TLAXIACO", - "20398": "AYOQUEZCO DE ALDAMA", - "20399": "SANTA MARÍA ATZOMPA", - "20400": "SANTA MARÍA CAMOTLÁN", - "20401": "SANTA MARÍA COLOTEPEC", - "20402": "SANTA MARÍA CORTIJO", - "20403": "SANTA MARÍA COYOTEPEC", - "20404": "SANTA MARÍA CHACHOÁPAM", - "20405": "VILLA DE CHILAPA DE DÍAZ", - "20406": "SANTA MARÍA CHILCHOTLA", - "20407": "SANTA MARÍA CHIMALAPA", - "20408": "SANTA MARÍA DEL ROSARIO", - "20409": "SANTA MARÍA DEL TULE", - "20410": "SANTA MARÍA ECATEPEC", - "20411": "SANTA MARÍA GUELACÉ", - "20412": "SANTA MARÍA GUIENAGATI", - "20413": "SANTA MARÍA HUATULCO", - "20414": "SANTA MARÍA HUAZOLOTITLÁN", - "20415": "SANTA MARÍA IPALAPA", - "20416": "SANTA MARÍA IXCATLÁN", - "20417": "SANTA MARÍA JACATEPEC", - "20418": "SANTA MARÍA JALAPA DEL MARQUÉS", - "20419": "SANTA MARÍA JALTIANGUIS", - "20420": "SANTA MARÍA LACHIXÍO", - "20421": "SANTA MARÍA MIXTEQUILLA", - "20422": "SANTA MARÍA NATIVITAS", - "20423": "SANTA MARÍA NDUAYACO", - "20424": "SANTA MARÍA OZOLOTEPEC", - "20425": "SANTA MARÍA PÁPALO", - "20426": "SANTA MARÍA PEÑOLES", - "20427": "SANTA MARÍA PETAPA", - "20428": "SANTA MARÍA QUIEGOLANI", - "20429": "SANTA MARÍA SOLA", - "20430": "SANTA MARÍA TATALTEPEC", - "20431": "SANTA MARÍA TECOMAVACA", - "20432": "SANTA MARÍA TEMAXCALAPA", - "20433": "SANTA MARÍA TEMAXCALTEPEC", - "20434": "SANTA MARÍA TEOPOXCO", - "20435": "SANTA MARÍA TEPANTLALI", - "20436": "SANTA MARÍA TEXCATITLÁN", - "20437": "SANTA MARÍA TLAHUITOLTEPEC", - "20438": "SANTA MARÍA TLALIXTAC", - "20439": "SANTA MARÍA TONAMECA", - "20440": "SANTA MARÍA TOTOLAPILLA", - "20441": "SANTA MARÍA XADANI", - "20442": "SANTA MARÍA YALINA", - "20443": "SANTA MARÍA YAVESÍA", - "20444": "SANTA MARÍA YOLOTEPEC", - "20445": "SANTA MARÍA YOSOYÚA", - "20446": "SANTA MARÍA YUCUHITI", - "20447": "SANTA MARÍA ZACATEPEC", - "20448": "SANTA MARÍA ZANIZA", - "20449": "SANTA MARÍA ZOQUITLÁN", - "20450": "SANTIAGO AMOLTEPEC", - "20451": "SANTIAGO APOALA", - "20452": "SANTIAGO APÓSTOL", - "20453": "SANTIAGO ASTATA", - "20454": "SANTIAGO ATITLÁN", - "20455": "SANTIAGO AYUQUILILLA", - "20456": "SANTIAGO CACALOXTEPEC", - "20457": "SANTIAGO CAMOTLÁN", - "20458": "SANTIAGO COMALTEPEC", - "20459": "VILLA DE SANTIAGO CHAZUMBA", - "20460": "SANTIAGO CHOÁPAM", - "20461": "SANTIAGO DEL RÍO", - "20462": "SANTIAGO HUAJOLOTITLÁN", - "20463": "SANTIAGO HUAUCLILLA", - "20464": "SANTIAGO IHUITLÁN PLUMAS", - "20465": "SANTIAGO IXCUINTEPEC", - "20466": "SANTIAGO IXTAYUTLA", - "20467": "SANTIAGO JAMILTEPEC", - "20468": "SANTIAGO JOCOTEPEC", - "20469": "SANTIAGO JUXTLAHUACA", - "20470": "SANTIAGO LACHIGUIRI", - "20471": "SANTIAGO LALOPA", - "20472": "SANTIAGO LAOLLAGA", - "20473": "SANTIAGO LAXOPA", - "20474": "SANTIAGO LLANO GRANDE", - "20475": "SANTIAGO MATATLÁN", - "20476": "SANTIAGO MILTEPEC", - "20477": "SANTIAGO MINAS", - "20478": "SANTIAGO NACALTEPEC", - "20479": "SANTIAGO NEJAPILLA", - "20480": "SANTIAGO NUNDICHE", - "20481": "SANTIAGO NUYOÓ", - "20482": "SANTIAGO PINOTEPA NACIONAL", - "20483": "SANTIAGO SUCHILQUITONGO", - "20484": "SANTIAGO TAMAZOLA", - "20485": "SANTIAGO TAPEXTLA", - "20486": "VILLA TEJÚPAM DE LA UNIÓN", - "20487": "SANTIAGO TENANGO", - "20488": "SANTIAGO TEPETLAPA", - "20489": "SANTIAGO TETEPEC", - "20490": "SANTIAGO TEXCALCINGO", - "20491": "SANTIAGO TEXTITLÁN", - "20492": "SANTIAGO TILANTONGO", - "20493": "SANTIAGO TILLO", - "20494": "SANTIAGO TLAZOYALTEPEC", - "20495": "SANTIAGO XANICA", - "20496": "SANTIAGO XIACUÍ", - "20497": "SANTIAGO YAITEPEC", - "20498": "SANTIAGO YAVEO", - "20499": "SANTIAGO YOLOMÉCATL", - "20500": "SANTIAGO YOSONDÚA", - "20501": "SANTIAGO YUCUYACHI", - "20502": "SANTIAGO ZACATEPEC", - "20503": "SANTIAGO ZOOCHILA", - "20504": "NUEVO ZOQUIÁPAM", - "20505": "SANTO DOMINGO INGENIO", - "20506": "SANTO DOMINGO ALBARRADAS", - "20507": "SANTO DOMINGO ARMENTA", - "20508": "SANTO DOMINGO CHIHUITÁN", - "20509": "SANTO DOMINGO DE MORELOS", - "20510": "SANTO DOMINGO IXCATLÁN", - "20511": "SANTO DOMINGO NUXAÁ", - "20512": "SANTO DOMINGO OZOLOTEPEC", - "20513": "SANTO DOMINGO PETAPA", - "20514": "SANTO DOMINGO ROAYAGA", - "20515": "SANTO DOMINGO TEHUANTEPEC", - "20516": "SANTO DOMINGO TEOJOMULCO", - "20517": "SANTO DOMINGO TEPUXTEPEC", - "20518": "SANTO DOMINGO TLATAYÁPAM", - "20519": "SANTO DOMINGO TOMALTEPEC", - "20520": "SANTO DOMINGO TONALÁ", - "20521": "SANTO DOMINGO TONALTEPEC", - "20522": "SANTO DOMINGO XAGACÍA", - "20523": "SANTO DOMINGO YANHUITLÁN", - "20524": "SANTO DOMINGO YODOHINO", - "20525": "SANTO DOMINGO ZANATEPEC", - "20526": "SANTOS REYES NOPALA", - "20527": "SANTOS REYES PÁPALO", - "20528": "SANTOS REYES TEPEJILLO", - "20529": "SANTOS REYES YUCUNÁ", - "20530": "SANTO TOMÁS JALIEZA", - "20531": "SANTO TOMÁS MAZALTEPEC", - "20532": "SANTO TOMÁS OCOTEPEC", - "20533": "SANTO TOMÁS TAMAZULAPAN", - "20534": "SAN VICENTE COATLÁN", - "20535": "SAN VICENTE LACHIXÍO", - "20536": "SAN VICENTE NUÑÚ", - "20537": "SILACAYOÁPAM", - "20538": "SITIO DE XITLAPEHUA", - "20539": "SOLEDAD ETLA", - "20540": "VILLA DE TAMAZULÁPAM DEL PROGRESO", - "20541": "TANETZE DE ZARAGOZA", - "20542": "TANICHE", - "20543": "TATALTEPEC DE VALDÉS", - "20544": "TEOCOCUILCO DE MARCOS PÉREZ", - "20545": "TEOTITLÁN DE FLORES MAGÓN", - "20546": "TEOTITLÁN DEL VALLE", - "20547": "TEOTONGO", - "20548": "TEPELMEME VILLA DE MORELOS", - "20549": "HEROICA VILLA TEZOATLÁN DE SEGURA Y LUNA, CUNA DE LA INDEPENDENCIA DE OAXACA", - "20550": "SAN JERÓNIMO TLACOCHAHUAYA", - "20551": "TLACOLULA DE MATAMOROS", - "20552": "TLACOTEPEC PLUMAS", - "20553": "TLALIXTAC DE CABRERA", - "20554": "TOTONTEPEC VILLA DE MORELOS", - "20555": "TRINIDAD ZAACHILA", - "20556": "LA TRINIDAD VISTA HERMOSA", - "20557": "UNIÓN HIDALGO", - "20558": "VALERIO TRUJANO", - "20559": "SAN JUAN BAUTISTA VALLE NACIONAL", - "20560": "VILLA DÍAZ ORDAZ", - "20561": "YAXE", - "20562": "MAGDALENA YODOCONO DE PORFIRIO DÍAZ", - "20563": "YOGANA", - "20564": "YUTANDUCHI DE GUERRERO", - "20565": "VILLA DE ZAACHILA", - "20566": "SAN MATEO YUCUTINDOO", - "20567": "ZAPOTITLÁN LAGUNAS", - "20568": "ZAPOTITLÁN PALMAS", - "20569": "SANTA INÉS DE ZARAGOZA", - "20570": "ZIMATLÁN DE ÁLVAREZ", - "21001": "ACAJETE", - "21002": "ACATENO", - "21003": "ACATLÁN", - "21004": "ACATZINGO", - "21005": "ACTEOPAN", - "21006": "AHUACATLÁN", - "21007": "AHUATLÁN", - "21008": "AHUAZOTEPEC", - "21009": "AHUEHUETITLA", - "21010": "AJALPAN", - "21011": "ALBINO ZERTUCHE", - "21012": "ALJOJUCA", - "21013": "ALTEPEXI", - "21014": "AMIXTLÁN", - "21015": "AMOZOC", - "21016": "AQUIXTLA", - "21017": "ATEMPAN", - "21018": "ATEXCAL", - "21019": "ATLIXCO", - "21020": "ATOYATEMPAN", - "21021": "ATZALA", - "21022": "ATZITZIHUACÁN", - "21023": "ATZITZINTLA", - "21024": "AXUTLA", - "21025": "AYOTOXCO DE GUERRERO", - "21026": "CALPAN", - "21027": "CALTEPEC", - "21028": "CAMOCUAUTLA", - "21029": "CAXHUACAN", - "21030": "COATEPEC", - "21031": "COATZINGO", - "21032": "COHETZALA", - "21033": "COHUECAN", - "21034": "CORONANGO", - "21035": "COXCATLÁN", - "21036": "COYOMEAPAN", - "21037": "COYOTEPEC", - "21038": "CUAPIAXTLA DE MADERO", - "21039": "CUAUTEMPAN", - "21040": "CUAUTINCHÁN", - "21041": "CUAUTLANCINGO", - "21042": "CUAYUCA DE ANDRADE", - "21043": "CUETZALAN DEL PROGRESO", - "21044": "CUYOACO", - "21045": "CHALCHICOMULA DE SESMA", - "21046": "CHAPULCO", - "21047": "CHIAUTLA", - "21048": "CHIAUTZINGO", - "21049": "CHICONCUAUTLA", - "21050": "CHICHIQUILA", - "21051": "CHIETLA", - "21052": "CHIGMECATITLÁN", - "21053": "CHIGNAHUAPAN", - "21054": "CHIGNAUTLA", - "21055": "CHILA", - "21056": "CHILA DE LA SAL", - "21057": "HONEY", - "21058": "CHILCHOTLA", - "21059": "CHINANTLA", - "21060": "DOMINGO ARENAS", - "21061": "ELOXOCHITLÁN", - "21062": "EPATLÁN", - "21063": "ESPERANZA", - "21064": "FRANCISCO Z. MENA", - "21065": "GENERAL FELIPE ÁNGELES", - "21066": "GUADALUPE", - "21067": "GUADALUPE VICTORIA", - "21068": "HERMENEGILDO GALEANA", - "21069": "HUAQUECHULA", - "21070": "HUATLATLAUCA", - "21071": "HUAUCHINANGO", - "21072": "HUEHUETLA", - "21073": "HUEHUETLÁN EL CHICO", - "21074": "HUEJOTZINGO", - "21075": "HUEYAPAN", - "21076": "HUEYTAMALCO", - "21077": "HUEYTLALPAN", - "21078": "HUITZILAN DE SERDÁN", - "21079": "HUITZILTEPEC", - "21080": "ATLEQUIZAYAN", - "21081": "IXCAMILPA DE GUERRERO", - "21082": "IXCAQUIXTLA", - "21083": "IXTACAMAXTITLÁN", - "21084": "IXTEPEC", - "21085": "IZÚCAR DE MATAMOROS", - "21086": "JALPAN", - "21087": "JOLALPAN", - "21088": "JONOTLA", - "21089": "JOPALA", - "21090": "JUAN C. BONILLA", - "21091": "JUAN GALINDO", - "21092": "JUAN N. MÉNDEZ", - "21093": "LAFRAGUA", - "21094": "LIBRES", - "21095": "LA MAGDALENA TLATLAUQUITEPEC", - "21096": "MAZAPILTEPEC DE JUÁREZ", - "21097": "MIXTLA", - "21098": "MOLCAXAC", - "21099": "CAÑADA MORELOS", - "21100": "NAUPAN", - "21101": "NAUZONTLA", - "21102": "NEALTICAN", - "21103": "NICOLÁS BRAVO", - "21104": "NOPALUCAN", - "21105": "OCOTEPEC", - "21106": "OCOYUCAN", - "21107": "OLINTLA", - "21108": "ORIENTAL", - "21109": "PAHUATLÁN", - "21110": "PALMAR DE BRAVO", - "21111": "PANTEPEC", - "21112": "PETLALCINGO", - "21113": "PIAXTLA", - "21114": "PUEBLA", - "21115": "QUECHOLAC", - "21116": "QUIMIXTLÁN", - "21117": "RAFAEL LARA GRAJALES", - "21118": "LOS REYES DE JUÁREZ", - "21119": "SAN ANDRÉS CHOLULA", - "21120": "SAN ANTONIO CAÑADA", - "21121": "SAN DIEGO LA MESA TOCHIMILTZINGO", - "21122": "SAN FELIPE TEOTLALCINGO", - "21123": "SAN FELIPE TEPATLÁN", - "21124": "SAN GABRIEL CHILAC", - "21125": "SAN GREGORIO ATZOMPA", - "21126": "SAN JERÓNIMO TECUANIPAN", - "21127": "SAN JERÓNIMO XAYACATLÁN", - "21128": "SAN JOSÉ CHIAPA", - "21129": "SAN JOSÉ MIAHUATLÁN", - "21130": "SAN JUAN ATENCO", - "21131": "SAN JUAN ATZOMPA", - "21132": "SAN MARTÍN TEXMELUCAN", - "21133": "SAN MARTÍN TOTOLTEPEC", - "21134": "SAN MATÍAS TLALANCALECA", - "21135": "SAN MIGUEL IXITLÁN", - "21136": "SAN MIGUEL XOXTLA", - "21137": "SAN NICOLÁS BUENOS AIRES", - "21138": "SAN NICOLÁS DE LOS RANCHOS", - "21139": "SAN PABLO ANICANO", - "21140": "SAN PEDRO CHOLULA", - "21141": "SAN PEDRO YELOIXTLAHUACA", - "21142": "SAN SALVADOR EL SECO", - "21143": "SAN SALVADOR EL VERDE", - "21144": "SAN SALVADOR HUIXCOLOTLA", - "21145": "SAN SEBASTIÁN TLACOTEPEC", - "21146": "SANTA CATARINA TLALTEMPAN", - "21147": "SANTA INÉS AHUATEMPAN", - "21148": "SANTA ISABEL CHOLULA", - "21149": "SANTIAGO MIAHUATLÁN", - "21150": "HUEHUETLÁN EL GRANDE", - "21151": "SANTO TOMÁS HUEYOTLIPAN", - "21152": "SOLTEPEC", - "21153": "TECALI DE HERRERA", - "21154": "TECAMACHALCO", - "21155": "TECOMATLÁN", - "21156": "TEHUACÁN", - "21157": "TEHUITZINGO", - "21158": "TENAMPULCO", - "21159": "TEOPANTLÁN", - "21160": "TEOTLALCO", - "21161": "TEPANCO DE LÓPEZ", - "21162": "TEPANGO DE RODRÍGUEZ", - "21163": "TEPATLAXCO DE HIDALGO", - "21164": "TEPEACA", - "21165": "TEPEMAXALCO", - "21166": "TEPEOJUMA", - "21167": "TEPETZINTLA", - "21168": "TEPEXCO", - "21169": "TEPEXI DE RODRÍGUEZ", - "21170": "TEPEYAHUALCO", - "21171": "TEPEYAHUALCO DE CUAUHTÉMOC", - "21172": "TETELA DE OCAMPO", - "21173": "TETELES DE AVILA CASTILLO", - "21174": "TEZIUTLÁN", - "21175": "TIANGUISMANALCO", - "21176": "TILAPA", - "21177": "TLACOTEPEC DE BENITO JUÁREZ", - "21178": "TLACUILOTEPEC", - "21179": "TLACHICHUCA", - "21180": "TLAHUAPAN", - "21181": "TLALTENANGO", - "21182": "TLANEPANTLA", - "21183": "TLAOLA", - "21184": "TLAPACOYA", - "21185": "TLAPANALÁ", - "21186": "TLATLAUQUITEPEC", - "21187": "TLAXCO", - "21188": "TOCHIMILCO", - "21189": "TOCHTEPEC", - "21190": "TOTOLTEPEC DE GUERRERO", - "21191": "TULCINGO", - "21192": "TUZAMAPAN DE GALEANA", - "21193": "TZICATLACOYAN", - "21194": "VENUSTIANO CARRANZA", - "21195": "VICENTE GUERRERO", - "21196": "XAYACATLÁN DE BRAVO", - "21197": "XICOTEPEC", - "21198": "XICOTLÁN", - "21199": "XIUTETELCO", - "21200": "XOCHIAPULCO", - "21201": "XOCHILTEPEC", - "21202": "XOCHITLÁN DE VICENTE SUÁREZ", - "21203": "XOCHITLÁN TODOS SANTOS", - "21204": "YAONÁHUAC", - "21205": "YEHUALTEPEC", - "21206": "ZACAPALA", - "21207": "ZACAPOAXTLA", - "21208": "ZACATLÁN", - "21209": "ZAPOTITLÁN", - "21210": "ZAPOTITLÁN DE MÉNDEZ", - "21211": "ZARAGOZA", - "21212": "ZAUTLA", - "21213": "ZIHUATEUTLA", - "21214": "ZINACATEPEC", - "21215": "ZONGOZOTLA", - "21216": "ZOQUIAPAN", - "21217": "ZOQUITLÁN", - "22001": "AMEALCO DE BONFIL", - "22002": "PINAL DE AMOLES", - "22003": "ARROYO SECO", - "22004": "CADEREYTA DE MONTES", - "22005": "COLÓN", - "22006": "CORREGIDORA", - "22007": "EZEQUIEL MONTES", - "22008": "HUIMILPAN", - "22009": "JALPAN DE SERRA", - "22010": "LANDA DE MATAMOROS", - "22011": "EL MARQUÉS", - "22012": "PEDRO ESCOBEDO", - "22013": "PEÑAMILLER", - "22014": "QUERÉTARO", - "22015": "SAN JOAQUÍN", - "22016": "SAN JUAN DEL RÍO", - "22017": "TEQUISQUIAPAN", - "22018": "TOLIMÁN", - "23001": "COZUMEL", - "23002": "FELIPE CARRILLO PUERTO", - "23003": "ISLA MUJERES", - "23004": "OTHÓN P. BLANCO", - "23005": "BENITO JUÁREZ", - "23006": "JOSÉ MARÍA MORELOS", - "23007": "LÁZARO CÁRDENAS", - "23008": "SOLIDARIDAD", - "23009": "TULUM", - "23010": "BACALAR", - "23011": "PUERTO MORELOS", - "24001": "AHUALULCO", - "24002": "ALAQUINES", - "24003": "AQUISMÓN", - "24004": "ARMADILLO DE LOS INFANTE", - "24005": "CÁRDENAS", - "24006": "CATORCE", - "24007": "CEDRAL", - "24008": "CERRITOS", - "24009": "CERRO DE SAN PEDRO", - "24010": "CIUDAD DEL MAÍZ", - "24011": "CIUDAD FERNÁNDEZ", - "24012": "TANCANHUITZ", - "24013": "CIUDAD VALLES", - "24014": "COXCATLÁN", - "24015": "CHARCAS", - "24016": "EBANO", - "24017": "GUADALCÁZAR", - "24018": "HUEHUETLÁN", - "24019": "LAGUNILLAS", - "24020": "MATEHUALA", - "24021": "MEXQUITIC DE CARMONA", - "24022": "MOCTEZUMA", - "24023": "RAYÓN", - "24024": "RIOVERDE", - "24025": "SALINAS", - "24026": "SAN ANTONIO", - "24027": "SAN CIRO DE ACOSTA", - "24028": "SAN LUIS POTOSÍ", - "24029": "SAN MARTÍN CHALCHICUAUTLA", - "24030": "SAN NICOLÁS TOLENTINO", - "24031": "SANTA CATARINA", - "24032": "SANTA MARÍA DEL RÍO", - "24033": "SANTO DOMINGO", - "24034": "SAN VICENTE TANCUAYALAB", - "24035": "SOLEDAD DE GRACIANO SÁNCHEZ", - "24036": "TAMASOPO", - "24037": "TAMAZUNCHALE", - "24038": "TAMPACÁN", - "24039": "TAMPAMOLÓN CORONA", - "24040": "TAMUÍN", - "24041": "TANLAJÁS", - "24042": "TANQUIÁN DE ESCOBEDO", - "24043": "TIERRA NUEVA", - "24044": "VANEGAS", - "24045": "VENADO", - "24046": "VILLA DE ARRIAGA", - "24047": "VILLA DE GUADALUPE", - "24048": "VILLA DE LA PAZ", - "24049": "VILLA DE RAMOS", - "24050": "VILLA DE REYES", - "24051": "VILLA HIDALGO", - "24052": "VILLA JUÁREZ", - "24053": "AXTLA DE TERRAZAS", - "24054": "XILITLA", - "24055": "ZARAGOZA", - "24056": "VILLA DE ARISTA", - "24057": "MATLAPA", - "24058": "EL NARANJO", - "25001": "AHOME", - "25002": "ANGOSTURA", - "25003": "BADIRAGUATO", - "25004": "CONCORDIA", - "25005": "COSALÁ", - "25006": "CULIACÁN", - "25007": "CHOIX", - "25008": "ELOTA", - "25009": "ESCUINAPA", - "25010": "EL FUERTE", - "25011": "GUASAVE", - "25012": "MAZATLÁN", - "25013": "MOCORITO", - "25014": "ROSARIO", - "25015": "SALVADOR ALVARADO", - "25016": "SAN IGNACIO", - "25017": "SINALOA", - "25018": "NAVOLATO", - "26001": "ACONCHI", - "26002": "AGUA PRIETA", - "26003": "ALAMOS", - "26004": "ALTAR", - "26005": "ARIVECHI", - "26006": "ARIZPE", - "26007": "ATIL", - "26008": "BACADÉHUACHI", - "26009": "BACANORA", - "26010": "BACERAC", - "26011": "BACOACHI", - "26012": "BÁCUM", - "26013": "BANÁMICHI", - "26014": "BAVIÁCORA", - "26015": "BAVISPE", - "26016": "BENJAMÍN HILL", - "26017": "CABORCA", - "26018": "CAJEME", - "26019": "CANANEA", - "26020": "CARBÓ", - "26021": "LA COLORADA", - "26022": "CUCURPE", - "26023": "CUMPAS", - "26024": "DIVISADEROS", - "26025": "EMPALME", - "26026": "ETCHOJOA", - "26027": "FRONTERAS", - "26028": "GRANADOS", - "26029": "GUAYMAS", - "26030": "HERMOSILLO", - "26031": "HUACHINERA", - "26032": "HUÁSABAS", - "26033": "HUATABAMPO", - "26034": "HUÉPAC", - "26035": "IMURIS", - "26036": "MAGDALENA", - "26037": "MAZATÁN", - "26038": "MOCTEZUMA", - "26039": "NACO", - "26040": "NÁCORI CHICO", - "26041": "NACOZARI DE GARCÍA", - "26042": "NAVOJOA", - "26043": "NOGALES", - "26044": "ONAVAS", - "26045": "OPODEPE", - "26046": "OQUITOA", - "26047": "PITIQUITO", - "26048": "PUERTO PEÑASCO", - "26049": "QUIRIEGO", - "26050": "RAYÓN", - "26051": "ROSARIO", - "26052": "SAHUARIPA", - "26053": "SAN FELIPE DE JESÚS", - "26054": "SAN JAVIER", - "26055": "SAN LUIS RÍO COLORADO", - "26056": "SAN MIGUEL DE HORCASITAS", - "26057": "SAN PEDRO DE LA CUEVA", - "26058": "SANTA ANA", - "26059": "SANTA CRUZ", - "26060": "SÁRIC", - "26061": "SOYOPA", - "26062": "SUAQUI GRANDE", - "26063": "TEPACHE", - "26064": "TRINCHERAS", - "26065": "TUBUTAMA", - "26066": "URES", - "26067": "VILLA HIDALGO", - "26068": "VILLA PESQUEIRA", - "26069": "YÉCORA", - "26070": "GENERAL PLUTARCO ELÍAS CALLES", - "26071": "BENITO JUÁREZ", - "26072": "SAN IGNACIO RÍO MUERTO", - "27001": "BALANCÁN", - "27002": "CÁRDENAS", - "27003": "CENTLA", - "27004": "CENTRO", - "27005": "COMALCALCO", - "27006": "CUNDUACÁN", - "27007": "EMILIANO ZAPATA", - "27008": "HUIMANGUILLO", - "27009": "JALAPA", - "27010": "JALPA DE MÉNDEZ", - "27011": "JONUTA", - "27012": "MACUSPANA", - "27013": "NACAJUCA", - "27014": "PARAÍSO", - "27015": "TACOTALPA", - "27016": "TEAPA", - "27017": "TENOSIQUE", - "28001": "ABASOLO", - "28002": "ALDAMA", - "28003": "ALTAMIRA", - "28004": "ANTIGUO MORELOS", - "28005": "BURGOS", - "28006": "BUSTAMANTE", - "28007": "CAMARGO", - "28008": "CASAS", - "28009": "CIUDAD MADERO", - "28010": "CRUILLAS", - "28011": "GÓMEZ FARÍAS", - "28012": "GONZÁLEZ", - "28013": "GÜÉMEZ", - "28014": "GUERRERO", - "28015": "GUSTAVO DÍAZ ORDAZ", - "28016": "HIDALGO", - "28017": "JAUMAVE", - "28018": "JIMÉNEZ", - "28019": "LLERA", - "28020": "MAINERO", - "28021": "EL MANTE", - "28022": "MATAMOROS", - "28023": "MÉNDEZ", - "28024": "MIER", - "28025": "MIGUEL ALEMÁN", - "28026": "MIQUIHUANA", - "28027": "NUEVO LAREDO", - "28028": "NUEVO MORELOS", - "28029": "OCAMPO", - "28030": "PADILLA", - "28031": "PALMILLAS", - "28032": "REYNOSA", - "28033": "RÍO BRAVO", - "28034": "SAN CARLOS", - "28035": "SAN FERNANDO", - "28036": "SAN NICOLÁS", - "28037": "SOTO LA MARINA", - "28038": "TAMPICO", - "28039": "TULA", - "28040": "VALLE HERMOSO", - "28041": "VICTORIA", - "28042": "VILLAGRÁN", - "28043": "XICOTÉNCATL", - "29001": "AMAXAC DE GUERRERO", - "29002": "APETATITLÁN DE ANTONIO CARVAJAL", - "29003": "ATLANGATEPEC", - "29004": "ATLTZAYANCA", - "29005": "APIZACO", - "29006": "CALPULALPAN", - "29007": "EL CARMEN TEQUEXQUITLA", - "29008": "CUAPIAXTLA", - "29009": "CUAXOMULCO", - "29010": "CHIAUTEMPAN", - "29011": "MUÑOZ DE DOMINGO ARENAS", - "29012": "ESPAÑITA", - "29013": "HUAMANTLA", - "29014": "HUEYOTLIPAN", - "29015": "IXTACUIXTLA DE MARIANO MATAMOROS", - "29016": "IXTENCO", - "29017": "MAZATECOCHCO DE JOSÉ MARÍA MORELOS", - "29018": "CONTLA DE JUAN CUAMATZI", - "29019": "TEPETITLA DE LARDIZÁBAL", - "29020": "SANCTÓRUM DE LÁZARO CÁRDENAS", - "29021": "NANACAMILPA DE MARIANO ARISTA", - "29022": "ACUAMANALA DE MIGUEL HIDALGO", - "29023": "NATÍVITAS", - "29024": "PANOTLA", - "29025": "SAN PABLO DEL MONTE", - "29026": "SANTA CRUZ TLAXCALA", - "29027": "TENANCINGO", - "29028": "TEOLOCHOLCO", - "29029": "TEPEYANCO", - "29030": "TERRENATE", - "29031": "TETLA DE LA SOLIDARIDAD", - "29032": "TETLATLAHUCA", - "29033": "TLAXCALA", - "29034": "TLAXCO", - "29035": "TOCATLÁN", - "29036": "TOTOLAC", - "29037": "ZILTLALTÉPEC DE TRINIDAD SÁNCHEZ SANTOS", - "29038": "TZOMPANTEPEC", - "29039": "XALOZTOC", - "29040": "XALTOCAN", - "29041": "PAPALOTLA DE XICOHTÉNCATL", - "29042": "XICOHTZINCO", - "29043": "YAUHQUEMEHCAN", - "29044": "ZACATELCO", - "29045": "BENITO JUÁREZ", - "29046": "EMILIANO ZAPATA", - "29047": "LÁZARO CÁRDENAS", - "29048": "LA MAGDALENA TLALTELULCO", - "29049": "SAN DAMIÁN TEXÓLOC", - "29050": "SAN FRANCISCO TETLANOHCAN", - "29051": "SAN JERÓNIMO ZACUALPAN", - "29052": "SAN JOSÉ TEACALCO", - "29053": "SAN JUAN HUACTZINCO", - "29054": "SAN LORENZO AXOCOMANITLA", - "29055": "SAN LUCAS TECOPILCO", - "29056": "SANTA ANA NOPALUCAN", - "29057": "SANTA APOLONIA TEACALCO", - "29058": "SANTA CATARINA AYOMETLA", - "29059": "SANTA CRUZ QUILEHTLA", - "29060": "SANTA ISABEL XILOXOXTLA", - "30001": "ACAJETE", - "30002": "ACATLÁN", - "30003": "ACAYUCAN", - "30004": "ACTOPAN", - "30005": "ACULA", - "30006": "ACULTZINGO", - "30007": "CAMARÓN DE TEJEDA", - "30008": "ALPATLÁHUAC", - "30009": "ALTO LUCERO DE GUTIÉRREZ BARRIOS", - "30010": "ALTOTONGA", - "30011": "ALVARADO", - "30012": "AMATITLÁN", - "30013": "NARANJOS AMATLÁN", - "30014": "AMATLÁN DE LOS REYES", - "30015": "ANGEL R. CABADA", - "30016": "LA ANTIGUA", - "30017": "APAZAPAN", - "30018": "AQUILA", - "30019": "ASTACINGA", - "30020": "ATLAHUILCO", - "30021": "ATOYAC", - "30022": "ATZACAN", - "30023": "ATZALAN", - "30024": "TLALTETELA", - "30025": "AYAHUALULCO", - "30026": "BANDERILLA", - "30027": "BENITO JUÁREZ", - "30028": "BOCA DEL RÍO", - "30029": "CALCAHUALCO", - "30030": "CAMERINO Z. MENDOZA", - "30031": "CARRILLO PUERTO", - "30032": "CATEMACO", - "30033": "CAZONES DE HERRERA", - "30034": "CERRO AZUL", - "30035": "CITLALTÉPETL", - "30036": "COACOATZINTLA", - "30037": "COAHUITLÁN", - "30038": "COATEPEC", - "30039": "COATZACOALCOS", - "30040": "COATZINTLA", - "30041": "COETZALA", - "30042": "COLIPA", - "30043": "COMAPA", - "30044": "CÓRDOBA", - "30045": "COSAMALOAPAN DE CARPIO", - "30046": "COSAUTLÁN DE CARVAJAL", - "30047": "COSCOMATEPEC", - "30048": "COSOLEACAQUE", - "30049": "COTAXTLA", - "30050": "COXQUIHUI", - "30051": "COYUTLA", - "30052": "CUICHAPA", - "30053": "CUITLÁHUAC", - "30054": "CHACALTIANGUIS", - "30055": "CHALMA", - "30056": "CHICONAMEL", - "30057": "CHICONQUIACO", - "30058": "CHICONTEPEC", - "30059": "CHINAMECA", - "30060": "CHINAMPA DE GOROSTIZA", - "30061": "LAS CHOAPAS", - "30062": "CHOCAMÁN", - "30063": "CHONTLA", - "30064": "CHUMATLÁN", - "30065": "EMILIANO ZAPATA", - "30066": "ESPINAL", - "30067": "FILOMENO MATA", - "30068": "FORTÍN", - "30069": "GUTIÉRREZ ZAMORA", - "30070": "HIDALGOTITLÁN", - "30071": "HUATUSCO", - "30072": "HUAYACOCOTLA", - "30073": "HUEYAPAN DE OCAMPO", - "30074": "HUILOAPAN DE CUAUHTÉMOC", - "30075": "IGNACIO DE LA LLAVE", - "30076": "ILAMATLÁN", - "30077": "ISLA", - "30078": "IXCATEPEC", - "30079": "IXHUACÁN DE LOS REYES", - "30080": "IXHUATLÁN DEL CAFÉ", - "30081": "IXHUATLANCILLO", - "30082": "IXHUATLÁN DEL SURESTE", - "30083": "IXHUATLÁN DE MADERO", - "30084": "IXMATLAHUACAN", - "30085": "IXTACZOQUITLÁN", - "30086": "JALACINGO", - "30087": "XALAPA", - "30088": "JALCOMULCO", - "30089": "JÁLTIPAN", - "30090": "JAMAPA", - "30091": "JESÚS CARRANZA", - "30092": "XICO", - "30093": "JILOTEPEC", - "30094": "JUAN RODRÍGUEZ CLARA", - "30095": "JUCHIQUE DE FERRER", - "30096": "LANDERO Y COSS", - "30097": "LERDO DE TEJADA", - "30098": "MAGDALENA", - "30099": "MALTRATA", - "30100": "MANLIO FABIO ALTAMIRANO", - "30101": "MARIANO ESCOBEDO", - "30102": "MARTÍNEZ DE LA TORRE", - "30103": "MECATLÁN", - "30104": "MECAYAPAN", - "30105": "MEDELLÍN DE BRAVO", - "30106": "MIAHUATLÁN", - "30107": "LAS MINAS", - "30108": "MINATITLÁN", - "30109": "MISANTLA", - "30110": "MIXTLA DE ALTAMIRANO", - "30111": "MOLOACÁN", - "30112": "NAOLINCO", - "30113": "NARANJAL", - "30114": "NAUTLA", - "30115": "NOGALES", - "30116": "OLUTA", - "30117": "OMEALCA", - "30118": "ORIZABA", - "30119": "OTATITLÁN", - "30120": "OTEAPAN", - "30121": "OZULUAMA DE MASCAREÑAS", - "30122": "PAJAPAN", - "30123": "PÁNUCO", - "30124": "PAPANTLA", - "30125": "PASO DEL MACHO", - "30126": "PASO DE OVEJAS", - "30127": "LA PERLA", - "30128": "PEROTE", - "30129": "PLATÓN SÁNCHEZ", - "30130": "PLAYA VICENTE", - "30131": "POZA RICA DE HIDALGO", - "30132": "LAS VIGAS DE RAMÍREZ", - "30133": "PUEBLO VIEJO", - "30134": "PUENTE NACIONAL", - "30135": "RAFAEL DELGADO", - "30136": "RAFAEL LUCIO", - "30137": "LOS REYES", - "30138": "RÍO BLANCO", - "30139": "SALTABARRANCA", - "30140": "SAN ANDRÉS TENEJAPAN", - "30141": "SAN ANDRÉS TUXTLA", - "30142": "SAN JUAN EVANGELISTA", - "30143": "SANTIAGO TUXTLA", - "30144": "SAYULA DE ALEMÁN", - "30145": "SOCONUSCO", - "30146": "SOCHIAPA", - "30147": "SOLEDAD ATZOMPA", - "30148": "SOLEDAD DE DOBLADO", - "30149": "SOTEAPAN", - "30150": "TAMALÍN", - "30151": "TAMIAHUA", - "30152": "TAMPICO ALTO", - "30153": "TANCOCO", - "30154": "TANTIMA", - "30155": "TANTOYUCA", - "30156": "TATATILA", - "30157": "CASTILLO DE TEAYO", - "30158": "TECOLUTLA", - "30159": "TEHUIPANGO", - "30160": "ÁLAMO TEMAPACHE", - "30161": "TEMPOAL", - "30162": "TENAMPA", - "30163": "TENOCHTITLÁN", - "30164": "TEOCELO", - "30165": "TEPATLAXCO", - "30166": "TEPETLÁN", - "30167": "TEPETZINTLA", - "30168": "TEQUILA", - "30169": "JOSÉ AZUETA", - "30170": "TEXCATEPEC", - "30171": "TEXHUACÁN", - "30172": "TEXISTEPEC", - "30173": "TEZONAPA", - "30174": "TIERRA BLANCA", - "30175": "TIHUATLÁN", - "30176": "TLACOJALPAN", - "30177": "TLACOLULAN", - "30178": "TLACOTALPAN", - "30179": "TLACOTEPEC DE MEJÍA", - "30180": "TLACHICHILCO", - "30181": "TLALIXCOYAN", - "30182": "TLALNELHUAYOCAN", - "30183": "TLAPACOYAN", - "30184": "TLAQUILPA", - "30185": "TLILAPAN", - "30186": "TOMATLÁN", - "30187": "TONAYÁN", - "30188": "TOTUTLA", - "30189": "TUXPAN", - "30190": "TUXTILLA", - "30191": "URSULO GALVÁN", - "30192": "VEGA DE ALATORRE", - "30193": "VERACRUZ", - "30194": "VILLA ALDAMA", - "30195": "XOXOCOTLA", - "30196": "YANGA", - "30197": "YECUATLA", - "30198": "ZACUALPAN", - "30199": "ZARAGOZA", - "30200": "ZENTLA", - "30201": "ZONGOLICA", - "30202": "ZONTECOMATLÁN DE LÓPEZ Y FUENTES", - "30203": "ZOZOCOLCO DE HIDALGO", - "30204": "AGUA DULCE", - "30205": "EL HIGO", - "30206": "NANCHITAL DE LÁZARO CÁRDENAS DEL RÍO", - "30207": "TRES VALLES", - "30208": "CARLOS A. CARRILLO", - "30209": "TATAHUICAPAN DE JUÁREZ", - "30210": "UXPANAPA", - "30211": "SAN RAFAEL", - "30212": "SANTIAGO SOCHIAPAN", - "31001": "ABALÁ", - "31002": "ACANCEH", - "31003": "AKIL", - "31004": "BACA", - "31005": "BOKOBÁ", - "31006": "BUCTZOTZ", - "31007": "CACALCHÉN", - "31008": "CALOTMUL", - "31009": "CANSAHCAB", - "31010": "CANTAMAYEC", - "31011": "CELESTÚN", - "31012": "CENOTILLO", - "31013": "CONKAL", - "31014": "CUNCUNUL", - "31015": "CUZAMÁ", - "31016": "CHACSINKÍN", - "31017": "CHANKOM", - "31018": "CHAPAB", - "31019": "CHEMAX", - "31020": "CHICXULUB PUEBLO", - "31021": "CHICHIMILÁ", - "31022": "CHIKINDZONOT", - "31023": "CHOCHOLÁ", - "31024": "CHUMAYEL", - "31025": "DZÁN", - "31026": "DZEMUL", - "31027": "DZIDZANTÚN", - "31028": "DZILAM DE BRAVO", - "31029": "DZILAM GONZÁLEZ", - "31030": "DZITÁS", - "31031": "DZONCAUICH", - "31032": "ESPITA", - "31033": "HALACHÓ", - "31034": "HOCABÁ", - "31035": "HOCTÚN", - "31036": "HOMÚN", - "31037": "HUHÍ", - "31038": "HUNUCMÁ", - "31039": "IXIL", - "31040": "IZAMAL", - "31041": "KANASÍN", - "31042": "KANTUNIL", - "31043": "KAUA", - "31044": "KINCHIL", - "31045": "KOPOMÁ", - "31046": "MAMA", - "31047": "MANÍ", - "31048": "MAXCANÚ", - "31049": "MAYAPÁN", - "31050": "MÉRIDA", - "31051": "MOCOCHÁ", - "31052": "MOTUL", - "31053": "MUNA", - "31054": "MUXUPIP", - "31055": "OPICHÉN", - "31056": "OXKUTZCAB", - "31057": "PANABÁ", - "31058": "PETO", - "31059": "PROGRESO", - "31060": "QUINTANA ROO", - "31061": "RÍO LAGARTOS", - "31062": "SACALUM", - "31063": "SAMAHIL", - "31064": "SANAHCAT", - "31065": "SAN FELIPE", - "31066": "SANTA ELENA", - "31067": "SEYÉ", - "31068": "SINANCHÉ", - "31069": "SOTUTA", - "31070": "SUCILÁ", - "31071": "SUDZAL", - "31072": "SUMA", - "31073": "TAHDZIÚ", - "31074": "TAHMEK", - "31075": "TEABO", - "31076": "TECOH", - "31077": "TEKAL DE VENEGAS", - "31078": "TEKANTÓ", - "31079": "TEKAX", - "31080": "TEKIT", - "31081": "TEKOM", - "31082": "TELCHAC PUEBLO", - "31083": "TELCHAC PUERTO", - "31084": "TEMAX", - "31085": "TEMOZÓN", - "31086": "TEPAKÁN", - "31087": "TETIZ", - "31088": "TEYA", - "31089": "TICUL", - "31090": "TIMUCUY", - "31091": "TINUM", - "31092": "TIXCACALCUPUL", - "31093": "TIXKOKOB", - "31094": "TIXMEHUAC", - "31095": "TIXPÉHUAL", - "31096": "TIZIMÍN", - "31097": "TUNKÁS", - "31098": "TZUCACAB", - "31099": "UAYMA", - "31100": "UCÚ", - "31101": "UMÁN", - "31102": "VALLADOLID", - "31103": "XOCCHEL", - "31104": "YAXCABÁ", - "31105": "YAXKUKUL", - "31106": "YOBAÍN", - "32001": "APOZOL", - "32002": "APULCO", - "32003": "ATOLINGA", - "32004": "BENITO JUÁREZ", - "32005": "CALERA", - "32006": "CAÑITAS DE FELIPE PESCADOR", - "32007": "CONCEPCIÓN DEL ORO", - "32008": "CUAUHTÉMOC", - "32009": "CHALCHIHUITES", - "32010": "FRESNILLO", - "32011": "TRINIDAD GARCÍA DE LA CADENA", - "32012": "GENARO CODINA", - "32013": "GENERAL ENRIQUE ESTRADA", - "32014": "GENERAL FRANCISCO R. MURGUÍA", - "32015": "EL PLATEADO DE JOAQUÍN AMARO", - "32016": "GENERAL PÁNFILO NATERA", - "32017": "GUADALUPE", - "32018": "HUANUSCO", - "32019": "JALPA", - "32020": "JEREZ", - "32021": "JIMÉNEZ DEL TEUL", - "32022": "JUAN ALDAMA", - "32023": "JUCHIPILA", - "32024": "LORETO", - "32025": "LUIS MOYA", - "32026": "MAZAPIL", - "32027": "MELCHOR OCAMPO", - "32028": "MEZQUITAL DEL ORO", - "32029": "MIGUEL AUZA", - "32030": "MOMAX", - "32031": "MONTE ESCOBEDO", - "32032": "MORELOS", - "32033": "MOYAHUA DE ESTRADA", - "32034": "NOCHISTLÁN DE MEJÍA", - "32035": "NORIA DE ÁNGELES", - "32036": "OJOCALIENTE", - "32037": "PÁNUCO", - "32038": "PINOS", - "32039": "RÍO GRANDE", - "32040": "SAIN ALTO", - "32041": "EL SALVADOR", - "32042": "SOMBRERETE", - "32043": "SUSTICACÁN", - "32044": "TABASCO", - "32045": "TEPECHITLÁN", - "32046": "TEPETONGO", - "32047": "TEÚL DE GONZÁLEZ ORTEGA", - "32048": "TLALTENANGO DE SÁNCHEZ ROMÁN", - "32049": "VALPARAÍSO", - "32050": "VETAGRANDE", - "32051": "VILLA DE COS", - "32052": "VILLA GARCÍA", - "32053": "VILLA GONZÁLEZ ORTEGA", - "32054": "VILLA HIDALGO", - "32055": "VILLANUEVA", - "32056": "ZACATECAS", - "32057": "TRANCOSO", - "32058": "SANTA MARÍA DE LA PAZ" - }, - "municipality_coords": { - "01001": { - "latitude": 21.81143623, - "longitude": -102.29580290000001 - }, - "01002": { - "latitude": 22.12650816, - "longitude": -102.04563809999999 - }, - "01003": { - "latitude": 21.90069449, - "longitude": -102.7049039 - }, - "01004": { - "latitude": 22.36062674, - "longitude": -102.29704170000001 - }, - "01005": { - "latitude": 21.93211751, - "longitude": -102.4456493 - }, - "01006": { - "latitude": 22.10454236, - "longitude": -102.3016772 - }, - "01007": { - "latitude": 22.26740775, - "longitude": -102.3407287 - }, - "01008": { - "latitude": 22.14663461, - "longitude": -102.5258387 - }, - "01009": { - "latitude": 22.23697375, - "longitude": -102.1921306 - }, - "01010": { - "latitude": 21.92151943, - "longitude": -102.0353985 - }, - "01011": { - "latitude": 22.03307051, - "longitude": -102.22902140000001 - }, - "02001": { - "latitude": 30.05371448, - "longitude": -114.94052820000002 - }, - "02002": { - "latitude": 31.90230985, - "longitude": -115.2875564 - }, - "02003": { - "latitude": 32.43548074, - "longitude": -116.29001129999999 - }, - "02004": { - "latitude": 32.41283999, - "longitude": -116.84743200000001 - }, - "02005": { - "latitude": 32.25294194, - "longitude": -116.8907398 - }, - "03001": { - "latitude": 25.4915005, - "longitude": -111.82088159999999 - }, - "03002": { - "latitude": 27.28599233, - "longitude": -113.2317354 - }, - "03003": { - "latitude": 24.17862556, - "longitude": -110.67296280000001 - }, - "03008": { - "latitude": 23.27661327, - "longitude": -109.7532775 - }, - "03009": { - "latitude": 25.95650804, - "longitude": -111.4662146 - }, - "04001": { - "latitude": 20.38342724, - "longitude": -90.21714439 - }, - "04002": { - "latitude": 19.61699063, - "longitude": -90.26756999 - }, - "04003": { - "latitude": 18.52404216, - "longitude": -91.48322871 - }, - "04004": { - "latitude": 19.13421881, - "longitude": -90.4993197 - }, - "04005": { - "latitude": 20.12440764, - "longitude": -90.1352755 - }, - "04006": { - "latitude": 19.47407174, - "longitude": -89.60964397 - }, - "04007": { - "latitude": 18.27359984, - "longitude": -91.9738727 - }, - "04008": { - "latitude": 19.96963863, - "longitude": -90.23301736 - }, - "04009": { - "latitude": 18.55059826, - "longitude": -90.4743501 - }, - "04010": { - "latitude": 18.40282912, - "longitude": -89.66157351 - }, - "04011": { - "latitude": 18.09903851, - "longitude": -90.71656440000001 - }, - "05001": { - "latitude": 27.12239469, - "longitude": -101.2457824 - }, - "05002": { - "latitude": 29.43260232, - "longitude": -102.01002659999999 - }, - "05003": { - "latitude": 28.27834828, - "longitude": -100.91600279999999 - }, - "05004": { - "latitude": 25.34135773, - "longitude": -100.6423697 - }, - "05005": { - "latitude": 26.85245277, - "longitude": -100.7992504 - }, - "05006": { - "latitude": 26.58623862, - "longitude": -101.3869252 - }, - "05007": { - "latitude": 26.69910387, - "longitude": -102.29898270000001 - }, - "05008": { - "latitude": 27.30606524, - "longitude": -101.2795895 - }, - "05009": { - "latitude": 26.32014576, - "longitude": -103.18085740000001 - }, - "05010": { - "latitude": 26.94769788, - "longitude": -101.5282729 - }, - "05011": { - "latitude": 25.52169062, - "longitude": -101.55104 - }, - "05012": { - "latitude": 28.09740673, - "longitude": -100.3937925 - }, - "05013": { - "latitude": 27.83932123, - "longitude": -100.050503 - }, - "05014": { - "latitude": 29.00270229, - "longitude": -100.95126409999999 - }, - "05015": { - "latitude": 27.6565463, - "longitude": -100.69337840000001 - }, - "05016": { - "latitude": 27.15054723, - "longitude": -101.9137193 - }, - "05017": { - "latitude": 25.55982485, - "longitude": -103.2150637 - }, - "05018": { - "latitude": 26.89685679, - "longitude": -101.19439399999999 - }, - "05019": { - "latitude": 28.32774739, - "longitude": -101.0833512 - }, - "05020": { - "latitude": 28.40301796, - "longitude": -101.90046629999999 - }, - "05021": { - "latitude": 27.22773136, - "longitude": -101.7654256 - }, - "05022": { - "latitude": 28.49643866, - "longitude": -100.6204887 - }, - "05023": { - "latitude": 27.965618699999997, - "longitude": -102.8928889 - }, - "05024": { - "latitude": 25.50387172, - "longitude": -102.11466800000001 - }, - "05025": { - "latitude": 28.779820299999997, - "longitude": -100.6144697 - }, - "05026": { - "latitude": 27.42142241, - "longitude": -101.02148199999999 - }, - "05027": { - "latitude": 25.9137476, - "longitude": -101.2820653 - }, - "05028": { - "latitude": 27.92287166, - "longitude": -101.1430006 - }, - "05029": { - "latitude": 26.93983257, - "longitude": -101.7564941 - }, - "05030": { - "latitude": 25.02914759, - "longitude": -101.12510870000001 - }, - "05031": { - "latitude": 27.84012935, - "longitude": -101.9688792 - }, - "05032": { - "latitude": 28.06395621, - "longitude": -101.3897589 - }, - "05033": { - "latitude": 26.08404224, - "longitude": -102.71799720000001 - }, - "05034": { - "latitude": 27.48176767, - "longitude": -103.61010859999999 - }, - "05035": { - "latitude": 25.05128201, - "longitude": -103.20830959999999 - }, - "05036": { - "latitude": 25.22186896, - "longitude": -102.92496829999999 - }, - "05037": { - "latitude": 28.097392699999997, - "longitude": -100.78030820000001 - }, - "05038": { - "latitude": 28.81197418, - "longitude": -101.3950114 - }, - "06001": { - "latitude": 19.0092462, - "longitude": -103.9984204 - }, - "06002": { - "latitude": 19.11609609, - "longitude": -103.6326678 - }, - "06003": { - "latitude": 19.39344345, - "longitude": -103.7699941 - }, - "06004": { - "latitude": 19.18812918, - "longitude": -103.92075279999999 - }, - "06005": { - "latitude": 19.32684376, - "longitude": -103.59549859999998 - }, - "06006": { - "latitude": 18.967614800000003, - "longitude": -103.6813453 - }, - "06007": { - "latitude": 19.14882741, - "longitude": -104.27281590000001 - }, - "06008": { - "latitude": 19.37208652, - "longitude": -104.03105699999999 - }, - "06009": { - "latitude": 18.88860309, - "longitude": -103.8114493 - }, - "06010": { - "latitude": 19.30960166, - "longitude": -103.84442659999999 - }, - "07001": { - "latitude": 15.41413979, - "longitude": -92.68168539 - }, - "07002": { - "latitude": 16.55160458, - "longitude": -92.81465689 - }, - "07003": { - "latitude": 15.23141447, - "longitude": -92.77402483 - }, - "07004": { - "latitude": 16.6618845, - "longitude": -91.86257298 - }, - "07005": { - "latitude": 17.38559389, - "longitude": -92.8573383 - }, - "07006": { - "latitude": 15.55683535, - "longitude": -92.09716338 - }, - "07007": { - "latitude": 16.51528956, - "longitude": -92.39542713 - }, - "07008": { - "latitude": 15.75814794, - "longitude": -92.680448 - }, - "07009": { - "latitude": 16.2488839, - "longitude": -93.93736053 - }, - "07010": { - "latitude": 15.49175527, - "longitude": -92.16129268 - }, - "07011": { - "latitude": 15.6195846, - "longitude": -92.24241688 - }, - "07012": { - "latitude": 16.86660665, - "longitude": -93.3190748 - }, - "07013": { - "latitude": 17.01412276, - "longitude": -92.95879022 - }, - "07014": { - "latitude": 17.03174823, - "longitude": -92.74129239 - }, - "07015": { - "latitude": 15.08624107, - "longitude": -92.16413446 - }, - "07016": { - "latitude": 17.77987128, - "longitude": -91.99760375 - }, - "07017": { - "latitude": 16.71296265, - "longitude": -93.86747176 - }, - "07018": { - "latitude": 17.120574899999998, - "longitude": -93.12607842 - }, - "07019": { - "latitude": 16.29688357, - "longitude": -92.17897404 - }, - "07020": { - "latitude": 15.96089493, - "longitude": -92.77124298 - }, - "07021": { - "latitude": 17.09417441, - "longitude": -93.25286045 - }, - "07022": { - "latitude": 17.02127057, - "longitude": -92.61180176 - }, - "07023": { - "latitude": 16.81936583, - "longitude": -92.68016909 - }, - "07024": { - "latitude": 16.61153322, - "longitude": -92.21697044 - }, - "07025": { - "latitude": 17.32679743, - "longitude": -93.13153759 - }, - "07026": { - "latitude": 16.95015717, - "longitude": -92.57043516 - }, - "07027": { - "latitude": 16.6066351, - "longitude": -92.97604928 - }, - "07028": { - "latitude": 16.55397282, - "longitude": -92.72594407 - }, - "07029": { - "latitude": 16.99533305, - "longitude": -93.11151997 - }, - "07030": { - "latitude": 15.79903226, - "longitude": -92.39128986 - }, - "07031": { - "latitude": 17.10969122, - "longitude": -92.03514188 - }, - "07032": { - "latitude": 15.36443247, - "longitude": -92.55816843 - }, - "07033": { - "latitude": 17.29407362, - "longitude": -93.27618676 - }, - "07034": { - "latitude": 15.76265142, - "longitude": -92.08776684 - }, - "07035": { - "latitude": 14.75000928, - "longitude": -92.21319902 - }, - "07036": { - "latitude": 15.51299672, - "longitude": -92.21840122 - }, - "07037": { - "latitude": 15.009404, - "longitude": -92.42377326 - }, - "07038": { - "latitude": 16.69427743, - "longitude": -92.39963387 - }, - "07039": { - "latitude": 17.24316727, - "longitude": -92.69492697 - }, - "07040": { - "latitude": 15.09698587, - "longitude": -92.54685429999999 - }, - "07041": { - "latitude": 16.20470226, - "longitude": -91.79579481 - }, - "07042": { - "latitude": 17.29853247, - "longitude": -92.97862919 - }, - "07043": { - "latitude": 17.42139781, - "longitude": -93.09902283 - }, - "07044": { - "latitude": 16.81795072, - "longitude": -92.89699515 - }, - "07045": { - "latitude": 17.46687275, - "longitude": -92.97559131 - }, - "07046": { - "latitude": 16.52273562, - "longitude": -93.67207618 - }, - "07047": { - "latitude": 17.08951414, - "longitude": -92.87430856 - }, - "07048": { - "latitude": 17.69944721, - "longitude": -93.19333536 - }, - "07049": { - "latitude": 16.9243837, - "longitude": -92.77667746 - }, - "07050": { - "latitude": 17.6066362, - "longitude": -91.75107452 - }, - "07051": { - "latitude": 15.46101214, - "longitude": -92.89163473 - }, - "07052": { - "latitude": 16.38560263, - "longitude": -91.74028292 - }, - "07053": { - "latitude": 15.37276629, - "longitude": -92.18576379999999 - }, - "07054": { - "latitude": 14.88060478, - "longitude": -92.49755249 - }, - "07055": { - "latitude": 14.82166366, - "longitude": -92.20159973 - }, - "07056": { - "latitude": 16.87481014, - "longitude": -92.56310089 - }, - "07057": { - "latitude": 15.3138259, - "longitude": -92.3314642 - }, - "07058": { - "latitude": 16.43820042, - "longitude": -92.61005045 - }, - "07059": { - "latitude": 16.70209388, - "longitude": -91.33749873 - }, - "07060": { - "latitude": 17.2207974, - "longitude": -93.17387627 - }, - "07061": { - "latitude": 16.82629462, - "longitude": -93.49094584 - }, - "07062": { - "latitude": 17.43241532, - "longitude": -93.39956964 - }, - "07063": { - "latitude": 16.8952333, - "longitude": -93.08380364 - }, - "07064": { - "latitude": 16.780998, - "longitude": -92.27478655 - }, - "07065": { - "latitude": 17.4440756, - "longitude": -91.81265556 - }, - "07066": { - "latitude": 17.06010348, - "longitude": -92.46406541 - }, - "07067": { - "latitude": 17.18918598, - "longitude": -93.05690018 - }, - "07068": { - "latitude": 17.53057653, - "longitude": -93.19914078 - }, - "07069": { - "latitude": 15.66955614, - "longitude": -93.19240132 - }, - "07070": { - "latitude": 15.43254643, - "longitude": -92.26392556 - }, - "07071": { - "latitude": 15.16542249, - "longitude": -92.61956647 - }, - "07072": { - "latitude": 17.21802968, - "longitude": -92.86173804 - }, - "07073": { - "latitude": 17.19137782, - "longitude": -92.99826673 - }, - "07074": { - "latitude": 17.86422331, - "longitude": -93.22938058 - }, - "07075": { - "latitude": 16.36530762, - "longitude": -92.36472679 - }, - "07076": { - "latitude": 17.3198257, - "longitude": -92.61076221 - }, - "07077": { - "latitude": 17.437619, - "longitude": -92.18714149 - }, - "07078": { - "latitude": 16.683240599999998, - "longitude": -92.60040328 - }, - "07079": { - "latitude": 16.91313319, - "longitude": -93.20967827 - }, - "07080": { - "latitude": 15.54667156, - "longitude": -92.40132453 - }, - "07081": { - "latitude": 17.13892291, - "longitude": -92.62501505 - }, - "07082": { - "latitude": 17.03726598, - "longitude": -92.34828952 - }, - "07083": { - "latitude": 16.10642759, - "longitude": -92.37594578 - }, - "07084": { - "latitude": 17.38699234, - "longitude": -93.00479064 - }, - "07085": { - "latitude": 16.92596894, - "longitude": -92.98867457 - }, - "07086": { - "latitude": 16.58554557, - "longitude": -93.13633225 - }, - "07087": { - "latitude": 14.63938353, - "longitude": -92.22712117 - }, - "07088": { - "latitude": 17.48885642, - "longitude": -93.25158759 - }, - "07089": { - "latitude": 14.93396804, - "longitude": -92.30479679 - }, - "07090": { - "latitude": 17.22011355, - "longitude": -93.11231445 - }, - "07091": { - "latitude": 17.25397268, - "longitude": -93.00344638 - }, - "07092": { - "latitude": 17.17295415, - "longitude": -93.39546257 - }, - "07093": { - "latitude": 16.83318847, - "longitude": -92.47200579999999 - }, - "07094": { - "latitude": 16.56110293, - "longitude": -92.50881225 - }, - "07096": { - "latitude": 17.37918929, - "longitude": -92.48582821 - }, - "07097": { - "latitude": 15.99699063, - "longitude": -93.69052811 - }, - "07098": { - "latitude": 16.51515533, - "longitude": -92.65996329 - }, - "07099": { - "latitude": 16.02444313, - "longitude": -91.89940024 - }, - "07100": { - "latitude": 17.30078978, - "longitude": -92.26962532 - }, - "07101": { - "latitude": 16.73944663, - "longitude": -93.13728499 - }, - "07102": { - "latitude": 14.89410615, - "longitude": -92.19867824 - }, - "07103": { - "latitude": 15.14044136, - "longitude": -92.41156439 - }, - "07104": { - "latitude": 16.12408314, - "longitude": -92.24643996 - }, - "07105": { - "latitude": 15.05995272, - "longitude": -92.10254994 - }, - "07106": { - "latitude": 16.31731243, - "longitude": -92.60789686 - }, - "07107": { - "latitude": 16.07734699, - "longitude": -93.23025415 - }, - "07108": { - "latitude": 16.3461952, - "longitude": -93.37550681 - }, - "07109": { - "latitude": 17.18555925, - "longitude": -92.32584884 - }, - "07110": { - "latitude": 16.62247027, - "longitude": -92.72378131 - }, - "07111": { - "latitude": 16.72191589, - "longitude": -92.78198098 - }, - "07112": { - "latitude": 16.93015997, - "longitude": -92.39166786 - }, - "07113": { - "latitude": 16.92183092, - "longitude": -92.69017606 - }, - "07114": { - "latitude": 16.28183601, - "longitude": -90.5625088 - }, - "07115": { - "latitude": 16.19919393, - "longitude": -91.24859487 - }, - "07116": { - "latitude": 16.24635014, - "longitude": -90.74342293 - }, - "07117": { - "latitude": 15.67167765, - "longitude": -92.66439042 - }, - "07118": { - "latitude": 17.15401445, - "longitude": -92.80308984 - }, - "07119": { - "latitude": 16.94936398, - "longitude": -92.72154872 - }, - "07120": { - "latitude": 15.54919158, - "longitude": -92.61467086 - }, - "07121": { - "latitude": 17.21769519, - "longitude": -92.93323321 - }, - "07122": { - "latitude": 16.33743251, - "longitude": -92.98654870000001 - }, - "07123": { - "latitude": 16.49890816, - "longitude": -92.88268596 - }, - "07124": { - "latitude": 17.21479414, - "longitude": -93.63239355 - }, - "08001": { - "latitude": 30.4492369, - "longitude": -106.38069209999999 - }, - "08002": { - "latitude": 29.07328623, - "longitude": -105.58856899999999 - }, - "08003": { - "latitude": 27.09494843, - "longitude": -105.30549280000001 - }, - "08004": { - "latitude": 28.58222418, - "longitude": -105.8235382 - }, - "08005": { - "latitude": 31.33197448, - "longitude": -107.51985520000001 - }, - "08006": { - "latitude": 28.85799668, - "longitude": -107.2916428 - }, - "08007": { - "latitude": 26.75306244, - "longitude": -106.54294229999999 - }, - "08008": { - "latitude": 26.94545012, - "longitude": -107.6932965 - }, - "08009": { - "latitude": 27.80783991, - "longitude": -107.58011709999998 - }, - "08010": { - "latitude": 30.05813877, - "longitude": -107.1214006 - }, - "08011": { - "latitude": 28.03369767, - "longitude": -104.42365629999999 - }, - "08012": { - "latitude": 27.810145799999997, - "longitude": -107.0632506 - }, - "08013": { - "latitude": 30.19391943, - "longitude": -108.20229340000002 - }, - "08014": { - "latitude": 26.63393949, - "longitude": -105.0699625 - }, - "08015": { - "latitude": 29.75703878, - "longitude": -105.20778349999999 - }, - "08016": { - "latitude": 27.89765303, - "longitude": -105.0448645 - }, - "08017": { - "latitude": 28.72346977, - "longitude": -106.94869369999999 - }, - "08018": { - "latitude": 28.21163419, - "longitude": -106.8969304 - }, - "08019": { - "latitude": 29.00055223, - "longitude": -106.23252590000001 - }, - "08020": { - "latitude": 27.45595628, - "longitude": -108.51636609999998 - }, - "08021": { - "latitude": 28.11949156, - "longitude": -105.4918591 - }, - "08022": { - "latitude": 27.99997196, - "longitude": -106.4611469 - }, - "08023": { - "latitude": 30.16074891, - "longitude": -107.64464040000001 - }, - "08024": { - "latitude": 28.32120104, - "longitude": -106.3495511 - }, - "08025": { - "latitude": 29.33656323, - "longitude": -107.7373156 - }, - "08026": { - "latitude": 28.29878505, - "longitude": -106.56942250000002 - }, - "08027": { - "latitude": 27.15044174, - "longitude": -107.24776489999999 - }, - "08028": { - "latitude": 30.82727011, - "longitude": -105.64050970000001 - }, - "08029": { - "latitude": 26.16798033, - "longitude": -107.0339368 - }, - "08030": { - "latitude": 27.39095152, - "longitude": -108.2740565 - }, - "08031": { - "latitude": 28.38509768, - "longitude": -107.55805339999999 - }, - "08032": { - "latitude": 27.12904341, - "longitude": -105.69703670000001 - }, - "08033": { - "latitude": 27.069318300000003, - "longitude": -106.06793770000002 - }, - "08034": { - "latitude": 29.72209336, - "longitude": -107.72354070000002 - }, - "08035": { - "latitude": 30.84935267, - "longitude": -108.4502245 - }, - "08036": { - "latitude": 27.08210864, - "longitude": -104.3907025 - }, - "08037": { - "latitude": 31.44966528, - "longitude": -106.56411340000001 - }, - "08038": { - "latitude": 28.54101074, - "longitude": -105.0545047 - }, - "08039": { - "latitude": 26.92622135, - "longitude": -105.0109759 - }, - "08040": { - "latitude": 29.32693331, - "longitude": -108.3293237 - }, - "08041": { - "latitude": 27.83630331, - "longitude": -107.97329520000001 - }, - "08042": { - "latitude": 28.92889784, - "longitude": -103.8246345 - }, - "08043": { - "latitude": 28.82410054, - "longitude": -107.7206325 - }, - "08044": { - "latitude": 26.72505739, - "longitude": -105.5229179 - }, - "08045": { - "latitude": 28.35062359, - "longitude": -105.5014636 - }, - "08046": { - "latitude": 26.57153489, - "longitude": -107.7281308 - }, - "08047": { - "latitude": 28.15274708, - "longitude": -108.7372541 - }, - "08048": { - "latitude": 29.29526009, - "longitude": -107.1403845 - }, - "08049": { - "latitude": 27.42458467, - "longitude": -106.6842544 - }, - "08050": { - "latitude": 30.532849100000004, - "longitude": -107.7290615 - }, - "08051": { - "latitude": 28.15363044, - "longitude": -108.20480400000001 - }, - "08052": { - "latitude": 29.36421991, - "longitude": -104.5252959 - }, - "08053": { - "latitude": 31.23816291, - "longitude": -105.92588359999999 - }, - "08054": { - "latitude": 28.80629504, - "longitude": -106.61704540000001 - }, - "08055": { - "latitude": 28.20504901, - "longitude": -105.7478247 - }, - "08056": { - "latitude": 27.26889856, - "longitude": -106.3146864 - }, - "08057": { - "latitude": 27.89249883, - "longitude": -106.7351865 - }, - "08058": { - "latitude": 27.58212766, - "longitude": -105.3622558 - }, - "08059": { - "latitude": 26.88525171, - "longitude": -105.94623829999999 - }, - "08060": { - "latitude": 26.80392271, - "longitude": -105.7829219 - }, - "08061": { - "latitude": 27.77861765, - "longitude": -106.1930861 - }, - "08062": { - "latitude": 28.00108937, - "longitude": -105.34302959999998 - }, - "08063": { - "latitude": 28.71477463, - "longitude": -108.0848277 - }, - "08064": { - "latitude": 27.04510196, - "longitude": -106.29743789999999 - }, - "08065": { - "latitude": 27.226301, - "longitude": -107.97641159999999 - }, - "08066": { - "latitude": 27.86164045, - "longitude": -108.506556 - }, - "08067": { - "latitude": 27.48705444, - "longitude": -105.8083277 - }, - "09002": { - "latitude": 19.48532861, - "longitude": -99.18210694 - }, - "09003": { - "latitude": 19.32666725, - "longitude": -99.15037635 - }, - "09004": { - "latitude": 19.3246343, - "longitude": -99.31072853 - }, - "09005": { - "latitude": 19.50406521, - "longitude": -99.11586421 - }, - "09006": { - "latitude": 19.3969119, - "longitude": -99.0943298 - }, - "09007": { - "latitude": 19.34916632, - "longitude": -99.05679896 - }, - "09008": { - "latitude": 19.2689765, - "longitude": -99.26841291 - }, - "09009": { - "latitude": 19.139456600000003, - "longitude": -99.05109542 - }, - "09010": { - "latitude": 19.33617556, - "longitude": -99.24681971 - }, - "09011": { - "latitude": 19.27699838, - "longitude": -99.00282161 - }, - "09012": { - "latitude": 19.19833968, - "longitude": -99.2062208 - }, - "09013": { - "latitude": 19.24514505, - "longitude": -99.09036359999999 - }, - "09014": { - "latitude": 19.38064242, - "longitude": -99.16113466 - }, - "09015": { - "latitude": 19.43137343, - "longitude": -99.14905576 - }, - "09016": { - "latitude": 19.42806236, - "longitude": -99.20456691 - }, - "09017": { - "latitude": 19.43049545, - "longitude": -99.09310579999999 - }, - "10001": { - "latitude": 24.51111583, - "longitude": -104.9358862 - }, - "10002": { - "latitude": 25.07272202, - "longitude": -106.451108 - }, - "10003": { - "latitude": 25.03397567, - "longitude": -104.78374170000001 - }, - "10004": { - "latitude": 24.69480558, - "longitude": -103.70028740000001 - }, - "10005": { - "latitude": 23.97048255, - "longitude": -104.8437012 - }, - "10006": { - "latitude": 24.76151316, - "longitude": -103.2120786 - }, - "10007": { - "latitude": 25.72797734, - "longitude": -103.4906318 - }, - "10008": { - "latitude": 24.41267444, - "longitude": -104.07327790000001 - }, - "10009": { - "latitude": 25.99631573, - "longitude": -106.0672243 - }, - "10010": { - "latitude": 26.09033838, - "longitude": -104.81708370000001 - }, - "10011": { - "latitude": 25.72622631, - "longitude": -104.9955371 - }, - "10012": { - "latitude": 25.47764531, - "longitude": -103.6858344 - }, - "10013": { - "latitude": 26.14599851, - "longitude": -104.13132850000001 - }, - "10014": { - "latitude": 23.0021139, - "longitude": -104.55068809999999 - }, - "10015": { - "latitude": 25.24709833, - "longitude": -104.0776859 - }, - "10016": { - "latitude": 23.81386026, - "longitude": -104.2111146 - }, - "10017": { - "latitude": 26.48187294, - "longitude": -105.6766932 - }, - "10018": { - "latitude": 25.54902415, - "longitude": -105.21585060000001 - }, - "10019": { - "latitude": 24.70144901, - "longitude": -105.93642870000001 - }, - "10020": { - "latitude": 24.49485755, - "longitude": -104.35404179999999 - }, - "10021": { - "latitude": 24.78598706, - "longitude": -104.0823245 - }, - "10022": { - "latitude": 24.003555300000002, - "longitude": -104.02194770000001 - }, - "10023": { - "latitude": 23.41144241, - "longitude": -105.3142656 - }, - "10024": { - "latitude": 25.19530368, - "longitude": -104.56162370000001 - }, - "10025": { - "latitude": 26.18411493, - "longitude": -105.67244740000001 - }, - "10026": { - "latitude": 24.22848693, - "longitude": -105.74228459999999 - }, - "10027": { - "latitude": 24.64752613, - "longitude": -102.7180363 - }, - "10028": { - "latitude": 24.80735337, - "longitude": -104.4704012 - }, - "10029": { - "latitude": 25.37610245, - "longitude": -104.3064859 - }, - "10030": { - "latitude": 25.62189903, - "longitude": -104.39824509999998 - }, - "10031": { - "latitude": 24.49776047, - "longitude": -103.41377840000001 - }, - "10032": { - "latitude": 24.98415697, - "longitude": -105.6904219 - }, - "10033": { - "latitude": 23.43688304, - "longitude": -104.149631 - }, - "10034": { - "latitude": 24.94675712, - "longitude": -106.7119943 - }, - "10035": { - "latitude": 25.45024416, - "longitude": -106.0616254 - }, - "10036": { - "latitude": 26.34496393, - "longitude": -103.6254838 - }, - "10037": { - "latitude": 25.25676265, - "longitude": -106.58974429999999 - }, - "10038": { - "latitude": 23.73333998, - "longitude": -103.9510545 - }, - "10039": { - "latitude": 24.84669493, - "longitude": -105.03803119999999 - }, - "11001": { - "latitude": 20.53323096, - "longitude": -101.536012 - }, - "11002": { - "latitude": 20.05246689, - "longitude": -100.7519672 - }, - "11003": { - "latitude": 20.925250600000002, - "longitude": -100.73772740000001 - }, - "11004": { - "latitude": 20.42184137, - "longitude": -100.57352009999998 - }, - "11005": { - "latitude": 20.57551187, - "longitude": -100.6217358 - }, - "11006": { - "latitude": 21.26519938, - "longitude": -99.80444429 - }, - "11007": { - "latitude": 20.5375656, - "longitude": -100.787865 - }, - "11008": { - "latitude": 20.71294733, - "longitude": -101.879784 - }, - "11009": { - "latitude": 20.74127252, - "longitude": -100.7911227 - }, - "11010": { - "latitude": 20.21700077, - "longitude": -100.3835978 - }, - "11011": { - "latitude": 20.42911364, - "longitude": -100.9383703 - }, - "11012": { - "latitude": 20.61522623, - "longitude": -101.66800959999999 - }, - "11013": { - "latitude": 21.141603600000003, - "longitude": -100.3596342 - }, - "11014": { - "latitude": 21.14701686, - "longitude": -100.9347773 - }, - "11015": { - "latitude": 21.01845431, - "longitude": -101.23732890000001 - }, - "11016": { - "latitude": 20.36736545, - "longitude": -101.499004 - }, - "11017": { - "latitude": 20.6998135, - "longitude": -101.36832079999999 - }, - "11018": { - "latitude": 20.35879709, - "longitude": -101.0520887 - }, - "11019": { - "latitude": 20.19710833, - "longitude": -100.5078824 - }, - "11020": { - "latitude": 21.12474925, - "longitude": -101.6224026 - }, - "11021": { - "latitude": 20.08431562, - "longitude": -101.24468929999999 - }, - "11022": { - "latitude": 21.5795705, - "longitude": -101.47299699999999 - }, - "11023": { - "latitude": 20.40161797, - "longitude": -101.8158452 - }, - "11024": { - "latitude": 20.54992749, - "longitude": -101.3612588 - }, - "11025": { - "latitude": 20.92751567, - "longitude": -101.92856309999999 - }, - "11026": { - "latitude": 20.8257897, - "longitude": -101.5951285 - }, - "11027": { - "latitude": 20.62511012, - "longitude": -101.16509609999999 - }, - "11028": { - "latitude": 20.20756151, - "longitude": -100.915131 - }, - "11029": { - "latitude": 21.44216589, - "longitude": -100.8464137 - }, - "11030": { - "latitude": 21.50320013, - "longitude": -101.23369890000001 - }, - "11031": { - "latitude": 20.91912408, - "longitude": -101.7885196 - }, - "11032": { - "latitude": 21.00232178, - "longitude": -100.3885917 - }, - "11033": { - "latitude": 21.39936839, - "longitude": -100.47624959999999 - }, - "11034": { - "latitude": 21.15067776, - "longitude": -100.07190179999999 - }, - "11035": { - "latitude": 20.6741044, - "longitude": -100.9940839 - }, - "11036": { - "latitude": 20.15823336, - "longitude": -100.9903644 - }, - "11037": { - "latitude": 20.96311535, - "longitude": -101.43778359999999 - }, - "11038": { - "latitude": 20.00447958, - "longitude": -100.52890570000001 - }, - "11039": { - "latitude": 20.29673593, - "longitude": -100.74149659999999 - }, - "11040": { - "latitude": 21.03229119, - "longitude": -100.15600620000001 - }, - "11041": { - "latitude": 20.11969239, - "longitude": -101.15261600000001 - }, - "11042": { - "latitude": 20.37832823, - "longitude": -101.2705609 - }, - "11043": { - "latitude": 21.36595727, - "longitude": -100.21461 - }, - "11044": { - "latitude": 20.541961899999997, - "longitude": -100.99251240000001 - }, - "11045": { - "latitude": 21.35675968, - "longitude": -99.97852131 - }, - "11046": { - "latitude": 20.18315101, - "longitude": -101.2255261 - }, - "12001": { - "latitude": 16.95724847, - "longitude": -99.71423967 - }, - "12002": { - "latitude": 17.75227333, - "longitude": -98.95137274 - }, - "12003": { - "latitude": 17.91901542, - "longitude": -100.6077339 - }, - "12004": { - "latitude": 17.37589907, - "longitude": -98.36610731 - }, - "12005": { - "latitude": 17.64223532, - "longitude": -98.51056918 - }, - "12006": { - "latitude": 18.09123113, - "longitude": -99.98089741 - }, - "12007": { - "latitude": 18.25261897, - "longitude": -100.1987864 - }, - "12008": { - "latitude": 18.14437535, - "longitude": -99.06995865 - }, - "12009": { - "latitude": 17.27023906, - "longitude": -98.58268601 - }, - "12010": { - "latitude": 17.51433748, - "longitude": -98.90304507 - }, - "12011": { - "latitude": 17.3328223, - "longitude": -100.3420676 - }, - "12012": { - "latitude": 16.95727114, - "longitude": -99.06753635 - }, - "12013": { - "latitude": 16.6836011, - "longitude": -98.57240423 - }, - "12014": { - "latitude": 17.09654177, - "longitude": -100.42711729999999 - }, - "12015": { - "latitude": 18.46156986, - "longitude": -99.42073336 - }, - "12016": { - "latitude": 18.28302622, - "longitude": -101.64944190000001 - }, - "12017": { - "latitude": 18.13229581, - "longitude": -99.71366374 - }, - "12018": { - "latitude": 16.60803407, - "longitude": -98.93060422 - }, - "12019": { - "latitude": 17.98214298, - "longitude": -99.05204248 - }, - "12020": { - "latitude": 17.43262197, - "longitude": -98.70190024 - }, - "12021": { - "latitude": 17.14254842, - "longitude": -100.05896870000001 - }, - "12022": { - "latitude": 18.08179439, - "longitude": -100.92990640000001 - }, - "12023": { - "latitude": 16.46196849, - "longitude": -98.51767037 - }, - "12024": { - "latitude": 17.73829138, - "longitude": -98.6712625 - }, - "12025": { - "latitude": 16.71853871, - "longitude": -98.96371297 - }, - "12026": { - "latitude": 18.12476399, - "longitude": -99.81470134 - }, - "12027": { - "latitude": 18.65981605, - "longitude": -100.61791640000001 - }, - "12028": { - "latitude": 17.52369125, - "longitude": -99.11235956 - }, - "12029": { - "latitude": 17.39083354, - "longitude": -99.69744738 - }, - "12030": { - "latitude": 16.69293166, - "longitude": -99.13421993 - }, - "12031": { - "latitude": 18.44112606, - "longitude": -100.1041749 - }, - "12032": { - "latitude": 17.73380119, - "longitude": -100.0269355 - }, - "12033": { - "latitude": 17.8121633, - "longitude": -98.54709158 - }, - "12034": { - "latitude": 18.22977373, - "longitude": -99.25342176 - }, - "12035": { - "latitude": 18.22680759, - "longitude": -99.58211984 - }, - "12036": { - "latitude": 16.80173828, - "longitude": -98.49328449 - }, - "12037": { - "latitude": 18.46344984, - "longitude": -99.76559193 - }, - "12038": { - "latitude": 17.82012681, - "longitude": -101.4341354 - }, - "12039": { - "latitude": 17.14213312, - "longitude": -99.47292506 - }, - "12040": { - "latitude": 17.63193552, - "longitude": -99.79579387 - }, - "12041": { - "latitude": 17.14605906, - "longitude": -98.70461015 - }, - "12042": { - "latitude": 17.83249918, - "longitude": -99.35757156 - }, - "12043": { - "latitude": 17.134026199999997, - "longitude": -98.43974508 - }, - "12044": { - "latitude": 17.33684138, - "longitude": -99.37059791 - }, - "12045": { - "latitude": 17.896560600000004, - "longitude": -98.78389343 - }, - "12046": { - "latitude": 16.66156451, - "longitude": -98.35281624 - }, - "12047": { - "latitude": 18.54466422, - "longitude": -99.86921918 - }, - "12048": { - "latitude": 17.62009604, - "longitude": -101.1603314 - }, - "12049": { - "latitude": 18.70423234, - "longitude": -99.60783004 - }, - "12050": { - "latitude": 18.34562443, - "longitude": -100.61147249999999 - }, - "12051": { - "latitude": 17.31282285, - "longitude": -99.18521692 - }, - "12052": { - "latitude": 16.87635772, - "longitude": -98.75107689 - }, - "12053": { - "latitude": 16.80869452, - "longitude": -99.40903907 - }, - "12054": { - "latitude": 17.83981017, - "longitude": -100.3182452 - }, - "12055": { - "latitude": 18.52004079, - "longitude": -99.59744023 - }, - "12056": { - "latitude": 16.98045465, - "longitude": -99.29488666 - }, - "12057": { - "latitude": 17.40594413, - "longitude": -100.74436419999999 - }, - "12058": { - "latitude": 18.35826158, - "longitude": -99.91407478 - }, - "12059": { - "latitude": 18.10099881, - "longitude": -99.46939369 - }, - "12060": { - "latitude": 18.64884153, - "longitude": -99.67176064 - }, - "12061": { - "latitude": 17.59935009, - "longitude": -99.36746755 - }, - "12062": { - "latitude": 16.93906124, - "longitude": -98.27712722 - }, - "12063": { - "latitude": 17.23001428, - "longitude": -98.78615129999999 - }, - "12064": { - "latitude": 18.42802214, - "longitude": -100.43502640000001 - }, - "12065": { - "latitude": 17.571652, - "longitude": -98.40919507 - }, - "12066": { - "latitude": 17.56217381, - "longitude": -98.61554475 - }, - "12067": { - "latitude": 18.28028523, - "longitude": -100.45333070000001 - }, - "12068": { - "latitude": 18.01665921, - "longitude": -101.8549511 - }, - "12069": { - "latitude": 17.42980943, - "longitude": -98.54148877 - }, - "12070": { - "latitude": 17.90451023, - "longitude": -98.50929792 - }, - "12071": { - "latitude": 16.86942692, - "longitude": -98.15726884 - }, - "12072": { - "latitude": 17.32454588, - "longitude": -98.82952307 - }, - "12073": { - "latitude": 18.34492682, - "longitude": -101.2182267 - }, - "12074": { - "latitude": 17.7495844, - "longitude": -99.18510854 - }, - "12075": { - "latitude": 17.80149173, - "longitude": -99.60977485 - }, - "12076": { - "latitude": 17.17481646, - "longitude": -98.97603348 - }, - "12077": { - "latitude": 16.63917919, - "longitude": -98.74501981 - }, - "12078": { - "latitude": 17.10057443, - "longitude": -98.42387038 - }, - "12079": { - "latitude": 17.44263449, - "longitude": -98.99594006 - }, - "12080": { - "latitude": 16.59397881, - "longitude": -98.67763518 - }, - "12081": { - "latitude": 17.04710314, - "longitude": -98.63787708 - }, - "13001": { - "latitude": 20.20642357, - "longitude": -98.44034804 - }, - "13002": { - "latitude": 20.15984947, - "longitude": -98.19840393 - }, - "13003": { - "latitude": 20.31454678, - "longitude": -98.88969145 - }, - "13004": { - "latitude": 20.36156659, - "longitude": -98.36937564 - }, - "13005": { - "latitude": 20.11982645, - "longitude": -99.07802825 - }, - "13006": { - "latitude": 20.40709358, - "longitude": -99.40540381 - }, - "13007": { - "latitude": 19.74162226, - "longitude": -98.32707468 - }, - "13008": { - "latitude": 19.72290463, - "longitude": -98.4470011 - }, - "13009": { - "latitude": 20.21714615, - "longitude": -98.88257553 - }, - "13010": { - "latitude": 20.05474564, - "longitude": -99.22137492 - }, - "13011": { - "latitude": 21.02731012, - "longitude": -98.36355276 - }, - "13012": { - "latitude": 20.35483987, - "longitude": -98.67648799 - }, - "13013": { - "latitude": 19.97344548, - "longitude": -99.23137642 - }, - "13014": { - "latitude": 20.90605589, - "longitude": -98.54849083 - }, - "13015": { - "latitude": 20.59916867, - "longitude": -99.06019562 - }, - "13016": { - "latitude": 19.98430844, - "longitude": -98.28166824 - }, - "13017": { - "latitude": 20.26368581, - "longitude": -99.47164753 - }, - "13018": { - "latitude": 21.12843769, - "longitude": -98.94967145 - }, - "13019": { - "latitude": 20.32431946, - "longitude": -99.25513105 - }, - "13020": { - "latitude": 20.74140853, - "longitude": -98.88033469 - }, - "13021": { - "latitude": 19.65929692, - "longitude": -98.60027246 - }, - "13022": { - "latitude": 20.03214441, - "longitude": -98.64393461 - }, - "13023": { - "latitude": 20.23527925, - "longitude": -99.08028489 - }, - "13024": { - "latitude": 20.22590705, - "longitude": -98.54312562 - }, - "13025": { - "latitude": 21.03825624, - "longitude": -98.24714397 - }, - "13026": { - "latitude": 20.99749554, - "longitude": -98.48913491 - }, - "13027": { - "latitude": 20.51415864, - "longitude": -98.06408679 - }, - "13028": { - "latitude": 21.127235100000004, - "longitude": -98.45171616 - }, - "13029": { - "latitude": 20.38381711, - "longitude": -99.68073437 - }, - "13030": { - "latitude": 20.53251507, - "longitude": -99.20132324 - }, - "13031": { - "latitude": 20.96995759, - "longitude": -99.14721861 - }, - "13032": { - "latitude": 21.14847884, - "longitude": -98.52757247 - }, - "13033": { - "latitude": 20.83158128, - "longitude": -98.83574779 - }, - "13034": { - "latitude": 20.96215421, - "longitude": -98.72330956 - }, - "13035": { - "latitude": 20.25697177, - "longitude": -98.34191085 - }, - "13036": { - "latitude": 20.52379329, - "longitude": -98.60528533 - }, - "13037": { - "latitude": 20.56544656, - "longitude": -98.80965292 - }, - "13038": { - "latitude": 20.22304183, - "longitude": -98.75356021 - }, - "13039": { - "latitude": 20.14035542, - "longitude": -98.65883191 - }, - "13040": { - "latitude": 21.07096295, - "longitude": -99.07051198 - }, - "13041": { - "latitude": 20.22385342, - "longitude": -99.18072623 - }, - "13042": { - "latitude": 20.86438844, - "longitude": -98.77641598 - }, - "13043": { - "latitude": 20.78647347, - "longitude": -99.17541269 - }, - "13044": { - "latitude": 20.23298851, - "longitude": -99.67268404 - }, - "13045": { - "latitude": 20.17374554, - "longitude": -98.62196473 - }, - "13046": { - "latitude": 21.26033399, - "longitude": -98.58167516 - }, - "13047": { - "latitude": 20.99976316, - "longitude": -99.31541272 - }, - "13048": { - "latitude": 20.10208402, - "longitude": -98.78223052 - }, - "13049": { - "latitude": 21.23448816, - "longitude": -98.98883302 - }, - "13050": { - "latitude": 20.31433293, - "longitude": -99.17815488 - }, - "13051": { - "latitude": 20.05865871, - "longitude": -98.72017324 - }, - "13052": { - "latitude": 20.09557477, - "longitude": -98.94003559 - }, - "13053": { - "latitude": 20.46851621, - "longitude": -98.19105243 - }, - "13054": { - "latitude": 20.3047487, - "longitude": -99.04786107 - }, - "13055": { - "latitude": 20.41237062, - "longitude": -98.98285335 - }, - "13056": { - "latitude": 20.03565103, - "longitude": -98.39277665 - }, - "13057": { - "latitude": 19.98760322, - "longitude": -98.49546087 - }, - "13058": { - "latitude": 20.54233973, - "longitude": -99.37583088 - }, - "13059": { - "latitude": 20.53926327, - "longitude": -99.63243188 - }, - "13060": { - "latitude": 20.34335814, - "longitude": -98.21083288 - }, - "13061": { - "latitude": 19.81553973, - "longitude": -98.49478528 - }, - "13062": { - "latitude": 21.06143031, - "longitude": -98.83294325 - }, - "13063": { - "latitude": 19.90266681, - "longitude": -99.36350111 - }, - "13064": { - "latitude": 20.19422036, - "longitude": -99.39870442 - }, - "13065": { - "latitude": 20.114407, - "longitude": -99.15182643 - }, - "13066": { - "latitude": 19.91282247, - "longitude": -98.80336447 - }, - "13067": { - "latitude": 20.17886959, - "longitude": -99.29328099 - }, - "13068": { - "latitude": 20.77878539, - "longitude": -98.54418537 - }, - "13069": { - "latitude": 19.85252666, - "longitude": -98.96118415 - }, - "13070": { - "latitude": 20.13155372, - "longitude": -99.21906889 - }, - "13071": { - "latitude": 20.86659296, - "longitude": -98.97238929 - }, - "13072": { - "latitude": 19.83519921, - "longitude": -98.58693202 - }, - "13073": { - "latitude": 21.03183491, - "longitude": -98.64818253 - }, - "13074": { - "latitude": 20.09620421, - "longitude": -99.23099148 - }, - "13075": { - "latitude": 19.95495588, - "longitude": -98.92335202 - }, - "13076": { - "latitude": 20.06412923, - "longitude": -99.3767425 - }, - "13077": { - "latitude": 20.12360121, - "longitude": -98.35093968 - }, - "13078": { - "latitude": 20.85785711, - "longitude": -98.28808963 - }, - "13079": { - "latitude": 20.79490401, - "longitude": -98.63957886 - }, - "13080": { - "latitude": 20.91624987, - "longitude": -98.38351714 - }, - "13081": { - "latitude": 20.65074738, - "longitude": -98.58672605 - }, - "13082": { - "latitude": 19.99260551, - "longitude": -98.85530217 - }, - "13083": { - "latitude": 19.923130399999998, - "longitude": -98.67233409 - }, - "13084": { - "latitude": 20.75287884, - "longitude": -99.36572672 - }, - "14001": { - "latitude": 20.7700527, - "longitude": -102.9091588 - }, - "14002": { - "latitude": 20.42849351, - "longitude": -103.6088457 - }, - "14003": { - "latitude": 20.7114665, - "longitude": -103.9353619 - }, - "14004": { - "latitude": 19.99994646, - "longitude": -103.62258349999999 - }, - "14005": { - "latitude": 20.84998982, - "longitude": -103.71725190000001 - }, - "14006": { - "latitude": 20.5416639, - "longitude": -104.0805433 - }, - "14007": { - "latitude": 20.80910293, - "longitude": -104.00677840000002 - }, - "14008": { - "latitude": 20.76643742, - "longitude": -102.3006184 - }, - "14009": { - "latitude": 20.75497256, - "longitude": -103.67901409999999 - }, - "14010": { - "latitude": 20.17295242, - "longitude": -103.7316537 - }, - "14011": { - "latitude": 20.31807551, - "longitude": -104.27392490000001 - }, - "14012": { - "latitude": 20.33673411, - "longitude": -104.5506741 - }, - "14013": { - "latitude": 20.54756608, - "longitude": -102.5396146 - }, - "14014": { - "latitude": 19.99643921, - "longitude": -103.4704691 - }, - "14015": { - "latitude": 19.74346644, - "longitude": -104.3121564 - }, - "14016": { - "latitude": 20.48882101, - "longitude": -102.3429278 - }, - "14017": { - "latitude": 20.05025735, - "longitude": -104.43482270000001 - }, - "14018": { - "latitude": 20.36382714, - "longitude": -102.5232997 - }, - "14019": { - "latitude": 21.87465371, - "longitude": -103.92047590000001 - }, - "14020": { - "latitude": 20.34240326, - "longitude": -105.4065665 - }, - "14021": { - "latitude": 19.60294869, - "longitude": -104.4701611 - }, - "14022": { - "latitude": 19.27737715, - "longitude": -104.6149475 - }, - "14023": { - "latitude": 19.71077367, - "longitude": -103.51033690000001 - }, - "14024": { - "latitude": 20.39035318, - "longitude": -103.8244592 - }, - "14025": { - "latitude": 22.09170961, - "longitude": -103.28720109999999 - }, - "14026": { - "latitude": 19.98241522, - "longitude": -103.236428 - }, - "14027": { - "latitude": 19.43563169, - "longitude": -104.311053 - }, - "14028": { - "latitude": 20.19299643, - "longitude": -104.5098565 - }, - "14029": { - "latitude": 20.95240229, - "longitude": -103.0287168 - }, - "14030": { - "latitude": 20.25986033, - "longitude": -103.1879112 - }, - "14031": { - "latitude": 21.72991944, - "longitude": -103.6599475 - }, - "14032": { - "latitude": 20.08228397, - "longitude": -103.8801849 - }, - "14033": { - "latitude": 20.44789177, - "longitude": -102.1677902 - }, - "14034": { - "latitude": 19.91241507, - "longitude": -104.08162209999999 - }, - "14035": { - "latitude": 21.55570522, - "longitude": -102.1914798 - }, - "14036": { - "latitude": 20.74360686, - "longitude": -104.123768 - }, - "14037": { - "latitude": 19.80105574, - "longitude": -104.1951248 - }, - "14038": { - "latitude": 20.67890612, - "longitude": -104.42156429999999 - }, - "14039": { - "latitude": 20.67621886, - "longitude": -103.3357483 - }, - "14040": { - "latitude": 21.05746433, - "longitude": -104.0754075 - }, - "14041": { - "latitude": 22.31855027, - "longitude": -103.2339852 - }, - "14042": { - "latitude": 22.58370015, - "longitude": -103.9162128 - }, - "14043": { - "latitude": 19.51475481, - "longitude": -104.862967 - }, - "14044": { - "latitude": 20.3916422, - "longitude": -103.20737640000002 - }, - "14045": { - "latitude": 20.89856092, - "longitude": -103.2278117 - }, - "14046": { - "latitude": 21.19166622, - "longitude": -102.4893397 - }, - "14047": { - "latitude": 20.28013081, - "longitude": -102.6856745 - }, - "14048": { - "latitude": 20.63546774, - "longitude": -102.1198652 - }, - "14049": { - "latitude": 19.3295189, - "longitude": -102.88109250000001 - }, - "14050": { - "latitude": 20.31451142, - "longitude": -103.4171813 - }, - "14051": { - "latitude": 20.48171971, - "longitude": -103.1352113 - }, - "14052": { - "latitude": 20.05424235, - "longitude": -104.0366571 - }, - "14053": { - "latitude": 21.49401266, - "longitude": -101.8796566 - }, - "14054": { - "latitude": 19.84079338, - "longitude": -104.1003184 - }, - "14055": { - "latitude": 20.90825221, - "longitude": -104.0307698 - }, - "14056": { - "latitude": 19.52919475, - "longitude": -102.8386562 - }, - "14057": { - "latitude": 20.02151145, - "longitude": -103.10783719999999 - }, - "14058": { - "latitude": 20.57894589, - "longitude": -104.81406 - }, - "14059": { - "latitude": 19.89423914, - "longitude": -103.07253399999999 - }, - "14060": { - "latitude": 21.26385325, - "longitude": -102.7535341 - }, - "14061": { - "latitude": 22.22244116, - "longitude": -103.9944275 - }, - "14062": { - "latitude": 20.50891275, - "longitude": -104.45291800000001 - }, - "14063": { - "latitude": 20.39744147, - "longitude": -102.7240506 - }, - "14064": { - "latitude": 21.81083021, - "longitude": -101.7151166 - }, - "14065": { - "latitude": 19.14655026, - "longitude": -103.3818619 - }, - "14066": { - "latitude": 20.27021538, - "longitude": -102.8947191 - }, - "14067": { - "latitude": 20.69786615, - "longitude": -105.14913929999999 - }, - "14068": { - "latitude": 19.80719022, - "longitude": -104.72284259999999 - }, - "14069": { - "latitude": 19.80453814, - "longitude": -102.86824140000002 - }, - "14070": { - "latitude": 20.53902526, - "longitude": -103.2454573 - }, - "14071": { - "latitude": 21.04787905, - "longitude": -103.5001484 - }, - "14072": { - "latitude": 20.97012189, - "longitude": -102.02345799999999 - }, - "14073": { - "latitude": 21.26969603, - "longitude": -102.2943526 - }, - "14074": { - "latitude": 20.99766134, - "longitude": -102.1634755 - }, - "14075": { - "latitude": 20.82468888, - "longitude": -104.2320496 - }, - "14076": { - "latitude": 21.59589296, - "longitude": -103.7850122 - }, - "14077": { - "latitude": 20.44992064, - "longitude": -103.9051365 - }, - "14078": { - "latitude": 20.99259447, - "longitude": -102.3796422 - }, - "14079": { - "latitude": 19.85645666, - "longitude": -103.4171853 - }, - "14080": { - "latitude": 20.85245301, - "longitude": -104.8261233 - }, - "14081": { - "latitude": 22.19330689, - "longitude": -103.18128100000001 - }, - "14082": { - "latitude": 19.86176203, - "longitude": -103.59464390000001 - }, - "14083": { - "latitude": 20.60742028, - "longitude": -103.6821936 - }, - "14084": { - "latitude": 20.29944406, - "longitude": -104.95348059999999 - }, - "14085": { - "latitude": 19.6874747, - "longitude": -103.1792876 - }, - "14086": { - "latitude": 19.94823865, - "longitude": -103.76547140000001 - }, - "14087": { - "latitude": 19.2252978, - "longitude": -103.192531 - }, - "14088": { - "latitude": 20.25922375, - "longitude": -104.0241829 - }, - "14089": { - "latitude": 20.09243218, - "longitude": -103.57526240000001 - }, - "14090": { - "latitude": 20.14688817, - "longitude": -104.16552940000001 - }, - "14091": { - "latitude": 21.48035762, - "longitude": -102.5544777 - }, - "14092": { - "latitude": 20.10871232, - "longitude": -103.3471464 - }, - "14093": { - "latitude": 20.81484228, - "longitude": -102.7208429 - }, - "14094": { - "latitude": 21.11246072, - "longitude": -103.78096190000001 - }, - "14095": { - "latitude": 20.67925845, - "longitude": -103.8323882 - }, - "14096": { - "latitude": 20.11962202, - "longitude": -103.0710725 - }, - "14097": { - "latitude": 20.47869601, - "longitude": -103.4173673 - }, - "14098": { - "latitude": 20.59148137, - "longitude": -103.3478552 - }, - "14099": { - "latitude": 19.55288984, - "longitude": -103.93056740000002 - }, - "14100": { - "latitude": 19.97952464, - "longitude": -105.16474529999999 - }, - "14101": { - "latitude": 20.62005309, - "longitude": -103.2143447 - }, - "14102": { - "latitude": 19.84789868, - "longitude": -103.95017990000001 - }, - "14103": { - "latitude": 19.43210152, - "longitude": -103.5350894 - }, - "14104": { - "latitude": 21.95891053, - "longitude": -103.47857420000001 - }, - "14105": { - "latitude": 20.54872807, - "longitude": -102.74871850000001 - }, - "14106": { - "latitude": 19.68122188, - "longitude": -104.0331604 - }, - "14107": { - "latitude": 20.14689801, - "longitude": -103.2420362 - }, - "14108": { - "latitude": 19.47902981, - "longitude": -103.45726440000001 - }, - "14109": { - "latitude": 21.15467802, - "longitude": -101.99718320000001 - }, - "14110": { - "latitude": 19.99286929, - "longitude": -104.2557182 - }, - "14111": { - "latitude": 21.04651516, - "longitude": -102.6509561 - }, - "14112": { - "latitude": 19.83517392, - "longitude": -102.9726177 - }, - "14113": { - "latitude": 19.70991138, - "longitude": -103.7389065 - }, - "14114": { - "latitude": 20.38964587, - "longitude": -103.7088569 - }, - "14115": { - "latitude": 22.02878092, - "longitude": -103.6866622 - }, - "14116": { - "latitude": 21.66771587, - "longitude": -102.5935932 - }, - "14117": { - "latitude": 21.15982261, - "longitude": -102.7012285 - }, - "14118": { - "latitude": 21.13793647, - "longitude": -102.9336608 - }, - "14119": { - "latitude": 20.23551778, - "longitude": -103.5680598 - }, - "14120": { - "latitude": 20.79490429, - "longitude": -103.49421 - }, - "14121": { - "latitude": 19.62160546, - "longitude": -103.3457808 - }, - "14122": { - "latitude": 19.51557281, - "longitude": -103.7583372 - }, - "14123": { - "latitude": 20.46086374, - "longitude": -102.924974 - }, - "14124": { - "latitude": 20.63604761, - "longitude": -103.0488368 - }, - "14125": { - "latitude": 20.76460749, - "longitude": -102.5064047 - }, - "15001": { - "latitude": 19.97294169, - "longitude": -99.87153026 - }, - "15002": { - "latitude": 19.63377366, - "longitude": -98.91986209999999 - }, - "15003": { - "latitude": 20.11567647, - "longitude": -99.83334661 - }, - "15004": { - "latitude": 18.85396719, - "longitude": -99.87080434 - }, - "15005": { - "latitude": 19.40541435, - "longitude": -99.82940584 - }, - "15006": { - "latitude": 19.1587798, - "longitude": -99.49187295 - }, - "15007": { - "latitude": 19.25093149, - "longitude": -99.9883932 - }, - "15008": { - "latitude": 18.70299252, - "longitude": -100.2668015 - }, - "15009": { - "latitude": 19.12488715, - "longitude": -98.71656333 - }, - "15010": { - "latitude": 19.98450893, - "longitude": -99.14789892 - }, - "15011": { - "latitude": 19.54543136, - "longitude": -98.96213222 - }, - "15012": { - "latitude": 19.17554556, - "longitude": -99.49997516 - }, - "15013": { - "latitude": 19.56480728, - "longitude": -99.27404399 - }, - "15014": { - "latitude": 19.80985286, - "longitude": -99.84581628 - }, - "15015": { - "latitude": 19.03110809, - "longitude": -98.71706467 - }, - "15016": { - "latitude": 19.7630572, - "longitude": -98.72129628 - }, - "15017": { - "latitude": 19.12429094, - "longitude": -98.81635586 - }, - "15018": { - "latitude": 19.16553448, - "longitude": -99.64325788 - }, - "15019": { - "latitude": 19.20982606, - "longitude": -99.4605509 - }, - "15020": { - "latitude": 19.62629, - "longitude": -99.10239554 - }, - "15021": { - "latitude": 18.94553521, - "longitude": -99.79936634 - }, - "15022": { - "latitude": 19.22602957, - "longitude": -98.85889492 - }, - "15023": { - "latitude": 19.78998449, - "longitude": -99.22220534 - }, - "15024": { - "latitude": 19.70821393, - "longitude": -99.15945203 - }, - "15025": { - "latitude": 19.25359717, - "longitude": -98.83168617 - }, - "15026": { - "latitude": 19.82575536, - "longitude": -99.55093911 - }, - "15027": { - "latitude": 19.20649249, - "longitude": -99.55010889 - }, - "15028": { - "latitude": 19.57302919, - "longitude": -98.88387265 - }, - "15029": { - "latitude": 19.40629463, - "longitude": -98.87757302 - }, - "15030": { - "latitude": 19.55627849, - "longitude": -98.89669568 - }, - "15031": { - "latitude": 19.416273699999998, - "longitude": -98.94720806 - }, - "15032": { - "latitude": 19.31644199, - "longitude": -100.1848434 - }, - "15033": { - "latitude": 19.57278367, - "longitude": -99.04321177 - }, - "15034": { - "latitude": 18.96802196, - "longitude": -98.73664959999999 - }, - "15035": { - "latitude": 19.82263264, - "longitude": -99.25502817 - }, - "15036": { - "latitude": 19.95241235, - "longitude": -99.02800775 - }, - "15037": { - "latitude": 19.38310083, - "longitude": -99.3395276 - }, - "15038": { - "latitude": 19.55424328, - "longitude": -99.44037608 - }, - "15039": { - "latitude": 19.34280188, - "longitude": -98.77905526 - }, - "15040": { - "latitude": 18.85069655, - "longitude": -99.6908411 - }, - "15041": { - "latitude": 19.25742638, - "longitude": -100.2778499 - }, - "15042": { - "latitude": 19.58959594, - "longitude": -99.80703039 - }, - "15043": { - "latitude": 19.16524522, - "longitude": -99.35927063 - }, - "15044": { - "latitude": 19.75354133, - "longitude": -99.09302776 - }, - "15045": { - "latitude": 20.01910289, - "longitude": -99.5965693 - }, - "15046": { - "latitude": 19.50604721, - "longitude": -99.39043697 - }, - "15047": { - "latitude": 19.586084600000003, - "longitude": -99.64161764 - }, - "15048": { - "latitude": 19.71719207, - "longitude": -99.82360682 - }, - "15049": { - "latitude": 19.07016008, - "longitude": -99.51646093 - }, - "15050": { - "latitude": 19.09359394, - "longitude": -98.90408244 - }, - "15051": { - "latitude": 19.34508348, - "longitude": -99.47486233 - }, - "15052": { - "latitude": 18.88191804, - "longitude": -99.48564245 - }, - "15053": { - "latitude": 19.70965059, - "longitude": -99.13354781 - }, - "15054": { - "latitude": 19.24739155, - "longitude": -99.58826349 - }, - "15055": { - "latitude": 19.21108655, - "longitude": -99.58313028 - }, - "15056": { - "latitude": 19.75987612, - "longitude": -99.64896227 - }, - "15057": { - "latitude": 19.47125315, - "longitude": -99.29260539 - }, - "15058": { - "latitude": 19.42257866, - "longitude": -99.02269952 - }, - "15059": { - "latitude": 19.72993819, - "longitude": -99.07452371 - }, - "15060": { - "latitude": 19.62497302, - "longitude": -99.39174976 - }, - "15061": { - "latitude": 19.81231434, - "longitude": -98.71708912 - }, - "15062": { - "latitude": 19.25951521, - "longitude": -99.40628254 - }, - "15063": { - "latitude": 19.0092341, - "longitude": -99.39641629 - }, - "15064": { - "latitude": 19.79514613, - "longitude": -100.0791527 - }, - "15065": { - "latitude": 19.65448935, - "longitude": -98.73712895 - }, - "15066": { - "latitude": 19.10803006, - "longitude": -100.31894720000001 - }, - "15067": { - "latitude": 19.45024137, - "longitude": -99.52993802 - }, - "15068": { - "latitude": 19.02175613, - "longitude": -98.80968433 - }, - "15069": { - "latitude": 19.55988192, - "longitude": -98.85785961 - }, - "15070": { - "latitude": 19.36107302, - "longitude": -98.94669088 - }, - "15071": { - "latitude": 20.22407791, - "longitude": -99.83167840000002 - }, - "15072": { - "latitude": 19.13887782, - "longitude": -99.56707433 - }, - "15073": { - "latitude": 19.16887714, - "longitude": -99.5512837 - }, - "15074": { - "latitude": 19.65322484, - "longitude": -99.98252284 - }, - "15075": { - "latitude": 19.72369673, - "longitude": -98.83282913 - }, - "15076": { - "latitude": 19.26895424, - "longitude": -99.54225234 - }, - "15077": { - "latitude": 18.98005482, - "longitude": -100.0368717 - }, - "15078": { - "latitude": 19.17968795, - "longitude": -100.2998129 - }, - "15079": { - "latitude": 20.05180535, - "longitude": -99.51387438 - }, - "15080": { - "latitude": 18.73462102, - "longitude": -99.98920338 - }, - "15081": { - "latitude": 19.705836399999995, - "longitude": -98.98650793 - }, - "15082": { - "latitude": 18.87379724, - "longitude": -100.21309129999999 - }, - "15083": { - "latitude": 19.18893267, - "longitude": -98.88377729999999 - }, - "15084": { - "latitude": 19.81912074, - "longitude": -98.88106872 - }, - "15085": { - "latitude": 19.92126474, - "longitude": -100.0369993 - }, - "15086": { - "latitude": 19.08136146, - "longitude": -99.99658431 - }, - "15087": { - "latitude": 19.48573043, - "longitude": -99.6023182 - }, - "15088": { - "latitude": 18.97682093, - "longitude": -99.5717902 - }, - "15089": { - "latitude": 19.15163715, - "longitude": -98.87015061 - }, - "15090": { - "latitude": 19.08135021, - "longitude": -99.63028617 - }, - "15091": { - "latitude": 19.762207399999998, - "longitude": -99.16818479 - }, - "15092": { - "latitude": 19.68631789, - "longitude": -98.87066921 - }, - "15093": { - "latitude": 19.56941442, - "longitude": -98.76570055 - }, - "15094": { - "latitude": 19.00994035, - "longitude": -98.84128390000001 - }, - "15095": { - "latitude": 19.72521313, - "longitude": -99.30619368 - }, - "15096": { - "latitude": 19.90464878, - "longitude": -99.14958514 - }, - "15097": { - "latitude": 18.940007, - "longitude": -99.94073885 - }, - "15098": { - "latitude": 19.129644, - "longitude": -99.50642909999999 - }, - "15099": { - "latitude": 19.47167655, - "longitude": -98.82769174 - }, - "15100": { - "latitude": 19.59691617, - "longitude": -98.93141082 - }, - "15101": { - "latitude": 19.162300199999997, - "longitude": -99.43216378 - }, - "15102": { - "latitude": 19.89634578, - "longitude": -99.71804159 - }, - "15103": { - "latitude": 19.20890233, - "longitude": -98.73196968 - }, - "15104": { - "latitude": 19.54492196, - "longitude": -99.19307226 - }, - "15105": { - "latitude": 18.54448264, - "longitude": -100.25708320000001 - }, - "15106": { - "latitude": 19.29626331, - "longitude": -99.66699652 - }, - "15107": { - "latitude": 18.78090369, - "longitude": -99.63755943 - }, - "15108": { - "latitude": 19.67930656, - "longitude": -99.11964884 - }, - "15109": { - "latitude": 19.61489934, - "longitude": -99.15803393 - }, - "15110": { - "latitude": 19.17776775, - "longitude": -100.12195030000001 - }, - "15111": { - "latitude": 19.38724301, - "longitude": -100.1375638 - }, - "15112": { - "latitude": 19.72106219, - "longitude": -99.47839368 - }, - "15113": { - "latitude": 18.97308724, - "longitude": -99.68728991 - }, - "15114": { - "latitude": 19.44275026, - "longitude": -99.99213425 - }, - "15115": { - "latitude": 19.43695108, - "longitude": -99.46759868 - }, - "15116": { - "latitude": 19.06082963, - "longitude": -100.2561103 - }, - "15117": { - "latitude": 18.71582018, - "longitude": -99.81281105 - }, - "15118": { - "latitude": 19.21501978, - "longitude": -99.79782220000001 - }, - "15119": { - "latitude": 18.80011739, - "longitude": -99.55408935 - }, - "15120": { - "latitude": 19.80910677, - "longitude": -99.07182055 - }, - "15121": { - "latitude": 19.65453652, - "longitude": -99.22522664 - }, - "15122": { - "latitude": 19.2764065, - "longitude": -98.94831698 - }, - "15123": { - "latitude": 18.94081843, - "longitude": -100.4064827 - }, - "15124": { - "latitude": 19.61712872, - "longitude": -100.14560820000001 - }, - "15125": { - "latitude": 19.68182481, - "longitude": -99.05835864 - }, - "16001": { - "latitude": 19.46583081, - "longitude": -101.3400023 - }, - "16002": { - "latitude": 18.77774207, - "longitude": -102.76108719999999 - }, - "16003": { - "latitude": 19.87353688, - "longitude": -101.0217579 - }, - "16004": { - "latitude": 20.13890612, - "longitude": -101.7277624 - }, - "16005": { - "latitude": 19.62922913, - "longitude": -100.2985271 - }, - "16006": { - "latitude": 18.93817311, - "longitude": -102.4233222 - }, - "16007": { - "latitude": 19.66198182, - "longitude": -100.3954263 - }, - "16008": { - "latitude": 18.37423788, - "longitude": -103.23583670000001 - }, - "16009": { - "latitude": 19.156312300000003, - "longitude": -101.70667209999999 - }, - "16010": { - "latitude": 18.36406996, - "longitude": -102.27068179999999 - }, - "16011": { - "latitude": 20.23754319, - "longitude": -102.58979529999999 - }, - "16012": { - "latitude": 19.20387568, - "longitude": -102.5838682 - }, - "16013": { - "latitude": 18.96882776, - "longitude": -101.03631429999999 - }, - "16014": { - "latitude": 18.74280927, - "longitude": -103.6153802 - }, - "16015": { - "latitude": 18.679653, - "longitude": -103.0859668 - }, - "16016": { - "latitude": 19.79529388, - "longitude": -101.6272501 - }, - "16017": { - "latitude": 19.95930782, - "longitude": -100.2075883 - }, - "16018": { - "latitude": 19.91627962, - "longitude": -101.22140309999999 - }, - "16019": { - "latitude": 19.75908409, - "longitude": -102.6999617 - }, - "16020": { - "latitude": 19.98059264, - "longitude": -101.1118238 - }, - "16021": { - "latitude": 19.69241839, - "longitude": -102.2279705 - }, - "16022": { - "latitude": 19.66891409, - "longitude": -101.0133079 - }, - "16023": { - "latitude": 20.04402637, - "longitude": -102.44670649999999 - }, - "16024": { - "latitude": 19.73461884, - "longitude": -101.9897389 - }, - "16025": { - "latitude": 19.81335263, - "longitude": -102.1011676 - }, - "16026": { - "latitude": 18.76389637, - "longitude": -103.40893790000001 - }, - "16027": { - "latitude": 19.8969503, - "longitude": -101.36219129999999 - }, - "16028": { - "latitude": 20.12889306, - "longitude": -102.0780297 - }, - "16029": { - "latitude": 18.689244, - "longitude": -101.6162319 - }, - "16030": { - "latitude": 20.15555787, - "longitude": -102.2434175 - }, - "16031": { - "latitude": 20.14734218, - "longitude": -100.2893416 - }, - "16032": { - "latitude": 19.61978801, - "longitude": -101.72521379999999 - }, - "16033": { - "latitude": 19.15881701, - "longitude": -102.0071373 - }, - "16034": { - "latitude": 19.61260339, - "longitude": -100.6778972 - }, - "16035": { - "latitude": 18.84195916, - "longitude": -101.9211609 - }, - "16036": { - "latitude": 19.99613035, - "longitude": -101.2777668 - }, - "16037": { - "latitude": 19.8919507, - "longitude": -101.49647809999999 - }, - "16038": { - "latitude": 18.65387091, - "longitude": -101.1050639 - }, - "16039": { - "latitude": 19.52154211, - "longitude": -101.45706159999999 - }, - "16040": { - "latitude": 19.76602206, - "longitude": -100.94215809999999 - }, - "16041": { - "latitude": 19.71680013, - "longitude": -100.4679996 - }, - "16042": { - "latitude": 20.15136247, - "longitude": -102.40571920000001 - }, - "16043": { - "latitude": 19.93494144, - "longitude": -102.3160019 - }, - "16044": { - "latitude": 19.92683113, - "longitude": -101.70439209999999 - }, - "16045": { - "latitude": 19.977497800000002, - "longitude": -102.75340909999998 - }, - "16046": { - "latitude": 19.2928217, - "longitude": -100.4601793 - }, - "16047": { - "latitude": 19.43333715, - "longitude": -100.5186892 - }, - "16048": { - "latitude": 19.577998899999997, - "longitude": -101.4111949 - }, - "16049": { - "latitude": 19.34246827, - "longitude": -101.17021820000001 - }, - "16050": { - "latitude": 19.88943861, - "longitude": -100.42895240000001 - }, - "16051": { - "latitude": 20.04482342, - "longitude": -102.9678339 - }, - "16052": { - "latitude": 18.08853957, - "longitude": -102.375113 - }, - "16053": { - "latitude": 19.66659348, - "longitude": -101.2791066 - }, - "16054": { - "latitude": 19.98983113, - "longitude": -101.44299559999999 - }, - "16055": { - "latitude": 18.97109857, - "longitude": -102.12380490000001 - }, - "16056": { - "latitude": 19.64517681, - "longitude": -101.8795512 - }, - "16057": { - "latitude": 19.09348841, - "longitude": -101.2159329 - }, - "16058": { - "latitude": 19.40823659, - "longitude": -102.19572840000001 - }, - "16059": { - "latitude": 19.15911561, - "longitude": -101.8636818 - }, - "16060": { - "latitude": 20.25067632, - "longitude": -101.95975340000001 - }, - "16061": { - "latitude": 19.57717926, - "longitude": -100.33276550000001 - }, - "16062": { - "latitude": 20.14515743, - "longitude": -102.5257373 - }, - "16063": { - "latitude": 20.00174484, - "longitude": -101.7816513 - }, - "16064": { - "latitude": 19.0620596, - "longitude": -102.21229100000001 - }, - "16065": { - "latitude": 19.65412656, - "longitude": -102.07105200000001 - }, - "16066": { - "latitude": 19.49449656, - "longitude": -101.59901540000001 - }, - "16067": { - "latitude": 20.10383811, - "longitude": -101.8956067 - }, - "16068": { - "latitude": 19.49528911, - "longitude": -102.4526098 - }, - "16069": { - "latitude": 20.30558291, - "longitude": -102.0723113 - }, - "16070": { - "latitude": 19.91071886, - "longitude": -101.9920137 - }, - "16071": { - "latitude": 20.11571026, - "longitude": -101.5280324 - }, - "16072": { - "latitude": 19.72647699, - "longitude": -100.8467716 - }, - "16073": { - "latitude": 19.69517547, - "longitude": -101.5386656 - }, - "16074": { - "latitude": 20.1119487, - "longitude": -102.8792274 - }, - "16075": { - "latitude": 19.65284042, - "longitude": -102.3953396 - }, - "16076": { - "latitude": 20.05514052, - "longitude": -102.7662973 - }, - "16077": { - "latitude": 18.56725894, - "longitude": -100.7628778 - }, - "16078": { - "latitude": 20.03925119, - "longitude": -101.03888570000001 - }, - "16079": { - "latitude": 19.38121386, - "longitude": -101.6880828 - }, - "16080": { - "latitude": 19.74617683, - "longitude": -100.3423317 - }, - "16081": { - "latitude": 19.19120378, - "longitude": -100.40686740000001 - }, - "16082": { - "latitude": 19.25483538, - "longitude": -101.4520159 - }, - "16083": { - "latitude": 19.33114385, - "longitude": -102.3470143 - }, - "16084": { - "latitude": 19.89024686, - "longitude": -102.4536454 - }, - "16085": { - "latitude": 19.87262274, - "longitude": -102.2486814 - }, - "16086": { - "latitude": 20.25924502, - "longitude": -102.34178349999999 - }, - "16087": { - "latitude": 19.32930957, - "longitude": -101.8951056 - }, - "16088": { - "latitude": 19.81648565, - "longitude": -101.1575038 - }, - "16089": { - "latitude": 19.06823452, - "longitude": -102.85832909999999 - }, - "16090": { - "latitude": 19.51388791, - "longitude": -101.85065279999999 - }, - "16091": { - "latitude": 19.78673289, - "longitude": -102.50041829999999 - }, - "16092": { - "latitude": 19.05718232, - "longitude": -100.79537509999999 - }, - "16093": { - "latitude": 19.77988677, - "longitude": -100.20658259999999 - }, - "16094": { - "latitude": 20.00591861, - "longitude": -102.06087729999999 - }, - "16095": { - "latitude": 19.64639736, - "longitude": -102.5936982 - }, - "16096": { - "latitude": 18.550255, - "longitude": -102.5100321 - }, - "16097": { - "latitude": 18.93207603, - "longitude": -101.4221165 - }, - "16098": { - "latitude": 19.56833187, - "longitude": -100.48787779999999 - }, - "16099": { - "latitude": 19.22180179, - "longitude": -100.6179474 - }, - "16100": { - "latitude": 19.60995025, - "longitude": -101.5495268 - }, - "16101": { - "latitude": 19.43162048, - "longitude": -100.914012 - }, - "16102": { - "latitude": 19.44363709, - "longitude": -102.10564509999999 - }, - "16103": { - "latitude": 20.14306192, - "longitude": -102.66620019999999 - }, - "16104": { - "latitude": 19.99376164, - "longitude": -102.586401 - }, - "16105": { - "latitude": 20.26622194, - "longitude": -102.4698262 - }, - "16106": { - "latitude": 20.299267800000003, - "longitude": -102.21951390000001 - }, - "16107": { - "latitude": 19.82413732, - "longitude": -101.8278668 - }, - "16108": { - "latitude": 20.03301909, - "longitude": -102.26407840000002 - }, - "16109": { - "latitude": 20.18248422, - "longitude": -102.0115465 - }, - "16110": { - "latitude": 19.87071447, - "longitude": -100.769286 - }, - "16111": { - "latitude": 19.42852654, - "longitude": -101.90904429999999 - }, - "16112": { - "latitude": 19.43822531, - "longitude": -100.3379489 - }, - "16113": { - "latitude": 20.25691726, - "longitude": -101.5669324 - }, - "17001": { - "latitude": 18.59000049, - "longitude": -99.38668497 - }, - "17002": { - "latitude": 18.93504982, - "longitude": -98.89450111 - }, - "17003": { - "latitude": 18.52523896, - "longitude": -98.75211401 - }, - "17004": { - "latitude": 18.71621794, - "longitude": -98.97897017 - }, - "17005": { - "latitude": 18.73183008, - "longitude": -99.44577706 - }, - "17006": { - "latitude": 18.82705976, - "longitude": -98.96180449 - }, - "17007": { - "latitude": 18.93887812, - "longitude": -99.26302765 - }, - "17008": { - "latitude": 18.81372618, - "longitude": -99.18089778 - }, - "17009": { - "latitude": 19.05759276, - "longitude": -99.23662672 - }, - "17010": { - "latitude": 18.68540541, - "longitude": -98.76471122 - }, - "17011": { - "latitude": 18.88515843, - "longitude": -99.16645097 - }, - "17012": { - "latitude": 18.58455463, - "longitude": -99.22254296 - }, - "17013": { - "latitude": 18.66375718, - "longitude": -98.80941421 - }, - "17014": { - "latitude": 18.68591542, - "longitude": -99.3654166 - }, - "17015": { - "latitude": 18.80295735, - "longitude": -99.35517814 - }, - "17016": { - "latitude": 18.88157206, - "longitude": -98.78096085 - }, - "17017": { - "latitude": 18.57779343, - "longitude": -99.28567481 - }, - "17018": { - "latitude": 18.84253096, - "longitude": -99.27224257 - }, - "17019": { - "latitude": 18.57477528, - "longitude": -98.89425245 - }, - "17020": { - "latitude": 18.98129584, - "longitude": -99.10518861 - }, - "17021": { - "latitude": 18.69273564, - "longitude": -99.41239406 - }, - "17022": { - "latitude": 18.90553419, - "longitude": -98.70820353 - }, - "17023": { - "latitude": 19.03870566, - "longitude": -98.99023986 - }, - "17024": { - "latitude": 18.70495251, - "longitude": -99.10824605 - }, - "17025": { - "latitude": 18.49913238, - "longitude": -99.07472909 - }, - "17026": { - "latitude": 18.95402753, - "longitude": -98.97503301 - }, - "17027": { - "latitude": 19.00043552, - "longitude": -98.9180321 - }, - "17028": { - "latitude": 18.76189782, - "longitude": -99.23527614 - }, - "17029": { - "latitude": 18.87223534, - "longitude": -99.05235336 - }, - "17030": { - "latitude": 18.85269755, - "longitude": -98.85681235 - }, - "17031": { - "latitude": 18.65565407, - "longitude": -99.2027141 - }, - "17032": { - "latitude": 18.80687621, - "longitude": -98.75379818 - }, - "17033": { - "latitude": 18.75924142, - "longitude": -98.79049403 - }, - "18001": { - "latitude": 22.46483773, - "longitude": -105.25895729999999 - }, - "18002": { - "latitude": 21.04111246, - "longitude": -104.57634350000001 - }, - "18003": { - "latitude": 20.84847126, - "longitude": -104.40145090000001 - }, - "18004": { - "latitude": 21.13137723, - "longitude": -105.05673200000001 - }, - "18005": { - "latitude": 22.78853899, - "longitude": -105.2442176 - }, - "18006": { - "latitude": 21.03342818, - "longitude": -104.3069559 - }, - "18007": { - "latitude": 21.18407343, - "longitude": -104.3993208 - }, - "18008": { - "latitude": 21.39086208, - "longitude": -104.9617614 - }, - "18009": { - "latitude": 22.12907067, - "longitude": -104.65710870000001 - }, - "18010": { - "latitude": 22.11770868, - "longitude": -105.21454059999999 - }, - "18011": { - "latitude": 21.99110491, - "longitude": -104.9625618 - }, - "18012": { - "latitude": 21.56962543, - "longitude": -105.20666029999998 - }, - "18013": { - "latitude": 21.16107453, - "longitude": -104.74879720000001 - }, - "18014": { - "latitude": 21.35648517, - "longitude": -104.590333 - }, - "18015": { - "latitude": 21.85403282, - "longitude": -105.32192579999999 - }, - "18016": { - "latitude": 22.33701825, - "longitude": -105.5194529 - }, - "18017": { - "latitude": 21.62158999, - "longitude": -104.8404865 - }, - "18018": { - "latitude": 21.96155849, - "longitude": -105.37442340000001 - }, - "18019": { - "latitude": 21.54281556, - "longitude": -104.1508925 - }, - "18020": { - "latitude": 20.84635495, - "longitude": -105.27109499999999 - }, - "19001": { - "latitude": 25.94054341, - "longitude": -100.40594240000001 - }, - "19002": { - "latitude": 26.29871207, - "longitude": -99.70308278 - }, - "19003": { - "latitude": 26.09150606, - "longitude": -99.27348015 - }, - "19004": { - "latitude": 25.30143412, - "longitude": -100.02951829999999 - }, - "19005": { - "latitude": 27.34215397, - "longitude": -100.0253546 - }, - "19006": { - "latitude": 25.79227578, - "longitude": -100.1873311 - }, - "19007": { - "latitude": 24.2251177, - "longitude": -99.88650893 - }, - "19008": { - "latitude": 26.57171111, - "longitude": -100.56179250000001 - }, - "19009": { - "latitude": 25.52459054, - "longitude": -99.91418546 - }, - "19010": { - "latitude": 25.90077114, - "longitude": -100.35688459999999 - }, - "19011": { - "latitude": 26.07231789, - "longitude": -99.70537346 - }, - "19012": { - "latitude": 25.97745846, - "longitude": -100.1854355 - }, - "19013": { - "latitude": 25.48015877, - "longitude": -98.97240917 - }, - "19014": { - "latitude": 23.86010838, - "longitude": -100.3062665 - }, - "19015": { - "latitude": 25.96409109, - "longitude": -99.03087341 - }, - "19016": { - "latitude": 25.84925201, - "longitude": -99.80497996 - }, - "19017": { - "latitude": 24.760509, - "longitude": -100.3922872 - }, - "19018": { - "latitude": 25.80901057, - "longitude": -100.65977690000001 - }, - "19019": { - "latitude": 25.64459748, - "longitude": -100.3747577 - }, - "19020": { - "latitude": 25.80331479, - "longitude": -98.84841806 - }, - "19021": { - "latitude": 25.82186667, - "longitude": -100.355575 - }, - "19022": { - "latitude": 25.27587397, - "longitude": -99.41301659999999 - }, - "19023": { - "latitude": 26.21264845, - "longitude": -99.44596719 - }, - "19024": { - "latitude": 23.90102904, - "longitude": -99.74017352 - }, - "19025": { - "latitude": 25.91139219, - "longitude": -100.13481970000001 - }, - "19026": { - "latitude": 25.67265769, - "longitude": -100.2057942 - }, - "19027": { - "latitude": 25.91607901, - "longitude": -99.41423983 - }, - "19028": { - "latitude": 26.03316812, - "longitude": -99.99750801 - }, - "19029": { - "latitude": 24.88379087, - "longitude": -99.67809606 - }, - "19030": { - "latitude": 24.63841769, - "longitude": -99.84871564 - }, - "19031": { - "latitude": 25.61409014, - "longitude": -100.12147990000001 - }, - "19032": { - "latitude": 27.05084141, - "longitude": -100.4182159 - }, - "19033": { - "latitude": 24.8533227, - "longitude": -99.53643597 - }, - "19034": { - "latitude": 25.874518, - "longitude": -99.96461835 - }, - "19035": { - "latitude": 26.04893062, - "longitude": -99.49351596 - }, - "19036": { - "latitude": 23.41791655, - "longitude": -100.16040799999999 - }, - "19037": { - "latitude": 26.28558356, - "longitude": -100.7862766 - }, - "19038": { - "latitude": 25.12630542, - "longitude": -99.80838054 - }, - "19039": { - "latitude": 25.64464035, - "longitude": -100.3109518 - }, - "19040": { - "latitude": 26.58304245, - "longitude": -99.60155405 - }, - "19041": { - "latitude": 25.73676866, - "longitude": -99.97713474 - }, - "19042": { - "latitude": 25.65331004, - "longitude": -99.58766699 - }, - "19043": { - "latitude": 25.06582344, - "longitude": -100.12773259999999 - }, - "19044": { - "latitude": 26.57510231, - "longitude": -100.1492882 - }, - "19045": { - "latitude": 26.16105223, - "longitude": -100.2703853 - }, - "19046": { - "latitude": 25.73607632, - "longitude": -100.2706926 - }, - "19047": { - "latitude": 25.99940226, - "longitude": -100.4531901 - }, - "19048": { - "latitude": 25.57461031, - "longitude": -100.4838634 - }, - "19049": { - "latitude": 25.38489716, - "longitude": -100.23732290000001 - }, - "19050": { - "latitude": 26.64810601, - "longitude": -99.88476271 - }, - "19051": { - "latitude": 26.46970461, - "longitude": -100.3480695 - }, - "20001": { - "latitude": 17.49015075, - "longitude": -96.63383803 - }, - "20002": { - "latitude": 18.45215291, - "longitude": -96.53956536 - }, - "20003": { - "latitude": 17.03383022, - "longitude": -95.92691037 - }, - "20004": { - "latitude": 17.92949564, - "longitude": -97.65270861 - }, - "20005": { - "latitude": 16.66197944, - "longitude": -94.95645243 - }, - "20006": { - "latitude": 17.46478617, - "longitude": -97.16135216 - }, - "20007": { - "latitude": 16.76289014, - "longitude": -96.72575715 - }, - "20008": { - "latitude": 16.226119699999998, - "longitude": -95.76619704 - }, - "20009": { - "latitude": 17.71464085, - "longitude": -96.16680111 - }, - "20010": { - "latitude": 16.78827691, - "longitude": -95.04303654 - }, - "20011": { - "latitude": 17.54573428, - "longitude": -98.25385539 - }, - "20012": { - "latitude": 15.89776534, - "longitude": -96.52776973 - }, - "20013": { - "latitude": 16.89378422, - "longitude": -96.76637066 - }, - "20014": { - "latitude": 16.62338817, - "longitude": -95.08933484 - }, - "20015": { - "latitude": 16.51405209, - "longitude": -96.63581227 - }, - "20016": { - "latitude": 17.21602079, - "longitude": -98.21717863 - }, - "20017": { - "latitude": 16.57979996, - "longitude": -96.85145738 - }, - "20018": { - "latitude": 17.99030153, - "longitude": -97.44280341 - }, - "20019": { - "latitude": 17.86769028, - "longitude": -96.853921 - }, - "20020": { - "latitude": 17.047655399999996, - "longitude": -97.98182759999999 - }, - "20021": { - "latitude": 18.57987178, - "longitude": -96.66187941 - }, - "20022": { - "latitude": 18.13803675, - "longitude": -97.80167377 - }, - "20023": { - "latitude": 17.00696101, - "longitude": -96.80142690000001 - }, - "20024": { - "latitude": 17.96612996, - "longitude": -96.8573083 - }, - "20025": { - "latitude": 16.27389553, - "longitude": -94.20464522 - }, - "20026": { - "latitude": 16.9868333, - "longitude": -97.56232794 - }, - "20027": { - "latitude": 17.99247012, - "longitude": -96.74874223 - }, - "20028": { - "latitude": 16.59658161, - "longitude": -96.7313923 - }, - "20029": { - "latitude": 18.19464715, - "longitude": -96.86927345 - }, - "20030": { - "latitude": 16.4671716, - "longitude": -95.03953594 - }, - "20031": { - "latitude": 17.03726413, - "longitude": -96.02215887 - }, - "20032": { - "latitude": 17.92988021, - "longitude": -98.12916855 - }, - "20033": { - "latitude": 17.17716477, - "longitude": -96.80207909 - }, - "20034": { - "latitude": 17.75444983, - "longitude": -98.16429733 - }, - "20035": { - "latitude": 17.31467933, - "longitude": -96.49911391 - }, - "20036": { - "latitude": 16.84234379, - "longitude": -95.38340731 - }, - "20037": { - "latitude": 16.922331, - "longitude": -98.00992363 - }, - "20038": { - "latitude": 17.18116689, - "longitude": -96.16018356 - }, - "20039": { - "latitude": 17.8427634, - "longitude": -97.79831452 - }, - "20040": { - "latitude": 18.07266209, - "longitude": -96.78392921 - }, - "20041": { - "latitude": 18.14458495, - "longitude": -96.79997821 - }, - "20042": { - "latitude": 17.49122912, - "longitude": -96.34132176 - }, - "20043": { - "latitude": 16.38160316, - "longitude": -94.93109275 - }, - "20044": { - "latitude": 18.01319056, - "longitude": -95.89152748 - }, - "20045": { - "latitude": 17.24715315, - "longitude": -96.81523584 - }, - "20046": { - "latitude": 17.26115613, - "longitude": -97.24206201 - }, - "20047": { - "latitude": 17.80660688, - "longitude": -97.48178989 - }, - "20048": { - "latitude": 16.89634483, - "longitude": -96.90875228 - }, - "20049": { - "latitude": 16.70859393, - "longitude": -96.71497296 - }, - "20050": { - "latitude": 17.24045855, - "longitude": -97.55388411 - }, - "20051": { - "latitude": 16.89016658, - "longitude": -96.55748953 - }, - "20052": { - "latitude": 16.347771599999998, - "longitude": -95.65531113 - }, - "20053": { - "latitude": 16.51083788, - "longitude": -95.25267107 - }, - "20054": { - "latitude": 17.390439100000002, - "longitude": -97.22491453 - }, - "20055": { - "latitude": 17.82752528, - "longitude": -98.12365401 - }, - "20056": { - "latitude": 16.5421234, - "longitude": -98.23680387 - }, - "20057": { - "latitude": 17.15015252, - "longitude": -94.97131956 - }, - "20058": { - "latitude": 18.02936486, - "longitude": -96.91094817 - }, - "20059": { - "latitude": 16.34838425, - "longitude": -96.64607523 - }, - "20060": { - "latitude": 17.16538706, - "longitude": -96.10405078 - }, - "20061": { - "latitude": 16.37315966, - "longitude": -96.63097633 - }, - "20062": { - "latitude": 17.30173369, - "longitude": -96.42625116 - }, - "20063": { - "latitude": 17.18117953, - "longitude": -96.82935149 - }, - "20064": { - "latitude": 16.72666078, - "longitude": -95.67470674 - }, - "20065": { - "latitude": 17.50415996, - "longitude": -98.01435578 - }, - "20066": { - "latitude": 16.51981911, - "longitude": -94.58806951 - }, - "20067": { - "latitude": 17.10210531, - "longitude": -96.72412007 - }, - "20068": { - "latitude": 16.76179401, - "longitude": -96.70339762 - }, - "20069": { - "latitude": 16.62350315, - "longitude": -96.79388558 - }, - "20070": { - "latitude": 16.40368016, - "longitude": -97.96606981 - }, - "20071": { - "latitude": 15.91937436, - "longitude": -96.427886 - }, - "20072": { - "latitude": 16.67208158, - "longitude": -96.66506905 - }, - "20073": { - "latitude": 17.01922648, - "longitude": -97.90486485 - }, - "20074": { - "latitude": 16.30918146, - "longitude": -96.27025517 - }, - "20075": { - "latitude": 16.39252593, - "longitude": -94.44580949 - }, - "20076": { - "latitude": 16.64764866, - "longitude": -97.86337078 - }, - "20077": { - "latitude": 17.20994185, - "longitude": -96.81906748 - }, - "20078": { - "latitude": 17.00241096, - "longitude": -96.63615081 - }, - "20079": { - "latitude": 16.19338942, - "longitude": -95.21957567 - }, - "20080": { - "latitude": 16.51378795, - "longitude": -96.81379699 - }, - "20081": { - "latitude": 17.5891712, - "longitude": -97.99341397 - }, - "20082": { - "latitude": 16.44970648, - "longitude": -97.80467683 - }, - "20083": { - "latitude": 16.99197137, - "longitude": -96.68559333 - }, - "20084": { - "latitude": 17.20126067, - "longitude": -96.7182607 - }, - "20085": { - "latitude": 15.97617651, - "longitude": -96.62081918 - }, - "20086": { - "latitude": 17.19826944, - "longitude": -97.51574086 - }, - "20087": { - "latitude": 17.08069583, - "longitude": -96.67946037 - }, - "20088": { - "latitude": 16.84743612, - "longitude": -97.79208044 - }, - "20089": { - "latitude": 17.69853025, - "longitude": -97.68874149 - }, - "20090": { - "latitude": 16.3447832, - "longitude": -97.91750822 - }, - "20091": { - "latitude": 17.12746228, - "longitude": -96.66729251 - }, - "20092": { - "latitude": 17.0587764, - "longitude": -96.86491558 - }, - "20093": { - "latitude": 17.58946689, - "longitude": -97.52933784 - }, - "20094": { - "latitude": 17.23396072, - "longitude": -97.06316004 - }, - "20095": { - "latitude": 16.21169318, - "longitude": -96.52495399 - }, - "20096": { - "latitude": 17.48468654, - "longitude": -97.29610822 - }, - "20097": { - "latitude": 17.27677289, - "longitude": -96.22329916 - }, - "20098": { - "latitude": 17.94475945, - "longitude": -96.59952005 - }, - "20099": { - "latitude": 17.65936527, - "longitude": -98.38642919 - }, - "20100": { - "latitude": 17.29031236, - "longitude": -96.13238811 - }, - "20101": { - "latitude": 16.60105234, - "longitude": -96.86062898 - }, - "20102": { - "latitude": 17.184201100000003, - "longitude": -96.90297596 - }, - "20103": { - "latitude": 16.81393718, - "longitude": -96.69254034 - }, - "20104": { - "latitude": 16.83405697, - "longitude": -97.04503841 - }, - "20105": { - "latitude": 17.51848188, - "longitude": -97.74396892 - }, - "20106": { - "latitude": 17.74288886, - "longitude": -97.49559693 - }, - "20107": { - "latitude": 17.02411222, - "longitude": -96.69181849 - }, - "20108": { - "latitude": 16.92059284, - "longitude": -97.14296404 - }, - "20109": { - "latitude": 18.14615121, - "longitude": -97.16451187 - }, - "20110": { - "latitude": 17.153158899999998, - "longitude": -97.57365855 - }, - "20111": { - "latitude": 16.54069891, - "longitude": -98.04782928 - }, - "20112": { - "latitude": 16.76633415, - "longitude": -96.50736766 - }, - "20113": { - "latitude": 16.03600603, - "longitude": -96.79618477 - }, - "20114": { - "latitude": 17.22041007, - "longitude": -96.21060997 - }, - "20115": { - "latitude": 16.94970866, - "longitude": -96.68652541 - }, - "20116": { - "latitude": 18.050078600000003, - "longitude": -96.67552201 - }, - "20117": { - "latitude": 15.94384598, - "longitude": -96.75481592 - }, - "20118": { - "latitude": 16.89672669, - "longitude": -96.50006211 - }, - "20119": { - "latitude": 17.22398118, - "longitude": -97.45258218 - }, - "20120": { - "latitude": 17.24528035, - "longitude": -96.24324114 - }, - "20121": { - "latitude": 17.58442384, - "longitude": -97.31415577 - }, - "20122": { - "latitude": 16.42550448, - "longitude": -95.92803205 - }, - "20123": { - "latitude": 16.84441718, - "longitude": -96.91718107 - }, - "20124": { - "latitude": 16.35789376, - "longitude": -95.14617615 - }, - "20125": { - "latitude": 16.41468324, - "longitude": -95.96223289 - }, - "20126": { - "latitude": 16.30731885, - "longitude": -96.38300782 - }, - "20127": { - "latitude": 17.28237816, - "longitude": -97.58108205 - }, - "20128": { - "latitude": 17.35143804, - "longitude": -96.17494951 - }, - "20129": { - "latitude": 17.72542108, - "longitude": -97.38361878 - }, - "20130": { - "latitude": 16.33756595, - "longitude": -94.74048308 - }, - "20131": { - "latitude": 16.78091818, - "longitude": -96.30206453 - }, - "20132": { - "latitude": 16.74990744, - "longitude": -96.66417571 - }, - "20133": { - "latitude": 17.07693455, - "longitude": -97.6919824 - }, - "20134": { - "latitude": 18.06964547, - "longitude": -96.53510114 - }, - "20135": { - "latitude": 17.09289788, - "longitude": -96.8852348 - }, - "20136": { - "latitude": 17.820290600000003, - "longitude": -96.50709594 - }, - "20137": { - "latitude": 16.85808426, - "longitude": -97.36767707 - }, - "20138": { - "latitude": 17.1808617, - "longitude": -96.26464619 - }, - "20139": { - "latitude": 17.90557106, - "longitude": -96.74520233 - }, - "20140": { - "latitude": 17.41701041, - "longitude": -97.31435809 - }, - "20141": { - "latitude": 16.23271861, - "longitude": -94.47040972 - }, - "20142": { - "latitude": 18.19523609, - "longitude": -96.93618416 - }, - "20143": { - "latitude": 16.35269197, - "longitude": -94.51307622 - }, - "20144": { - "latitude": 17.34649285, - "longitude": -97.27507697 - }, - "20145": { - "latitude": 17.02634566, - "longitude": -96.59581524 - }, - "20146": { - "latitude": 16.3734251, - "longitude": -96.38012773 - }, - "20147": { - "latitude": 17.36332979, - "longitude": -97.33402944 - }, - "20148": { - "latitude": 16.09335799, - "longitude": -96.20194971 - }, - "20149": { - "latitude": 16.51416064, - "longitude": -96.90584891 - }, - "20150": { - "latitude": 17.37211155, - "longitude": -96.92812306 - }, - "20151": { - "latitude": 17.89041314, - "longitude": -97.54353169 - }, - "20152": { - "latitude": 17.47636742, - "longitude": -98.26332851 - }, - "20153": { - "latitude": 16.05062452, - "longitude": -97.04525976 - }, - "20154": { - "latitude": 16.28938927, - "longitude": -96.45374331 - }, - "20155": { - "latitude": 16.59193461, - "longitude": -96.95603543 - }, - "20156": { - "latitude": 17.373846, - "longitude": -96.13700208 - }, - "20157": { - "latitude": 17.09536839, - "longitude": -96.75743125 - }, - "20158": { - "latitude": 16.50327312, - "longitude": -97.36595834 - }, - "20159": { - "latitude": 16.20444791, - "longitude": -96.96964343 - }, - "20160": { - "latitude": 17.80672793, - "longitude": -97.86887175 - }, - "20161": { - "latitude": 17.39054654, - "longitude": -97.03577882 - }, - "20162": { - "latitude": 16.70405467, - "longitude": -96.57139296 - }, - "20163": { - "latitude": 18.15379816, - "longitude": -96.92903245 - }, - "20164": { - "latitude": 17.68914337, - "longitude": -98.09157575 - }, - "20165": { - "latitude": 17.9544198, - "longitude": -97.97217797 - }, - "20166": { - "latitude": 17.91468219, - "longitude": -96.12365066 - }, - "20167": { - "latitude": 16.28058259, - "longitude": -96.49329044 - }, - "20168": { - "latitude": 16.37783988, - "longitude": -98.25632333 - }, - "20169": { - "latitude": 18.25762943, - "longitude": -96.64248972 - }, - "20170": { - "latitude": 16.40157117, - "longitude": -96.33496679999999 - }, - "20171": { - "latitude": 18.16084547, - "longitude": -96.66804377 - }, - "20172": { - "latitude": 17.35000841, - "longitude": -97.50055163 - }, - "20173": { - "latitude": 17.46411312, - "longitude": -96.48836861 - }, - "20174": { - "latitude": 16.98731872, - "longitude": -96.71620336 - }, - "20175": { - "latitude": 17.58890487, - "longitude": -96.768566 - }, - "20176": { - "latitude": 17.720610100000002, - "longitude": -97.26241174 - }, - "20177": { - "latitude": 17.74116787, - "longitude": -96.96902211 - }, - "20178": { - "latitude": 17.23798873, - "longitude": -96.75915453 - }, - "20179": { - "latitude": 17.43918248, - "longitude": -96.80747942 - }, - "20180": { - "latitude": 16.51487415, - "longitude": -98.34379308 - }, - "20181": { - "latitude": 18.00000777, - "longitude": -97.64327838 - }, - "20182": { - "latitude": 17.87300808, - "longitude": -96.59241628 - }, - "20183": { - "latitude": 17.59022703, - "longitude": -98.32233861 - }, - "20184": { - "latitude": 18.02855889, - "longitude": -96.09253795 - }, - "20185": { - "latitude": 16.6417198, - "longitude": -98.16342197 - }, - "20186": { - "latitude": 17.86540627, - "longitude": -98.27071846 - }, - "20187": { - "latitude": 18.05833918, - "longitude": -96.72866531 - }, - "20188": { - "latitude": 16.49515165, - "longitude": -97.9106704 - }, - "20189": { - "latitude": 17.32899011, - "longitude": -95.95655558 - }, - "20190": { - "latitude": 17.3183451, - "longitude": -95.49677532 - }, - "20191": { - "latitude": 17.2792222, - "longitude": -96.50733955 - }, - "20192": { - "latitude": 16.82825863, - "longitude": -96.67165498 - }, - "20193": { - "latitude": 17.3294448, - "longitude": -96.77924723 - }, - "20194": { - "latitude": 16.89177683, - "longitude": -96.16134864 - }, - "20195": { - "latitude": 17.27778246, - "longitude": -97.38965236 - }, - "20196": { - "latitude": 17.40090727, - "longitude": -96.53932270000001 - }, - "20197": { - "latitude": 16.95390697, - "longitude": -96.54152523 - }, - "20198": { - "latitude": 17.04918846, - "longitude": -95.11606123 - }, - "20199": { - "latitude": 17.76434906, - "longitude": -98.29025003 - }, - "20200": { - "latitude": 16.87465975, - "longitude": -95.89103607 - }, - "20201": { - "latitude": 17.32401185, - "longitude": -96.30172725 - }, - "20202": { - "latitude": 16.20928681, - "longitude": -97.11696817 - }, - "20203": { - "latitude": 16.5684309, - "longitude": -96.54577698 - }, - "20204": { - "latitude": 16.51141779, - "longitude": -95.91790851 - }, - "20205": { - "latitude": 17.49319542, - "longitude": -95.79056247 - }, - "20206": { - "latitude": 18.04433699, - "longitude": -97.03923905 - }, - "20207": { - "latitude": 17.13202832, - "longitude": -95.4207718 - }, - "20208": { - "latitude": 17.33769528, - "longitude": -97.85588184 - }, - "20209": { - "latitude": 16.24668765, - "longitude": -96.31317811 - }, - "20210": { - "latitude": 17.42614113, - "longitude": -97.75488992 - }, - "20211": { - "latitude": 16.10424799, - "longitude": -96.20747964 - }, - "20212": { - "latitude": 17.48992716, - "longitude": -96.04772648 - }, - "20213": { - "latitude": 16.34208505, - "longitude": -97.35483359 - }, - "20214": { - "latitude": 17.66272605, - "longitude": -96.6262494 - }, - "20215": { - "latitude": 17.44829825, - "longitude": -97.29178853 - }, - "20216": { - "latitude": 17.31861365, - "longitude": -96.21850917 - }, - "20217": { - "latitude": 17.11640564, - "longitude": -97.17102263 - }, - "20218": { - "latitude": 17.0774139, - "longitude": -97.4300197 - }, - "20219": { - "latitude": 16.89453765, - "longitude": -96.59773993 - }, - "20220": { - "latitude": 17.73966436, - "longitude": -96.76248539 - }, - "20221": { - "latitude": 17.58725836, - "longitude": -97.41575783 - }, - "20222": { - "latitude": 17.44198768, - "longitude": -96.27995294 - }, - "20223": { - "latitude": 17.4105133, - "longitude": -96.18215004 - }, - "20224": { - "latitude": 17.52343023, - "longitude": -97.26898286 - }, - "20225": { - "latitude": 16.41123122, - "longitude": -97.87785903 - }, - "20226": { - "latitude": 16.89102189, - "longitude": -96.23848428 - }, - "20227": { - "latitude": 17.12904403, - "longitude": -96.80356204 - }, - "20228": { - "latitude": 18.21634851, - "longitude": -96.9172768 - }, - "20229": { - "latitude": 16.52686919, - "longitude": -97.18646671 - }, - "20230": { - "latitude": 17.63189924, - "longitude": -98.12383343 - }, - "20231": { - "latitude": 16.93781058, - "longitude": -95.68977049 - }, - "20232": { - "latitude": 18.03423592, - "longitude": -96.36252103 - }, - "20233": { - "latitude": 16.87929712, - "longitude": -96.45350239 - }, - "20234": { - "latitude": 18.11234409, - "longitude": -96.91589166 - }, - "20235": { - "latitude": 16.45326575, - "longitude": -96.47893075 - }, - "20236": { - "latitude": 16.04057767, - "longitude": -96.40399494 - }, - "20237": { - "latitude": 17.73750639, - "longitude": -97.90379799 - }, - "20238": { - "latitude": 16.65605437, - "longitude": -96.72606797 - }, - "20239": { - "latitude": 17.39629574, - "longitude": -97.60895626 - }, - "20240": { - "latitude": 17.21735851, - "longitude": -97.85578038 - }, - "20241": { - "latitude": 16.61637881, - "longitude": -96.85418204 - }, - "20242": { - "latitude": 17.36169274, - "longitude": -98.24503381 - }, - "20243": { - "latitude": 16.87574695, - "longitude": -96.69192176 - }, - "20244": { - "latitude": 18.107397, - "longitude": -97.03090382 - }, - "20245": { - "latitude": 17.81654698, - "longitude": -98.07095312 - }, - "20246": { - "latitude": 17.15297381, - "longitude": -96.19696721 - }, - "20247": { - "latitude": 17.31804609, - "longitude": -96.4208821 - }, - "20248": { - "latitude": 16.20929796, - "longitude": -95.04560784 - }, - "20249": { - "latitude": 18.14118493, - "longitude": -96.8689532 - }, - "20250": { - "latitude": 17.42258838, - "longitude": -97.26290992 - }, - "20251": { - "latitude": 17.646894, - "longitude": -98.42138923 - }, - "20252": { - "latitude": 17.14499236, - "longitude": -97.494783 - }, - "20253": { - "latitude": 15.97172884, - "longitude": -96.33878511 - }, - "20254": { - "latitude": 16.12131113, - "longitude": -96.52522696 - }, - "20255": { - "latitude": 17.00395217, - "longitude": -97.37110764 - }, - "20256": { - "latitude": 17.80505165, - "longitude": -97.42951402 - }, - "20257": { - "latitude": 17.24589122, - "longitude": -96.15076238 - }, - "20258": { - "latitude": 17.30661488, - "longitude": -97.47352432 - }, - "20259": { - "latitude": 17.68289032, - "longitude": -98.33212839 - }, - "20260": { - "latitude": 17.43389861, - "longitude": -96.70427136 - }, - "20261": { - "latitude": 17.88672125, - "longitude": -98.01944132 - }, - "20262": { - "latitude": 17.20015323, - "longitude": -96.45641029 - }, - "20263": { - "latitude": 16.16662551, - "longitude": -96.68014043 - }, - "20264": { - "latitude": 17.62680545, - "longitude": -97.19822105 - }, - "20265": { - "latitude": 16.65253048, - "longitude": -94.40985652 - }, - "20266": { - "latitude": 15.9451799, - "longitude": -96.09622576 - }, - "20267": { - "latitude": 17.32747251, - "longitude": -96.57438728 - }, - "20268": { - "latitude": 16.59619052, - "longitude": -96.73660583 - }, - "20269": { - "latitude": 17.07855122, - "longitude": -97.61587166 - }, - "20270": { - "latitude": 17.75443928, - "longitude": -97.14618099 - }, - "20271": { - "latitude": 16.75755063, - "longitude": -96.94786412 - }, - "20272": { - "latitude": 16.23865626, - "longitude": -97.40049458 - }, - "20273": { - "latitude": 16.92856758, - "longitude": -97.01207513 - }, - "20274": { - "latitude": 16.98105764, - "longitude": -97.21635824 - }, - "20275": { - "latitude": 16.97567149, - "longitude": -95.78022138 - }, - "20276": { - "latitude": 17.91987064, - "longitude": -96.79768146 - }, - "20277": { - "latitude": 16.51321122, - "longitude": -97.05817961 - }, - "20278": { - "latitude": 18.25251509, - "longitude": -96.43906766 - }, - "20279": { - "latitude": 16.08016842, - "longitude": -96.4584274 - }, - "20280": { - "latitude": 17.36739324, - "longitude": -96.23183725 - }, - "20281": { - "latitude": 17.37886401, - "longitude": -97.29105164 - }, - "20282": { - "latitude": 16.23193369, - "longitude": -95.54782229999999 - }, - "20283": { - "latitude": 17.82418797, - "longitude": -97.31488046 - }, - "20284": { - "latitude": 16.77563455, - "longitude": -96.56436075 - }, - "20285": { - "latitude": 16.44046169, - "longitude": -98.10827453 - }, - "20286": { - "latitude": 17.44225771, - "longitude": -98.01070023 - }, - "20287": { - "latitude": 17.75368617, - "longitude": -97.44600984 - }, - "20288": { - "latitude": 17.34811373, - "longitude": -96.35340735 - }, - "20289": { - "latitude": 16.43095609, - "longitude": -96.744656 - }, - "20290": { - "latitude": 17.77629615, - "longitude": -98.13261622 - }, - "20291": { - "latitude": 16.17026207, - "longitude": -96.79001419 - }, - "20292": { - "latitude": 16.98204805, - "longitude": -96.89023066 - }, - "20293": { - "latitude": 17.16366076, - "longitude": -96.73374565 - }, - "20294": { - "latitude": 17.30974902, - "longitude": -96.87359613 - }, - "20295": { - "latitude": 16.81801043, - "longitude": -96.80660489 - }, - "20296": { - "latitude": 17.52170745, - "longitude": -96.52161909 - }, - "20297": { - "latitude": 17.00754368, - "longitude": -97.47128512 - }, - "20298": { - "latitude": 16.96879815, - "longitude": -96.29489429 - }, - "20299": { - "latitude": 17.12508766, - "longitude": -96.21716093 - }, - "20300": { - "latitude": 16.67748923, - "longitude": -98.08367048 - }, - "20301": { - "latitude": 16.74126504, - "longitude": -96.73403126 - }, - "20302": { - "latitude": 16.51880777, - "longitude": -97.96946313 - }, - "20303": { - "latitude": 17.16344398, - "longitude": -96.26205749 - }, - "20304": { - "latitude": 17.52117074, - "longitude": -97.10982708 - }, - "20305": { - "latitude": 16.46362243, - "longitude": -95.16654459 - }, - "20306": { - "latitude": 16.01581992, - "longitude": -96.47169102 - }, - "20307": { - "latitude": 15.97422137, - "longitude": -95.78230058 - }, - "20308": { - "latitude": 16.24285951, - "longitude": -95.14752247 - }, - "20309": { - "latitude": 18.15914301, - "longitude": -96.55145365 - }, - "20310": { - "latitude": 17.05269724, - "longitude": -96.82695087 - }, - "20311": { - "latitude": 17.68676294, - "longitude": -97.02657865 - }, - "20312": { - "latitude": 16.46950143, - "longitude": -98.04210259999999 - }, - "20313": { - "latitude": 17.75925332, - "longitude": -97.07149682 - }, - "20314": { - "latitude": 16.31916421, - "longitude": -97.10907075 - }, - "20315": { - "latitude": 16.74830981, - "longitude": -96.70425300000001 - }, - "20316": { - "latitude": 16.44215836, - "longitude": -96.25359166 - }, - "20317": { - "latitude": 17.45008951, - "longitude": -97.64380990000001 - }, - "20318": { - "latitude": 15.94964572, - "longitude": -97.06957763 - }, - "20319": { - "latitude": 16.21878521, - "longitude": -96.20957828 - }, - "20320": { - "latitude": 17.10391642, - "longitude": -97.55183620000001 - }, - "20321": { - "latitude": 17.81050124, - "longitude": -97.57686337 - }, - "20322": { - "latitude": 18.18336434, - "longitude": -96.91128678 - }, - "20323": { - "latitude": 16.97177335, - "longitude": -95.84078762 - }, - "20324": { - "latitude": 15.78921429, - "longitude": -96.41286559999999 - }, - "20325": { - "latitude": 16.76726761, - "longitude": -96.03444782 - }, - "20326": { - "latitude": 17.81952031, - "longitude": -96.64089991 - }, - "20327": { - "latitude": 16.28064522, - "longitude": -94.21505792 - }, - "20328": { - "latitude": 16.64390956, - "longitude": -96.5339677 - }, - "20329": { - "latitude": 16.99570628, - "longitude": -97.2748038 - }, - "20330": { - "latitude": 17.99027722, - "longitude": -96.62867166 - }, - "20331": { - "latitude": 17.33734882, - "longitude": -97.39130417 - }, - "20332": { - "latitude": 17.45524577, - "longitude": -97.3574355 - }, - "20333": { - "latitude": 16.66284198, - "longitude": -96.22921317 - }, - "20334": { - "latitude": 16.07768492, - "longitude": -97.53748063 - }, - "20335": { - "latitude": 17.42312781, - "longitude": -96.38067198 - }, - "20336": { - "latitude": 17.6333863, - "longitude": -96.47946998 - }, - "20337": { - "latitude": 17.02174213, - "longitude": -96.13498258 - }, - "20338": { - "latitude": 17.19515568, - "longitude": -96.79317529 - }, - "20339": { - "latitude": 17.50787446, - "longitude": -97.50641198 - }, - "20340": { - "latitude": 18.08848582, - "longitude": -97.70629436 - }, - "20341": { - "latitude": 17.57722615, - "longitude": -97.48085188 - }, - "20342": { - "latitude": 16.98200297, - "longitude": -96.75474531 - }, - "20343": { - "latitude": 16.98468275, - "longitude": -96.60331604 - }, - "20344": { - "latitude": 16.08850958, - "longitude": -96.87125378 - }, - "20345": { - "latitude": 16.52593403, - "longitude": -98.1495432 - }, - "20346": { - "latitude": 17.51995662, - "longitude": -97.67438603 - }, - "20347": { - "latitude": 16.20508158, - "longitude": -96.42338233 - }, - "20348": { - "latitude": 17.345235600000002, - "longitude": -98.09363608 - }, - "20349": { - "latitude": 16.95177261, - "longitude": -96.63342433 - }, - "20350": { - "latitude": 17.04577781, - "longitude": -96.67597206 - }, - "20351": { - "latitude": 16.40190282, - "longitude": -96.72652063 - }, - "20352": { - "latitude": 17.83536408, - "longitude": -97.99814221 - }, - "20353": { - "latitude": 16.3342698, - "longitude": -96.730285 - }, - "20354": { - "latitude": 18.22474547, - "longitude": -96.88847220000001 - }, - "20355": { - "latitude": 17.98977608, - "longitude": -96.80115606 - }, - "20356": { - "latitude": 17.01151593, - "longitude": -96.46539767 - }, - "20357": { - "latitude": 16.60425255, - "longitude": -95.88380558 - }, - "20358": { - "latitude": 16.74308392, - "longitude": -96.86155966 - }, - "20359": { - "latitude": 17.39622183, - "longitude": -96.62214556 - }, - "20360": { - "latitude": 16.83640056, - "longitude": -96.73192965 - }, - "20361": { - "latitude": 16.32960773, - "longitude": -96.24174566 - }, - "20362": { - "latitude": 16.29491607, - "longitude": -96.64821402 - }, - "20363": { - "latitude": 17.21379905, - "longitude": -96.57708566 - }, - "20364": { - "latitude": 16.17733989, - "longitude": -97.29619085 - }, - "20365": { - "latitude": 17.180509899999997, - "longitude": -96.49846088 - }, - "20366": { - "latitude": 16.07095582, - "longitude": -96.71877370000001 - }, - "20367": { - "latitude": 16.33971055, - "longitude": -97.83913159 - }, - "20368": { - "latitude": 16.79147008, - "longitude": -96.61268877 - }, - "20369": { - "latitude": 16.88335016, - "longitude": -96.73207752 - }, - "20370": { - "latitude": 17.334691, - "longitude": -97.55141843 - }, - "20371": { - "latitude": 17.06184944, - "longitude": -97.53435223 - }, - "20372": { - "latitude": 17.00782372, - "longitude": -97.67265295 - }, - "20373": { - "latitude": 18.02075019, - "longitude": -97.55663262 - }, - "20374": { - "latitude": 18.15750173, - "longitude": -96.88304720000001 - }, - "20375": { - "latitude": 17.04859358, - "longitude": -96.68509385 - }, - "20376": { - "latitude": 17.57055097, - "longitude": -98.21533513 - }, - "20377": { - "latitude": 16.72821289, - "longitude": -97.68135953 - }, - "20378": { - "latitude": 16.78999717, - "longitude": -96.90533953 - }, - "20379": { - "latitude": 17.15489574, - "longitude": -97.71831637 - }, - "20380": { - "latitude": 16.952505300000002, - "longitude": -96.58383042 - }, - "20381": { - "latitude": 17.82143692, - "longitude": -98.16437647 - }, - "20382": { - "latitude": 16.91813104, - "longitude": -97.46235759999999 - }, - "20383": { - "latitude": 17.37670294, - "longitude": -97.56794816 - }, - "20384": { - "latitude": 16.33730982, - "longitude": -96.67813986 - }, - "20385": { - "latitude": 17.01902122, - "longitude": -96.74859524 - }, - "20386": { - "latitude": 16.46934814, - "longitude": -97.48478131 - }, - "20387": { - "latitude": 16.78171817, - "longitude": -96.79318164 - }, - "20388": { - "latitude": 16.92174362, - "longitude": -96.85463253 - }, - "20389": { - "latitude": 16.80582095, - "longitude": -96.75894202 - }, - "20390": { - "latitude": 17.06333747, - "longitude": -96.69897321 - }, - "20391": { - "latitude": 16.18082228, - "longitude": -96.62065978 - }, - "20392": { - "latitude": 16.94319496, - "longitude": -97.7321456 - }, - "20393": { - "latitude": 16.72468074, - "longitude": -96.66866224 - }, - "20394": { - "latitude": 17.07917757, - "longitude": -95.84651753 - }, - "20395": { - "latitude": 17.62470922, - "longitude": -97.08020585 - }, - "20396": { - "latitude": 18.10335298, - "longitude": -96.81726293 - }, - "20397": { - "latitude": 17.23138871, - "longitude": -97.69139232 - }, - "20398": { - "latitude": 16.67745841, - "longitude": -96.89208389 - }, - "20399": { - "latitude": 17.08820292, - "longitude": -96.78644659999999 - }, - "20400": { - "latitude": 17.86961908, - "longitude": -97.64995474 - }, - "20401": { - "latitude": 15.86198934, - "longitude": -96.92215416 - }, - "20402": { - "latitude": 16.42892672, - "longitude": -98.31270555 - }, - "20403": { - "latitude": 16.97062263, - "longitude": -96.71020223 - }, - "20404": { - "latitude": 17.56576365, - "longitude": -97.26064898 - }, - "20405": { - "latitude": 17.59383603, - "longitude": -97.6380132 - }, - "20406": { - "latitude": 18.29306933, - "longitude": -96.74620242 - }, - "20407": { - "latitude": 16.94691728, - "longitude": -94.38859636 - }, - "20408": { - "latitude": 17.343685999999998, - "longitude": -97.60512086 - }, - "20409": { - "latitude": 17.0292408, - "longitude": -96.63429752 - }, - "20410": { - "latitude": 16.23336282, - "longitude": -95.86505776 - }, - "20411": { - "latitude": 16.99283537, - "longitude": -96.61277778 - }, - "20412": { - "latitude": 16.73666969, - "longitude": -95.35194817 - }, - "20413": { - "latitude": 15.796287699999997, - "longitude": -96.22328377 - }, - "20414": { - "latitude": 16.20876435, - "longitude": -97.926371 - }, - "20415": { - "latitude": 16.61488391, - "longitude": -97.99832226 - }, - "20416": { - "latitude": 17.85041621, - "longitude": -97.15841518 - }, - "20417": { - "latitude": 17.84985227, - "longitude": -96.13157547 - }, - "20418": { - "latitude": 16.51581525, - "longitude": -95.47423419 - }, - "20419": { - "latitude": 17.36273778, - "longitude": -96.54173476 - }, - "20420": { - "latitude": 16.73757096, - "longitude": -97.04092845 - }, - "20421": { - "latitude": 16.42469388, - "longitude": -95.27546846 - }, - "20422": { - "latitude": 17.64628671, - "longitude": -97.332413 - }, - "20423": { - "latitude": 17.4077128, - "longitude": -97.5013625 - }, - "20424": { - "latitude": 16.0991212, - "longitude": -96.34926992 - }, - "20425": { - "latitude": 17.80729373, - "longitude": -96.78377964 - }, - "20426": { - "latitude": 17.04844086, - "longitude": -97.03342985 - }, - "20427": { - "latitude": 16.88462039, - "longitude": -95.07197612 - }, - "20428": { - "latitude": 16.30454824, - "longitude": -96.05190356 - }, - "20429": { - "latitude": 16.56093426, - "longitude": -97.02992482 - }, - "20430": { - "latitude": 17.13752007, - "longitude": -97.39526374 - }, - "20431": { - "latitude": 17.95356152, - "longitude": -97.09895728 - }, - "20432": { - "latitude": 17.3789968, - "longitude": -96.15809889 - }, - "20433": { - "latitude": 16.16477914, - "longitude": -97.18102505 - }, - "20434": { - "latitude": 18.17420351, - "longitude": -96.97158946 - }, - "20435": { - "latitude": 16.95130671, - "longitude": -95.98911681 - }, - "20436": { - "latitude": 17.72236949, - "longitude": -97.0504942 - }, - "20437": { - "latitude": 17.11428485, - "longitude": -96.05367628 - }, - "20438": { - "latitude": 17.92137345, - "longitude": -96.73712224 - }, - "20439": { - "latitude": 15.77289023, - "longitude": -96.68183622 - }, - "20440": { - "latitude": 16.62292549, - "longitude": -95.61526582 - }, - "20441": { - "latitude": 16.36346304, - "longitude": -95.02633963 - }, - "20442": { - "latitude": 17.27107384, - "longitude": -96.2962949 - }, - "20443": { - "latitude": 17.20118046, - "longitude": -96.41135865 - }, - "20444": { - "latitude": 16.88221416, - "longitude": -97.46030903 - }, - "20445": { - "latitude": 17.10744086, - "longitude": -97.50000109999999 - }, - "20446": { - "latitude": 17.03511593, - "longitude": -97.80327895 - }, - "20447": { - "latitude": 16.77871898, - "longitude": -97.97374242 - }, - "20448": { - "latitude": 16.64276483, - "longitude": -97.35910349 - }, - "20449": { - "latitude": 16.55904374, - "longitude": -96.37040504 - }, - "20450": { - "latitude": 16.63155823, - "longitude": -97.52084469 - }, - "20451": { - "latitude": 17.64968715, - "longitude": -97.13619286 - }, - "20452": { - "latitude": 16.7961922, - "longitude": -96.72731765 - }, - "20453": { - "latitude": 15.97757389, - "longitude": -95.61214771 - }, - "20454": { - "latitude": 17.0962642, - "longitude": -95.92169429 - }, - "20455": { - "latitude": 17.91950421, - "longitude": -97.97432499 - }, - "20456": { - "latitude": 17.73110187, - "longitude": -97.7344468 - }, - "20457": { - "latitude": 17.52749201, - "longitude": -96.16645775 - }, - "20458": { - "latitude": 17.61592437, - "longitude": -96.39463779 - }, - "20459": { - "latitude": 18.19985559, - "longitude": -97.71938724 - }, - "20460": { - "latitude": 17.37094639, - "longitude": -95.92396629 - }, - "20461": { - "latitude": 17.43083934, - "longitude": -98.10138449 - }, - "20462": { - "latitude": 17.80345366, - "longitude": -97.68911086 - }, - "20463": { - "latitude": 17.48625586, - "longitude": -97.04697481 - }, - "20464": { - "latitude": 17.88109314, - "longitude": -97.44830365 - }, - "20465": { - "latitude": 16.92770952, - "longitude": -95.58206814 - }, - "20466": { - "latitude": 16.53818372, - "longitude": -97.69832478 - }, - "20467": { - "latitude": 16.20214238, - "longitude": -97.78518396 - }, - "20468": { - "latitude": 17.65573824, - "longitude": -95.98259358 - }, - "20469": { - "latitude": 17.19416682, - "longitude": -98.01877462 - }, - "20470": { - "latitude": 16.77302382, - "longitude": -95.52658913 - }, - "20471": { - "latitude": 17.41452601, - "longitude": -96.25064614 - }, - "20472": { - "latitude": 16.62311361, - "longitude": -95.26114179 - }, - "20473": { - "latitude": 17.20041946, - "longitude": -96.32594456 - }, - "20474": { - "latitude": 16.48536662, - "longitude": -98.2608235 - }, - "20475": { - "latitude": 16.82978096, - "longitude": -96.42274908 - }, - "20476": { - "latitude": 17.981738, - "longitude": -97.71956519 - }, - "20477": { - "latitude": 16.43954429, - "longitude": -97.26634666 - }, - "20478": { - "latitude": 17.52329105, - "longitude": -96.91203388 - }, - "20479": { - "latitude": 17.42835532, - "longitude": -97.38695177 - }, - "20480": { - "latitude": 17.33506674, - "longitude": -97.7012952 - }, - "20481": { - "latitude": 17.006470800000002, - "longitude": -97.75979017 - }, - "20482": { - "latitude": 16.29240029, - "longitude": -98.12139237 - }, - "20483": { - "latitude": 17.23131686, - "longitude": -96.91039192 - }, - "20484": { - "latitude": 17.73406793, - "longitude": -98.23470396 - }, - "20485": { - "latitude": 16.33309337, - "longitude": -98.46597851 - }, - "20486": { - "latitude": 17.66620289, - "longitude": -97.46375568 - }, - "20487": { - "latitude": 17.28942033, - "longitude": -96.99858209 - }, - "20488": { - "latitude": 17.79207546, - "longitude": -97.39733696 - }, - "20489": { - "latitude": 16.3416915, - "longitude": -97.67743337 - }, - "20490": { - "latitude": 18.21512621, - "longitude": -96.97874814 - }, - "20491": { - "latitude": 16.72113395, - "longitude": -97.3091462 - }, - "20492": { - "latitude": 17.2102228, - "longitude": -97.35343154 - }, - "20493": { - "latitude": 17.46770107, - "longitude": -97.31487572 - }, - "20494": { - "latitude": 17.02713075, - "longitude": -96.97125894 - }, - "20495": { - "latitude": 16.00452542, - "longitude": -96.21860989 - }, - "20496": { - "latitude": 17.27238029, - "longitude": -96.39379789 - }, - "20497": { - "latitude": 16.20856373, - "longitude": -97.2378897 - }, - "20498": { - "latitude": 17.49926855, - "longitude": -95.49063054 - }, - "20499": { - "latitude": 17.46982162, - "longitude": -97.57443593 - }, - "20500": { - "latitude": 16.85047627, - "longitude": -97.53113824 - }, - "20501": { - "latitude": 17.61435922, - "longitude": -98.22059886 - }, - "20502": { - "latitude": 17.19424558, - "longitude": -95.88493028 - }, - "20503": { - "latitude": 17.2168591, - "longitude": -96.25157456 - }, - "20504": { - "latitude": 17.26107453, - "longitude": -96.64658114 - }, - "20505": { - "latitude": 16.57960531, - "longitude": -94.73155659 - }, - "20506": { - "latitude": 17.07121655, - "longitude": -96.21035647 - }, - "20507": { - "latitude": 16.32896644, - "longitude": -98.36462251 - }, - "20508": { - "latitude": 16.62997947, - "longitude": -95.17369373 - }, - "20509": { - "latitude": 15.83354687, - "longitude": -96.63441351 - }, - "20510": { - "latitude": 16.90908556, - "longitude": -97.52394753 - }, - "20511": { - "latitude": 17.17379561, - "longitude": -97.06675342 - }, - "20512": { - "latitude": 16.17597396, - "longitude": -96.31441438 - }, - "20513": { - "latitude": 16.85408273, - "longitude": -95.21866665 - }, - "20514": { - "latitude": 17.33222177, - "longitude": -96.07090666 - }, - "20515": { - "latitude": 16.20838841, - "longitude": -95.38982634 - }, - "20516": { - "latitude": 16.57572596, - "longitude": -97.2772268 - }, - "20517": { - "latitude": 16.93255135, - "longitude": -96.07778391 - }, - "20518": { - "latitude": 17.40179804, - "longitude": -97.34051601 - }, - "20519": { - "latitude": 17.07202025, - "longitude": -96.59089333 - }, - "20520": { - "latitude": 17.68134747, - "longitude": -97.98596278 - }, - "20521": { - "latitude": 17.60726618, - "longitude": -97.35338834 - }, - "20522": { - "latitude": 17.12522205, - "longitude": -96.29134589 - }, - "20523": { - "latitude": 17.53296783, - "longitude": -97.34822009 - }, - "20524": { - "latitude": 17.63445759, - "longitude": -97.70072533 - }, - "20525": { - "latitude": 16.46449652, - "longitude": -94.33233834 - }, - "20526": { - "latitude": 16.08074669, - "longitude": -97.18831678 - }, - "20527": { - "latitude": 17.7936793, - "longitude": -96.8752636 - }, - "20528": { - "latitude": 17.42283331, - "longitude": -97.95025639 - }, - "20529": { - "latitude": 17.77241475, - "longitude": -98.00590565 - }, - "20530": { - "latitude": 16.86657365, - "longitude": -96.63769048 - }, - "20531": { - "latitude": 17.1468686, - "longitude": -96.91193398 - }, - "20532": { - "latitude": 17.11442265, - "longitude": -97.78216826 - }, - "20533": { - "latitude": 16.24183083, - "longitude": -96.58044002 - }, - "20534": { - "latitude": 16.37277369, - "longitude": -96.83351719 - }, - "20535": { - "latitude": 16.65242487, - "longitude": -97.03822258 - }, - "20536": { - "latitude": 17.43034678, - "longitude": -97.43559994 - }, - "20537": { - "latitude": 17.56024968, - "longitude": -98.14027823 - }, - "20538": { - "latitude": 16.36024333, - "longitude": -96.53879277 - }, - "20539": { - "latitude": 17.16066771, - "longitude": -96.8263007 - }, - "20540": { - "latitude": 17.69029566, - "longitude": -97.58023022 - }, - "20541": { - "latitude": 17.38414133, - "longitude": -96.2940096 - }, - "20542": { - "latitude": 16.5713064, - "longitude": -96.76930611 - }, - "20543": { - "latitude": 16.30965221, - "longitude": -97.53494227 - }, - "20544": { - "latitude": 17.32775656, - "longitude": -96.67069511 - }, - "20545": { - "latitude": 18.10737736, - "longitude": -97.11221409999999 - }, - "20546": { - "latitude": 17.05567209, - "longitude": -96.51729369 - }, - "20547": { - "latitude": 17.74864187, - "longitude": -97.53850586 - }, - "20548": { - "latitude": 18.00688345, - "longitude": -97.30108849 - }, - "20549": { - "latitude": 17.58223901, - "longitude": -97.85849621 - }, - "20550": { - "latitude": 17.00771805, - "longitude": -96.5487025 - }, - "20551": { - "latitude": 16.94074153, - "longitude": -96.48089424 - }, - "20552": { - "latitude": 17.87201299, - "longitude": -97.47554143 - }, - "20553": { - "latitude": 17.09413253, - "longitude": -96.61638562 - }, - "20554": { - "latitude": 17.24502402, - "longitude": -96.02112668 - }, - "20555": { - "latitude": 16.92951431, - "longitude": -96.79236146 - }, - "20556": { - "latitude": 17.77717683, - "longitude": -97.50146918 - }, - "20557": { - "latitude": 16.4873716, - "longitude": -94.82312019 - }, - "20558": { - "latitude": 17.765045999999998, - "longitude": -96.98823473 - }, - "20559": { - "latitude": 17.79731088, - "longitude": -96.33476665 - }, - "20560": { - "latitude": 17.05789338, - "longitude": -96.38019696 - }, - "20561": { - "latitude": 16.70864746, - "longitude": -96.44799505 - }, - "20562": { - "latitude": 17.37853167, - "longitude": -97.39501442 - }, - "20563": { - "latitude": 16.44235483, - "longitude": -96.79781903 - }, - "20564": { - "latitude": 17.07731499, - "longitude": -97.29644017 - }, - "20565": { - "latitude": 16.94968338, - "longitude": -96.76657257 - }, - "20566": { - "latitude": 16.78047898, - "longitude": -97.38216568 - }, - "20567": { - "latitude": 17.77617214, - "longitude": -98.39696145 - }, - "20568": { - "latitude": 17.88251128, - "longitude": -97.83488831 - }, - "20569": { - "latitude": 17.27488895, - "longitude": -97.14139877 - }, - "20570": { - "latitude": 16.7462207, - "longitude": -97.11636663 - }, - "21001": { - "latitude": 19.103301300000002, - "longitude": -97.93982646 - }, - "21002": { - "latitude": 20.10915352, - "longitude": -97.22980413 - }, - "21003": { - "latitude": 18.23584752, - "longitude": -98.05788545 - }, - "21004": { - "latitude": 19.02611094, - "longitude": -97.76498324 - }, - "21005": { - "latitude": 18.75938936, - "longitude": -98.67908978 - }, - "21006": { - "latitude": 20.02695065, - "longitude": -97.86768292 - }, - "21007": { - "latitude": 18.57565596, - "longitude": -98.28281092 - }, - "21008": { - "latitude": 20.06116358, - "longitude": -98.13362286 - }, - "21009": { - "latitude": 18.23129332, - "longitude": -98.19111737 - }, - "21010": { - "latitude": 18.42156659, - "longitude": -97.12561105 - }, - "21011": { - "latitude": 18.01069428, - "longitude": -98.54710583 - }, - "21012": { - "latitude": 19.10259922, - "longitude": -97.517423 - }, - "21013": { - "latitude": 18.35634421, - "longitude": -97.30036858 - }, - "21014": { - "latitude": 20.05581435, - "longitude": -97.80068157 - }, - "21015": { - "latitude": 19.04832022, - "longitude": -98.05499676 - }, - "21016": { - "latitude": 19.7722879, - "longitude": -97.93024253 - }, - "21017": { - "latitude": 19.81167829, - "longitude": -97.44090571 - }, - "21018": { - "latitude": 18.37557262, - "longitude": -97.6900814 - }, - "21019": { - "latitude": 18.89906991, - "longitude": -98.4522922 - }, - "21020": { - "latitude": 18.80601371, - "longitude": -97.90907449 - }, - "21021": { - "latitude": 18.5470439, - "longitude": -98.54171637 - }, - "21022": { - "latitude": 18.82308045, - "longitude": -98.60777209 - }, - "21023": { - "latitude": 18.933788399999997, - "longitude": -97.30398939 - }, - "21024": { - "latitude": 18.18468335, - "longitude": -98.39350835 - }, - "21025": { - "latitude": 20.08398986, - "longitude": -97.40878099 - }, - "21026": { - "latitude": 19.10644153, - "longitude": -98.47621913 - }, - "21027": { - "latitude": 18.14187063, - "longitude": -97.48291302 - }, - "21028": { - "latitude": 20.03082794, - "longitude": -97.75294701 - }, - "21029": { - "latitude": 20.07349194, - "longitude": -97.6063013 - }, - "21030": { - "latitude": 20.05515269, - "longitude": -97.73105073 - }, - "21031": { - "latitude": 18.57116587, - "longitude": -98.16492281 - }, - "21032": { - "latitude": 18.19049285, - "longitude": -98.78853181 - }, - "21033": { - "latitude": 18.74581891, - "longitude": -98.71820516 - }, - "21034": { - "latitude": 19.13523475, - "longitude": -98.29174546 - }, - "21035": { - "latitude": 18.24559359, - "longitude": -97.11723317 - }, - "21036": { - "latitude": 18.28234992, - "longitude": -96.9659423 - }, - "21037": { - "latitude": 18.40132506, - "longitude": -97.81295424 - }, - "21038": { - "latitude": 18.92018689, - "longitude": -97.82637517 - }, - "21039": { - "latitude": 19.91357021, - "longitude": -97.79212747 - }, - "21040": { - "latitude": 18.96164736, - "longitude": -98.04510325 - }, - "21041": { - "latitude": 19.11671772, - "longitude": -98.25607681 - }, - "21042": { - "latitude": 18.44566634, - "longitude": -98.18898924 - }, - "21043": { - "latitude": 20.02798346, - "longitude": -97.50058148 - }, - "21044": { - "latitude": 19.59666014, - "longitude": -97.57325921 - }, - "21045": { - "latitude": 18.97734204, - "longitude": -97.42970984 - }, - "21046": { - "latitude": 18.63964054, - "longitude": -97.40363987 - }, - "21047": { - "latitude": 18.27657181, - "longitude": -98.59919194 - }, - "21048": { - "latitude": 19.19560226, - "longitude": -98.51334297 - }, - "21049": { - "latitude": 20.08875464, - "longitude": -97.96598298 - }, - "21050": { - "latitude": 19.20472403, - "longitude": -97.07008617 - }, - "21051": { - "latitude": 18.51036719, - "longitude": -98.62590949 - }, - "21052": { - "latitude": 18.64879581, - "longitude": -98.05934889 - }, - "21053": { - "latitude": 19.82102188, - "longitude": -98.13474367 - }, - "21054": { - "latitude": 19.73555901, - "longitude": -97.43655727 - }, - "21055": { - "latitude": 17.96024748, - "longitude": -97.87923883 - }, - "21056": { - "latitude": 18.13955579, - "longitude": -98.47000981 - }, - "21057": { - "latitude": 20.26015975, - "longitude": -98.23887755 - }, - "21058": { - "latitude": 19.25827205, - "longitude": -97.21356386 - }, - "21059": { - "latitude": 18.23293094, - "longitude": -98.27958708 - }, - "21060": { - "latitude": 19.13216528, - "longitude": -98.44114029999999 - }, - "21061": { - "latitude": 18.50678098, - "longitude": -96.92670134 - }, - "21062": { - "latitude": 18.61559097, - "longitude": -98.37626252 - }, - "21063": { - "latitude": 18.85903205, - "longitude": -97.36462519999999 - }, - "21064": { - "latitude": 20.71053503, - "longitude": -97.81316187 - }, - "21065": { - "latitude": 19.02071858, - "longitude": -97.66751244 - }, - "21066": { - "latitude": 18.04838012, - "longitude": -98.1511474 - }, - "21067": { - "latitude": 19.31641552, - "longitude": -97.38013408 - }, - "21068": { - "latitude": 20.1167643, - "longitude": -97.73118241 - }, - "21069": { - "latitude": 18.76928625, - "longitude": -98.51717405 - }, - "21070": { - "latitude": 18.6837875, - "longitude": -98.06784484 - }, - "21071": { - "latitude": 20.16621141, - "longitude": -98.05173534 - }, - "21072": { - "latitude": 20.11386083, - "longitude": -97.62196879999999 - }, - "21073": { - "latitude": 18.38645497, - "longitude": -98.72712591 - }, - "21074": { - "latitude": 19.16712035, - "longitude": -98.44877906 - }, - "21075": { - "latitude": 19.92183005, - "longitude": -97.40112949 - }, - "21076": { - "latitude": 20.03060613, - "longitude": -97.3101679 - }, - "21077": { - "latitude": 20.04315229, - "longitude": -97.68416059 - }, - "21078": { - "latitude": 19.94374845, - "longitude": -97.71330019999999 - }, - "21079": { - "latitude": 18.76692931, - "longitude": -97.85963231 - }, - "21080": { - "latitude": 20.01468691, - "longitude": -97.62733464 - }, - "21081": { - "latitude": 18.03444322, - "longitude": -98.71231873 - }, - "21082": { - "latitude": 18.4816577, - "longitude": -97.83349408 - }, - "21083": { - "latitude": 19.624043899999997, - "longitude": -97.85841668 - }, - "21084": { - "latitude": 20.04064063, - "longitude": -97.64144455 - }, - "21085": { - "latitude": 18.50191588, - "longitude": -98.44701034 - }, - "21086": { - "latitude": 20.45614763, - "longitude": -97.87594720000001 - }, - "21087": { - "latitude": 18.30719688, - "longitude": -98.91566224 - }, - "21088": { - "latitude": 20.0452532, - "longitude": -97.5676975 - }, - "21089": { - "latitude": 20.20640026, - "longitude": -97.77797878 - }, - "21090": { - "latitude": 19.1193265, - "longitude": -98.34546072 - }, - "21091": { - "latitude": 20.22369782, - "longitude": -97.99658593 - }, - "21092": { - "latitude": 18.53209084, - "longitude": -97.73987847 - }, - "21093": { - "latitude": 19.28110413, - "longitude": -97.29372226 - }, - "21094": { - "latitude": 19.46915447, - "longitude": -97.67613533 - }, - "21095": { - "latitude": 18.74182327, - "longitude": -98.10248941 - }, - "21096": { - "latitude": 19.15112318, - "longitude": -97.69200708 - }, - "21097": { - "latitude": 18.90772492, - "longitude": -97.89170639 - }, - "21098": { - "latitude": 18.66861506, - "longitude": -97.86980516 - }, - "21099": { - "latitude": 18.73315745, - "longitude": -97.42812562 - }, - "21100": { - "latitude": 20.24527304, - "longitude": -98.10286098 - }, - "21101": { - "latitude": 19.9630735, - "longitude": -97.58898662 - }, - "21102": { - "latitude": 19.06120163, - "longitude": -98.44711673 - }, - "21103": { - "latitude": 18.62751876, - "longitude": -97.33753748 - }, - "21104": { - "latitude": 19.19061621, - "longitude": -97.83330118 - }, - "21105": { - "latitude": 19.55551915, - "longitude": -97.67381970000001 - }, - "21106": { - "latitude": 18.93166717, - "longitude": -98.31913555 - }, - "21107": { - "latitude": 20.11242736, - "longitude": -97.67181812 - }, - "21108": { - "latitude": 19.32649861, - "longitude": -97.58343658 - }, - "21109": { - "latitude": 20.29327055, - "longitude": -98.13736645 - }, - "21110": { - "latitude": 18.835006, - "longitude": -97.53557657 - }, - "21111": { - "latitude": 20.55490702, - "longitude": -97.87682617 - }, - "21112": { - "latitude": 18.06911923, - "longitude": -97.91587977 - }, - "21113": { - "latitude": 18.11397481, - "longitude": -98.27075126 - }, - "21114": { - "latitude": 19.0076115, - "longitude": -98.17615466 - }, - "21115": { - "latitude": 18.94815781, - "longitude": -97.63447059 - }, - "21116": { - "latitude": 19.25373554, - "longitude": -97.11338558 - }, - "21117": { - "latitude": 19.26485599, - "longitude": -97.8262372 - }, - "21118": { - "latitude": 18.96243518, - "longitude": -97.82390240000001 - }, - "21119": { - "latitude": 19.02414118, - "longitude": -98.2897525 - }, - "21120": { - "latitude": 18.49700918, - "longitude": -97.27368691 - }, - "21121": { - "latitude": 18.76741435, - "longitude": -98.33586271 - }, - "21122": { - "latitude": 19.23151849, - "longitude": -98.52594032 - }, - "21123": { - "latitude": 20.11152204, - "longitude": -97.78676016 - }, - "21124": { - "latitude": 18.31813024, - "longitude": -97.38396879999999 - }, - "21125": { - "latitude": 19.01049019, - "longitude": -98.3456193 - }, - "21126": { - "latitude": 19.03492142, - "longitude": -98.39375169 - }, - "21127": { - "latitude": 18.19849896, - "longitude": -97.92168662 - }, - "21128": { - "latitude": 19.2546746, - "longitude": -97.72857107 - }, - "21129": { - "latitude": 18.22887062, - "longitude": -97.29006663 - }, - "21130": { - "latitude": 19.04706887, - "longitude": -97.55189065 - }, - "21131": { - "latitude": 18.74480414, - "longitude": -98.03048699 - }, - "21132": { - "latitude": 19.26895642, - "longitude": -98.42851299 - }, - "21133": { - "latitude": 18.65772257, - "longitude": -98.35524109 - }, - "21134": { - "latitude": 19.346650699999998, - "longitude": -98.50282234 - }, - "21135": { - "latitude": 18.011919199999998, - "longitude": -97.76988542 - }, - "21136": { - "latitude": 19.17266376, - "longitude": -98.3064453 - }, - "21137": { - "latitude": 19.22311259, - "longitude": -97.4975324 - }, - "21138": { - "latitude": 19.07942556, - "longitude": -98.56693124 - }, - "21139": { - "latitude": 18.14193516, - "longitude": -98.13893540000001 - }, - "21140": { - "latitude": 19.07296366, - "longitude": -98.34313061 - }, - "21141": { - "latitude": 18.04066937, - "longitude": -98.04403695 - }, - "21142": { - "latitude": 19.15394548, - "longitude": -97.61391707 - }, - "21143": { - "latitude": 19.24458618, - "longitude": -98.56133829999999 - }, - "21144": { - "latitude": 18.92651711, - "longitude": -97.77233329 - }, - "21145": { - "latitude": 18.37958325, - "longitude": -96.82880254 - }, - "21146": { - "latitude": 18.61590045, - "longitude": -98.07913849 - }, - "21147": { - "latitude": 18.40329717, - "longitude": -98.04927182 - }, - "21148": { - "latitude": 18.97483262, - "longitude": -98.38531851 - }, - "21149": { - "latitude": 18.55545776, - "longitude": -97.42486597 - }, - "21150": { - "latitude": 18.7571762, - "longitude": -98.15696493 - }, - "21151": { - "latitude": 18.88751606, - "longitude": -97.86522078 - }, - "21152": { - "latitude": 19.12066003, - "longitude": -97.74609258 - }, - "21153": { - "latitude": 18.88700453, - "longitude": -97.96822819 - }, - "21154": { - "latitude": 18.85930269, - "longitude": -97.7312203 - }, - "21155": { - "latitude": 18.07142178, - "longitude": -98.3190541 - }, - "21156": { - "latitude": 18.46128765, - "longitude": -97.44508376 - }, - "21157": { - "latitude": 18.35319017, - "longitude": -98.30395121 - }, - "21158": { - "latitude": 20.1892034, - "longitude": -97.40160479 - }, - "21159": { - "latitude": 18.72946448, - "longitude": -98.25059785 - }, - "21160": { - "latitude": 18.45045837, - "longitude": -98.83874044 - }, - "21161": { - "latitude": 18.55389626, - "longitude": -97.54301562 - }, - "21162": { - "latitude": 20.00845756, - "longitude": -97.78432776 - }, - "21163": { - "latitude": 19.14522391, - "longitude": -98.00360129 - }, - "21164": { - "latitude": 19.01192895, - "longitude": -97.87616383 - }, - "21165": { - "latitude": 18.7397547, - "longitude": -98.63294046 - }, - "21166": { - "latitude": 18.72177251, - "longitude": -98.43127478 - }, - "21167": { - "latitude": 19.94949041, - "longitude": -97.85304314 - }, - "21168": { - "latitude": 18.64631731, - "longitude": -98.65400054 - }, - "21169": { - "latitude": 18.49674862, - "longitude": -97.93733911 - }, - "21170": { - "latitude": 19.47960807, - "longitude": -97.463275 - }, - "21171": { - "latitude": 18.80631216, - "longitude": -97.86667947 - }, - "21172": { - "latitude": 19.81821106, - "longitude": -97.78573372 - }, - "21173": { - "latitude": 19.85437095, - "longitude": -97.44936339 - }, - "21174": { - "latitude": 19.86380579, - "longitude": -97.35857551 - }, - "21175": { - "latitude": 19.00018565, - "longitude": -98.47914559 - }, - "21176": { - "latitude": 18.61430199, - "longitude": -98.54199094 - }, - "21177": { - "latitude": 18.65570959, - "longitude": -97.62887090000001 - }, - "21178": { - "latitude": 20.37774286, - "longitude": -97.99619802 - }, - "21179": { - "latitude": 19.13361194, - "longitude": -97.35212022 - }, - "21180": { - "latitude": 19.36228299, - "longitude": -98.58532173 - }, - "21181": { - "latitude": 19.15649692, - "longitude": -98.34284211 - }, - "21182": { - "latitude": 18.85701013, - "longitude": -97.88532078 - }, - "21183": { - "latitude": 20.16730933, - "longitude": -97.90980922 - }, - "21184": { - "latitude": 20.12982415, - "longitude": -97.83827923 - }, - "21185": { - "latitude": 18.6899646, - "longitude": -98.53619712 - }, - "21186": { - "latitude": 19.84214085, - "longitude": -97.49934788 - }, - "21187": { - "latitude": 20.39982707, - "longitude": -98.04887213 - }, - "21188": { - "latitude": 18.92246749, - "longitude": -98.61220578 - }, - "21189": { - "latitude": 18.82845102, - "longitude": -97.8212 - }, - "21190": { - "latitude": 18.29153958, - "longitude": -97.84804665 - }, - "21191": { - "latitude": 17.97507786, - "longitude": -98.39755934 - }, - "21192": { - "latitude": 20.10381551, - "longitude": -97.5305825 - }, - "21193": { - "latitude": 18.81619637, - "longitude": -98.04173543 - }, - "21194": { - "latitude": 20.50835084, - "longitude": -97.68724406 - }, - "21195": { - "latitude": 18.53034909, - "longitude": -97.18206461 - }, - "21196": { - "latitude": 18.27825046, - "longitude": -97.94651501 - }, - "21197": { - "latitude": 20.32661795, - "longitude": -97.90262658 - }, - "21198": { - "latitude": 18.09563368, - "longitude": -98.60058101 - }, - "21199": { - "latitude": 19.72253577, - "longitude": -97.35991993 - }, - "21200": { - "latitude": 19.847951899999998, - "longitude": -97.64678338 - }, - "21201": { - "latitude": 18.65810028, - "longitude": -98.33696278 - }, - "21202": { - "latitude": 19.93888597, - "longitude": -97.65361312 - }, - "21203": { - "latitude": 18.69580582, - "longitude": -97.77793116 - }, - "21204": { - "latitude": 19.91962006, - "longitude": -97.44247686 - }, - "21205": { - "latitude": 18.76754974, - "longitude": -97.67825119 - }, - "21206": { - "latitude": 18.58008419, - "longitude": -98.05248294 - }, - "21207": { - "latitude": 19.85436973, - "longitude": -97.58127268 - }, - "21208": { - "latitude": 19.96491989, - "longitude": -97.99901149 - }, - "21209": { - "latitude": 18.27741729, - "longitude": -97.52189928 - }, - "21210": { - "latitude": 20.00415042, - "longitude": -97.69260901 - }, - "21211": { - "latitude": 19.74726107, - "longitude": -97.56857217 - }, - "21212": { - "latitude": 19.71429803, - "longitude": -97.68268746 - }, - "21213": { - "latitude": 20.2990971, - "longitude": -97.79829523 - }, - "21214": { - "latitude": 18.32743779, - "longitude": -97.22247259999999 - }, - "21215": { - "latitude": 19.97654051, - "longitude": -97.76052386 - }, - "21216": { - "latitude": 20.00903522, - "longitude": -97.59963042 - }, - "21217": { - "latitude": 18.37711212, - "longitude": -96.97866859999999 - }, - "22001": { - "latitude": 20.17491047, - "longitude": -100.09863270000001 - }, - "22002": { - "latitude": 21.14174185, - "longitude": -99.59268801 - }, - "22003": { - "latitude": 21.40923859, - "longitude": -99.63560433 - }, - "22004": { - "latitude": 20.79138473, - "longitude": -99.65702606 - }, - "22005": { - "latitude": 20.75826716, - "longitude": -100.1005707 - }, - "22006": { - "latitude": 20.48544207, - "longitude": -100.4410749 - }, - "22007": { - "latitude": 20.64928262, - "longitude": -99.86668859999999 - }, - "22008": { - "latitude": 20.40384376, - "longitude": -100.3142129 - }, - "22009": { - "latitude": 21.37457277, - "longitude": -99.33159051 - }, - "22010": { - "latitude": 21.25768568, - "longitude": -99.19182537 - }, - "22011": { - "latitude": 20.72022829, - "longitude": -100.27861750000001 - }, - "22012": { - "latitude": 20.47195782, - "longitude": -100.1724274 - }, - "22013": { - "latitude": 21.09766847, - "longitude": -99.82995009 - }, - "22014": { - "latitude": 20.72880538, - "longitude": -100.4527103 - }, - "22015": { - "latitude": 20.9826653, - "longitude": -99.52076120000001 - }, - "22016": { - "latitude": 20.36891154, - "longitude": -100.00038 - }, - "22017": { - "latitude": 20.55117299, - "longitude": -99.95256399 - }, - "22018": { - "latitude": 20.91796183, - "longitude": -99.93444003 - }, - "23001": { - "latitude": 20.44202609, - "longitude": -86.90249856 - }, - "23002": { - "latitude": 19.66989862, - "longitude": -88.05637997 - }, - "23003": { - "latitude": 21.36435578, - "longitude": -86.98827926 - }, - "23004": { - "latitude": 18.51085549, - "longitude": -88.53594694 - }, - "23005": { - "latitude": 21.07818808, - "longitude": -86.94111688 - }, - "23006": { - "latitude": 19.63597995, - "longitude": -88.81574687 - }, - "23007": { - "latitude": 21.05074282, - "longitude": -87.38486638 - }, - "23008": { - "latitude": 20.58205564, - "longitude": -87.39982273 - }, - "23009": { - "latitude": 20.30392765, - "longitude": -87.66568557 - }, - "23010": { - "latitude": 18.97560147, - "longitude": -88.53126417 - }, - "23011": { - "latitude": 20.93759236, - "longitude": -87.12996329999999 - }, - "24001": { - "latitude": 22.45053296, - "longitude": -101.253311 - }, - "24002": { - "latitude": 22.0999259, - "longitude": -99.61950453 - }, - "24003": { - "latitude": 21.72362397, - "longitude": -99.11195949 - }, - "24004": { - "latitude": 22.26960618, - "longitude": -100.63782859999999 - }, - "24005": { - "latitude": 21.99052384, - "longitude": -99.67599289 - }, - "24006": { - "latitude": 23.64549802, - "longitude": -101.0565151 - }, - "24007": { - "latitude": 23.93035437, - "longitude": -100.6737464 - }, - "24008": { - "latitude": 22.44478376, - "longitude": -100.2773366 - }, - "24009": { - "latitude": 22.19247586, - "longitude": -100.77776379999999 - }, - "24010": { - "latitude": 22.43914517, - "longitude": -99.71753175 - }, - "24011": { - "latitude": 22.01581349, - "longitude": -100.2115952 - }, - "24012": { - "latitude": 21.63166129, - "longitude": -98.95970283 - }, - "24013": { - "latitude": 22.10739256, - "longitude": -99.06316082 - }, - "24014": { - "latitude": 21.51498959, - "longitude": -98.90582676 - }, - "24015": { - "latitude": 23.21913784, - "longitude": -101.12137729999999 - }, - "24016": { - "latitude": 22.2042265, - "longitude": -98.51421755 - }, - "24017": { - "latitude": 22.86652943, - "longitude": -100.3037137 - }, - "24018": { - "latitude": 21.52600651, - "longitude": -98.98318422 - }, - "24019": { - "latitude": 21.61493341, - "longitude": -99.60949678 - }, - "24020": { - "latitude": 23.51336274, - "longitude": -100.58726870000001 - }, - "24021": { - "latitude": 22.259043300000002, - "longitude": -101.1566926 - }, - "24022": { - "latitude": 22.73335046, - "longitude": -101.1710738 - }, - "24023": { - "latitude": 21.82409542, - "longitude": -99.61680884 - }, - "24024": { - "latitude": 21.96192818, - "longitude": -100.03451940000001 - }, - "24025": { - "latitude": 22.79811628, - "longitude": -101.6291418 - }, - "24026": { - "latitude": 21.62920969, - "longitude": -98.84153517 - }, - "24027": { - "latitude": 21.57614527, - "longitude": -99.8955838 - }, - "24028": { - "latitude": 22.27047925, - "longitude": -100.96088859999999 - }, - "24029": { - "latitude": 21.39978665, - "longitude": -98.61950357 - }, - "24030": { - "latitude": 22.16951198, - "longitude": -100.457769 - }, - "24031": { - "latitude": 21.58855358, - "longitude": -99.40602609 - }, - "24032": { - "latitude": 21.76797671, - "longitude": -100.5542327 - }, - "24033": { - "latitude": 23.34961959, - "longitude": -101.6811118 - }, - "24034": { - "latitude": 21.79979373, - "longitude": -98.59785453 - }, - "24035": { - "latitude": 22.27162472, - "longitude": -100.85513359999999 - }, - "24036": { - "latitude": 21.93315016, - "longitude": -99.35609774 - }, - "24037": { - "latitude": 21.24130694, - "longitude": -98.78471997 - }, - "24038": { - "latitude": 21.41765166, - "longitude": -98.74574175 - }, - "24039": { - "latitude": 21.55457934, - "longitude": -98.77065975 - }, - "24040": { - "latitude": 22.093619600000004, - "longitude": -98.73532951 - }, - "24041": { - "latitude": 21.72279293, - "longitude": -98.82610186 - }, - "24042": { - "latitude": 21.60728857, - "longitude": -98.66472390000001 - }, - "24043": { - "latitude": 21.6642375, - "longitude": -100.4974204 - }, - "24044": { - "latitude": 24.11052274, - "longitude": -100.91405870000001 - }, - "24045": { - "latitude": 22.92513541, - "longitude": -101.0951226 - }, - "24046": { - "latitude": 21.96861916, - "longitude": -101.27315290000001 - }, - "24047": { - "latitude": 23.21267936, - "longitude": -100.7175693 - }, - "24048": { - "latitude": 23.66491995, - "longitude": -100.7568708 - }, - "24049": { - "latitude": 22.9324175, - "longitude": -101.916313 - }, - "24050": { - "latitude": 21.85176188, - "longitude": -100.98153570000001 - }, - "24051": { - "latitude": 22.64076357, - "longitude": -100.6734083 - }, - "24052": { - "latitude": 22.289232300000002, - "longitude": -100.1973454 - }, - "24053": { - "latitude": 21.42618036, - "longitude": -98.86921306 - }, - "24054": { - "latitude": 21.38588697, - "longitude": -99.02540542 - }, - "24055": { - "latitude": 22.00817352, - "longitude": -100.6767205 - }, - "24056": { - "latitude": 22.65993097, - "longitude": -100.8043875 - }, - "24057": { - "latitude": 21.32933262, - "longitude": -98.83735472 - }, - "24058": { - "latitude": 22.490104100000003, - "longitude": -99.36599121 - }, - "25001": { - "latitude": 25.89564802, - "longitude": -109.1331985 - }, - "25002": { - "latitude": 25.14607366, - "longitude": -108.1410939 - }, - "25003": { - "latitude": 25.59085472, - "longitude": -107.39596470000001 - }, - "25004": { - "latitude": 23.41416866, - "longitude": -105.9917878 - }, - "25005": { - "latitude": 24.48148376, - "longitude": -106.7994351 - }, - "25006": { - "latitude": 24.651490300000003, - "longitude": -107.26665390000001 - }, - "25007": { - "latitude": 26.68030641, - "longitude": -108.27704170000001 - }, - "25008": { - "latitude": 24.04339025, - "longitude": -106.84213759999999 - }, - "25009": { - "latitude": 22.72409473, - "longitude": -105.68576100000001 - }, - "25010": { - "latitude": 26.25532113, - "longitude": -108.67899709999999 - }, - "25011": { - "latitude": 25.5345967, - "longitude": -108.5581919 - }, - "25012": { - "latitude": 23.46852341, - "longitude": -106.30588610000001 - }, - "25013": { - "latitude": 25.35992094, - "longitude": -107.7795865 - }, - "25014": { - "latitude": 23.05623489, - "longitude": -105.8052048 - }, - "25015": { - "latitude": 25.41845504, - "longitude": -108.07604950000001 - }, - "25016": { - "latitude": 23.95449476, - "longitude": -106.37017639999999 - }, - "25017": { - "latitude": 25.96878983, - "longitude": -108.11032040000002 - }, - "25018": { - "latitude": 24.72325232, - "longitude": -107.7645976 - }, - "26001": { - "latitude": 29.79621737, - "longitude": -110.222371 - }, - "26002": { - "latitude": 31.10442351, - "longitude": -109.1974435 - }, - "26003": { - "latitude": 27.05105854, - "longitude": -108.87696709999999 - }, - "26004": { - "latitude": 31.17589724, - "longitude": -111.9248742 - }, - "26005": { - "latitude": 28.87281273, - "longitude": -109.0504402 - }, - "26006": { - "latitude": 30.41089416, - "longitude": -110.18931119999999 - }, - "26007": { - "latitude": 30.81601562, - "longitude": -111.544905 - }, - "26008": { - "latitude": 29.84534142, - "longitude": -109.08768859999999 - }, - "26009": { - "latitude": 28.89299627, - "longitude": -109.38562490000001 - }, - "26010": { - "latitude": 30.31031971, - "longitude": -108.81975320000001 - }, - "26011": { - "latitude": 30.66970805, - "longitude": -109.97909070000001 - }, - "26012": { - "latitude": 27.74388509, - "longitude": -110.15912409999999 - }, - "26013": { - "latitude": 30.0610103, - "longitude": -110.2732719 - }, - "26014": { - "latitude": 29.62461998, - "longitude": -110.1198071 - }, - "26015": { - "latitude": 30.61782092, - "longitude": -109.0064864 - }, - "26016": { - "latitude": 30.17022409, - "longitude": -111.21140929999999 - }, - "26017": { - "latitude": 30.82495234, - "longitude": -112.5394862 - }, - "26018": { - "latitude": 27.79281977, - "longitude": -109.88677109999999 - }, - "26019": { - "latitude": 30.98846022, - "longitude": -110.23532 - }, - "26020": { - "latitude": 29.71958362, - "longitude": -111.0722845 - }, - "26021": { - "latitude": 28.72431197, - "longitude": -110.3826953 - }, - "26022": { - "latitude": 30.41153767, - "longitude": -110.63057959999999 - }, - "26023": { - "latitude": 30.06740331, - "longitude": -109.8099456 - }, - "26024": { - "latitude": 29.61540765, - "longitude": -109.37681070000001 - }, - "26025": { - "latitude": 28.00849387, - "longitude": -110.6687289 - }, - "26026": { - "latitude": 27.015137100000004, - "longitude": -109.6885338 - }, - "26027": { - "latitude": 30.84851772, - "longitude": -109.6479104 - }, - "26028": { - "latitude": 29.76113888, - "longitude": -109.312385 - }, - "26029": { - "latitude": 28.14268152, - "longitude": -110.625571 - }, - "26030": { - "latitude": 29.02729919, - "longitude": -111.40307390000001 - }, - "26031": { - "latitude": 30.12313648, - "longitude": -108.9153445 - }, - "26032": { - "latitude": 29.97550878, - "longitude": -109.3814121 - }, - "26033": { - "latitude": 26.65067223, - "longitude": -109.40638030000001 - }, - "26034": { - "latitude": 29.93031025, - "longitude": -110.2451735 - }, - "26035": { - "latitude": 30.84734103, - "longitude": -110.7457822 - }, - "26036": { - "latitude": 30.731382899999996, - "longitude": -111.021441 - }, - "26037": { - "latitude": 28.96007162, - "longitude": -110.20964380000001 - }, - "26038": { - "latitude": 29.72855623, - "longitude": -109.72379140000001 - }, - "26039": { - "latitude": 31.22949858, - "longitude": -109.9572085 - }, - "26040": { - "latitude": 29.635274, - "longitude": -108.85200990000001 - }, - "26041": { - "latitude": 30.48674044, - "longitude": -109.4799158 - }, - "26042": { - "latitude": 27.07810146, - "longitude": -109.4027334 - }, - "26043": { - "latitude": 31.19883403, - "longitude": -111.0024433 - }, - "26044": { - "latitude": 28.4572983, - "longitude": -109.49210829999998 - }, - "26045": { - "latitude": 30.02923059, - "longitude": -110.8204791 - }, - "26046": { - "latitude": 30.76160022, - "longitude": -111.65534620000001 - }, - "26047": { - "latitude": 29.951767200000003, - "longitude": -112.09403 - }, - "26048": { - "latitude": 31.52942876, - "longitude": -113.29311909999998 - }, - "26049": { - "latitude": 27.57898602, - "longitude": -109.36487350000002 - }, - "26050": { - "latitude": 29.753532, - "longitude": -110.54497959999999 - }, - "26051": { - "latitude": 28.03260577, - "longitude": -109.31842890000001 - }, - "26052": { - "latitude": 29.01000361, - "longitude": -108.9941007 - }, - "26053": { - "latitude": 29.87643273, - "longitude": -110.32936200000002 - }, - "26054": { - "latitude": 28.60953483, - "longitude": -109.75869640000002 - }, - "26055": { - "latitude": 32.0175589, - "longitude": -114.3507168 - }, - "26056": { - "latitude": 29.46301686, - "longitude": -110.79864009999999 - }, - "26057": { - "latitude": 29.26579766, - "longitude": -109.6711449 - }, - "26058": { - "latitude": 30.4516397, - "longitude": -111.0589858 - }, - "26059": { - "latitude": 31.19203062, - "longitude": -110.5488187 - }, - "26060": { - "latitude": 31.28176238, - "longitude": -111.45405259999998 - }, - "26061": { - "latitude": 28.78977489, - "longitude": -109.6116908 - }, - "26062": { - "latitude": 28.39162755, - "longitude": -109.8865288 - }, - "26063": { - "latitude": 29.47223047, - "longitude": -109.52793419999999 - }, - "26064": { - "latitude": 30.31206264, - "longitude": -111.581574 - }, - "26065": { - "latitude": 30.92133455, - "longitude": -111.40282930000001 - }, - "26066": { - "latitude": 29.34216876, - "longitude": -110.329199 - }, - "26067": { - "latitude": 30.2341848, - "longitude": -109.3338342 - }, - "26068": { - "latitude": 29.08680699, - "longitude": -109.9705855 - }, - "26069": { - "latitude": 28.41983451, - "longitude": -108.9652483 - }, - "26070": { - "latitude": 31.71999008, - "longitude": -112.9082883 - }, - "26071": { - "latitude": 27.10640175, - "longitude": -109.85144409999998 - }, - "26072": { - "latitude": 27.35978386, - "longitude": -110.35883829999999 - }, - "27001": { - "latitude": 17.80484952, - "longitude": -91.31173364 - }, - "27002": { - "latitude": 18.17016622, - "longitude": -93.64675235 - }, - "27003": { - "latitude": 18.36142312, - "longitude": -92.58623946 - }, - "27004": { - "latitude": 18.00910356, - "longitude": -92.86021070000001 - }, - "27005": { - "latitude": 18.28692896, - "longitude": -93.33669765 - }, - "27006": { - "latitude": 18.07657775, - "longitude": -93.22066925 - }, - "27007": { - "latitude": 17.70512366, - "longitude": -91.67578259999999 - }, - "27008": { - "latitude": 17.82639053, - "longitude": -93.69981914 - }, - "27009": { - "latitude": 17.76359427, - "longitude": -92.78703376 - }, - "27010": { - "latitude": 18.21330536, - "longitude": -93.0838765 - }, - "27011": { - "latitude": 18.07907506, - "longitude": -92.14342134 - }, - "27012": { - "latitude": 17.84503972, - "longitude": -92.45860023 - }, - "27013": { - "latitude": 18.18786501, - "longitude": -92.94862336 - }, - "27014": { - "latitude": 18.38118145, - "longitude": -93.20058449999999 - }, - "27015": { - "latitude": 17.528232100000004, - "longitude": -92.73260346 - }, - "27016": { - "latitude": 17.62330665, - "longitude": -92.95237537 - }, - "27017": { - "latitude": 17.42637633, - "longitude": -91.29355894 - }, - "28001": { - "latitude": 24.13398853, - "longitude": -98.26829151 - }, - "28002": { - "latitude": 23.00229554, - "longitude": -98.03576758 - }, - "28003": { - "latitude": 22.54199506, - "longitude": -98.08245441 - }, - "28004": { - "latitude": 22.56230715, - "longitude": -99.07977604 - }, - "28005": { - "latitude": 24.92857866, - "longitude": -98.84645748 - }, - "28006": { - "latitude": 23.32679751, - "longitude": -99.87267888 - }, - "28007": { - "latitude": 26.18364957, - "longitude": -98.85907359999999 - }, - "28008": { - "latitude": 23.53941103, - "longitude": -98.61642332 - }, - "28009": { - "latitude": 22.27951923, - "longitude": -97.8283959 - }, - "28010": { - "latitude": 24.6285715, - "longitude": -98.44012657 - }, - "28011": { - "latitude": 23.00669776, - "longitude": -99.17851553 - }, - "28012": { - "latitude": 22.78642915, - "longitude": -98.55448688 - }, - "28013": { - "latitude": 23.88547691, - "longitude": -99.08670707 - }, - "28014": { - "latitude": 26.90405273, - "longitude": -99.4826522 - }, - "28015": { - "latitude": 26.1363693, - "longitude": -98.64123495 - }, - "28016": { - "latitude": 24.19553858, - "longitude": -99.3805184 - }, - "28017": { - "latitude": 23.47842578, - "longitude": -99.41265851 - }, - "28018": { - "latitude": 24.26228145, - "longitude": -98.52027397 - }, - "28019": { - "latitude": 23.27202415, - "longitude": -98.85736887 - }, - "28020": { - "latitude": 24.58792998, - "longitude": -99.56442796 - }, - "28021": { - "latitude": 22.57184837, - "longitude": -98.83319204 - }, - "28022": { - "latitude": 25.61236294, - "longitude": -97.53291023 - }, - "28023": { - "latitude": 25.22375993, - "longitude": -98.44003787 - }, - "28024": { - "latitude": 26.41510254, - "longitude": -99.25686652 - }, - "28025": { - "latitude": 26.23862405, - "longitude": -99.06736285 - }, - "28026": { - "latitude": 23.61912126, - "longitude": -99.77391426 - }, - "28027": { - "latitude": 27.47580985, - "longitude": -99.67379902 - }, - "28028": { - "latitude": 22.50753638, - "longitude": -99.20404154 - }, - "28029": { - "latitude": 22.82979917, - "longitude": -99.33585521 - }, - "28030": { - "latitude": 24.02260743, - "longitude": -98.84612144 - }, - "28031": { - "latitude": 23.27177592, - "longitude": -99.56529333 - }, - "28032": { - "latitude": 25.81023622, - "longitude": -98.37336068 - }, - "28033": { - "latitude": 25.74440916, - "longitude": -98.03784676 - }, - "28034": { - "latitude": 24.47584859, - "longitude": -98.97581755 - }, - "28035": { - "latitude": 24.89119704, - "longitude": -97.95827066 - }, - "28036": { - "latitude": 24.63195575, - "longitude": -98.76966942 - }, - "28037": { - "latitude": 23.7834299, - "longitude": -98.03734713 - }, - "28038": { - "latitude": 22.27861616, - "longitude": -97.90126211 - }, - "28039": { - "latitude": 22.93989355, - "longitude": -99.77626222 - }, - "28040": { - "latitude": 25.70068183, - "longitude": -97.84479651 - }, - "28041": { - "latitude": 23.69701948, - "longitude": -99.16665096 - }, - "28042": { - "latitude": 24.56059055, - "longitude": -99.36003268 - }, - "28043": { - "latitude": 23.00570979, - "longitude": -98.93151568 - }, - "29001": { - "latitude": 19.35533569, - "longitude": -98.16611579 - }, - "29002": { - "latitude": 19.35149175, - "longitude": -98.19468309999999 - }, - "29003": { - "latitude": 19.54505862, - "longitude": -98.18293334 - }, - "29004": { - "latitude": 19.41174076, - "longitude": -97.79301653 - }, - "29005": { - "latitude": 19.42352061, - "longitude": -98.12708931 - }, - "29006": { - "latitude": 19.56096269, - "longitude": -98.58936477 - }, - "29007": { - "latitude": 19.3357065, - "longitude": -97.6743247 - }, - "29008": { - "latitude": 19.33127616, - "longitude": -97.76457038 - }, - "29009": { - "latitude": 19.34998887, - "longitude": -98.09162804 - }, - "29010": { - "latitude": 19.28975994, - "longitude": -98.13110566 - }, - "29011": { - "latitude": 19.50609037, - "longitude": -98.23348195 - }, - "29012": { - "latitude": 19.44445843, - "longitude": -98.43685077 - }, - "29013": { - "latitude": 19.33244361, - "longitude": -97.93643381 - }, - "29014": { - "latitude": 19.48820551, - "longitude": -98.34226608 - }, - "29015": { - "latitude": 19.35611285, - "longitude": -98.38330259 - }, - "29016": { - "latitude": 19.25758462, - "longitude": -97.91135452 - }, - "29017": { - "latitude": 19.1917481, - "longitude": -98.16432482 - }, - "29018": { - "latitude": 19.31995976, - "longitude": -98.13338911 - }, - "29019": { - "latitude": 19.28195839, - "longitude": -98.37922152 - }, - "29020": { - "latitude": 19.54743237, - "longitude": -98.44071355 - }, - "29021": { - "latitude": 19.499825899999998, - "longitude": -98.55402812 - }, - "29022": { - "latitude": 19.21687335, - "longitude": -98.17051525 - }, - "29023": { - "latitude": 19.2333147, - "longitude": -98.33196217 - }, - "29024": { - "latitude": 19.35211769, - "longitude": -98.28415338 - }, - "29025": { - "latitude": 19.15611741, - "longitude": -98.1403641 - }, - "29026": { - "latitude": 19.35294211, - "longitude": -98.13056740000002 - }, - "29027": { - "latitude": 19.15074398, - "longitude": -98.19029715 - }, - "29028": { - "latitude": 19.22284974, - "longitude": -98.11629565 - }, - "29029": { - "latitude": 19.24713091, - "longitude": -98.22838917 - }, - "29030": { - "latitude": 19.48399434, - "longitude": -97.93446795 - }, - "29031": { - "latitude": 19.48224416, - "longitude": -98.07635291 - }, - "29032": { - "latitude": 19.23389222, - "longitude": -98.28744367 - }, - "29033": { - "latitude": 19.30934734, - "longitude": -98.23669393 - }, - "29034": { - "latitude": 19.62014027, - "longitude": -98.17731149 - }, - "29035": { - "latitude": 19.38884219, - "longitude": -98.01614633 - }, - "29036": { - "latitude": 19.33613584, - "longitude": -98.24855966 - }, - "29037": { - "latitude": 19.2116821, - "longitude": -97.92673899 - }, - "29038": { - "latitude": 19.3807187, - "longitude": -98.08522747 - }, - "29039": { - "latitude": 19.41617132, - "longitude": -98.02915359 - }, - "29040": { - "latitude": 19.43020296, - "longitude": -98.23956475 - }, - "29041": { - "latitude": 19.17226713, - "longitude": -98.19722782 - }, - "29042": { - "latitude": 19.17118668, - "longitude": -98.24133799 - }, - "29043": { - "latitude": 19.40171152, - "longitude": -98.17774708 - }, - "29044": { - "latitude": 19.19384801, - "longitude": -98.26038382 - }, - "29045": { - "latitude": 19.59513083, - "longitude": -98.40913643 - }, - "29046": { - "latitude": 19.56385087, - "longitude": -97.92594603 - }, - "29047": { - "latitude": 19.53329053, - "longitude": -97.99078448 - }, - "29048": { - "latitude": 19.27805735, - "longitude": -98.19140847 - }, - "29049": { - "latitude": 19.28618134, - "longitude": -98.29850257 - }, - "29050": { - "latitude": 19.25711119, - "longitude": -98.08404382 - }, - "29051": { - "latitude": 19.24814806, - "longitude": -98.26414296 - }, - "29052": { - "latitude": 19.32361376, - "longitude": -98.04931457 - }, - "29053": { - "latitude": 19.23467638, - "longitude": -98.25388956 - }, - "29054": { - "latitude": 19.21722098, - "longitude": -98.26104827 - }, - "29055": { - "latitude": 19.49125148, - "longitude": -98.25555933 - }, - "29056": { - "latitude": 19.29701103, - "longitude": -98.33322249 - }, - "29057": { - "latitude": 19.24592575, - "longitude": -98.31344774 - }, - "29058": { - "latitude": 19.19342247, - "longitude": -98.21641469 - }, - "29059": { - "latitude": 19.21123526, - "longitude": -98.20459185 - }, - "29060": { - "latitude": 19.26246377, - "longitude": -98.20657922 - }, - "30001": { - "latitude": 19.56471389, - "longitude": -97.04423266 - }, - "30002": { - "latitude": 19.69170559, - "longitude": -96.84017641 - }, - "30003": { - "latitude": 18.0366793, - "longitude": -95.03261136 - }, - "30004": { - "latitude": 19.54624287, - "longitude": -96.5286179 - }, - "30005": { - "latitude": 18.55406058, - "longitude": -95.80397263 - }, - "30006": { - "latitude": 18.71614672, - "longitude": -97.27642307 - }, - "30007": { - "latitude": 19.01088106, - "longitude": -96.56902009 - }, - "30008": { - "latitude": 19.09772771, - "longitude": -97.13567824 - }, - "30009": { - "latitude": 19.71798561, - "longitude": -96.58289350000001 - }, - "30010": { - "latitude": 19.77627465, - "longitude": -97.12733097 - }, - "30011": { - "latitude": 18.79995005, - "longitude": -95.85033618 - }, - "30012": { - "latitude": 18.43295756, - "longitude": -95.68972379 - }, - "30013": { - "latitude": 21.31317133, - "longitude": -97.68538713 - }, - "30014": { - "latitude": 18.85975188, - "longitude": -96.87617372 - }, - "30015": { - "latitude": 18.60202055, - "longitude": -95.39232785 - }, - "30016": { - "latitude": 19.31004918, - "longitude": -96.30902318 - }, - "30017": { - "latitude": 19.33823426, - "longitude": -96.67004061 - }, - "30018": { - "latitude": 18.78889023, - "longitude": -97.32424391 - }, - "30019": { - "latitude": 18.56175559, - "longitude": -97.10034096 - }, - "30020": { - "latitude": 18.67911236, - "longitude": -97.10792738 - }, - "30021": { - "latitude": 18.92792948, - "longitude": -96.7965438 - }, - "30022": { - "latitude": 18.94432572, - "longitude": -97.07789467 - }, - "30023": { - "latitude": 19.90812683, - "longitude": -97.11576299 - }, - "30024": { - "latitude": 19.28845916, - "longitude": -96.82479508 - }, - "30025": { - "latitude": 19.40472893, - "longitude": -97.19503301 - }, - "30026": { - "latitude": 19.58678638, - "longitude": -96.94294025 - }, - "30027": { - "latitude": 20.81924222, - "longitude": -98.17863349 - }, - "30028": { - "latitude": 19.11740532, - "longitude": -96.12100554 - }, - "30029": { - "latitude": 19.11327219, - "longitude": -97.17826511 - }, - "30030": { - "latitude": 18.79042982, - "longitude": -97.16339541 - }, - "30031": { - "latitude": 18.81662191, - "longitude": -96.58192323 - }, - "30032": { - "latitude": 18.4347381, - "longitude": -95.02575805 - }, - "30033": { - "latitude": 20.71444969, - "longitude": -97.28548255 - }, - "30034": { - "latitude": 21.18737154, - "longitude": -97.76923097 - }, - "30035": { - "latitude": 21.34277386, - "longitude": -97.88875569 - }, - "30036": { - "latitude": 19.67620622, - "longitude": -96.94979726 - }, - "30037": { - "latitude": 20.26911892, - "longitude": -97.70579953 - }, - "30038": { - "latitude": 19.4475469, - "longitude": -96.93054619 - }, - "30039": { - "latitude": 18.13255848, - "longitude": -94.39736763 - }, - "30040": { - "latitude": 20.42745527, - "longitude": -97.53741248 - }, - "30041": { - "latitude": 18.77541273, - "longitude": -96.92152001 - }, - "30042": { - "latitude": 19.93351798, - "longitude": -96.70518024 - }, - "30043": { - "latitude": 19.13916911, - "longitude": -96.68554216 - }, - "30044": { - "latitude": 18.93236783, - "longitude": -96.93845744 - }, - "30045": { - "latitude": 18.30206741, - "longitude": -95.97233596 - }, - "30046": { - "latitude": 19.33144886, - "longitude": -96.96713971 - }, - "30047": { - "latitude": 19.05332286, - "longitude": -97.08946644 - }, - "30048": { - "latitude": 18.01624261, - "longitude": -94.56808029999999 - }, - "30049": { - "latitude": 18.86268869, - "longitude": -96.36619139 - }, - "30050": { - "latitude": 20.2146302, - "longitude": -97.55029855 - }, - "30051": { - "latitude": 20.33842179, - "longitude": -97.66568391 - }, - "30052": { - "latitude": 18.76755799, - "longitude": -96.82091391 - }, - "30053": { - "latitude": 18.77630255, - "longitude": -96.65952086 - }, - "30054": { - "latitude": 18.21342248, - "longitude": -95.80713719 - }, - "30055": { - "latitude": 21.20846734, - "longitude": -98.38897173 - }, - "30056": { - "latitude": 21.26127467, - "longitude": -98.47699679 - }, - "30057": { - "latitude": 19.75440244, - "longitude": -96.77459286 - }, - "30058": { - "latitude": 21.00325252, - "longitude": -98.04062246 - }, - "30059": { - "latitude": 18.05983235, - "longitude": -94.70118042 - }, - "30060": { - "latitude": 21.37645382, - "longitude": -97.6689843 - }, - "30061": { - "latitude": 17.53583581, - "longitude": -93.95723578 - }, - "30062": { - "latitude": 19.000607000000002, - "longitude": -97.03952586 - }, - "30063": { - "latitude": 21.38621898, - "longitude": -97.97834374 - }, - "30064": { - "latitude": 20.22280837, - "longitude": -97.585068 - }, - "30065": { - "latitude": 19.43999763, - "longitude": -96.73142159 - }, - "30066": { - "latitude": 20.27593468, - "longitude": -97.49682237 - }, - "30067": { - "latitude": 20.20528162, - "longitude": -97.69907974 - }, - "30068": { - "latitude": 18.90215487, - "longitude": -96.99007092 - }, - "30069": { - "latitude": 20.44637395, - "longitude": -97.10959092 - }, - "30070": { - "latitude": 17.55377158, - "longitude": -94.62128396 - }, - "30071": { - "latitude": 19.13680215, - "longitude": -96.93977451 - }, - "30072": { - "latitude": 20.517711600000002, - "longitude": -98.46760021 - }, - "30073": { - "latitude": 18.19711174, - "longitude": -95.15482306 - }, - "30074": { - "latitude": 18.81730721, - "longitude": -97.13310201 - }, - "30075": { - "latitude": 18.66545877, - "longitude": -95.96350516 - }, - "30076": { - "latitude": 20.78128497, - "longitude": -98.42647992 - }, - "30077": { - "latitude": 18.08214803, - "longitude": -95.55839757 - }, - "30078": { - "latitude": 21.23859503, - "longitude": -98.02099761 - }, - "30079": { - "latitude": 19.36556807, - "longitude": -97.09226901 - }, - "30080": { - "latitude": 19.03740085, - "longitude": -96.93083244 - }, - "30081": { - "latitude": 18.88988662, - "longitude": -97.16658676 - }, - "30082": { - "latitude": 17.98607627, - "longitude": -94.39512851 - }, - "30083": { - "latitude": 20.72305338, - "longitude": -98.00998054 - }, - "30084": { - "latitude": 18.47389529, - "longitude": -95.88690763 - }, - "30085": { - "latitude": 18.85056593, - "longitude": -97.02901322 - }, - "30086": { - "latitude": 19.76471782, - "longitude": -97.29189218 - }, - "30087": { - "latitude": 19.54385763, - "longitude": -96.88833353 - }, - "30088": { - "latitude": 19.33952825, - "longitude": -96.75579833 - }, - "30089": { - "latitude": 17.87041569, - "longitude": -94.71507467 - }, - "30090": { - "latitude": 18.99968403, - "longitude": -96.25323055 - }, - "30091": { - "latitude": 17.41844947, - "longitude": -94.90441623 - }, - "30092": { - "latitude": 19.4478172, - "longitude": -97.05833603 - }, - "30093": { - "latitude": 19.6111875, - "longitude": -96.9164818 - }, - "30094": { - "latitude": 17.98153738, - "longitude": -95.36585165 - }, - "30095": { - "latitude": 19.81894488, - "longitude": -96.66163895 - }, - "30096": { - "latitude": 19.74402371, - "longitude": -96.85383873 - }, - "30097": { - "latitude": 18.65658733, - "longitude": -95.50058695 - }, - "30098": { - "latitude": 18.76720723, - "longitude": -97.04618509 - }, - "30099": { - "latitude": 18.83652575, - "longitude": -97.26566391 - }, - "30100": { - "latitude": 19.10486517, - "longitude": -96.33945019 - }, - "30101": { - "latitude": 18.93297294, - "longitude": -97.18385140000001 - }, - "30102": { - "latitude": 20.13354816, - "longitude": -97.05103274 - }, - "30103": { - "latitude": 20.20800857, - "longitude": -97.65261501 - }, - "30104": { - "latitude": 18.18544996, - "longitude": -94.79446084 - }, - "30105": { - "latitude": 18.98827775, - "longitude": -96.16191090000001 - }, - "30106": { - "latitude": 19.72403525, - "longitude": -96.88144634 - }, - "30107": { - "latitude": 19.703865, - "longitude": -97.14990336 - }, - "30108": { - "latitude": 17.71136874, - "longitude": -94.38869659999999 - }, - "30109": { - "latitude": 19.96258631, - "longitude": -96.88543722 - }, - "30110": { - "latitude": 18.59166247, - "longitude": -96.97677314 - }, - "30111": { - "latitude": 17.9826748, - "longitude": -94.28574276 - }, - "30112": { - "latitude": 19.63327726, - "longitude": -96.84098748 - }, - "30113": { - "latitude": 18.79488772, - "longitude": -96.95705857 - }, - "30114": { - "latitude": 20.10701928, - "longitude": -96.79325104 - }, - "30115": { - "latitude": 18.825356, - "longitude": -97.19899721 - }, - "30116": { - "latitude": 17.9032174, - "longitude": -94.89165325 - }, - "30117": { - "latitude": 18.71203315, - "longitude": -96.70320207 - }, - "30118": { - "latitude": 18.85586189, - "longitude": -97.10480787 - }, - "30119": { - "latitude": 18.16746435, - "longitude": -96.03425928 - }, - "30120": { - "latitude": 17.98879647, - "longitude": -94.67362428 - }, - "30121": { - "latitude": 21.72125868, - "longitude": -97.84760899999999 - }, - "30122": { - "latitude": 18.20342171, - "longitude": -94.67790599 - }, - "30123": { - "latitude": 22.11398629, - "longitude": -98.25637589 - }, - "30124": { - "latitude": 20.41090014, - "longitude": -97.28632709 - }, - "30125": { - "latitude": 18.942696100000003, - "longitude": -96.66301274 - }, - "30126": { - "latitude": 19.24636713, - "longitude": -96.45004916 - }, - "30127": { - "latitude": 18.98970411, - "longitude": -97.19234893 - }, - "30128": { - "latitude": 19.52843749, - "longitude": -97.27889594 - }, - "30129": { - "latitude": 21.29478302, - "longitude": -98.37572296 - }, - "30130": { - "latitude": 17.7670025, - "longitude": -95.64516654 - }, - "30131": { - "latitude": 20.53004888, - "longitude": -97.43847188 - }, - "30132": { - "latitude": 19.62228382, - "longitude": -97.09478186 - }, - "30133": { - "latitude": 22.15806355, - "longitude": -97.92480994 - }, - "30134": { - "latitude": 19.30132699, - "longitude": -96.56567185 - }, - "30135": { - "latitude": 18.80292982, - "longitude": -97.09560038 - }, - "30136": { - "latitude": 19.59959057, - "longitude": -96.98482614 - }, - "30137": { - "latitude": 18.67397933, - "longitude": -97.04343852 - }, - "30138": { - "latitude": 18.84449831, - "longitude": -97.1509199 - }, - "30139": { - "latitude": 18.56197248, - "longitude": -95.5213724 - }, - "30140": { - "latitude": 18.77226012, - "longitude": -97.09302106 - }, - "30141": { - "latitude": 18.46717781, - "longitude": -95.22222152 - }, - "30142": { - "latitude": 17.76597682, - "longitude": -95.16202377 - }, - "30143": { - "latitude": 18.39931897, - "longitude": -95.39983457 - }, - "30144": { - "latitude": 17.72470458, - "longitude": -94.94589874 - }, - "30145": { - "latitude": 18.00248922, - "longitude": -94.83464604 - }, - "30146": { - "latitude": 19.17320741, - "longitude": -96.92231546 - }, - "30147": { - "latitude": 18.70689595, - "longitude": -97.18624474 - }, - "30148": { - "latitude": 19.04891536, - "longitude": -96.45317706 - }, - "30149": { - "latitude": 18.23697539, - "longitude": -94.90079557 - }, - "30150": { - "latitude": 21.52425884, - "longitude": -97.62767503 - }, - "30151": { - "latitude": 21.32395574, - "longitude": -97.49652555 - }, - "30152": { - "latitude": 21.93617932, - "longitude": -97.77841936 - }, - "30153": { - "latitude": 21.26296773, - "longitude": -97.77894274 - }, - "30154": { - "latitude": 21.42695642, - "longitude": -97.75595107 - }, - "30155": { - "latitude": 21.3889701, - "longitude": -98.17126331 - }, - "30156": { - "latitude": 19.71156675, - "longitude": -97.08418809999999 - }, - "30157": { - "latitude": 20.73194315, - "longitude": -97.66908585 - }, - "30158": { - "latitude": 20.38557678, - "longitude": -97.02528317 - }, - "30159": { - "latitude": 18.52987455, - "longitude": -97.05242196 - }, - "30160": { - "latitude": 20.97114766, - "longitude": -97.7102113 - }, - "30161": { - "latitude": 21.56885045, - "longitude": -98.38160913 - }, - "30162": { - "latitude": 19.26029651, - "longitude": -96.84099228 - }, - "30163": { - "latitude": 19.81451302, - "longitude": -96.93921024 - }, - "30164": { - "latitude": 19.37380336, - "longitude": -96.94156813 - }, - "30165": { - "latitude": 19.04497749, - "longitude": -96.85321115 - }, - "30166": { - "latitude": 19.66861358, - "longitude": -96.77330435 - }, - "30167": { - "latitude": 21.14866246, - "longitude": -97.86305558 - }, - "30168": { - "latitude": 18.73680249, - "longitude": -97.04434375 - }, - "30169": { - "latitude": 18.11412097, - "longitude": -95.70208794 - }, - "30170": { - "latitude": 20.62421432, - "longitude": -98.30878675 - }, - "30171": { - "latitude": 18.61899671, - "longitude": -97.03205768 - }, - "30172": { - "latitude": 17.78548809, - "longitude": -94.79704777 - }, - "30173": { - "latitude": 18.57974579, - "longitude": -96.77611258 - }, - "30174": { - "latitude": 18.5498343, - "longitude": -96.28645194 - }, - "30175": { - "latitude": 20.6604023, - "longitude": -97.53020177 - }, - "30176": { - "latitude": 18.19605643, - "longitude": -95.94648756 - }, - "30177": { - "latitude": 19.70186462, - "longitude": -97.00467801 - }, - "30178": { - "latitude": 18.53369935, - "longitude": -95.62298322 - }, - "30179": { - "latitude": 19.18328672, - "longitude": -96.78128481 - }, - "30180": { - "latitude": 20.61155451, - "longitude": -98.18534266 - }, - "30181": { - "latitude": 18.75498341, - "longitude": -96.16951855 - }, - "30182": { - "latitude": 19.54111195, - "longitude": -96.98303599 - }, - "30183": { - "latitude": 20.02356969, - "longitude": -97.17443100000001 - }, - "30184": { - "latitude": 18.60940814, - "longitude": -97.10486705 - }, - "30185": { - "latitude": 18.79439858, - "longitude": -97.07733225 - }, - "30186": { - "latitude": 19.02185519, - "longitude": -96.99684613 - }, - "30187": { - "latitude": 19.72352834, - "longitude": -96.92140571 - }, - "30188": { - "latitude": 19.22619195, - "longitude": -96.89706268 - }, - "30189": { - "latitude": 20.93479451, - "longitude": -97.41178697 - }, - "30190": { - "latitude": 18.18790178, - "longitude": -95.88014343 - }, - "30191": { - "latitude": 19.43762211, - "longitude": -96.38777692 - }, - "30192": { - "latitude": 19.97684352, - "longitude": -96.63426217 - }, - "30193": { - "latitude": 19.18582833, - "longitude": -96.22169275 - }, - "30194": { - "latitude": 19.65194921, - "longitude": -97.20293211 - }, - "30195": { - "latitude": 18.63267497, - "longitude": -97.16357952 - }, - "30196": { - "latitude": 18.8264735, - "longitude": -96.79963961 - }, - "30197": { - "latitude": 19.84816786, - "longitude": -96.77341547 - }, - "30198": { - "latitude": 20.49544325, - "longitude": -98.34406514 - }, - "30199": { - "latitude": 17.95047768, - "longitude": -94.63867524 - }, - "30200": { - "latitude": 19.06716755, - "longitude": -96.73382708 - }, - "30201": { - "latitude": 18.64926051, - "longitude": -96.92548505 - }, - "30202": { - "latitude": 20.73432651, - "longitude": -98.30312036 - }, - "30203": { - "latitude": 20.13393602, - "longitude": -97.55857395 - }, - "30204": { - "latitude": 18.08486975, - "longitude": -94.16076183 - }, - "30205": { - "latitude": 21.74926874, - "longitude": -98.41892066 - }, - "30206": { - "latitude": 18.0627734, - "longitude": -94.39136099 - }, - "30207": { - "latitude": 18.30276684, - "longitude": -96.16849571 - }, - "30208": { - "latitude": 18.3267852, - "longitude": -95.71865855 - }, - "30209": { - "latitude": 18.36832684, - "longitude": -94.78736589 - }, - "30210": { - "latitude": 17.27687311, - "longitude": -94.35585899 - }, - "30211": { - "latitude": 20.21728862, - "longitude": -96.91521712 - }, - "30212": { - "latitude": 17.62510072, - "longitude": -95.66494262 - }, - "31001": { - "latitude": 20.65519595, - "longitude": -89.65038354 - }, - "31002": { - "latitude": 20.82448594, - "longitude": -89.44744388 - }, - "31003": { - "latitude": 20.26206244, - "longitude": -89.34837905 - }, - "31004": { - "latitude": 21.13445617, - "longitude": -89.39940637 - }, - "31005": { - "latitude": 21.00051233, - "longitude": -89.17563894 - }, - "31006": { - "latitude": 21.22176719, - "longitude": -88.6496238 - }, - "31007": { - "latitude": 20.98025621, - "longitude": -89.2512884 - }, - "31008": { - "latitude": 21.014120300000002, - "longitude": -88.12445168 - }, - "31009": { - "latitude": 21.16573963, - "longitude": -89.07320278 - }, - "31010": { - "latitude": 20.42533041, - "longitude": -89.04934870000001 - }, - "31011": { - "latitude": 20.88889424, - "longitude": -90.27996321 - }, - "31012": { - "latitude": 21.03071021, - "longitude": -88.58078184 - }, - "31013": { - "latitude": 21.08211393, - "longitude": -89.51377024 - }, - "31014": { - "latitude": 20.6240193, - "longitude": -88.34805696 - }, - "31015": { - "latitude": 20.71914872, - "longitude": -89.34527876 - }, - "31016": { - "latitude": 20.19371447, - "longitude": -89.01828028 - }, - "31017": { - "latitude": 20.49655986, - "longitude": -88.569283 - }, - "31018": { - "latitude": 20.4985426, - "longitude": -89.48608378 - }, - "31019": { - "latitude": 20.76025023, - "longitude": -87.82448745 - }, - "31020": { - "latitude": 21.15073103, - "longitude": -89.52674427 - }, - "31021": { - "latitude": 20.43709107, - "longitude": -88.18155117 - }, - "31022": { - "latitude": 20.27386238, - "longitude": -88.52659401 - }, - "31023": { - "latitude": 20.72999992, - "longitude": -89.8487281 - }, - "31024": { - "latitude": 20.47147011, - "longitude": -89.2807338 - }, - "31025": { - "latitude": 20.40215716, - "longitude": -89.44465382 - }, - "31026": { - "latitude": 21.25592567, - "longitude": -89.34249046 - }, - "31027": { - "latitude": 21.29136151, - "longitude": -89.02505695 - }, - "31028": { - "latitude": 21.43361334, - "longitude": -88.66837592 - }, - "31029": { - "latitude": 21.33178032, - "longitude": -88.73536934 - }, - "31030": { - "latitude": 20.83547079, - "longitude": -88.53360071 - }, - "31031": { - "latitude": 21.08421779, - "longitude": -88.83979105 - }, - "31032": { - "latitude": 21.02120503, - "longitude": -88.35707775 - }, - "31033": { - "latitude": 20.56534144, - "longitude": -90.21681676 - }, - "31034": { - "latitude": 20.80753157, - "longitude": -89.24553897 - }, - "31035": { - "latitude": 20.87601837, - "longitude": -89.15922361 - }, - "31036": { - "latitude": 20.68104083, - "longitude": -89.2520665 - }, - "31037": { - "latitude": 20.69580664, - "longitude": -89.13150791 - }, - "31038": { - "latitude": 21.07240294, - "longitude": -89.9830479 - }, - "31039": { - "latitude": 21.23771036, - "longitude": -89.47349088 - }, - "31040": { - "latitude": 20.915678200000002, - "longitude": -88.98680514 - }, - "31041": { - "latitude": 20.91855407, - "longitude": -89.53688908 - }, - "31042": { - "latitude": 20.75982465, - "longitude": -88.98353862 - }, - "31043": { - "latitude": 20.59962858, - "longitude": -88.43751118 - }, - "31044": { - "latitude": 20.85176579, - "longitude": -90.0508828 - }, - "31045": { - "latitude": 20.64155383, - "longitude": -89.89896355 - }, - "31046": { - "latitude": 20.50261242, - "longitude": -89.38335188 - }, - "31047": { - "latitude": 20.38396651, - "longitude": -89.36898726 - }, - "31048": { - "latitude": 20.62194226, - "longitude": -90.06972589 - }, - "31049": { - "latitude": 20.49116068, - "longitude": -89.18590727 - }, - "31050": { - "latitude": 20.98406703, - "longitude": -89.63952414 - }, - "31051": { - "latitude": 21.13242902, - "longitude": -89.45419552 - }, - "31052": { - "latitude": 21.14382651, - "longitude": -89.27801583 - }, - "31053": { - "latitude": 20.45329423, - "longitude": -89.73825346 - }, - "31054": { - "latitude": 21.051043300000003, - "longitude": -89.32380262 - }, - "31055": { - "latitude": 20.5512765, - "longitude": -89.84671148 - }, - "31056": { - "latitude": 20.14716664, - "longitude": -89.52253785 - }, - "31057": { - "latitude": 21.35377913, - "longitude": -88.30880151 - }, - "31058": { - "latitude": 20.077486800000003, - "longitude": -88.82791737 - }, - "31059": { - "latitude": 21.23039692, - "longitude": -89.67105223 - }, - "31060": { - "latitude": 20.84269388, - "longitude": -88.63583467 - }, - "31061": { - "latitude": 21.547225199999996, - "longitude": -88.08449719 - }, - "31062": { - "latitude": 20.52877179, - "longitude": -89.61901567 - }, - "31063": { - "latitude": 20.84075409, - "longitude": -89.91775368 - }, - "31064": { - "latitude": 20.76411652, - "longitude": -89.21018653 - }, - "31065": { - "latitude": 21.49390515, - "longitude": -88.3145486 - }, - "31066": { - "latitude": 20.26830001, - "longitude": -89.72647657 - }, - "31067": { - "latitude": 20.84100267, - "longitude": -89.37085568 - }, - "31068": { - "latitude": 21.27040025, - "longitude": -89.19865568 - }, - "31069": { - "latitude": 20.60745617, - "longitude": -88.98802889 - }, - "31070": { - "latitude": 21.20965766, - "longitude": -88.37183609 - }, - "31071": { - "latitude": 20.80483831, - "longitude": -88.8892138 - }, - "31072": { - "latitude": 21.10419325, - "longitude": -89.15125015 - }, - "31073": { - "latitude": 20.24777726, - "longitude": -88.9046864 - }, - "31074": { - "latitude": 20.89467971, - "longitude": -89.28562926 - }, - "31075": { - "latitude": 20.37731326, - "longitude": -89.22147358 - }, - "31076": { - "latitude": 20.66169306, - "longitude": -89.45733988 - }, - "31077": { - "latitude": 21.02193444, - "longitude": -88.84828985 - }, - "31078": { - "latitude": 21.00616039, - "longitude": -89.10192731 - }, - "31079": { - "latitude": 19.93222866, - "longitude": -89.30074612 - }, - "31080": { - "latitude": 20.57079082, - "longitude": -89.27298493 - }, - "31081": { - "latitude": 20.49303311, - "longitude": -88.39581352 - }, - "31082": { - "latitude": 21.21748393, - "longitude": -89.2557063 - }, - "31083": { - "latitude": 21.31297696, - "longitude": -89.27743018 - }, - "31084": { - "latitude": 21.16703414, - "longitude": -88.87353539 - }, - "31085": { - "latitude": 20.89859084, - "longitude": -88.0644649 - }, - "31086": { - "latitude": 21.06802574, - "longitude": -89.00247549 - }, - "31087": { - "latitude": 20.95619609, - "longitude": -90.05809417 - }, - "31088": { - "latitude": 21.06564334, - "longitude": -89.06610202 - }, - "31089": { - "latitude": 20.36038806, - "longitude": -89.56129083 - }, - "31090": { - "latitude": 20.76611742, - "longitude": -89.53564071 - }, - "31091": { - "latitude": 20.7266263, - "longitude": -88.50839668 - }, - "31092": { - "latitude": 20.39167374, - "longitude": -88.32315289 - }, - "31093": { - "latitude": 20.9787432, - "longitude": -89.37603631 - }, - "31094": { - "latitude": 20.24682346, - "longitude": -89.0869485 - }, - "31095": { - "latitude": 20.96347123, - "longitude": -89.46454423 - }, - "31096": { - "latitude": 21.25719612, - "longitude": -87.84787496 - }, - "31097": { - "latitude": 20.88623214, - "longitude": -88.74680818 - }, - "31098": { - "latitude": 19.93803502, - "longitude": -89.04678505 - }, - "31099": { - "latitude": 20.78006325, - "longitude": -88.36235766 - }, - "31100": { - "latitude": 21.06295726, - "longitude": -89.77988664 - }, - "31101": { - "latitude": 20.85247342, - "longitude": -89.76543103 - }, - "31102": { - "latitude": 20.63837323, - "longitude": -88.10839363 - }, - "31103": { - "latitude": 20.80520118, - "longitude": -89.12382555 - }, - "31104": { - "latitude": 20.48064363, - "longitude": -88.76971405 - }, - "31105": { - "latitude": 21.05726025, - "longitude": -89.44381964 - }, - "31106": { - "latitude": 21.28818859, - "longitude": -89.12039399 - }, - "32001": { - "latitude": 21.47234922, - "longitude": -103.0738144 - }, - "32002": { - "latitude": 21.46699466, - "longitude": -102.6918762 - }, - "32003": { - "latitude": 21.78651371, - "longitude": -103.4465838 - }, - "32004": { - "latitude": 21.495632500000003, - "longitude": -103.58179890000001 - }, - "32005": { - "latitude": 22.95689517, - "longitude": -102.7468215 - }, - "32006": { - "latitude": 23.57732787, - "longitude": -102.732615 - }, - "32007": { - "latitude": 24.4532314, - "longitude": -101.24127829999999 - }, - "32008": { - "latitude": 22.44872831, - "longitude": -102.390194 - }, - "32009": { - "latitude": 23.41807054, - "longitude": -103.910391 - }, - "32010": { - "latitude": 23.23682677, - "longitude": -102.99593829999999 - }, - "32011": { - "latitude": 21.21692275, - "longitude": -103.5031997 - }, - "32012": { - "latitude": 22.47794983, - "longitude": -102.55918609999999 - }, - "32013": { - "latitude": 23.01550299, - "longitude": -102.78784920000001 - }, - "32014": { - "latitude": 24.1374517, - "longitude": -102.8116043 - }, - "32015": { - "latitude": 21.99905422, - "longitude": -103.0500905 - }, - "32016": { - "latitude": 22.69015672, - "longitude": -102.119984 - }, - "32017": { - "latitude": 22.78020305, - "longitude": -102.4076267 - }, - "32018": { - "latitude": 21.77208281, - "longitude": -102.9278647 - }, - "32019": { - "latitude": 21.62368163, - "longitude": -102.9982926 - }, - "32020": { - "latitude": 22.72548291, - "longitude": -102.9919733 - }, - "32021": { - "latitude": 23.1752088, - "longitude": -103.9533271 - }, - "32022": { - "latitude": 24.29426611, - "longitude": -103.30318170000001 - }, - "32023": { - "latitude": 21.37670669, - "longitude": -103.124084 - }, - "32024": { - "latitude": 22.28458235, - "longitude": -101.9588052 - }, - "32025": { - "latitude": 22.43429897, - "longitude": -102.22555759999999 - }, - "32026": { - "latitude": 24.351924, - "longitude": -101.92279570000001 - }, - "32027": { - "latitude": 24.91536222, - "longitude": -101.9999469 - }, - "32028": { - "latitude": 21.19454955, - "longitude": -103.3337552 - }, - "32029": { - "latitude": 24.11737418, - "longitude": -103.4883779 - }, - "32030": { - "latitude": 21.93903296, - "longitude": -103.2480939 - }, - "32031": { - "latitude": 22.3750562, - "longitude": -103.4618775 - }, - "32032": { - "latitude": 22.85246269, - "longitude": -102.6728816 - }, - "32033": { - "latitude": 21.19863024, - "longitude": -103.1643097 - }, - "32034": { - "latitude": 21.41740362, - "longitude": -102.8595105 - }, - "32035": { - "latitude": 22.39669921, - "longitude": -101.9155517 - }, - "32036": { - "latitude": 22.56837522, - "longitude": -102.2164423 - }, - "32037": { - "latitude": 22.99132371, - "longitude": -102.4757078 - }, - "32038": { - "latitude": 22.26901611, - "longitude": -101.5287983 - }, - "32039": { - "latitude": 23.78296103, - "longitude": -103.0318616 - }, - "32040": { - "latitude": 23.56319824, - "longitude": -103.23993399999999 - }, - "32041": { - "latitude": 24.44965761, - "longitude": -100.9047093 - }, - "32042": { - "latitude": 23.64016114, - "longitude": -103.61477959999999 - }, - "32043": { - "latitude": 22.63129794, - "longitude": -103.19397990000002 - }, - "32044": { - "latitude": 21.93434276, - "longitude": -102.9331123 - }, - "32045": { - "latitude": 21.62446268, - "longitude": -103.35672609999999 - }, - "32046": { - "latitude": 22.44411107, - "longitude": -103.13684090000001 - }, - "32047": { - "latitude": 21.36371462, - "longitude": -103.4532459 - }, - "32048": { - "latitude": 21.78479068, - "longitude": -103.2271853 - }, - "32049": { - "latitude": 22.77899578, - "longitude": -103.7528186 - }, - "32050": { - "latitude": 22.84805234, - "longitude": -102.48264209999999 - }, - "32051": { - "latitude": 23.60483576, - "longitude": -102.1763669 - }, - "32052": { - "latitude": 22.12966107, - "longitude": -101.89235529999999 - }, - "32053": { - "latitude": 22.55186595, - "longitude": -101.9537329 - }, - "32054": { - "latitude": 22.40735843, - "longitude": -101.7143185 - }, - "32055": { - "latitude": 22.29826525, - "longitude": -102.85150829999999 - }, - "32056": { - "latitude": 22.73573457, - "longitude": -102.67807859999999 - }, - "32057": { - "latitude": 22.75562892, - "longitude": -102.3120031 - }, - "32058": { - "latitude": 21.52254413, - "longitude": -103.3439 - } - } -} diff --git a/ingestion/functions/parsing/mexico/input_event.json b/ingestion/functions/parsing/mexico/input_event.json deleted file mode 100644 index 06cab1762..000000000 --- a/ingestion/functions/parsing/mexico/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "5f77335466b1ce0028f328b1/2020/10/02/1410/content.csv", - "sourceUrl": "http://datosabiertos.salud.gob.mx/gobmx/salud/datos_abiertos/datos_abiertos_covid19.zip", - "sourceId": "5f77335466b1ce0028f328b1" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/mexico/mexico.py b/ingestion/functions/parsing/mexico/mexico.py deleted file mode 100644 index be574af6f..000000000 --- a/ingestion/functions/parsing/mexico/mexico.py +++ /dev/null @@ -1,259 +0,0 @@ -import os -import sys -from datetime import datetime -import csv -import json -import common.ingestion_logging as logging - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - -logger = logging.getLogger(__name__) - -with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "dictionaries.json"), encoding='utf-8') as json_file: - maps = json.load(json_file) - -_COMORBIDITIES_DICT = maps["comorbidities"] - -_STATES = maps["states"] - -_MUNICIPALITIES = maps["municipalities"] - -_MUNICIPALITY_COORD = maps["municipality_coords"] - -def convert_location(state_code: str, municipality_code: str): - """ - Convert state and municipality codes into location query. - """ - query_list = [] - missing_value_prefix = "9" - if municipality_code[0] != missing_value_prefix: - try: - query_list.append(_MUNICIPALITIES[state_code + municipality_code]) - except KeyError: - logger.warning(f"Municipality code missing: {state_code} {municipality_code}") - if state_code[0] != missing_value_prefix: - try: - query_list.append(_STATES[state_code]) - except KeyError: - logger.warning(f"State Code Missing: {state_code}") - query_string = ", ".join(query_list + ["MÉXICO"]) - try: - municipality_code = state_code + municipality_code - return { - "administrativeAreaLevel1": _STATES[state_code], - "administrativeAreaLevel2": _MUNICIPALITIES[municipality_code], - "geoResolution": "Admin2", - "country": "Mexico", - "name": query_string, - "geometry": { - "latitude": _MUNICIPALITY_COORD[municipality_code]["latitude"], - "longitude": _MUNICIPALITY_COORD[municipality_code]["longitude"] - } - } - except KeyError: - return {"query": query_string} - -def convert_date(raw_date): - """ - Convert raw date field into a value interpretable by the dataserver. - """ - date = datetime.strptime(raw_date, "%Y-%m-%d") - return date.strftime("%m/%d/%YZ") - - -def convert_gender(raw_gender: str): - if raw_gender == "2": - return "Male" - if raw_gender == "1": - return "Female" - - -def convert_events(date_admitted, hospitalized, icu, date_death, date_symptoms): - events = [ - { - "name": "confirmed", - "dateRange": { - "start": convert_date(date_admitted), - "end": convert_date(date_admitted), - }, - } - ] - if hospitalized == "2": - events.append( - { - "name": "hospitalAdmission", - "dateRange": { - "start": convert_date(date_admitted), - "end": convert_date(date_admitted), - }, - "value": "Yes", - } - ) - if icu == "1": - events.append( - { - "name": "icuAdmission", - "dateRange": { - "start": convert_date(date_admitted), - "end": convert_date(date_admitted), - }, - "value": "Yes", - } - ) - if date_death != "9999-99-99": - events.append( - { - "name": "outcome", - "dateRange": { - "start": convert_date(date_death), - "end": convert_date(date_death), - }, - "value": "Death", - } - ) - if date_symptoms: - events.append( - { - "name": "onsetSymptoms", - "dateRange": { - "start": convert_date(date_symptoms), - "end": convert_date(date_symptoms), - } - } - ) - return events - - -def convert_demographics(gender: str, age: str, nationality: str, national_origin: str): - demo = {} - if gender: - demo["gender"] = convert_gender(gender) - if age: - if float(age) < 120: - demo["ageRange"] = {"start": float(age), "end": float(age)} - if nationality == "1": - demo["nationalities"] = ["Mexican"] - elif nationality == "2": - demo["nationalities"] = [national_origin] - return demo or None - - -def convert_notes( - pregnant: str, - speaks_indig: str, - contact: str, - migrant: str, - immunosuppressed: str, - smoker: str, - identifies_indigenous: str, - other: str, -): - raw_notes = [] - if pregnant == "1": - raw_notes.append("Pregnant") - if speaks_indig == "1": - raw_notes.append("Speaks indigenous language") - if contact == "1": - raw_notes.append("Had contact with other SARS CoV-2 case") - if migrant == "1": - raw_notes.append("Migrant") - if immunosuppressed == "1": - raw_notes.append("Patient with immunosupression") - if smoker == "1": - raw_notes.append("Smoker") - if identifies_indigenous == "1": - raw_notes.append("Self-identifies as indigenous") - if other == "1": - raw_notes.append("Unspecified pre-existing condition") - notes = (", ").join(raw_notes) - if notes == "": - return None - return notes - - -def parse_cases(raw_data_file: str, source_id: str, source_url: str): - """ - Parses G.h-format case data from raw API data. - """ - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f) - for row in reader: - classification = parsing_lib.safe_int(row.get('CLASIFICACION_FINAL', None)) - # 1 CASO DE COVID-19 CONFIRMADO POR ASOCIACIÓN CLÍNICA EPIDEMIOLÓGICA - # 2 CASO DE COVID-19 CONFIRMADO POR COMITÉ DE DICTAMINACIÓN - # 3 CASO DE SARS-COV-2 CONFIRMADO - # 4 INVÁLIDO POR LABORATORIO - # 5 NO REALIZADO POR LABORATORIO - # 6 CASO SOSPECHOSO - # 7 NEGATIVO A SARS-COV-2 - if classification not in [1, 2, 3]: - continue - try: - case = { - "caseReference": { - "sourceId": source_id, - "sourceUrl": source_url, - "sourceEntryId": row["ID_REGISTRO"]}, - "location": convert_location( - row["ENTIDAD_RES"], row["MUNICIPIO_RES"] - ), - "events": convert_events( - row["FECHA_INGRESO"], - row["TIPO_PACIENTE"], - row["UCI"], - row["FECHA_DEF"], - row["FECHA_SINTOMAS"] - ), - "demographics": convert_demographics( - row["SEXO"], - row["EDAD"], - row["NACIONALIDAD"], - row["PAIS_ORIGEN"], - ), - } - if row["NEUMONIA"] == "1": - row["symptoms"] = {"status": "Symptomatic", "values": ["Pneumonia"]} - if any([row[k] == "1" for k in _COMORBIDITIES_DICT.keys()]): - case["preexistingConditions"] = { - "values": [ - _COMORBIDITIES_DICT[k] - for k in _COMORBIDITIES_DICT.keys() - if row[k] == "1" - ] - } - notes = convert_notes( - row["EMBARAZO"], - row["HABLA_LENGUA_INDIG"], - row["OTRO_CASO"], - row["MIGRANTE"], - row["INMUSUPR"], - row["TABAQUISMO"], - row["INDIGENA"], - row["OTRA_COM"], - ) - if notes: - case["notes"] = notes - yield case - except ValueError as ve: - raise ValueError(f"Unhandled data: {ve}") - - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/mexico/mexico_test.py b/ingestion/functions/parsing/mexico/mexico_test.py deleted file mode 100644 index d4a7835d0..000000000 --- a/ingestion/functions/parsing/mexico/mexico_test.py +++ /dev/null @@ -1,56 +0,0 @@ -import os -import unittest - -from mexico import mexico - -_SOURCE_ID = "abc123" -_SOURCE_URL = "https://mex.ico" -_PARSED_CASES = [{ - "caseReference": {"sourceId": "abc123", "sourceUrl": "https://mex.ico", "sourceEntryId": "147685"}, - "location": { - "administrativeAreaLevel1": "MÉXICO", - "administrativeAreaLevel2": 'ATIZAPÁN DE ZARAGOZA', - "country": "Mexico", - "geoResolution": "Admin2", - "geometry": {"latitude": 19.56480728, "longitude": -99.27404399}, - "name": "ATIZAPÁN DE ZARAGOZA, MÉXICO, MÉXICO" - }, - "events": [ - { - "name": "confirmed", - "dateRange": {"start": "04/28/2020Z", "end": "04/28/2020Z"}, - }, - { - "name": "hospitalAdmission", - "dateRange": {"start": "04/28/2020Z", "end": "04/28/2020Z"}, - "value": "Yes", - }, - { - "name": "outcome", - "dateRange": {"start": "05/09/2020Z", "end": "05/09/2020Z"}, - "value": "Death", - }, - { - "name": "onsetSymptoms", - "dateRange": {"start": "04/28/2020Z", "end": "04/28/2020Z"}, - } - ], - "demographics": { - "gender": "Male", - "ageRange": {"start": 56.0, "end": 56.0}, - "nationalities": ["Mexican"], - }, - "preexistingConditions": {"values": ["obesity"]}, - "notes": "Smoker", -}] - - -class MexicoTest(unittest.TestCase): - def test_parse(self): - # Default of 1500 is not enough to show diffs when there is one. - self.maxDiff = 5000 - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = mexico.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertEqual(list(result), _PARSED_CASES) diff --git a/ingestion/functions/parsing/mexico/sample_data.csv b/ingestion/functions/parsing/mexico/sample_data.csv deleted file mode 100644 index db23fedd7..000000000 --- a/ingestion/functions/parsing/mexico/sample_data.csv +++ /dev/null @@ -1,3 +0,0 @@ -FECHA_ACTUALIZACION,ID_REGISTRO,ORIGEN,SECTOR,ENTIDAD_UM,SEXO,ENTIDAD_NAC,ENTIDAD_RES,MUNICIPIO_RES,TIPO_PACIENTE,FECHA_INGRESO,FECHA_SINTOMAS,FECHA_DEF,INTUBADO,NEUMONIA,EDAD,NACIONALIDAD,EMBARAZO,HABLA_LENGUA_INDIG,INDIGENA,DIABETES,EPOC,ASMA,INMUSUPR,HIPERTENSION,OTRA_COM,CARDIOVASCULAR,OBESIDAD,RENAL_CRONICA,TABAQUISMO,OTRO_CASO,TOMA_MUESTRA_LAB,RESULTADO_LAB,TOMA_MUESTRA_ANTIGENO,RESULTADO_ANTIGENO,CLASIFICACION_FINAL,MIGRANTE,PAIS_NACIONALIDAD,PAIS_ORIGEN,UCI -2020-09-15,147685,2,4,15,2,15,15,013,2,2020-04-28,2020-04-28,2020-05-09,2,2,56,1,97,2,2,2,2,2,2,2,2,2,1,2,1,99,1,99,1,1,2,2,México,99,2 -2020-09-15,147680,2,4,15,2,15,15,013,2,2020-04-28,2020-04-28,2020-05-09,2,2,56,1,97,1,1,2,2,2,2,2,2,2,1,2,1,99,1,99,1,1,5,1,México,99,2 diff --git a/ingestion/functions/parsing/new_zealand/__init__.py b/ingestion/functions/parsing/new_zealand/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/new_zealand/geocodes.json b/ingestion/functions/parsing/new_zealand/geocodes.json deleted file mode 100644 index 2b1ff8cba..000000000 --- a/ingestion/functions/parsing/new_zealand/geocodes.json +++ /dev/null @@ -1,22 +0,0 @@ -{ -"Auckland": {"latitude": -36.8520950, "longitude": 174.7631803}, -"Bay of Plenty": {"latitude": -37.9519223, "longitude": 176.9945977}, -"Canterbury": {"latitude": -43.53095, "longitude": 172.63665}, -"Capital and Coast": {"latitude": -41.2887953, "longitude": 174.7772114}, -"Counties Manukau": {"latitude": -36.9938877, "longitude": 174.8774715}, -"Hawke's Bay": {"latitude": -39.4343, "longitude": 176.76526}, -"Hutt Valley": {"latitude": -41.12407, "longitude": 175.06996}, -"Lakes": {"latitude": -38.1381493, "longitude": 176.25292}, -"MidCentral": {"latitude": -40.356317, "longitude": 175.6112388}, -"Nelson Marlborough": {"latitude": -41.2710849, "longitude": 173.2836756}, -"Northland": {"latitude": -35.37127, "longitude": 173.74053}, -"South Canterbury": {"latitude": -44.1113, "longitude": 170.6918}, -"Southern": {"latitude": -45.3343708, "longitude": 168.7175147}, -"Tairawhiti": {"latitude": -38.25112, "longitude": 178.14891}, -"Taranaki": {"latitude": -39.3388499, "longitude": 174.2875945}, -"Waikato": {"latitude": -37.7878809, "longitude": 175.281788}, -"Wairarapa": {"latitude": -41.0243023, "longitude": 175.5259467}, -"Waitemata": {"latitude": -36.8805554, "longitude": 174.6333709}, -"West Coast": {"latitude": -42.87387, "longitude": 171.15336}, -"Whanganui": {"latitude": -39.9324904, "longitude": 175.0519306} -} diff --git a/ingestion/functions/parsing/new_zealand/input_event.json b/ingestion/functions/parsing/new_zealand/input_event.json deleted file mode 100644 index e50434fc7..000000000 --- a/ingestion/functions/parsing/new_zealand/input_event.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "test/new_zealand/new_zealand_jan14.csv", - "sourceUrl": "https://www.health.govt.nz/system/files/documents/pages/covid_cases_2021-01-13_0.csv", - "sourceId": "5ffd5fb27a354a0038b37dfd" -} - diff --git a/ingestion/functions/parsing/new_zealand/new_zealand.py b/ingestion/functions/parsing/new_zealand/new_zealand.py deleted file mode 100644 index 1c476b83e..000000000 --- a/ingestion/functions/parsing/new_zealand/new_zealand.py +++ /dev/null @@ -1,147 +0,0 @@ -import json -import os -import sys -from datetime import datetime -import csv -from pathlib import Path - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - -_NZ = parsing_lib.geocode_country('NZ') -_NZ["country"] = "New Zealand" - -_DHB = "DHB" -_REPORT_DATE = "Report Date" -_STATUS = "Case Status" -_GENDER = "Sex" -_AGE = "Age group" -_TRAVEL = "Overseas travel" - -# Geocode data © OpenStreetMap contributors https://www.openstreetmap.org/copyright - -# New Zealand data is organised by District Health Boards (DHBs) which are -# mostly similar to the regions (admin1 for NZ), but do not overlap in some -# cases. The mapping has been done manually via centroids or a city or town -# in the region. -with (Path(__file__).parent / 'geocodes.json').open() as geof: - _GEOCODES = json.load(geof) -_GEOCODES = { - g: { - "name": g, - # not really admin1, but close enough - "administrativeAreaLevel1": g, - "country": "New Zealand", - "geoResolution": "Admin1", - "geometry": _GEOCODES[g] - } - for g in _GEOCODES -} - - -def convert_date(raw_date: str): - "Convert raw date field into a value interpretable by the dataserver" - return datetime.fromisoformat(raw_date).strftime("%m/%d/%YZ") - - -def convert_location(raw_entry): - dhb = raw_entry[_DHB] - return _GEOCODES.get(dhb) or _NZ - - -def convert_demographics(entry): - ''' - If age is listed as 90+, setting age range as between 90 and 120. - ''' - demo = {} - if (age := entry[_AGE]) not in ["NA", "Unknown"]: - if '+' in age: - start = int(age.rstrip('+')) - demo["ageRange"] = {"start": start, "end": 120} - else: - start, end = list(map(int, age.split(' to '))) - demo["ageRange"] = {"start": start, "end": end} - if (gender := entry[_GENDER]) != "Unknown": - demo["gender"] = gender if gender in ['Male', 'Female'] else None - - return demo or None - - -def parse_cases(raw_data_file, source_id, source_url): - """ - Parses G.h-format case data from raw API data. - - New Zealand case data has no UUIDs, and provides just 6 fields: - - Age group - we convert 90+ to ageRange of 90 - 120 - Case Status - (confirmed/suspected), we take only confirmed - DHB (where the case lives - listed as "Managed isolation & quarantine" for border cases) - Overseas Travel - boolean, no details on where. We assume this means travel in last 30 days. - Report Date - Sex - - We only count cases with a Report Date and with Status=Confirmed - - Cases arriving to NZ from 'Overseas' are geocoded generically to 'New Zealand'. Cases arising in NZ should - have health board data (equivalent to admin1) - """ - - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f) - cases = [] - for entry in reader: - if entry[_STATUS] == 'Confirmed' and entry[_REPORT_DATE]: - notes = [] - case = { - "caseReference": { - "sourceId": source_id, - "sourceUrl": source_url - }, - "location": convert_location(entry), - "demographics": convert_demographics(entry), - "events": [ - { - "name": "confirmed", - "dateRange": - { - "start": convert_date(entry[_REPORT_DATE]), - "end": convert_date(entry[_REPORT_DATE]) - } - }, - ] - } - if case["demographics"] is None: - del case["demographics"] - if entry[_TRAVEL] == 'Yes': - case["travelHistory"] = { - "traveledPrior30Days": True - } - notes.append('Case imported from abroad.') - - if 'Managed Isolation' in entry[_DHB]: - notes.append( - 'Case identified at border and placed into managed quarantine.') - - if notes: - case["notes"] = " ".join(notes) - - yield case - - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/new_zealand/new_zealand_test.py b/ingestion/functions/parsing/new_zealand/new_zealand_test.py deleted file mode 100644 index a7ca32402..000000000 --- a/ingestion/functions/parsing/new_zealand/new_zealand_test.py +++ /dev/null @@ -1,103 +0,0 @@ -import os -import unittest -from new_zealand import new_zealand -# import new_zealand -from pprint import pprint - -_SOURCE_ID = "placeholder_ID" -_SOURCE_URL = "placeholder_URL" - -_caseReference = {"sourceId": "placeholder_ID", "sourceUrl": "placeholder_URL"} -_NZ = { - "country": "New Zealand", - "name": "New Zealand", - "geoResolution": "Country", - "geometry": { - "latitude": -40.900557, - "longitude": 174.885971, - }, -} - -_Bay_of_Plenty = { - "country": "New Zealand", - "name": "Bay of Plenty", - "administrativeAreaLevel1": "Bay of Plenty", - "geoResolution": "Admin1", - "geometry": { - "latitude": -37.9519223, - "longitude": 176.9945977, - }, -} - -_West_Coast = { - "country": "New Zealand", - "name": "West Coast", - "administrativeAreaLevel1": "West Coast", - "geoResolution": "Admin1", - "geometry": { - "latitude": -42.87387, - "longitude": 171.15336, - }, -} - -_notes = ( - "Case imported from abroad. " - "Case identified at border and placed into managed quarantine." -) - - -def _c(location, gender, age_start, age_end, confirmed_date, travel=False, notes=None): - demographics = {} - if age_start is not None and age_end is not None: - demographics["ageRange"] = {"start": age_start, "end": age_end} - if gender: - demographics["gender"] = gender - C = { - "caseReference": _caseReference, - "location": location, - "events": [ - { - "name": "confirmed", - "dateRange": {"start": confirmed_date, "end": confirmed_date}, - } - ], - } - if demographics: - C["demographics"] = demographics - if travel: - C["travelHistory"] = {"traveledPrior30Days": True} - if notes: - C["notes"] = notes - return C - - -_CASES = [ - _c(_NZ, "Male", 40, 49, "01/11/2021Z", True, _notes), - _c(_NZ, "Female", 40, 49, "01/11/2021Z", True, _notes), - _c(_NZ, "Male", 20, 29, "01/11/2021Z", True, _notes), - _c(_NZ, "Female", 10, 19, "01/11/2021Z", True, _notes), - _c(_NZ, "Male", 30, 39, "01/10/2021Z", True, _notes), - _c(_NZ, "Male", 0, 9, "01/10/2021Z", True, _notes), - _c(_NZ, "Male", 30, 39, "01/10/2021Z", True, _notes), - _c(_NZ, "Male", 20, 29, "01/10/2021Z", True, _notes), - _c(_Bay_of_Plenty, "Female", 90, 120, "05/05/2021Z", True, "Case imported from abroad."), - _c(_West_Coast, "Female", 20, 29, "05/06/2021Z", False), - _c(_West_Coast, None, None, None, "07/01/2021Z", False), - _c(_West_Coast, None, None, None, "07/01/2021Z", False), -] - - -class NewZealandTest(unittest.TestCase): - def setUp(self): - self.maxDiff = 5000 - - def test_parse(self): - """ - Includes a row where province and district are unspecified, where it should return just - the department and country - """ - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = new_zealand.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), _CASES) diff --git a/ingestion/functions/parsing/new_zealand/sample_data.csv b/ingestion/functions/parsing/new_zealand/sample_data.csv deleted file mode 100644 index b5e1dddad..000000000 --- a/ingestion/functions/parsing/new_zealand/sample_data.csv +++ /dev/null @@ -1,13 +0,0 @@ -Report Date,Case Status,Sex,Age group,DHB,Overseas travel,Historical -2021-01-11,Confirmed,Male,40 to 49,Managed Isolation & Quarantine,Yes, -2021-01-11,Confirmed,Female,40 to 49,Managed Isolation & Quarantine,Yes, -2021-01-11,Confirmed,Male,20 to 29,Managed Isolation & Quarantine,Yes, -2021-01-11,Confirmed,Female,10 to 19,Managed Isolation & Quarantine,Yes, -2021-01-10,Confirmed,Male,30 to 39,Managed Isolation & Quarantine,Yes, -2021-01-10,Confirmed,Male,0 to 9,Managed Isolation & Quarantine,Yes, -2021-01-10,Confirmed,Male,30 to 39,Managed Isolation & Quarantine,Yes, -2021-01-10,Confirmed,Male,20 to 29,Managed Isolation & Quarantine,Yes, -2021-05-05,Confirmed,Female,90+,Bay of Plenty,Yes, -2021-05-06,Confirmed,Female,20 to 29,West Coast,No, -2021-07-01,Confirmed,Unknown,NA,West Coast,No, -2021-07-01,Confirmed,Unknown,Unknown,West Coast,No, diff --git a/ingestion/functions/parsing/paraguay/__init__.py b/ingestion/functions/parsing/paraguay/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/paraguay/input_event.json b/ingestion/functions/parsing/paraguay/input_event.json deleted file mode 100644 index 25173e581..000000000 --- a/ingestion/functions/parsing/paraguay/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "5fc9076b25afc8003ac42327/2020/12/03/1603/content.csv", - "sourceUrl": "https://public.tableau.com/vizql/w/COVID19PY-Registros/v/Descargardatos/vudcsv/sessions/D8CB602652A24E009F367E19322820E5-0:0/views/7713620505763405234_2641841674343653269?showall=true&underlying_table_id=Migrated%20Data&underlying_table_caption=Full%20Data", - "sourceId": "5fc9076b25afc8003ac42327" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/paraguay/paraguay.py b/ingestion/functions/parsing/paraguay/paraguay.py deleted file mode 100644 index dc23d88a5..000000000 --- a/ingestion/functions/parsing/paraguay/paraguay.py +++ /dev/null @@ -1,123 +0,0 @@ -import json -import os -import sys -from datetime import datetime -import csv - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - - -_UUID = "ID" -_AGE = "Edad" -_GENDER = "Sexo" -_DEPARTMENT = "Departamento Residencia" -_DISTRICT = "Distrito Residencia" -_DATE_CONFIRMED = "Fecha Confirmacion" -_QUARANTINED = "En Albergue?" - - -def convert_date(raw_date): - """ - Convert raw date field into a value interpretable by the dataserver. - """ - # Some date fields are empty - try: - date = datetime.strptime(raw_date, "%d/%m/%Y") - return date.strftime("%m/%d/%YZ") - except: - return None - - -def convert_gender(raw_gender: str): - if raw_gender == "MASCULINO": - return "Male" - if raw_gender == "FEMENINO": - return "Female" - - -def convert_events(date_confirmed): - events = [ - { - "name": "confirmed", - "dateRange": { - "start": convert_date(date_confirmed), - "end": convert_date(date_confirmed), - }, - } - ] - return events - - -def convert_demographics(gender: str, age: str): - if all(item is None for item in [gender, age]): - return None - demo = {} - if gender: - demo["gender"] = convert_gender(gender) - if age and int(age) < 120: - demo["ageRange"] = {"start": float(age), "end": float(age)} - return demo - - -def convert_notes(quarantined): - raw_notes = [] - if quarantined == "SI": - raw_notes.append("Patient was/is in quarantine") - - if raw_notes: - return (", ").join(raw_notes) - - -def parse_cases(raw_data_file: str, source_id: str, source_url: str): - """ - Parses G.h-format case data from raw API data. - """ - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f, delimiter=",") - for row in reader: - age = int(row[_AGE]) - date_confirmed = convert_date(row[_DATE_CONFIRMED]) - # Cases with age 999 are in the process of being confirmed - if age != 999 and date_confirmed is not None: - try: - case = { - "caseReference": {"sourceId": source_id, "sourceEntryId": row[_UUID], "sourceUrl": source_url}, - "location": { - "query": ", ".join( - [row[_DISTRICT], row[_DEPARTMENT], "Paraguay"] - ) - }, - "events": convert_events( - row[_DATE_CONFIRMED] - ), - "demographics": convert_demographics( - row[_GENDER], row[_AGE] - ), - } - notes = convert_notes( - row[_QUARANTINED] - ) - if notes: - case["notes"] = notes - yield case - except ValueError as ve: - raise ValueError(f"error converting case: {ve}") - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) \ No newline at end of file diff --git a/ingestion/functions/parsing/paraguay/paraguay_test.py b/ingestion/functions/parsing/paraguay/paraguay_test.py deleted file mode 100644 index 68b0e7717..000000000 --- a/ingestion/functions/parsing/paraguay/paraguay_test.py +++ /dev/null @@ -1,39 +0,0 @@ -import os -import unittest -from paraguay import paraguay - -_SOURCE_ID = "abc123" -_SOURCE_URL = "https://public.tableau.com/vizql/w/COVID19PY-Registros/v/Descargardatos/vudcsv/sessions/D8CB602652A24E009F367E19322820E5-0:0/views/7713620505763405234_2641841674343653269?showall=true&underlying_table_id=Migrated%20Data&underlying_table_caption=Full%20Data" - -_PARSED_CASE = ({ - "caseReference": { - "sourceId": "abc123", - "sourceEntryId": "65794", - "sourceUrl": "https://public.tableau.com/vizql/w/COVID19PY-Registros/v/Descargardatos/vudcsv/sessions/D8CB602652A24E009F367E19322820E5-0:0/views/7713620505763405234_2641841674343653269?showall=true&underlying_table_id=Migrated%20Data&underlying_table_caption=Full%20Data", - }, - "location": {"query": "CIUDAD DEL ESTE, ALTO PARANA, Paraguay"}, - "events": [ - { - "name": "confirmed", - "dateRange": {"start": "11/06/2020Z", "end": "11/06/2020Z"}, - } - ], - "demographics": { - "gender": "Male", - "ageRange": {"start": 41.0, "end": 41.0} - }, - "notes": "Patient was/is in quarantine", -}) - - -class ParaguayTest(unittest.TestCase): - def test_parse(self): - # Default of 1500 is not enough to show diffs when there is one. - self.maxDiff = 5000 - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = next( - paraguay.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - ) - self.assertCountEqual([result], [_PARSED_CASE]) \ No newline at end of file diff --git a/ingestion/functions/parsing/paraguay/sample_data.csv b/ingestion/functions/parsing/paraguay/sample_data.csv deleted file mode 100644 index 8fdff00ad..000000000 --- a/ingestion/functions/parsing/paraguay/sample_data.csv +++ /dev/null @@ -1,3 +0,0 @@ -ID,Fecha Confirmacion,Sexo,Departamento Residencia,Distrito Residencia,En Albergue?,"""Edad""",Cod Distrito,Cod Dpto,Max Date,Cant. En Albergues,Cant. Fuera de Albergues,Confirmados Total,Edad,Number of Records -65794,06/11/2020,MASCULINO,ALTO PARANA,CIUDAD DEL ESTE,SI,Edad,01,10,01/12/2020,1,0,1,41,1 -65750,05/11/2020,FEMENINO,ITAPUA,ENCARNACION,NO,Edad,01,07,01/12/2020,0,1,1,999,1 \ No newline at end of file diff --git a/ingestion/functions/parsing/peru/__init__.py b/ingestion/functions/parsing/peru/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/peru/geocoding_dictionaries.json b/ingestion/functions/parsing/peru/geocoding_dictionaries.json deleted file mode 100644 index 7765d3ba9..000000000 --- a/ingestion/functions/parsing/peru/geocoding_dictionaries.json +++ /dev/null @@ -1,15136 +0,0 @@ -{ - "department_coords_dict": { - "AMAZONAS": [ - -78.0548917602748, - -5.0707287411804 - ], - "ANCASH": [ - -77.6699663982512, - -9.40702234055441 - ], - "APURIMAC": [ - -72.9753793681974, - -14.0281358675072 - ], - "AREQUIPA": [ - -72.4749243209886, - -15.8434368941805 - ], - "AYACUCHO": [ - -74.0830732330716, - -14.0904798436933 - ], - "CAJAMARCA": [ - -78.7454430596771, - -6.43300318107048 - ], - "CALLAO": [ - -77.125854772583, - -11.9403323012826 - ], - "CUSCO": [ - -72.1686222530541, - -13.1888550694011 - ], - "HUANCAVELICA": [ - -75.0027816260523, - -13.0243905950237 - ], - "HUANUCO": [ - -76.0256144133759, - -9.41619850001883 - ], - "ICA": [ - -75.5735838283943, - -14.2343039983144 - ], - "JUNIN": [ - -74.8790739825008, - -11.5382138128875 - ], - "LA LIBERTAD": [ - -78.3683374884193, - -7.92141326773799 - ], - "LAMBAYEQUE": [ - -79.8268890681323, - -6.34056470804907 - ], - "LIMA": [ - -76.6271728665078, - -11.7855675478949 - ], - "LORETO": [ - -74.4263575657836, - -4.11981135651695 - ], - "MADRE DE DIOS": [ - -70.5346856252107, - -11.9808551099878 - ], - "MOQUEGUA": [ - -70.8384240613374, - -16.8598296116758 - ], - "PASCO": [ - -75.2999105315118, - -10.3988732812141 - ], - "PIURA": [ - -80.335976521202, - -5.12799822444744 - ], - "PUNO": [ - -69.9529600802092, - -14.9271549455403 - ], - "SAN MARTIN": [ - -76.7150270749319, - -7.0341726868716 - ], - "TACNA": [ - -70.2769612631711, - -17.6447171638849 - ], - "TUMBES": [ - -80.5445771840406, - -3.85634757735983 - ], - "UCAYALI": [ - -73.4333617212562, - -9.61991838031103 - ] - }, - "place_capital_coords_dict": { - "ABANCAY, ABANCAY, APURIMAC": [ - -72.8716116233402, - -13.6358415130218 - ], - "ACARI, CARAVELI, AREQUIPA": [ - -74.5582426042272, - -15.3416727972364 - ], - "ACAS, OCROS, ANCASH": [ - -77.3394544625876, - -10.5182987311482 - ], - "ACCHA, PARURO, CUSCO": [ - -71.8626394672192, - -13.9885106516486 - ], - "ACCOCUNCA, ESPINAR, CUSCO": [ - -71.222670942571, - -14.7379441150145 - ], - "ACCOMARCA, VILCAS HUAMAN, AYACUCHO": [ - -73.8674019875557, - -13.8062372642835 - ], - "ACHANIZO, CARAVELI, AREQUIPA": [ - -73.9451650156371, - -15.8248564215061 - ], - "ACHAYA, AZANGARO, PUNO": [ - -70.1777000216524, - -15.240697297148 - ], - "ACHOMA, CAYLLOMA, AREQUIPA": [ - -71.6958456419628, - -15.8221400046491 - ], - "ACO, CARHUAZ, ANCASH": [ - -77.4330013742812, - -9.34392916684078 - ], - "ACO, CONCEPCION, JUNIN": [ - -75.3970799999209, - -11.9553363367792 - ], - "ACO, CORONGO, ANCASH": [ - -77.8834851319363, - -8.50803027348624 - ], - "ACO, OCROS, ANCASH": [ - -77.2248286784743, - -10.5034719628979 - ], - "ACOBAMBA, ACOBAMBA, HUANCAVELICA": [ - -74.5663960124243, - -12.8233134643166 - ], - "ACOBAMBA, SIHUAS, ANCASH": [ - -77.560736533207, - -8.30019592739892 - ], - "ACOBAMBA, TARMA, JUNIN": [ - -75.6568304668378, - -11.3491346944261 - ], - "ACOBAMBILLA, HUANCAVELICA, HUANCAVELICA": [ - -75.3712732321472, - -12.7040921473773 - ], - "ACOCHACA, ASUNCION, ANCASH": [ - -77.4057481205272, - -9.09720867169475 - ], - "ACOCRO, HUAMANGA, AYACUCHO": [ - -74.0209562966421, - -13.3042984943808 - ], - "ACOLLA, JAUJA, JUNIN": [ - -75.5675652983633, - -11.6626625342866 - ], - "ACOMAYO, ACOMAYO, CUSCO": [ - -71.6724776075014, - -13.8931515380544 - ], - "ACOMAYO, HUANUCO, HUANUCO": [ - -76.1107146570563, - -9.61537834385267 - ], - "ACOPAMPA, CARHUAZ, ANCASH": [ - -77.6100103595032, - -9.29003462978671 - ], - "ACOPIA, ACOMAYO, CUSCO": [ - -71.5064659910482, - -14.047070703867 - ], - "ACORA, PUNO, PUNO": [ - -69.9093845433234, - -16.2887543666248 - ], - "ACORIA, HUANCAVELICA, HUANCAVELICA": [ - -74.8235282305523, - -12.5995765559794 - ], - "ACOS VINCHOS, HUAMANGA, AYACUCHO": [ - -74.0556089233433, - -13.1279423878572 - ], - "ACOS, ACOMAYO, CUSCO": [ - -71.7302516176163, - -13.9392922394672 - ], - "ACOS, HUARAL, LIMA": [ - -76.7675033707361, - -11.2929704614503 - ], - "ACOSTAMBO, TAYACAJA, HUANCAVELICA": [ - -75.0117600766547, - -12.4126819821413 - ], - "ACRAQUIA, TAYACAJA, HUANCAVELICA": [ - -74.9392688312603, - -12.3963805447133 - ], - "ACZO, ANTONIO RAYMONDI, ANCASH": [ - -76.9983325300693, - -9.22002148587248 - ], - "AGALLPAMPA, OTUZCO, LA LIBERTAD": [ - -78.4640042298, - -7.94554981517569 - ], - "AGUA BLANCA, EL DORADO, SAN MARTIN": [ - -76.7056971970064, - -6.72414337270179 - ], - "AGUA BLANCA, SAN MIGUEL, CAJAMARCA": [ - -79.0541974684075, - -7.11890827166239 - ], - "AGUAS VERDES, ZARUMILLA, TUMBES": [ - -80.242445617991, - -3.49151627088843 - ], - "AGUAYTIA, PADRE ABAD, UCAYALI": [ - -75.6259546064887, - -8.89861017135788 - ], - "AHUAC, CHUPACA, JUNIN": [ - -75.3515546083106, - -12.0819994248809 - ], - "AHUAYCHA, TAYACAJA, HUANCAVELICA": [ - -74.906166747806, - -12.4441733384983 - ], - "AIJA, AIJA, ANCASH": [ - -77.5676294614706, - -9.80042157002845 - ], - "AJOYANI, CARABAYA, PUNO": [ - -70.2268920335216, - -14.1740360843438 - ], - "ALCA, LA UNION, AREQUIPA": [ - -72.7118703369673, - -15.1674820301897 - ], - "ALCAMENCA, VICTOR FAJARDO, AYACUCHO": [ - -74.2104510250195, - -13.6655360408103 - ], - "ALEXANDER VON HUMBOLDT, PADRE ABAD, UCAYALI": [ - -75.0480213639949, - -8.82492774714689 - ], - "ALFONSO UGARTE, TACNA, TACNA": [ - -70.2409451601948, - -18.1076693553858 - ], - "ALIANZA CRISTIANA, DATEM DEL MARA\u00d1ON, LORETO": [ - -76.6724137783051, - -3.27440540400455 - ], - "ALIS, YAUYOS, LIMA": [ - -75.7039648540287, - -12.2887825722961 - ], - "ALLAUCA, YAUYOS, LIMA": [ - -76.0383592683498, - -12.6400704940543 - ], - "ALTO CAMILACA, CANDARAVE, TACNA": [ - -70.4327437032204, - -17.1650684964339 - ], - "ALTO LARAN, CHINCHA, ICA": [ - -75.9388182251244, - -13.3821559926028 - ], - "AMANTANI, PUNO, PUNO": [ - -69.7106659655394, - -15.6645415266568 - ], - "AMASHCA, CARHUAZ, ANCASH": [ - -77.6448836859484, - -9.22352629340624 - ], - "AMAYBAMBA, LA CONVENCION, CUSCO": [ - -73.2087281724974, - -13.3020219005665 - ], - "AMBAR, HUAURA, LIMA": [ - -77.2677511820886, - -10.7823049380876 - ], - "AMBO, AMBO, HUANUCO": [ - -76.1411772790817, - -10.1501386374297 - ], - "AMELIA /14, MARISCAL RAMON CASTILLA, LORETO": [ - -72.0331142993698, - -4.47746309330621 - ], - "AMOTAPE, PAITA, PIURA": [ - -81.0067650422148, - -4.8355349636955 - ], - "ANANEA, SAN ANTONIO DE PUTINA, PUNO": [ - -69.5049882063517, - -14.6924837966793 - ], - "ANAPIA, YUNGUYO, PUNO": [ - -68.8788268375351, - -16.3253835042672 - ], - "ANCAHUASI, ANTA, CUSCO": [ - -72.3222295790569, - -13.4616252908857 - ], - "ANCHIHUAY, LA MAR, AYACUCHO": [ - -73.7127242786983, - -12.9564943811039 - ], - "ANCHONGA, ANGARAES, HUANCAVELICA": [ - -74.7060384708175, - -12.8873240700046 - ], - "ANCON, LIMA, LIMA": [ - -77.0958073070431, - -11.7025343029234 - ], - "ANDABAMBA, ACOBAMBA, HUANCAVELICA": [ - -74.6549284327827, - -12.6611871850892 - ], - "ANDABAMBA, SANTA CRUZ, CAJAMARCA": [ - -78.8095483610502, - -6.66399333110645 - ], - "ANDAGUA, CASTILLA, AREQUIPA": [ - -72.376817619411, - -15.4850465121236 - ], - "ANDAHUAYLAS, ANDAHUAYLAS, APURIMAC": [ - -73.3879719328062, - -13.7682169211928 - ], - "ANDAHUAYLILLAS, QUISPICANCHI, CUSCO": [ - -71.7003239695908, - -13.6657694234993 - ], - "ANDAJES, OYON, LIMA": [ - -76.9271502108519, - -10.7776031757941 - ], - "ANDAMARCA, CONCEPCION, JUNIN": [ - -74.8571869475326, - -11.696353573419 - ], - "ANDAMARCA, LUCANAS, AYACUCHO": [ - -73.98178561636, - -14.4658193089554 - ], - "ANDARAPA, ANDAHUAYLAS, APURIMAC": [ - -73.3885793315134, - -13.4974434507192 - ], - "ANDARAY, CONDESUYOS, AREQUIPA": [ - -72.8438585246931, - -15.8525163763654 - ], - "ANDAYMARCA, TAYACAJA, HUANCAVELICA": [ - -74.6327374860066, - -12.2985421832864 - ], - "ANGAMOS, REQUENA, LORETO": [ - -73.3444364661579, - -5.75171282584907 - ], - "ANGASMARCA, SANTIAGO DE CHUCO, LA LIBERTAD": [ - -78.0330414634898, - -8.14783730000842 - ], - "ANGUIA, CHOTA, CAJAMARCA": [ - -78.5751986963862, - -6.33807917997495 - ], - "ANISO, PARINACOCHAS, AYACUCHO": [ - -73.1640500725484, - -14.7782737735458 - ], - "ANRA, HUARI, ANCASH": [ - -76.9044566271285, - -9.25252807898609 - ], - "ANTA, ACOBAMBA, HUANCAVELICA": [ - -74.6638481693528, - -12.8172812734049 - ], - "ANTA, ANTA, CUSCO": [ - -72.1599768937721, - -13.4879086614161 - ], - "ANTA, CARHUAZ, ANCASH": [ - -77.6324228738074, - -9.36102152220949 - ], - "ANTABAMBA, ANTABAMBA, APURIMAC": [ - -72.7501192820734, - -14.5179968764682 - ], - "ANTAPARCO, ANGARAES, HUANCAVELICA": [ - -74.4306676479562, - -13.0655211860594 - ], - "ANTAUTA, MELGAR, PUNO": [ - -70.3841406206513, - -14.3546463857476 - ], - "ANTIOQUIA, HUAROCHIRI, LIMA": [ - -76.5890933941509, - -12.0615464050898 - ], - "APATA, JAUJA, JUNIN": [ - -75.2725231386646, - -11.6806677981864 - ], - "APLAO, CASTILLA, AREQUIPA": [ - -72.5682007880104, - -16.0272469434307 - ], - "APONGO, VICTOR FAJARDO, AYACUCHO": [ - -74.006856532142, - -14.0649574044449 - ], - "AQUIA, BOLOGNESI, ANCASH": [ - -77.1309657217238, - -9.96578613478178 - ], - "ARAHUAY, CANTA, LIMA": [ - -76.6751058947839, - -11.640712746722 - ], - "ARAMANGO, BAGUA, AMAZONAS": [ - -78.4483373488544, - -5.38043211432585 - ], - "ARANCAY, HUAMALIES, HUANUCO": [ - -76.7331496024112, - -9.137472061268 - ], - "ARAPA, AZANGARO, PUNO": [ - -70.0846096386864, - -15.0900440038403 - ], - "ARENAL, PAITA, PIURA": [ - -81.0300369214841, - -4.89957308010288 - ], - "AREQUIPA, AREQUIPA, AREQUIPA": [ - -71.5384595874357, - -16.4066582473659 - ], - "ARICAPAMPA, SANCHEZ CARRION, LA LIBERTAD": [ - -77.6960828656256, - -7.82158859841187 - ], - "ARMA, CASTROVIRREYNA, HUANCAVELICA": [ - -75.5111486866253, - -13.110484915431 - ], - "ASCENSION, HUANCAVELICA, HUANCAVELICA": [ - -75.1866179731032, - -12.8284340763289 - ], - "ASCOPE, ASCOPE, LA LIBERTAD": [ - -79.0820845058183, - -7.66089959451423 - ], - "ASIA, CA\u00d1ETE, LIMA": [ - -76.5112380793467, - -12.7967282894497 - ], - "ASILLO, AZANGARO, PUNO": [ - -70.35381907297, - -14.7408055834437 - ], - "ASQUIPATA, VICTOR FAJARDO, AYACUCHO": [ - -73.9378099843248, - -14.0758172295536 - ], - "ASUNCION, CAJAMARCA, CAJAMARCA": [ - -78.5271832843612, - -7.33823542571275 - ], - "ASUNCION, CHACHAPOYAS, AMAZONAS": [ - -77.7432008885819, - -5.99613485445976 - ], - "ATALAYA, ATALAYA, UCAYALI": [ - -73.4365950840762, - -10.5861738860233 - ], - "ATAURA, JAUJA, JUNIN": [ - -75.4471376351895, - -11.7953861720664 - ], - "ATICO, CARAVELI, AREQUIPA": [ - -73.5382713001717, - -16.0530366620608 - ], - "ATIQUIPA, CARAVELI, AREQUIPA": [ - -74.3036795716858, - -15.6892006410673 - ], - "ATUNCOLLA, PUNO, PUNO": [ - -70.1570529254666, - -15.6784572581415 - ], - "AUCALLAMA, HUARAL, LIMA": [ - -77.0498649795368, - -11.5176653247602 - ], - "AUCARA, LUCANAS, AYACUCHO": [ - -74.1539496043417, - -14.1944627449291 - ], - "AUCAYACU, LEONCIO PRADO, HUANUCO": [ - -76.1776726799713, - -8.93266319053618 - ], - "AURAHUA, CASTROVIRREYNA, HUANCAVELICA": [ - -75.4427950886895, - -12.9566716386231 - ], - "AYABACA, AYABACA, PIURA": [ - -79.6076829284005, - -4.68275461240726 - ], - "AYACUCHO, HUAMANGA, AYACUCHO": [ - -74.251978088752, - -13.1347558322497 - ], - "AYAHUAY, ANTABAMBA, APURIMAC": [ - -73.0352163628739, - -14.1578087736846 - ], - "AYAPATA, CARABAYA, PUNO": [ - -70.2435379349845, - -13.5010843298321 - ], - "AYAVI, HUAYTARA, HUANCAVELICA": [ - -75.3682601951885, - -13.7145851047812 - ], - "AYAVIRI, MELGAR, PUNO": [ - -70.6057581442103, - -14.9315548582185 - ], - "AYAVIRI, YAUYOS, LIMA": [ - -76.0422951589328, - -12.3654601640701 - ], - "AYO, CASTILLA, AREQUIPA": [ - -72.285088916581, - -15.6409571727894 - ], - "AYRAMPUNI, SAN ANTONIO DE PUTINA, PUNO": [ - -69.9142503268698, - -15.018386549156 - ], - "AYRIHUANCA, GRAU, APURIMAC": [ - -72.5747000617473, - -14.1399311323565 - ], - "AZANGARO, AZANGARO, PUNO": [ - -70.1492220425376, - -14.8809574748844 - ], - "AZANGARO, YAUYOS, LIMA": [ - -75.8255631815951, - -13.0090798911933 - ], - "BAGAZAN, REQUENA, LORETO": [ - -73.4051006485917, - -4.79793879045805 - ], - "BAGUA GRANDE, UTCUBAMBA, AMAZONAS": [ - -78.4399998981214, - -5.8388418149819 - ], - "BAGUA, BAGUA, AMAZONAS": [ - -78.5209826944256, - -5.58091287465729 - ], - "BAJO NARANJILLO, RIOJA, SAN MARTIN": [ - -77.4365073108882, - -5.85918841408146 - ], - "BAJO PICHANAQUI, CHANCHAMAYO, JUNIN": [ - -74.8687644509924, - -11.025028863992 - ], - "BALSAPUERTO, ALTO AMAZONAS, LORETO": [ - -76.5866803770818, - -5.73771006247065 - ], - "BALSAS, CHACHAPOYAS, AMAZONAS": [ - -77.9494215421574, - -6.80783943835509 - ], - "BAMBAMARCA, BOLIVAR, LA LIBERTAD": [ - -77.6883398414389, - -7.46463610094446 - ], - "BAMBAMARCA, HUALGAYOC, CAJAMARCA": [ - -78.4795120755161, - -6.69309602877751 - ], - "BAMBAS, CORONGO, ANCASH": [ - -78.0468559349284, - -8.60481104918683 - ], - "BARRANCA, BARRANCA, LIMA": [ - -77.6826923458819, - -10.7149260203657 - ], - "BARRANCO, LIMA, LIMA": [ - -77.0208625216697, - -12.1440295171995 - ], - "BARRANQUITA, LAMAS, SAN MARTIN": [ - -76.0487066463129, - -6.30627300643987 - ], - "BARRIO OBRERO INDUSTRIAL, LIMA, LIMA": [ - -77.0884101405144, - -11.9928307795161 - ], - "BA\u00d1OS, LAURICOCHA, HUANUCO": [ - -76.7838628922737, - -10.1073679469059 - ], - "BELEN, MAYNAS, LORETO": [ - -73.2119985583267, - -3.81156402042639 - ], - "BELEN, SUCRE, AYACUCHO": [ - -73.767257920992, - -13.8043146282798 - ], - "BELLA UNION, CARAVELI, AREQUIPA": [ - -74.7615764194503, - -15.3754119835032 - ], - "BELLAVISTA, BELLAVISTA, SAN MARTIN": [ - -76.6006118397694, - -6.99102691703072 - ], - "BELLAVISTA, CALLAO, CALLAO": [ - -77.1099033268696, - -12.0600062849559 - ], - "BELLAVISTA, JAEN, CAJAMARCA": [ - -78.7426463601639, - -5.56458733715936 - ], - "BELLAVISTA, SECHURA, PIURA": [ - -80.7428964265902, - -5.42651668767646 - ], - "BELLAVISTA, SULLANA, PIURA": [ - -80.6749040482833, - -4.89080080182046 - ], - "BERNAL, SECHURA, PIURA": [ - -80.7020022911086, - -5.4577524803448 - ], - "BIGOTE, MORROPON, PIURA": [ - -79.7412425918066, - -5.29589195529798 - ], - "BOCA COLORADO, MANU, MADRE DE DIOS": [ - -70.6753725176675, - -12.6295434968971 - ], - "BOCA MANU, MANU, MADRE DE DIOS": [ - -71.6346638135877, - -11.8504051472259 - ], - "BOLIVAR, BOLIVAR, LA LIBERTAD": [ - -77.7339034553527, - -7.26459772266379 - ], - "BOLIVAR, SAN MIGUEL, CAJAMARCA": [ - -79.1624871058557, - -6.97591143586301 - ], - "BOLOGNESI, ATALAYA, UCAYALI": [ - -73.8269401957792, - -9.97143690710676 - ], - "BOLOGNESI, PALLASCA, ANCASH": [ - -78.0699629501881, - -8.34272648350281 - ], - "BRETA\u00d1A, REQUENA, LORETO": [ - -74.8864168088715, - -5.64475543852456 - ], - "BREU, ATALAYA, UCAYALI": [ - -72.6985747401782, - -9.82975945165413 - ], - "BRE\u00d1A, LIMA, LIMA": [ - -77.050592430808, - -12.0591639133589 - ], - "BUENA VISTA ALTA, CASMA, ANCASH": [ - -78.1427106810178, - -9.37298777033197 - ], - "BUENOS AIRES, MORROPON, PIURA": [ - -79.9250472706554, - -5.26448517295085 - ], - "BUENOS AIRES, PICOTA, SAN MARTIN": [ - -76.3970297862686, - -6.73971460261252 - ], - "BUENOS AIRES, SANTA, ANCASH": [ - -78.4359394381781, - -9.10006882852927 - ], - "BUENOS AIRES, TRUJILLO, LA LIBERTAD": [ - -79.0456604798836, - -8.13949725084517 - ], - "BULDIBUYO, PATAZ, LA LIBERTAD": [ - -77.3827568426383, - -8.12441918007943 - ], - "CABALLOCOCHA, MARISCAL RAMON CASTILLA, LORETO": [ - -70.8361348303932, - -3.67749669371321 - ], - "CABANA, LUCANAS, AYACUCHO": [ - -74.0775043266508, - -14.3621379017731 - ], - "CABANA, PALLASCA, ANCASH": [ - -77.9593183505109, - -8.40387557874182 - ], - "CABANA, SAN ROMAN, PUNO": [ - -70.2798290611778, - -15.6428809847668 - ], - "CABANACONDE, CAYLLOMA, AREQUIPA": [ - -71.9594173738653, - -15.6746419428287 - ], - "CABANILLA, LAMPA, PUNO": [ - -70.3900899762315, - -15.569375991145 - ], - "CACATACHI, SAN MARTIN, SAN MARTIN": [ - -76.4384114546016, - -6.46781171176781 - ], - "CACHACHI, CAJABAMBA, CAJAMARCA": [ - -78.2533288091185, - -7.56770062426083 - ], - "CACHICADAN, SANTIAGO DE CHUCO, LA LIBERTAD": [ - -78.0643557336426, - -8.0172816910563 - ], - "CACHIMAYO, ANTA, CUSCO": [ - -72.0553872594671, - -13.4635010523233 - ], - "CACHORA, ABANCAY, APURIMAC": [ - -72.8140025746261, - -13.488845692748 - ], - "CACRA, YAUYOS, LIMA": [ - -75.7479685102651, - -12.7662258669316 - ], - "CAHUAC, YAROWILCA, HUANUCO": [ - -76.6493228341416, - -9.86463169667706 - ], - "CAHUACHO, CARAVELI, AREQUIPA": [ - -73.431758118851, - -15.5406474580859 - ], - "CAICAY, PAUCARTAMBO, CUSCO": [ - -71.6764519561073, - -13.5643060348803 - ], - "CAIRANI, CANDARAVE, TACNA": [ - -70.3408234064557, - -17.1878290824297 - ], - "CAJA, ACOBAMBA, HUANCAVELICA": [ - -74.4734204392933, - -12.8728793369793 - ], - "CAJABAMBA, CAJABAMBA, CAJAMARCA": [ - -78.0321481124752, - -7.6314507349105 - ], - "CAJACAY, BOLOGNESI, ANCASH": [ - -77.342480706522, - -10.1904465919637 - ], - "CAJAMARCA, CAJAMARCA, CAJAMARCA": [ - -78.5610881230837, - -7.07751246953789 - ], - "CAJAMARQUILLA, HUARAZ, ANCASH": [ - -77.7178843835536, - -9.63677240437598 - ], - "CAJAMARQUILLA, OCROS, ANCASH": [ - -77.2400396984947, - -10.3209133329033 - ], - "CAJARURO, UTCUBAMBA, AMAZONAS": [ - -78.1747783383787, - -5.61429849632456 - ], - "CAJATAMBO, CAJATAMBO, LIMA": [ - -76.9438396837041, - -10.455139913038 - ], - "CAJAY, HUARI, ANCASH": [ - -77.1314097335223, - -9.25703065066834 - ], - "CALACOA, MARISCAL NIETO, MOQUEGUA": [ - -70.6446511662424, - -16.6634082132264 - ], - "CALAMARCA, JULCAN, LA LIBERTAD": [ - -78.3807798724692, - -8.12034230224005 - ], - "CALANA, TACNA, TACNA": [ - -70.1462231445025, - -17.9542172033629 - ], - "CALANGO, CA\u00d1ETE, LIMA": [ - -76.4546171322687, - -12.4870660247686 - ], - "CALAPUJA, LAMPA, PUNO": [ - -70.236469357446, - -15.3110585604739 - ], - "CALCA, CALCA, CUSCO": [ - -71.9577770486071, - -13.2687223142149 - ], - "CALETA CRUZ, TUMBES, TUMBES": [ - -80.5663876190569, - -3.67176707916272 - ], - "CALETA DE CARQUIN, HUAURA, LIMA": [ - -77.6200247395693, - -11.0879788825077 - ], - "CALLAHUANCA, HUAROCHIRI, LIMA": [ - -76.5752045801539, - -11.8137053284318 - ], - "CALLALLI, CAYLLOMA, AREQUIPA": [ - -71.24853477838, - -15.5211500600524 - ], - "CALLANMARCA, ANGARAES, HUANCAVELICA": [ - -74.6245407188146, - -12.8785735283243 - ], - "CALLAO, CALLAO, CALLAO": [ - -77.1211330017318, - -12.0167524628215 - ], - "CALLAYUC, CUTERVO, CAJAMARCA": [ - -78.9310334994841, - -6.12738088268682 - ], - "CALQUIS, SAN MIGUEL, CAJAMARCA": [ - -78.953088293593, - -6.91374894684525 - ], - "CALZADA, MOYOBAMBA, SAN MARTIN": [ - -77.0957553952807, - -6.01453946633221 - ], - "CAMANA, CAMANA, AREQUIPA": [ - -72.7128812179551, - -16.6309120718077 - ], - "CAMINACA, AZANGARO, PUNO": [ - -70.0943279163374, - -15.30282510695 - ], - "CAMISEA, LA CONVENCION, CUSCO": [ - -72.8589183967616, - -11.7511320510681 - ], - "CAMPANILLA, MARISCAL CACERES, SAN MARTIN": [ - -76.8091613211374, - -7.6520486796585 - ], - "CAMPO VERDE, CORONEL PORTILLO, UCAYALI": [ - -74.845516823545, - -8.52057547007321 - ], - "CAMPORREDONDO, LUYA, AMAZONAS": [ - -78.3344759051519, - -6.17779919238366 - ], - "CANARIA, VICTOR FAJARDO, AYACUCHO": [ - -73.9945562806845, - -13.9615495588555 - ], - "CANAYRE, HUANTA, AYACUCHO": [ - -74.1021148071968, - -12.3406200404007 - ], - "CANCAS, CONTRALMIRANTE VILLAR, TUMBES": [ - -80.8903609555939, - -4.04094123617315 - ], - "CANCHABAMBA, HUACAYBAMBA, HUANUCO": [ - -77.1077537535022, - -8.84742209441864 - ], - "CANCHAQUE, HUANCABAMBA, PIURA": [ - -79.6258326376722, - -5.31206763803808 - ], - "CANCHAYLLO, JAUJA, JUNIN": [ - -75.8000061397634, - -11.9149666039658 - ], - "CANDARAVE, CANDARAVE, TACNA": [ - -70.2478566120181, - -17.0419322309195 - ], - "CANGALLO, CANGALLO, AYACUCHO": [ - -74.1100725868451, - -13.59973533993 - ], - "CANIS, BOLOGNESI, ANCASH": [ - -77.1909790633666, - -10.3344552026342 - ], - "CANTA, CANTA, LIMA": [ - -76.5822969457275, - -11.4753061524043 - ], - "CAPACHICA, PUNO, PUNO": [ - -69.8244737188459, - -15.6404258384226 - ], - "CAPACMARCA, CHUMBIVILCAS, CUSCO": [ - -71.9934867181348, - -14.0438332122428 - ], - "CAPAYA, AYMARAES, APURIMAC": [ - -73.353854952599, - -14.1155992763516 - ], - "CAPAZO, EL COLLAO, PUNO": [ - -69.7020167717451, - -17.1098494944924 - ], - "CAPILLAS, CASTROVIRREYNA, HUANCAVELICA": [ - -75.6110525541878, - -13.3424529741639 - ], - "CARABAMBA, JULCAN, LA LIBERTAD": [ - -78.5820151494512, - -8.1465773052052 - ], - "CARABAYLLO, LIMA, LIMA": [ - -76.9729270845038, - -11.8073838464182 - ], - "CARAC, HUARAL, LIMA": [ - -76.7728174815748, - -11.1488558910909 - ], - "CARACOTO, SAN ROMAN, PUNO": [ - -70.0879018303573, - -15.5574659577251 - ], - "CARAMPOMA, HUAROCHIRI, LIMA": [ - -76.3830419966992, - -11.6397021991101 - ], - "CARANIA, YAUYOS, LIMA": [ - -75.8816402968919, - -12.3558656479666 - ], - "CARAPO, HUANCA SANCOS, AYACUCHO": [ - -74.3034382012863, - -13.8120595924894 - ], - "CARAVELI, CARAVELI, AREQUIPA": [ - -73.3318178520816, - -15.8291785754744 - ], - "CARAYBAMBA, AYMARAES, APURIMAC": [ - -73.0945036109956, - -14.4193682069698 - ], - "CARAZ, HUAYLAS, ANCASH": [ - -77.7497708330429, - -9.0225172663955 - ], - "CARHUAC, CARHUAZ, ANCASH": [ - -77.7292991377802, - -9.2901935145351 - ], - "CARHUACALLANGA, HUANCAYO, JUNIN": [ - -75.2025810764228, - -12.3554296753622 - ], - "CARHUAMAYO, JUNIN, JUNIN": [ - -76.0209880336546, - -10.9139335532403 - ], - "CARHUANCA, VILCAS HUAMAN, AYACUCHO": [ - -73.7820672130959, - -13.7394386455665 - ], - "CARHUAZ, CARHUAZ, ANCASH": [ - -77.6396359755176, - -9.29359697306236 - ], - "CARMEN ALTO, HUAMANGA, AYACUCHO": [ - -74.2349683309207, - -13.2045249446694 - ], - "CARMEN DE LA LEGUA REYNOSO, CALLAO, CALLAO": [ - -77.0904177079874, - -12.042884628664 - ], - "CARUMAS, MARISCAL NIETO, MOQUEGUA": [ - -70.3714119533903, - -16.728430234359 - ], - "CASA GRANDE, ASCOPE, LA LIBERTAD": [ - -79.1949415022906, - -7.57668519003391 - ], - "CASCA, MARISCAL LUZURIAGA, ANCASH": [ - -77.3876640920165, - -8.82313871603465 - ], - "CASCAPARA, YUNGAY, ANCASH": [ - -77.8327104527901, - -9.31612413703025 - ], - "CASCAS, GRAN CHIMU, LA LIBERTAD": [ - -78.7639642739784, - -7.50151069298087 - ], - "CASHAPAMPA, SIHUAS, ANCASH": [ - -77.6532051901592, - -8.5878110929031 - ], - "CASMA, CASMA, ANCASH": [ - -78.2231984391643, - -9.51815087920089 - ], - "CASPISAPA, PICOTA, SAN MARTIN": [ - -76.4220117961079, - -6.92050640807534 - ], - "CASTILLA, PIURA, PIURA": [ - -80.5151818242225, - -5.13095183262086 - ], - "CASTILLO GRANDE, LEONCIO PRADO, HUANUCO": [ - -76.0379769094941, - -9.20807808979561 - ], - "CASTROVIRREYNA, CASTROVIRREYNA, HUANCAVELICA": [ - -75.2913802574621, - -13.153666359797 - ], - "CATAC, RECUAY, ANCASH": [ - -77.3170575974514, - -9.91121253958595 - ], - "CATACAOS, PIURA, PIURA": [ - -80.3651285521636, - -5.47050947479848 - ], - "CATACHE, SANTA CRUZ, CAJAMARCA": [ - -79.0768825187274, - -6.7493472233318 - ], - "CATAHUASI, YAUYOS, LIMA": [ - -75.8820021218917, - -12.7427843266223 - ], - "CATAN, CONTUMAZA, CAJAMARCA": [ - -78.94985171992, - -7.27531053149447 - ], - "CATILLUC, SAN MIGUEL, CAJAMARCA": [ - -78.7338414464924, - -6.80427830914586 - ], - "CAUDAY, CAJABAMBA, CAJAMARCA": [ - -78.0911434355364, - -7.53011598103817 - ], - "CAUJUL, OYON, LIMA": [ - -76.9866870761381, - -10.7564009696703 - ], - "CAURI, LAURICOCHA, HUANUCO": [ - -76.637588634882, - -10.2989322219711 - ], - "CAYALTI, CHICLAYO, LAMBAYEQUE": [ - -79.5066821601742, - -6.88870086412949 - ], - "CAYARA, VICTOR FAJARDO, AYACUCHO": [ - -73.9886787367262, - -13.7928459968113 - ], - "CAYARANI, CONDESUYOS, AREQUIPA": [ - -72.2891387355625, - -15.0147131388838 - ], - "CAYHUAYNA, HUANUCO, HUANUCO": [ - -76.2812487825766, - -10.0403786217308 - ], - "CAYLLOMA, CAYLLOMA, AREQUIPA": [ - -71.7966184476263, - -15.1516885534415 - ], - "CAYMA, AREQUIPA, AREQUIPA": [ - -71.4569615386198, - -16.25268575418 - ], - "CAYNA, AMBO, HUANUCO": [ - -76.3706024743277, - -10.2152122279029 - ], - "CAYRAN, HUANUCO, HUANUCO": [ - -76.3305360058951, - -9.99675569336045 - ], - "CA\u00d1ARIS, FERRE\u00d1AFE, LAMBAYEQUE": [ - -79.3046889268117, - -6.06021533872913 - ], - "CA\u00d1AVERAL, CONTRALMIRANTE VILLAR, TUMBES": [ - -80.6592750752784, - -4.03383471230043 - ], - "CCAPI, PARURO, CUSCO": [ - -72.0194253699714, - -13.8606810105031 - ], - "CCARHUAYO, QUISPICANCHI, CUSCO": [ - -71.3440122428196, - -13.5369810013137 - ], - "CCATCA, QUISPICANCHI, CUSCO": [ - -71.50577025841, - -13.6003880986264 - ], - "CCOCHACCASA, ANGARAES, HUANCAVELICA": [ - -74.8051840148668, - -12.9350573436591 - ], - "CCORCA, CUSCO, CUSCO": [ - -72.0871066052166, - -13.5895650008273 - ], - "CELENDIN, CELENDIN, CAJAMARCA": [ - -78.1176113963708, - -6.77519803381067 - ], - "CENTENARIO, HUARAZ, ANCASH": [ - -77.4847157717894, - -9.47135891805609 - ], - "CERRO AZUL, CA\u00d1ETE, LIMA": [ - -76.4647783204431, - -12.9659892155165 - ], - "CERRO DE PASCO, PASCO, PASCO": [ - -76.2465887267404, - -10.7011694914734 - ], - "CHACA, HUANTA, AYACUCHO": [ - -74.1915467902051, - -12.7835580583156 - ], - "CHACABAMBA, YAROWILCA, HUANUCO": [ - -76.6321369861679, - -9.90056872358094 - ], - "CHACAPALPA, YAULI, JUNIN": [ - -75.8212406972738, - -11.7246231829912 - ], - "CHACAPAMPA, HUANCAYO, JUNIN": [ - -75.2571328245283, - -12.4104203627029 - ], - "CHACAS, ASUNCION, ANCASH": [ - -77.397598324224, - -9.20558137048627 - ], - "CHACAYAN, DANIEL ALCIDES CARRION, PASCO": [ - -76.3925463792438, - -10.4795738944575 - ], - "CHACCHO, ANTONIO RAYMONDI, ANCASH": [ - -77.0720420298997, - -9.02773901521096 - ], - "CHACCRAMPA, ANDAHUAYLAS, APURIMAC": [ - -73.6030130668558, - -13.9621479884335 - ], - "CHACHAPOYAS, CHACHAPOYAS, AMAZONAS": [ - -77.8564917257644, - -6.24773573316975 - ], - "CHACHAS, CASTILLA, AREQUIPA": [ - -72.1161918991354, - -15.1821384947072 - ], - "CHACLACAYO, LIMA, LIMA": [ - -76.7669513497193, - -11.9916361158908 - ], - "CHACLLA, HUAROCHIRI, LIMA": [ - -76.7735595246577, - -11.8166490942047 - ], - "CHACOCHE, ABANCAY, APURIMAC": [ - -72.9912885694406, - -13.9974272305512 - ], - "CHADIN, CHOTA, CAJAMARCA": [ - -78.4127942670906, - -6.43986876884304 - ], - "CHAGLLA, PACHITEA, HUANUCO": [ - -75.79753851925, - -9.73697141979583 - ], - "CHALA, CARAVELI, AREQUIPA": [ - -74.1897431829963, - -15.7695010007125 - ], - "CHALACO, MORROPON, PIURA": [ - -79.7928094655505, - -5.06634587812567 - ], - "CHALAMARCA, CHOTA, CAJAMARCA": [ - -78.4951407777507, - -6.51763624355207 - ], - "CHALAN, CELENDIN, CAJAMARCA": [ - -78.2654004859709, - -6.65100562729042 - ], - "CHALCOS, SUCRE, AYACUCHO": [ - -73.7526066791788, - -13.8509550803906 - ], - "CHALHUANCA, AYMARAES, APURIMAC": [ - -73.2292836178048, - -14.2942553089155 - ], - "CHALLABAMBA, PAUCARTAMBO, CUSCO": [ - -71.7693107197923, - -13.1392818313489 - ], - "CHALLAS, PATAZ, LA LIBERTAD": [ - -77.3714771420769, - -8.4270637761987 - ], - "CHALLHUAHUACHO, COTABAMBAS, APURIMAC": [ - -72.3104130650274, - -14.1714371189327 - ], - "CHAMACA, CHUMBIVILCAS, CUSCO": [ - -71.8769132207192, - -14.3344207276266 - ], - "CHAMBARA, CONCEPCION, JUNIN": [ - -75.4364831609119, - -12.0056060980413 - ], - "CHANA, HUARI, ANCASH": [ - -76.9823463906965, - -9.46652854524538 - ], - "CHANCAY, HUARAL, LIMA": [ - -77.2918726127934, - -11.5009753537626 - ], - "CHANCAY, SAN MARCOS, CAJAMARCA": [ - -78.1173080543069, - -7.40943882712661 - ], - "CHANCAYBA\u00d1OS, SANTA CRUZ, CAJAMARCA": [ - -78.877409850247, - -6.55598727194903 - ], - "CHANGUILLO, NASCA, ICA": [ - -75.334396794657, - -14.8016716802307 - ], - "CHANGUILLO, NAZCA, ICA": [ - -75.334396794657, - -14.8016716802307 - ], - "CHAO, VIRU, LA LIBERTAD": [ - -78.5064078498177, - -8.55989569590649 - ], - "CHAPIMARCA, AYMARAES, APURIMAC": [ - -73.0867762677187, - -14.0078088866977 - ], - "CHARACATO, AREQUIPA, AREQUIPA": [ - -71.3828615258431, - -16.4577422602022 - ], - "CHARAT, OTUZCO, LA LIBERTAD": [ - -78.4738226819714, - -7.8086661873186 - ], - "CHARCANA, LA UNION, AREQUIPA": [ - -73.0487835030819, - -15.2108697127443 - ], - "CHASQUITAMBO, BOLOGNESI, ANCASH": [ - -77.585532981517, - -10.3013913189737 - ], - "CHAULAN, HUANUCO, HUANUCO": [ - -76.421822436845, - -10.0785253879983 - ], - "CHAVIN DE HUANTAR, HUARI, ANCASH": [ - -77.2117245983931, - -9.65543193693013 - ], - "CHAVIN DE PARIARCA, HUAMALIES, HUANUCO": [ - -76.7547060973049, - -9.43755795377609 - ], - "CHAVIN, CHINCHA, ICA": [ - -75.9426634309584, - -13.1202620412323 - ], - "CHAVINILLO, YAROWILCA, HUANUCO": [ - -76.5512878924768, - -9.80806947508392 - ], - "CHAVI\u00d1A, LUCANAS, AYACUCHO": [ - -73.883665677648, - -14.9827250510098 - ], - "CHAZUTA, SAN MARTIN, SAN MARTIN": [ - -75.9894181822517, - -6.61795845104842 - ], - "CHECACUPE, CANCHIS, CUSCO": [ - -71.0667868395658, - -14.0059389745645 - ], - "CHECCA, CANAS, CUSCO": [ - -71.4777304364404, - -14.4916049769779 - ], - "CHEPEN, CHEPEN, LA LIBERTAD": [ - -79.3538439777794, - -7.22852678067268 - ], - "CHETILLA, CAJAMARCA, CAJAMARCA": [ - -78.6540285201032, - -7.14250490323991 - ], - "CHETO, CHACHAPOYAS, AMAZONAS": [ - -77.6771662977474, - -6.29796980786315 - ], - "CHIARA, ANDAHUAYLAS, APURIMAC": [ - -73.6155652263205, - -13.8798451348732 - ], - "CHIARA, HUAMANGA, AYACUCHO": [ - -74.1586260614594, - -13.3757478927841 - ], - "CHICAMA, ASCOPE, LA LIBERTAD": [ - -79.0082256879314, - -7.80498197967665 - ], - "CHICCHE, HUANCAYO, JUNIN": [ - -75.2933879365356, - -12.2907558174468 - ], - "CHICHAS, CONDESUYOS, AREQUIPA": [ - -72.9457116169387, - -15.5345032131505 - ], - "CHICLA, HUAROCHIRI, LIMA": [ - -76.2437979289636, - -11.6644988531773 - ], - "CHICLAYO, CHICLAYO, LAMBAYEQUE": [ - -79.8258745796224, - -6.78300812326378 - ], - "CHIGUATA, AREQUIPA, AREQUIPA": [ - -71.3586444996881, - -16.3755757259576 - ], - "CHIGUIRIP, CHOTA, CAJAMARCA": [ - -78.7080371064415, - -6.42508063731485 - ], - "CHILCA, CA\u00d1ETE, LIMA": [ - -76.6299398205862, - -12.4298097070367 - ], - "CHILCA, HUANCAYO, JUNIN": [ - -75.1831548155222, - -12.0790510496107 - ], - "CHILCAS, LA MAR, AYACUCHO": [ - -73.866039111048, - -13.1686099211042 - ], - "CHILCAYMARCA, CASTILLA, AREQUIPA": [ - -72.3852756226445, - -15.3506202521996 - ], - "CHILCAYOC, SUCRE, AYACUCHO": [ - -73.7217606118029, - -13.8912385922383 - ], - "CHILETE, CONTUMAZA, CAJAMARCA": [ - -78.8216660079901, - -7.25634404127422 - ], - "CHILIQUIN, CHACHAPOYAS, AMAZONAS": [ - -77.7558680688655, - -6.07820669347796 - ], - "CHILLIA, PATAZ, LA LIBERTAD": [ - -77.5208976611016, - -8.16082663051885 - ], - "CHIMBAN, CHOTA, CAJAMARCA": [ - -78.4484400317904, - -6.28455379267197 - ], - "CHIMBOTE, SANTA, ANCASH": [ - -78.4011906423706, - -8.87768922488972 - ], - "CHIMUCH (CORTEGANA), CELENDIN, CAJAMARCA": [ - -78.2855239902207, - -6.48769432724889 - ], - "CHINCHA ALTA, CHINCHA, ICA": [ - -76.0345541723679, - -13.3245339119626 - ], - "CHINCHA BAJA, CHINCHA, ICA": [ - -76.1508444125596, - -13.4966756861187 - ], - "CHINCHAYPUJIO, ANTA, CUSCO": [ - -72.2715520620687, - -13.612930810587 - ], - "CHINCHERO, URUBAMBA, CUSCO": [ - -72.0387779231763, - -13.4093831008485 - ], - "CHINCHEROS, CHINCHEROS, APURIMAC": [ - -73.7481759289118, - -13.5186387873608 - ], - "CHINCHIHUASI, CHURCAMPA, HUANCAVELICA": [ - -74.5699472143297, - -12.4522676645686 - ], - "CHINCHO, ANGARAES, HUANCAVELICA": [ - -74.3427852073098, - -12.9850791515231 - ], - "CHINGALPO, SIHUAS, ANCASH": [ - -77.6459853393143, - -8.36287402159413 - ], - "CHINGAS, ANTONIO RAYMONDI, ANCASH": [ - -77.0071404629649, - -9.13929025206044 - ], - "CHIPAO, LUCANAS, AYACUCHO": [ - -73.7574180444943, - -14.4771648737549 - ], - "CHIQUIAN, BOLOGNESI, ANCASH": [ - -77.1792448233481, - -10.1781992402107 - ], - "CHIQUINTIRCA, LA MAR, AYACUCHO": [ - -73.6433486605367, - -13.0647121238044 - ], - "CHIRIACO, BAGUA, AMAZONAS": [ - -78.389593547252, - -4.99133149275942 - ], - "CHIRIMOTO, RODRIGUEZ DE MENDOZA, AMAZONAS": [ - -77.4200108618785, - -6.54747068291654 - ], - "CHIRINOS, SAN IGNACIO, CAJAMARCA": [ - -78.8827842580235, - -5.30757708273862 - ], - "CHISQUILLA, BONGARA, AMAZONAS": [ - -77.7257952512311, - -5.89484724059652 - ], - "CHIVAY, CAYLLOMA, AREQUIPA": [ - -71.5501476541934, - -15.6400950681744 - ], - "CHOCHOPE, LAMBAYEQUE, LAMBAYEQUE": [ - -79.613589931034, - -6.15523258480321 - ], - "CHOCO, CASTILLA, AREQUIPA": [ - -72.0687465229776, - -15.4141381712445 - ], - "CHOCOPE, ASCOPE, LA LIBERTAD": [ - -79.2263868712783, - -7.79049674780247 - ], - "CHOCOS, YAUYOS, LIMA": [ - -75.9240588232503, - -12.922385358404 - ], - "CHOJATA, GENERAL SANCHEZ CERRO, MOQUEGUA": [ - -70.5712577713913, - -16.4570250724392 - ], - "CHONGOS ALTO, HUANCAYO, JUNIN": [ - -75.4372524102107, - -12.4856577759153 - ], - "CHONGOS BAJO, CHUPACA, JUNIN": [ - -75.2844333012705, - -12.1948350215022 - ], - "CHONGOYAPE, CHICLAYO, LAMBAYEQUE": [ - -79.4645634553848, - -6.62686259016377 - ], - "CHONTABAMBA, OXAPAMPA, PASCO": [ - -75.5063390707304, - -10.6233198799421 - ], - "CHONTALI, JAEN, CAJAMARCA": [ - -79.133155396685, - -5.63382971414205 - ], - "CHORAS, YAROWILCA, HUANUCO": [ - -76.5718170532428, - -9.91181503213836 - ], - "CHOROPAMPA, CHOTA, CAJAMARCA": [ - -78.3690236402212, - -6.37005886377953 - ], - "CHOROS, CUTERVO, CAJAMARCA": [ - -78.7734754941915, - -5.92471668695182 - ], - "CHORRILLOS, LIMA, LIMA": [ - -77.0058884465196, - -12.1926451966803 - ], - "CHOSICA, LIMA, LIMA": [ - -76.8013300576448, - -11.9584802725514 - ], - "CHOTA, CHOTA, CAJAMARCA": [ - -78.6426259142255, - -6.5600295236805 - ], - "CHUCATAMANI, TARATA, TACNA": [ - -70.2145381422877, - -17.499409270151 - ], - "CHUCUITO, PUNO, PUNO": [ - -69.9195914666432, - -15.9326693878329 - ], - "CHUGAY, SANCHEZ CARRION, LA LIBERTAD": [ - -77.7980900105249, - -7.82233417823115 - ], - "CHUGUR, HUALGAYOC, CAJAMARCA": [ - -78.7076815559111, - -6.68551904677207 - ], - "CHULLIN, SIHUAS, ANCASH": [ - -77.6204766729451, - -8.67163701355884 - ], - "CHULUCANAS, MORROPON, PIURA": [ - -80.1944093596614, - -5.12169604783907 - ], - "CHUMPI, PARINACOCHAS, AYACUCHO": [ - -73.6999285266146, - -15.1058161000231 - ], - "CHUMUCH, CELENDIN, CAJAMARCA": [ - -78.1870561089263, - -6.57052616716341 - ], - "CHUNGUI, LA MAR, AYACUCHO": [ - -73.5704053121852, - -13.230006622345 - ], - "CHUPA, AZANGARO, PUNO": [ - -69.9519675380968, - -15.1062775945874 - ], - "CHUPACA, CHUPACA, JUNIN": [ - -75.2861146209686, - -12.0708257417027 - ], - "CHUPAMARCA, CASTROVIRREYNA, HUANCAVELICA": [ - -75.5296558486149, - -12.8940307892575 - ], - "CHUPAN, YAROWILCA, HUANUCO": [ - -76.5768712821809, - -9.71624219187614 - ], - "CHUPURO, HUANCAYO, JUNIN": [ - -75.2411338307498, - -12.2098279199507 - ], - "CHUQUIBAMBA, CHACHAPOYAS, AMAZONAS": [ - -77.8951903591654, - -6.93490198483361 - ], - "CHUQUIBAMBA, CONDESUYOS, AREQUIPA": [ - -72.7208606823176, - -16.0433819817056 - ], - "CHUQUIBAMBILLA, GRAU, APURIMAC": [ - -72.7746263792499, - -14.1173719148188 - ], - "CHUQUIS, DOS DE MAYO, HUANUCO": [ - -76.6323299591608, - -9.64827707523785 - ], - "CHURCAMPA, CHURCAMPA, HUANCAVELICA": [ - -74.3848798576814, - -12.710491656069 - ], - "CHURIN, OYON, LIMA": [ - -76.7975538573393, - -10.8378643661732 - ], - "CHURUBAMBA, HUANUCO, HUANUCO": [ - -76.2657330507641, - -9.6852555184602 - ], - "CHURUJA, BONGARA, AMAZONAS": [ - -77.9303641214897, - -6.00779616601285 - ], - "CHUSCHI, CANGALLO, AYACUCHO": [ - -74.4362056184944, - -13.493130513321 - ], - "CIENEGUILLA, LIMA, LIMA": [ - -76.7775258876874, - -12.0764633993373 - ], - "CIRCA, ABANCAY, APURIMAC": [ - -72.8915215793942, - -13.9741939974451 - ], - "CIUDAD DE DIOS, LIMA, LIMA": [ - -76.9665080585833, - -12.1578595724367 - ], - "CIUDAD NUEVA, TACNA, TACNA": [ - -70.1903380012711, - -17.8578365817098 - ], - "CIUDAD SATELITE, AREQUIPA, AREQUIPA": [ - -71.5234725656764, - -16.4314924546874 - ], - "COALAQUE, GENERAL SANCHEZ CERRO, MOQUEGUA": [ - -71.046088816601, - -16.5758064712456 - ], - "COASA, CARABAYA, PUNO": [ - -69.8975059797635, - -13.6433384632222 - ], - "COATA, PUNO, PUNO": [ - -69.9237965747034, - -15.5606498572077 - ], - "COAYLLO, CA\u00d1ETE, LIMA": [ - -76.4067248734426, - -12.6587222771079 - ], - "COCABAMBA, LUYA, AMAZONAS": [ - -78.0155621744324, - -6.62720663794254 - ], - "COCACHACRA, HUAROCHIRI, LIMA": [ - -76.5606421546695, - -11.925905136191 - ], - "COCACHACRA, ISLAY, AREQUIPA": [ - -71.5995223839544, - -16.9288764200261 - ], - "COCAS, CASTROVIRREYNA, HUANCAVELICA": [ - -75.363087894178, - -13.2741706428082 - ], - "COCHABAMBA, CHOTA, CAJAMARCA": [ - -78.85188438319, - -6.4831530365583 - ], - "COCHABAMBA, HUACAYBAMBA, HUANUCO": [ - -76.6266547467193, - -9.097457256593 - ], - "COCHABAMBA, HUARAZ, ANCASH": [ - -77.8515620316629, - -9.46607072139994 - ], - "COCHAMAL, RODRIGUEZ DE MENDOZA, AMAZONAS": [ - -77.6654526252267, - -6.38621788319943 - ], - "COCHAMARCA, OYON, LIMA": [ - -77.1279201555717, - -10.8835563933752 - ], - "COCHAPETI, HUARMEY, ANCASH": [ - -77.6922731178704, - -9.98584869647894 - ], - "COCHARCAS, CHINCHEROS, APURIMAC": [ - -73.7478500643694, - -13.6115547596379 - ], - "COCHAS, CONCEPCION, JUNIN": [ - -75.1413624459352, - -11.6200665328546 - ], - "COCHAS, YAUYOS, LIMA": [ - -76.1958993732045, - -12.2858328727527 - ], - "CODO DEL POZUZO, PUERTO INCA, HUANUCO": [ - -75.4665400060377, - -9.63436387936021 - ], - "COHECHAN, LUYA, AMAZONAS": [ - -78.191191729999, - -6.12653870724589 - ], - "COISHCO, SANTA, ANCASH": [ - -78.6178872192869, - -9.02746064712588 - ], - "COJATA, HUANCANE, PUNO": [ - -69.3931749352134, - -15.0081746464212 - ], - "COLASAY, JAEN, CAJAMARCA": [ - -78.9794632044882, - -5.9009451042654 - ], - "COLCA, HUANCAYO, JUNIN": [ - -75.19123874618, - -12.3142242806345 - ], - "COLCA, VICTOR FAJARDO, AYACUCHO": [ - -74.03793213013, - -13.7148600455261 - ], - "COLCABAMBA, AYMARAES, APURIMAC": [ - -73.2582708920003, - -13.9769172871096 - ], - "COLCABAMBA, HUARAZ, ANCASH": [ - -77.8216383504041, - -9.57633145734425 - ], - "COLCABAMBA, TAYACAJA, HUANCAVELICA": [ - -74.7004458851228, - -12.3850963169451 - ], - "COLCAMAR, LUYA, AMAZONAS": [ - -78.0106348368711, - -6.31002679144285 - ], - "COLCHA, PARURO, CUSCO": [ - -71.8670124387388, - -13.8709369435874 - ], - "COLLONCE, LUYA, AMAZONAS": [ - -78.1639926923002, - -6.34579119999819 - ], - "COLONIA, YAUYOS, LIMA": [ - -75.8459798081653, - -12.5842714426585 - ], - "COLPAS, AMBO, HUANUCO": [ - -76.4643577947427, - -10.2443983188281 - ], - "COLQUEMARCA, CHUMBIVILCAS, CUSCO": [ - -72.0146325413154, - -14.2377221156797 - ], - "COLQUEPATA, PAUCARTAMBO, CUSCO": [ - -71.6542271123515, - -13.4030344704621 - ], - "COLTA, PAUCAR DEL SARA SARA, AYACUCHO": [ - -73.2505709895432, - -15.1277616984369 - ], - "COMAS, CONCEPCION, JUNIN": [ - -75.0489918360374, - -11.665502270188 - ], - "COMBAPATA, CANCHIS, CUSCO": [ - -71.3341433293408, - -14.0881427738125 - ], - "CONAYCA, HUANCAVELICA, HUANCAVELICA": [ - -75.039818173022, - -12.5179571196675 - ], - "CONCEPCION, CONCEPCION, JUNIN": [ - -75.3135151620756, - -11.9124616399222 - ], - "CONCEPCION, VILCAS HUAMAN, AYACUCHO": [ - -73.8804072371117, - -13.5421020011487 - ], - "CONCHAMARCA, AMBO, HUANUCO": [ - -76.2095977741945, - -10.0486769559899 - ], - "CONCHAN, CHOTA, CAJAMARCA": [ - -78.6024506268036, - -6.47060841832678 - ], - "CONCHO, JAUJA, JUNIN": [ - -75.5947370265973, - -11.7068214745141 - ], - "CONCHUCOS, PALLASCA, ANCASH": [ - -77.7306554794962, - -8.25811864461607 - ], - "CONCORDIA, LORETO, LORETO": [ - -75.4846662457839, - -4.27492211748107 - ], - "CONDORMARCA /12, BOLIVAR, LA LIBERTAD": [ - -77.5975426104859, - -7.56156077221188 - ], - "CONDOROMA, ESPINAR, CUSCO": [ - -71.0740422036904, - -15.3007847624031 - ], - "CONDURIRI, EL COLLAO, PUNO": [ - -69.6334714449692, - -16.5526536308835 - ], - "CONGALLA, ANGARAES, HUANCAVELICA": [ - -74.5404764500107, - -12.9818037995542 - ], - "CONGAS, OCROS, ANCASH": [ - -77.4240811929044, - -10.3193720072688 - ], - "CONIMA, MOHO, PUNO": [ - -69.4120435125063, - -15.4493046332036 - ], - "CONSTITUCION, OXAPAMPA, PASCO": [ - -74.7846229854987, - -9.82583191866923 - ], - "CONTAMANA, UCAYALI, LORETO": [ - -75.3493778991756, - -7.78112464051196 - ], - "CONTUMAZA, CONTUMAZA, CAJAMARCA": [ - -78.736804868326, - -7.33474917069705 - ], - "COPA, CAJATAMBO, LIMA": [ - -77.0233792431247, - -10.3644796448955 - ], - "COPA, OCROS, ANCASH": [ - -77.5688710913098, - -10.4747236513029 - ], - "COPALLIN, BAGUA, AMAZONAS": [ - -78.3997554651562, - -5.64770028745191 - ], - "COPANI, YUNGUYO, PUNO": [ - -69.0732350309725, - -16.3710222246354 - ], - "COPORAQUE, CAYLLOMA, AREQUIPA": [ - -71.6412296272643, - -15.5913324279424 - ], - "COPORAQUE, ESPINAR, CUSCO": [ - -71.6353572148063, - -14.7572037585753 - ], - "CORACORA, PARINACOCHAS, AYACUCHO": [ - -73.6993401926905, - -14.8157595667868 - ], - "CORANI, CARABAYA, PUNO": [ - -70.7051544074335, - -13.923634284816 - ], - "CORCULLA, PAUCAR DEL SARA SARA, AYACUCHO": [ - -73.2186525373388, - -15.261823469542 - ], - "CORDOVA, HUAYTARA, HUANCAVELICA": [ - -75.151973678959, - -14.0115591689604 - ], - "CORIRE, CASTILLA, AREQUIPA": [ - -72.5255726729483, - -16.2615912033458 - ], - "CORIS, AIJA, ANCASH": [ - -77.7961441124832, - -9.80759338820343 - ], - "CORONGO, CORONGO, ANCASH": [ - -77.9290331055776, - -8.54891503626491 - ], - "COROSHA, BONGARA, AMAZONAS": [ - -77.8107241806685, - -5.81751871097102 - ], - "CORPANQUI, BOLOGNESI, ANCASH": [ - -77.2098539551582, - -10.2915292407187 - ], - "COSPAN, CAJAMARCA, CAJAMARCA": [ - -78.5168650168699, - -7.45302918746221 - ], - "COTABAMBAS, COTABAMBAS, APURIMAC": [ - -72.3412863620817, - -13.7512826812773 - ], - "COTAHUASI, LA UNION, AREQUIPA": [ - -72.861459781114, - -15.2763159491791 - ], - "COTAPARACO, RECUAY, ANCASH": [ - -77.54093133938, - -9.93755523980733 - ], - "COTARUSE, AYMARAES, APURIMAC": [ - -73.2951751135067, - -14.5889200791663 - ], - "COVIRIALI, SATIPO, JUNIN": [ - -74.6514739883331, - -11.3174655966858 - ], - "COYA, CALCA, CUSCO": [ - -71.9153272241254, - -13.4024157862149 - ], - "COYLLURQUI, COTABAMBAS, APURIMAC": [ - -72.39526047097, - -13.9189697833699 - ], - "CRUCERO, CARABAYA, PUNO": [ - -69.9288834767308, - -14.3363751356546 - ], - "CRUZ BLANCA, HUAURA, LIMA": [ - -77.4732457904186, - -11.1161474061114 - ], - "CUCHUMBAYA, MARISCAL NIETO, MOQUEGUA": [ - -70.6676287515439, - -16.7686536562474 - ], - "CUCUNGARA, PIURA, PIURA": [ - -80.5860498675313, - -5.3575904430697 - ], - "CUENCA, HUANCAVELICA, HUANCAVELICA": [ - -75.0558028009246, - -12.4599037876794 - ], - "CUISPES, BONGARA, AMAZONAS": [ - -77.9147926976479, - -5.91114536058822 - ], - "CUJILLO, CUTERVO, CAJAMARCA": [ - -78.559324065091, - -6.11656790794088 - ], - "CULLHUAS, HUANCAYO, JUNIN": [ - -75.1547028635111, - -12.2517931016354 - ], - "CUMBA, UTCUBAMBA, AMAZONAS": [ - -78.6077509544416, - -5.91680497059722 - ], - "CUPI, MELGAR, PUNO": [ - -70.8942616129024, - -14.8900967869389 - ], - "CURAHUASI, ABANCAY, APURIMAC": [ - -72.6181195644358, - -13.6388531133154 - ], - "CURASCO, GRAU, APURIMAC": [ - -72.5320377324999, - -14.1027798514328 - ], - "CURGOS, SANCHEZ CARRION, LA LIBERTAD": [ - -77.9534954641068, - -7.8477410511119 - ], - "CURIBAYA, CANDARAVE, TACNA": [ - -70.3338525404212, - -17.3940874896584 - ], - "CURIMANA, PADRE ABAD, UCAYALI": [ - -75.2971136503234, - -8.41738004677085 - ], - "CURIS /9, ICA, ICA": [ - -75.4341670349311, - -14.1006726151326 - ], - "CURPAHUASI, GRAU, APURIMAC": [ - -72.6498193720242, - -13.9688786773201 - ], - "CUSCA, CORONGO, ANCASH": [ - -77.7889320286036, - -8.52329455757695 - ], - "CUSCO, CUSCO, CUSCO": [ - -71.9876065965117, - -13.492540852511 - ], - "CUSICANCHA, HUAYTARA, HUANCAVELICA": [ - -75.2376815464031, - -13.465417715031 - ], - "CUSIPATA, QUISPICANCHI, CUSCO": [ - -71.4379172032332, - -13.8859747513413 - ], - "CUTERVO, CUTERVO, CAJAMARCA": [ - -78.8329612065848, - -6.38002946196422 - ], - "CUYOCUYO, SANDIA, PUNO": [ - -69.5576680126334, - -14.5238141174569 - ], - "CUZCO, BELLAVISTA, SAN MARTIN": [ - -76.2741149135452, - -7.82214808985679 - ], - "CU\u00d1UMBUQUI, LAMAS, SAN MARTIN": [ - -76.4683768048648, - -6.6156585954741 - ], - "DAGUAS, CHACHAPOYAS, AMAZONAS": [ - -77.7335754821233, - -6.23223588584653 - ], - "DANIEL ALOMIA ROBLES (PUMAHUASI), LEONCIO PRADO, HUANUCO": [ - -75.775162232684, - -9.36044775263213 - ], - "DESAGUADERO, CHUCUITO, PUNO": [ - -69.080280446002, - -16.6201520013777 - ], - "DEUSTUA, SAN ROMAN, PUNO": [ - -70.6224573602141, - -15.853368489896 - ], - "DOS DE MAYO, UCAYALI, LORETO": [ - -75.1859079536789, - -6.39059793004937 - ], - "DOS PUEBLOS, SECHURA, PIURA": [ - -80.7743550178165, - -5.48207978233202 - ], - "DURAZNOPAMPA, CHACHAPOYAS, AMAZONAS": [ - -77.7699953790984, - -6.5789069483119 - ], - "ECHARATE, LA CONVENCION, CUSCO": [ - -72.9831341316442, - -12.4182530845002 - ], - "EL AGUSTINO, LIMA, LIMA": [ - -76.9874046804472, - -12.0400969138003 - ], - "EL ALGARROBAL, ILO, MOQUEGUA": [ - -71.1415329490817, - -17.5830471148697 - ], - "EL ALTO, TALARA, PIURA": [ - -81.0801505266464, - -4.29150873178569 - ], - "EL CARDO, CAMANA, AREQUIPA": [ - -72.736621044444, - -16.5966737506357 - ], - "EL CARMEN, CHINCHA, ICA": [ - -75.915387743302, - -13.5121999134551 - ], - "EL DESCANSO, CANAS, CUSCO": [ - -71.2911717987154, - -14.5523439691577 - ], - "EL ESLABON, HUALLAGA, SAN MARTIN": [ - -76.7058137959861, - -6.99155538076392 - ], - "EL INGENIO, NASCA, ICA": [ - -75.0071063972804, - -14.6777456111477 - ], - "EL INGENIO, NAZCA, ICA": [ - -75.0071063972804, - -14.6777456111477 - ], - "EL MILAGRO, UTCUBAMBA, AMAZONAS": [ - -78.6113231002461, - -5.71733767807965 - ], - "EL PARCO, BAGUA, AMAZONAS": [ - -78.4739696760451, - -5.62263827334525 - ], - "EL PEDREGAL, CAYLLOMA, AREQUIPA": [ - -72.2963652349951, - -16.3527849465361 - ], - "EL PORVENIR, TRUJILLO, LA LIBERTAD": [ - -78.9959602589307, - -8.05161310049898 - ], - "EL PRADO, SAN MIGUEL, CAJAMARCA": [ - -79.0033168838485, - -7.0380424039574 - ], - "EL ROSARIO, JAUJA, JUNIN": [ - -75.669160229964, - -11.7684415151729 - ], - "EL TAMBO, HUANCAYO, JUNIN": [ - -75.1610888091066, - -11.9719552542269 - ], - "ENCA\u00d1ADA, CAJAMARCA, CAJAMARCA": [ - -78.4029394499717, - -6.98519968591838 - ], - "ESPERANZA, PURUS, UCAYALI": [ - -71.5823156313121, - -10.3734946801367 - ], - "ESTACION DE PUCARA, AZANGARO, PUNO": [ - -70.322729222368, - -15.0299953272217 - ], - "ESTIQUE, TARATA, TACNA": [ - -70.0251118501106, - -17.6237013757844 - ], - "ESTIQUE-PAMPA, TARATA, TACNA": [ - -70.1138484128749, - -17.6125217257129 - ], - "ETEN PUERTO, CHICLAYO, LAMBAYEQUE": [ - -79.8469587479606, - -6.95042146080356 - ], - "ETEN, CHICLAYO, LAMBAYEQUE": [ - -79.8157876850959, - -6.93048303290067 - ], - "FERRE\u00d1AFE, FERRE\u00d1AFE, LAMBAYEQUE": [ - -79.7911185840526, - -6.62052434308725 - ], - "FLOR DE PUNGA, REQUENA, LORETO": [ - -74.1269200106895, - -5.36637332324868 - ], - "FLORENCIA DE MORA, TRUJILLO, LA LIBERTAD": [ - -79.0214095600705, - -8.08242993064463 - ], - "FLORIDA (POMACOCHAS), BONGARA, AMAZONAS": [ - -77.9592016275404, - -5.82360449741324 - ], - "FRANCISCO DE ORELLANA, MAYNAS, LORETO": [ - -72.5289426328037, - -3.56822578515376 - ], - "FRIAS, AYABACA, PIURA": [ - -79.9709154147483, - -4.9272147733252 - ], - "GORGOR, CAJATAMBO, LIMA": [ - -76.9919108917448, - -10.6216407124347 - ], - "GORGORILLO, BOLOGNESI, ANCASH": [ - -77.1062856218687, - -10.3018683198042 - ], - "GOYLLARISQUIZGA, DANIEL ALCIDES CARRION, PASCO": [ - -76.4039621112516, - -10.4867472418906 - ], - "GRANADA, CHACHAPOYAS, AMAZONAS": [ - -77.5765977572062, - -6.09998536074605 - ], - "GUADALUPE, ICA, ICA": [ - -75.875777704139, - -13.9217606869883 - ], - "GUADALUPE, PACASMAYO, LA LIBERTAD": [ - -79.4878867018038, - -7.2881352091473 - ], - "GUADALUPITO, VIRU, LA LIBERTAD": [ - -78.6497460929762, - -8.80172327077203 - ], - "GUZMANGO, CONTUMAZA, CAJAMARCA": [ - -78.9176892863048, - -7.36430406444282 - ], - "HABANA, MOYOBAMBA, SAN MARTIN": [ - -77.1000936990825, - -6.08890186233433 - ], - "HAQUIRA, COTABAMBAS, APURIMAC": [ - -72.2305865606366, - -14.2771697955222 - ], - "HECTOR TEJADA, ESPINAR, CUSCO": [ - -71.0911325449141, - -14.9073549300055 - ], - "HERMILIO VALDIZAN, LEONCIO PRADO, HUANUCO": [ - -75.8755233772786, - -9.13951071601705 - ], - "HONGOS, YAUYOS, LIMA": [ - -75.672838105401, - -12.7664935882319 - ], - "HONORIA, PUERTO INCA, HUANUCO": [ - -74.6968415439037, - -8.71386510893011 - ], - "HUABAL, JAEN, CAJAMARCA": [ - -78.905860523931, - -5.60492868478835 - ], - "HUAC-HUAS, LUCANAS, AYACUCHO": [ - -74.9936613590631, - -14.1664038094055 - ], - "HUACACHI, HUARI, ANCASH": [ - -76.9295331550547, - -9.30857432706202 - ], - "HUACAPAMPA, CELENDIN, CAJAMARCA": [ - -78.1587758226002, - -6.91989426128341 - ], - "HUACAR, AMBO, HUANUCO": [ - -76.2696040228566, - -10.1953034796004 - ], - "HUACASCHUQUE, PALLASCA, ANCASH": [ - -77.9923664567574, - -8.30283578478079 - ], - "HUACAYBAMBA, HUACAYBAMBA, HUANUCO": [ - -76.8391097881263, - -8.9586133906167 - ], - "HUACA\u00d1A, SUCRE, AYACUCHO": [ - -73.8646680098338, - -14.2141283193713 - ], - "HUACCANA, CHINCHEROS, APURIMAC": [ - -73.7312119066422, - -13.3195065115051 - ], - "HUACCHIS, HUARI, ANCASH": [ - -76.8080498637904, - -9.1886637694589 - ], - "HUACHAC, CHUPACA, JUNIN": [ - -75.3427301692403, - -12.0355696713206 - ], - "HUACHIS, HUARI, ANCASH": [ - -77.0781527208679, - -9.42639022926456 - ], - "HUACHO, HUAURA, LIMA": [ - -77.4927671198211, - -11.2716617706088 - ], - "HUACHOCOLPA, HUANCAVELICA, HUANCAVELICA": [ - -74.9570050435568, - -13.0458930528339 - ], - "HUACHOCOLPA, TAYACAJA, HUANCAVELICA": [ - -74.5458328004275, - -12.0566739046602 - ], - "HUACHON, PASCO, PASCO": [ - -75.7854802448138, - -10.5742546655225 - ], - "HUACHOS, CASTROVIRREYNA, HUANCAVELICA": [ - -75.4834042520299, - -13.214711377885 - ], - "HUACLLAN, AIJA, ANCASH": [ - -77.678744258243, - -9.78608413332896 - ], - "HUACRACHUCO, MARA\u00d1ON, HUANUCO": [ - -77.1730525711687, - -8.60482185666154 - ], - "HUACRAPUQUIO, HUANCAYO, JUNIN": [ - -75.2093509293734, - -12.1866998604595 - ], - "HUACULLANI, CHUCUITO, PUNO": [ - -69.3988758380446, - -16.6041510263666 - ], - "HUALGAYOC, HUALGAYOC, CAJAMARCA": [ - -78.6003053099917, - -6.75268786138857 - ], - "HUALHUAS, HUANCAYO, JUNIN": [ - -75.2441232080083, - -11.9679755363801 - ], - "HUALLANCA, BOLOGNESI, ANCASH": [ - -76.9438141392498, - -9.91718302114329 - ], - "HUALLANCA, HUAYLAS, ANCASH": [ - -77.9175191960737, - -8.78789641557126 - ], - "HUALLHUA, HUANTA, AYACUCHO": [ - -74.3829865494872, - -12.3394997357963 - ], - "HUALMAY, HUAURA, LIMA": [ - -77.6069579552012, - -11.0927872750319 - ], - "HUAMACHUCO, SANCHEZ CARRION, LA LIBERTAD": [ - -78.0460793091492, - -7.82673306698598 - ], - "HUAMALI, JAUJA, JUNIN": [ - -75.4040905335279, - -11.7896290561628 - ], - "HUAMANCACA CHICO, CHUPACA, JUNIN": [ - -75.248767340808, - -12.0796503111749 - ], - "HUAMANGUILLA, HUANTA, AYACUCHO": [ - -74.1589464492153, - -12.9926548840502 - ], - "HUAMANQUIQUIA, VICTOR FAJARDO, AYACUCHO": [ - -74.2757165259385, - -13.7160784261069 - ], - "HUAMANTANGA, CANTA, LIMA": [ - -76.8438160400722, - -11.5503461367891 - ], - "HUAMATAMBO, CASTROVIRREYNA, HUANCAVELICA": [ - -75.6825045069007, - -13.1089464747428 - ], - "HUAMBALPA, VILCAS HUAMAN, AYACUCHO": [ - -73.8879094012635, - -13.7443085870251 - ], - "HUAMBO, CAYLLOMA, AREQUIPA": [ - -72.1604831315002, - -15.7962502451318 - ], - "HUAMBO, RODRIGUEZ DE MENDOZA, AMAZONAS": [ - -77.5305644025492, - -6.43557149848692 - ], - "HUAMBOS, CHOTA, CAJAMARCA": [ - -78.9702296821211, - -6.44374243619551 - ], - "HUAMPAMI, CONDORCANQUI, AMAZONAS": [ - -78.3358932903866, - -4.1685381325832 - ], - "HUAMPARA, YAUYOS, LIMA": [ - -76.1905986950694, - -12.3542955588713 - ], - "HUANCA SANCOS, HUANCA SANCOS, AYACUCHO": [ - -74.5597344914936, - -14.0010172593943 - ], - "HUANCA, CAYLLOMA, AREQUIPA": [ - -71.8279663861264, - -16.0064314609265 - ], - "HUANCA-HUANCA, ANGARAES, HUANCAVELICA": [ - -74.6264648272352, - -12.9647996907394 - ], - "HUANCABAMBA, ANDAHUAYLAS, APURIMAC": [ - -73.3239501635779, - -13.8094270842897 - ], - "HUANCABAMBA, HUANCABAMBA, PIURA": [ - -79.4974708547698, - -5.19683621763501 - ], - "HUANCABAMBA, OXAPAMPA, PASCO": [ - -75.6386321647265, - -10.3905114901338 - ], - "HUANCAN, HUANCAYO, JUNIN": [ - -75.204099270795, - -12.110516730553 - ], - "HUANCANE, HUANCANE, PUNO": [ - -69.8090201238396, - -15.1832078769793 - ], - "HUANCANI, JAUJA, JUNIN": [ - -75.4313872965561, - -11.869133066496 - ], - "HUANCANO, PISCO, ICA": [ - -75.615906699894, - -13.5551905052522 - ], - "HUANCAPALLAC, HUANUCO, HUANUCO": [ - -76.4208027182527, - -9.86924689411465 - ], - "HUANCAPI, VICTOR FAJARDO, AYACUCHO": [ - -74.0898403565012, - -13.8046582165024 - ], - "HUANCAPON, CAJATAMBO, LIMA": [ - -77.1089326593627, - -10.521692018886 - ], - "HUANCARAMA, ANDAHUAYLAS, APURIMAC": [ - -73.0283084812514, - -13.6568619053323 - ], - "HUANCARANI, PAUCARTAMBO, CUSCO": [ - -71.6311427416849, - -13.510998672382 - ], - "HUANCARAY, ANDAHUAYLAS, APURIMAC": [ - -73.5471998572166, - -13.7696234088544 - ], - "HUANCARAYLLA, VICTOR FAJARDO, AYACUCHO": [ - -74.1698708626338, - -13.7490758789268 - ], - "HUANCARQUI, CASTILLA, AREQUIPA": [ - -72.3681882063559, - -16.0123989265889 - ], - "HUANCAS, CHACHAPOYAS, AMAZONAS": [ - -77.8749736813187, - -6.1561387768197 - ], - "HUANCASPATA, PATAZ, LA LIBERTAD": [ - -77.2681887170076, - -8.43914764932042 - ], - "HUANCAVELICA, HUANCAVELICA, HUANCAVELICA": [ - -75.0086414812063, - -12.8628485494324 - ], - "HUANCAYA, YAUYOS, LIMA": [ - -75.8347862883788, - -12.0905096900704 - ], - "HUANCAYO, HUANCAYO, JUNIN": [ - -75.0712797803089, - -11.9933231240794 - ], - "HUANCHACO, TRUJILLO, LA LIBERTAD": [ - -79.05849480098, - -8.00098029731493 - ], - "HUANCHAY, HUARAZ, ANCASH": [ - -77.8193337257751, - -9.73105679220459 - ], - "HUANCHAY, OCROS, ANCASH": [ - -77.4870297103395, - -10.6492564990729 - ], - "HUANDO, HUANCAVELICA, HUANCAVELICA": [ - -75.0136079101945, - -12.627284592917 - ], - "HUANDOVAL, PALLASCA, ANCASH": [ - -77.945598106696, - -8.33456823658252 - ], - "HUANGASCAR, YAUYOS, LIMA": [ - -75.8218496051551, - -12.9415584167008 - ], - "HUANIPACA, ABANCAY, APURIMAC": [ - -72.9752848562508, - -13.4760904999523 - ], - "HUANOQUITE, PARURO, CUSCO": [ - -72.079213338247, - -13.6988092285409 - ], - "HUANTA, HUANTA, AYACUCHO": [ - -74.2114592985681, - -12.9120374963411 - ], - "HUANTAN, YAUYOS, LIMA": [ - -75.70407971749, - -12.5130670450619 - ], - "HUANTAR, HUARI, ANCASH": [ - -77.236164872829, - -9.46782655205434 - ], - "HUANUARA, CANDARAVE, TACNA": [ - -70.3304636172564, - -17.3085360236381 - ], - "HUANUCO, HUANUCO, HUANUCO": [ - -76.296672147182, - -9.89658247664458 - ], - "HUANZA, HUAROCHIRI, LIMA": [ - -76.4436514835191, - -11.5611438020127 - ], - "HUAQUIRCA, ANTABAMBA, APURIMAC": [ - -72.786688417167, - -14.3402713726486 - ], - "HUARAL, HUARAL, LIMA": [ - -77.1711034164779, - -11.3870920091398 - ], - "HUARANCHAL, OTUZCO, LA LIBERTAD": [ - -78.451799291133, - -7.69051249852008 - ], - "HUARANGO, SAN IGNACIO, CAJAMARCA": [ - -78.7153004144198, - -5.09645367033109 - ], - "HUARAZ, HUARAZ, ANCASH": [ - -77.4715366763244, - -9.57041619942402 - ], - "HUARI, HUARI, ANCASH": [ - -77.2328962322916, - -9.32314104654057 - ], - "HUARIACA, PASCO, PASCO": [ - -76.154112085472, - -10.4517724336074 - ], - "HUARIBAMBA, TAYACAJA, HUANCAVELICA": [ - -74.9089154641379, - -12.2620899378646 - ], - "HUARICOLCA, TARMA, JUNIN": [ - -75.6169726440968, - -11.5256485421098 - ], - "HUARIN, LAURICOCHA, HUANUCO": [ - -76.6275098300769, - -9.97837678707369 - ], - "HUARIPAMPA, HUAYLAS, ANCASH": [ - -77.722585189264, - -8.90866663872505 - ], - "HUARIPAMPA, JAUJA, JUNIN": [ - -75.4806050849648, - -11.8212801828235 - ], - "HUARMACA, HUANCABAMBA, PIURA": [ - -79.5609933402671, - -5.69472861199322 - ], - "HUARMEY, HUARMEY, ANCASH": [ - -77.918617565767, - -10.1738310203879 - ], - "HUARO, QUISPICANCHI, CUSCO": [ - -71.6724000496577, - -13.7553194609384 - ], - "HUAROCHIRI, HUAROCHIRI, LIMA": [ - -76.2725837881267, - -12.069474368604 - ], - "HUAROCONDO, ANTA, CUSCO": [ - -72.2767056648601, - -13.3696553180378 - ], - "HUAROS, CANTA, LIMA": [ - -76.5023974499611, - -11.401312856858 - ], - "HUASAHUASI, TARMA, JUNIN": [ - -75.6257397022023, - -11.1276239227155 - ], - "HUASICANCHA, HUANCAYO, JUNIN": [ - -75.2860889365955, - -12.3712236914953 - ], - "HUASMIN, CELENDIN, CAJAMARCA": [ - -78.3256328996798, - -6.82828186530502 - ], - "HUASO, JULCAN, LA LIBERTAD": [ - -78.4405302494605, - -8.26159022428641 - ], - "HUASTA, BOLOGNESI, ANCASH": [ - -77.0315610520593, - -10.1139260243821 - ], - "HUATA, HUAYLAS, ANCASH": [ - -77.8765826547594, - -9.03006918062392 - ], - "HUATA, PUNO, PUNO": [ - -69.9977989057883, - -15.6216181788146 - ], - "HUATASANI, HUANCANE, PUNO": [ - -69.7996159221377, - -15.0189298696294 - ], - "HUAURA, HUAURA, LIMA": [ - -77.4452284130144, - -11.0035804613591 - ], - "HUAY-HUAY, YAULI, JUNIN": [ - -75.9653315451653, - -11.717136846884 - ], - "HUAYACUNDO ARMA, HUAYTARA, HUANCAVELICA": [ - -75.3117469226151, - -13.5548801389436 - ], - "HUAYAN, HUARMEY, ANCASH": [ - -77.7441392579254, - -9.89712100961778 - ], - "HUAYANA, ANDAHUAYLAS, APURIMAC": [ - -73.5509679806645, - -13.9895898436307 - ], - "HUAYLAS, HUAYLAS, ANCASH": [ - -77.8940178640664, - -8.88969301045192 - ], - "HUAYLILLAS, PATAZ, LA LIBERTAD": [ - -77.2936995486645, - -8.19040304270327 - ], - "HUAYLLABAMBA, SIHUAS, ANCASH": [ - -77.5300570667942, - -8.51213165162543 - ], - "HUAYLLABAMBA, URUBAMBA, CUSCO": [ - -72.0498099368372, - -13.3418925063627 - ], - "HUAYLLACAYAN, BOLOGNESI, ANCASH": [ - -77.4107731421805, - -10.2469428966017 - ], - "HUAYLLAHUARA, HUANCAVELICA, HUANCAVELICA": [ - -75.1829733200987, - -12.4014650243609 - ], - "HUAYLLAN, POMABAMBA, ANCASH": [ - -77.4662792071935, - -8.8897169279704 - ], - "HUAYLLAPAMPA, RECUAY, ANCASH": [ - -77.5146890175342, - -10.0577318235392 - ], - "HUAYLLATI, GRAU, APURIMAC": [ - -72.4958241969493, - -13.966490689905 - ], - "HUAYLLAY GRANDE, ANGARAES, HUANCAVELICA": [ - -74.6710837925551, - -12.9235699986632 - ], - "HUAYLLAY, PASCO, PASCO": [ - -76.4254456806182, - -10.9519752711627 - ], - "HUAYNACANCHA, HUANTA, AYACUCHO": [ - -74.0931831531408, - -12.7845381367919 - ], - "HUAYO, PATAZ, LA LIBERTAD": [ - -77.5922271223796, - -8.03494125135816 - ], - "HUAYRAPATA, MOHO, PUNO": [ - -69.2956349349011, - -15.2760923321641 - ], - "HUAYTARA, HUAYTARA, HUANCAVELICA": [ - -75.3927503965879, - -13.6535444021996 - ], - "HUAYUCACHI, HUANCAYO, JUNIN": [ - -75.2220664868662, - -12.1344099817026 - ], - "HUA\u00d1EC, YAUYOS, LIMA": [ - -76.0794986416602, - -12.2748029125315 - ], - "HUEPETUHE, MANU, MADRE DE DIOS": [ - -70.6520780572816, - -13.0031498435792 - ], - "HUERTAS, JAUJA, JUNIN": [ - -75.4667399799649, - -11.7643840397455 - ], - "HUICUNGO, MARISCAL CACERES, SAN MARTIN": [ - -77.321560391347, - -7.25927236581214 - ], - "HUIMBAYOC, SAN MARTIN, SAN MARTIN": [ - -75.7136103360231, - -6.63864689763569 - ], - "HUMAY, PISCO, ICA": [ - -75.8179854018786, - -13.7440848561721 - ], - "IBERIA, REQUENA, LORETO": [ - -73.9935424074722, - -5.99203134605317 - ], - "IBERIA, TAHUAMANU, MADRE DE DIOS": [ - -69.6792726283442, - -11.4350937356332 - ], - "ICA, ICA, ICA": [ - -75.9066566806043, - -14.2138566933713 - ], - "ICHOCAN, SAN MARCOS, CAJAMARCA": [ - -78.0597916038431, - -7.40608245325243 - ], - "ICHUPAMPA, CAYLLOMA, AREQUIPA": [ - -71.7053082862247, - -15.5861918378982 - ], - "ICHU\u00d1A, GENERAL SANCHEZ CERRO, MOQUEGUA": [ - -70.4947181808719, - -16.1882306933747 - ], - "IHUARI, HUARAL, LIMA": [ - -76.9608767824114, - -11.18728337476 - ], - "IHUAYLLO, AYMARAES, APURIMAC": [ - -73.2440329948131, - -14.0979376254434 - ], - "ILABAYA, JORGE BASADRE, TACNA": [ - -70.5709881980353, - -17.3837836483756 - ], - "ILAVE, EL COLLAO, PUNO": [ - -69.6780853867734, - -16.2402047183414 - ], - "ILLIMO, LAMBAYEQUE, LAMBAYEQUE": [ - -79.853367188439, - -6.46959393045695 - ], - "ILO, ILO, MOQUEGUA": [ - -71.2169409950908, - -17.7141595452719 - ], - "IMPERIAL, CA\u00d1ETE, LIMA": [ - -76.3696001528183, - -13.0330912355124 - ], - "INAHUAYA, UCAYALI, LORETO": [ - -75.2998309831715, - -7.04088987085972 - ], - "INCAHUASI, FERRE\u00d1AFE, LAMBAYEQUE": [ - -79.387147202891, - -6.23124427947483 - ], - "INCHUPALLA, HUANCANE, PUNO": [ - -69.6446090721801, - -15.0008608312155 - ], - "INCUYO, PARINACOCHAS, AYACUCHO": [ - -73.5976263644899, - -15.2820812954191 - ], - "INDEPENDENCIA, LIMA, LIMA": [ - -77.0460445307492, - -11.9874731951672 - ], - "INDEPENDENCIA, PISCO, ICA": [ - -76.0129977710165, - -13.6468604050745 - ], - "INDIANA, MAYNAS, LORETO": [ - -72.856333386362, - -3.82915910635811 - ], - "INGENIO, HUANCAYO, JUNIN": [ - -75.2229562735624, - -11.8537364410937 - ], - "INGUILPATA, LUYA, AMAZONAS": [ - -78.0285735052228, - -6.24809797893011 - ], - "INTUTU, LORETO, LORETO": [ - -75.2648518295243, - -2.94373100205301 - ], - "IPAL /6, LA CONVENCION, CUSCO": [ - -72.4732857140615, - -13.0509532556662 - ], - "IPARIA, CORONEL PORTILLO, UCAYALI": [ - -74.1372239911992, - -9.44298790977894 - ], - "IQUIPI, CONDESUYOS, AREQUIPA": [ - -73.1265474157563, - -15.8808777060053 - ], - "IQUITOS, MAYNAS, LORETO": [ - -73.4328382975117, - -3.78230213607606 - ], - "IRAY, CONDESUYOS, AREQUIPA": [ - -72.6005764338971, - -15.9130183656615 - ], - "ISCOS, CHUPACA, JUNIN": [ - -75.3015957133579, - -12.1193467840652 - ], - "ISCOZACIN, OXAPAMPA, PASCO": [ - -75.2761401162079, - -10.2343613805951 - ], - "ISLAY (MATARANI), ISLAY, AREQUIPA": [ - -72.1022333632458, - -16.8763347033734 - ], - "ITE, JORGE BASADRE, TACNA": [ - -70.9329951430549, - -17.8035161835349 - ], - "ITUATA /16, CARABAYA, PUNO": [ - -70.1160944087771, - -13.8296416455405 - ], - "IZCUCHACA, HUANCAVELICA, HUANCAVELICA": [ - -75.0135552018404, - -12.496344739806 - ], - "I\u00d1APARI, TAHUAMANU, MADRE DE DIOS": [ - -70.6499129821014, - -10.9651997351768 - ], - "JACAS GRANDE, HUAMALIES, HUANUCO": [ - -76.6684104010932, - -9.51519574659661 - ], - "JACOBO HUNTER, AREQUIPA, AREQUIPA": [ - -71.5626841454198, - -16.4587137721784 - ], - "JAEN, JAEN, CAJAMARCA": [ - -78.8525180636178, - -5.77021239267015 - ], - "JAMALCA, UTCUBAMBA, AMAZONAS": [ - -78.2349570882293, - -5.95246999893778 - ], - "JANGAS, HUARAZ, ANCASH": [ - -77.6038411725108, - -9.44133063239278 - ], - "JANJAILLO /11, JAUJA, JUNIN": [ - -75.6187190286755, - -11.7656305305951 - ], - "JAQUI, CARAVELI, AREQUIPA": [ - -74.3981647648613, - -15.4491016657413 - ], - "JARDIN, HUAMANGA, AYACUCHO": [ - -74.2002043296657, - -13.1546008135357 - ], - "JARPA, CHUPACA, JUNIN": [ - -75.4510172540694, - -12.1234933138434 - ], - "JAUJA, JAUJA, JUNIN": [ - -75.491137788588, - -11.7740855820948 - ], - "JAYANCA, LAMBAYEQUE, LAMBAYEQUE": [ - -79.8082831139313, - -6.33418220439097 - ], - "JEBEROS, ALTO AMAZONAS, LORETO": [ - -76.2049797640072, - -5.29686019897673 - ], - "JENARO HERRERA, REQUENA, LORETO": [ - -73.698347747299, - -4.99617085001332 - ], - "JEPELACIO, MOYOBAMBA, SAN MARTIN": [ - -76.9218020698841, - -6.17353785050755 - ], - "JEQUETEPEQUE, PACASMAYO, LA LIBERTAD": [ - -79.5469849352348, - -7.35015297792695 - ], - "JESUS MARIA, LIMA, LIMA": [ - -77.0482083603501, - -12.0781064169476 - ], - "JESUS, CAJAMARCA, CAJAMARCA": [ - -78.3666471586572, - -7.29830954384266 - ], - "JESUS, LAURICOCHA, HUANUCO": [ - -76.7555788361306, - -10.2185320339679 - ], - "JILILI, AYABACA, PIURA": [ - -79.8315489938896, - -4.53182247946501 - ], - "JIMBE, SANTA, ANCASH": [ - -78.076414817062, - -8.96100155209023 - ], - "JIRCAN, HUAMALIES, HUANUCO": [ - -76.6440229105396, - -9.21653962191627 - ], - "JIVIA, LAURICOCHA, HUANUCO": [ - -76.6563209128212, - -10.0354742221484 - ], - "JUAN GUERRA, SAN MARTIN, SAN MARTIN": [ - -76.3506779945106, - -6.62125805960373 - ], - "JUANJUI, MARISCAL CACERES, SAN MARTIN": [ - -76.768004482267, - -7.24481666418179 - ], - "JUCUL, HUAURA, LIMA": [ - -76.6712218148464, - -10.9627544229786 - ], - "JULCAMARCA, ANGARAES, HUANCAVELICA": [ - -74.4309536397764, - -13.0125173346266 - ], - "JULCAN, JAUJA, JUNIN": [ - -75.4288855034775, - -11.7542554712741 - ], - "JULCAN, JULCAN, LA LIBERTAD": [ - -78.4619616901307, - -8.07476734876475 - ], - "JULI, CHUCUITO, PUNO": [ - -69.5029260540657, - -16.3287178075064 - ], - "JULIACA, SAN ROMAN, PUNO": [ - -70.2155289073877, - -15.4598740376323 - ], - "JUMBILLA, BONGARA, AMAZONAS": [ - -77.8256593500305, - -5.95173996980351 - ], - "JUNIN, JUNIN, JUNIN": [ - -76.0119235566731, - -11.1888143823653 - ], - "KAQUIABAMBA, ANDAHUAYLAS, APURIMAC": [ - -73.2794064467273, - -13.5115460436943 - ], - "KELLUYO, CHUCUITO, PUNO": [ - -69.2480151804017, - -16.7216019782086 - ], - "KIMBIRI, LA CONVENCION, CUSCO": [ - -73.6382269631562, - -12.614879219602 - ], - "KISHUARA, ANDAHUAYLAS, APURIMAC": [ - -73.1624793659387, - -13.6652521599257 - ], - "LA ARENA, PIURA, PIURA": [ - -80.7625787241597, - -5.30898220281659 - ], - "LA BANDA, SAN MARTIN, SAN MARTIN": [ - -76.2720677181716, - -6.47746214084566 - ], - "LA CALETA CULEBRAS, HUARMEY, ANCASH": [ - -78.1034619728267, - -9.82261258145535 - ], - "LA CAPILLA, GENERAL SANCHEZ CERRO, MOQUEGUA": [ - -71.2940095258597, - -16.826032684064 - ], - "LA COIPA, SAN IGNACIO, CAJAMARCA": [ - -78.9733676055675, - -5.38984119845824 - ], - "LA CUESTA, OTUZCO, LA LIBERTAD": [ - -78.6849850742976, - -7.90847527747319 - ], - "LA CURVA, ISLAY, AREQUIPA": [ - -71.8293991571818, - -17.097994148073 - ], - "LA ESMERALDA, CHURCAMPA, HUANCAVELICA": [ - -74.563053719002, - -12.6435333472702 - ], - "LA ESPERANZA, SANTA CRUZ, CAJAMARCA": [ - -78.859004737008, - -6.62072427434217 - ], - "LA ESPERANZA, TACNA, TACNA": [ - -70.2788960988511, - -17.8333562119029 - ], - "LA ESPERANZA, TRUJILLO, LA LIBERTAD": [ - -79.055943790646, - -8.06341068513155 - ], - "LA FLORIDA, SAN MIGUEL, CAJAMARCA": [ - -79.1488349006001, - -6.86887896491472 - ], - "LA GRAMA, SAN MARCOS, CAJAMARCA": [ - -78.1434022439999, - -7.44123441822372 - ], - "LA HUACA, PAITA, PIURA": [ - -80.9131600643639, - -5.06546309730484 - ], - "LA JALCA, CHACHAPOYAS, AMAZONAS": [ - -77.7844000042263, - -6.50359608708566 - ], - "LA JOYA, AREQUIPA, AREQUIPA": [ - -71.7957995388359, - -16.5884395606166 - ], - "LA LIBERTAD DE PALLAN, CELENDIN, CAJAMARCA": [ - -78.2860999340752, - -6.70880058859925 - ], - "LA LIBERTAD, AREQUIPA, AREQUIPA": [ - -71.5765993129701, - -16.3044653071168 - ], - "LA LIBERTAD, LIMA, LIMA": [ - -77.038900724795, - -11.9290645806825 - ], - "LA MATANZA, MORROPON, PIURA": [ - -80.0828694993064, - -5.36770207299451 - ], - "LA MERCED, AIJA, ANCASH": [ - -77.6154231162455, - -9.703052525146 - ], - "LA MERCED, CHANCHAMAYO, JUNIN": [ - -75.3564273111599, - -11.032763801939 - ], - "LA MERCED, CHURCAMPA, HUANCAVELICA": [ - -74.3297852898877, - -12.7948943855713 - ], - "LA MOLINA, LIMA, LIMA": [ - -76.925728617994, - -12.0880856621116 - ], - "LA MORADA, MARA\u00d1ON, HUANUCO": [ - -76.3630945294797, - -8.88043406847719 - ], - "LA OROYA, YAULI, JUNIN": [ - -75.8566873496264, - -11.6052702740277 - ], - "LA PAMPA, CAMANA, AREQUIPA": [ - -72.6524473304868, - -16.6013386971611 - ], - "LA PAMPA, CORONGO, ANCASH": [ - -77.8931061459428, - -8.67813902877634 - ], - "LA PECA, BAGUA, AMAZONAS": [ - -78.4454109538139, - -5.59197662393783 - ], - "LA PERLA, CALLAO, CALLAO": [ - -77.1160979212734, - -12.0702772897404 - ], - "LA PUNTA, CALLAO, CALLAO": [ - -77.1627829273893, - -12.0716951093548 - ], - "LA RAMADA, CUTERVO, CAJAMARCA": [ - -78.5542604253341, - -6.21657299145676 - ], - "LA SACILIA, CUTERVO, CAJAMARCA": [ - -78.6925137120132, - -5.98795017964297 - ], - "LA TINGUI\u00d1A, ICA, ICA": [ - -75.6734734403919, - -14.0107840080034 - ], - "LA UNION, DOS DE MAYO, HUANUCO": [ - -76.7946953058615, - -9.90789154732888 - ], - "LA UNION, PIURA, PIURA": [ - -80.867992118201, - -5.33287509221326 - ], - "LA VICTORIA, CHICLAYO, LAMBAYEQUE": [ - -79.8610892804087, - -6.82376578078751 - ], - "LA VICTORIA, LIMA, LIMA": [ - -77.0173856344259, - -12.0723328386541 - ], - "LACABAMBA, PALLASCA, ANCASH": [ - -77.905532601593, - -8.26579876882025 - ], - "LACHAQUI, CANTA, LIMA": [ - -76.6115962243171, - -11.5556352845022 - ], - "LAGUNAS, ALTO AMAZONAS, LORETO": [ - -75.976056368147, - -4.62833596891916 - ], - "LAGUNAS, AYABACA, PIURA": [ - -79.8533697392801, - -4.78001989953733 - ], - "LAHUAYTAMBO, HUAROCHIRI, LIMA": [ - -76.3918800530631, - -12.0932825713539 - ], - "LAJAS, CHOTA, CAJAMARCA": [ - -78.7274775478255, - -6.57432233616091 - ], - "LAMAS, LAMAS, SAN MARTIN": [ - -76.5260971797975, - -6.3989817375489 - ], - "LAMAY, CALCA, CUSCO": [ - -71.8810882392495, - -13.3220609252004 - ], - "LAMBAYEQUE, LAMBAYEQUE, LAMBAYEQUE": [ - -79.9328371532025, - -6.67387047238273 - ], - "LAMBRAMA, ABANCAY, APURIMAC": [ - -72.7881336912718, - -13.8040203914473 - ], - "LAMPA, LAMPA, PUNO": [ - -70.4109320389638, - -15.3559573978949 - ], - "LAMPA, PAUCAR DEL SARA SARA, AYACUCHO": [ - -73.4496747992374, - -15.148468363676 - ], - "LAMPIAN, HUARAL, LIMA": [ - -76.8638324497699, - -11.2473324768315 - ], - "LAMUD, LUYA, AMAZONAS": [ - -77.9435613296459, - -6.1198896666587 - ], - "LANCONES, SULLANA, PIURA": [ - -80.5027425247715, - -4.41997317153312 - ], - "LANGA, HUAROCHIRI, LIMA": [ - -76.3756797172465, - -12.1592795115646 - ], - "LANGUI, CANAS, CUSCO": [ - -71.2974019506019, - -14.385340105416 - ], - "LANLACUNI BAJO, CARABAYA, PUNO": [ - -70.3948706265551, - -13.5240516448606 - ], - "LARAMARCA, HUAYTARA, HUANCAVELICA": [ - -75.057273830608, - -13.9060115255224 - ], - "LARAMATE, LUCANAS, AYACUCHO": [ - -74.7662296052573, - -14.2499743850711 - ], - "LARAOS, HUAROCHIRI, LIMA": [ - -76.531702341938, - -11.585180558967 - ], - "LARAOS, YAUYOS, LIMA": [ - -75.6761897027286, - -12.3844899863409 - ], - "LARAQUERI, PUNO, PUNO": [ - -70.1584593210181, - -16.2398956288924 - ], - "LAREDO, TRUJILLO, LA LIBERTAD": [ - -78.8550903460996, - -8.10526455954691 - ], - "LARES, CALCA, CUSCO": [ - -72.0260323683824, - -13.0860066680094 - ], - "LARI, CAYLLOMA, AREQUIPA": [ - -71.7604455185155, - -15.4799474401474 - ], - "LARIA, HUANCAVELICA, HUANCAVELICA": [ - -75.0802488943444, - -12.5532459302612 - ], - "LAS LOMAS, PIURA, PIURA": [ - -80.2277415397906, - -4.69210978690848 - ], - "LAS NAZARENAS, HUAMANGA, AYACUCHO": [ - -74.2085018099994, - -13.1218251824794 - ], - "LAS PALMAS, LEONCIO PRADO, HUANUCO": [ - -76.030566095586, - -9.39464896799868 - ], - "LAS PALMERAS, LIMA, LIMA": [ - -77.0743669727161, - -11.9724226106155 - ], - "LAS PIEDRAS (PLANCHON), TAMBOPATA, MADRE DE DIOS": [ - -69.5393094906946, - -12.0036897677824 - ], - "LAS PIRIAS, JAEN, CAJAMARCA": [ - -78.8495902441663, - -5.63634227071634 - ], - "LAS YARAS, TACNA, TACNA": [ - -70.6676920127319, - -17.9569866749461 - ], - "LAYO, CANAS, CUSCO": [ - -71.0919648095727, - -14.5287982155691 - ], - "LEDOY, BELLAVISTA, SAN MARTIN": [ - -76.5688433860277, - -7.29422243940639 - ], - "LEIMEBAMBA, CHACHAPOYAS, AMAZONAS": [ - -77.7987079697163, - -6.80890011455197 - ], - "LETICIA, TARMA, JUNIN": [ - -75.822642562988, - -11.3609955276538 - ], - "LEVANTO, CHACHAPOYAS, AMAZONAS": [ - -77.8645483870601, - -6.31429772476705 - ], - "LICUPIS, CHOTA, CAJAMARCA": [ - -79.2455186013577, - -6.48432037859074 - ], - "LIMA, LIMA, LIMA": [ - -77.0488741340857, - -12.0510318836147 - ], - "LIMABAMBA, RODRIGUEZ DE MENDOZA, AMAZONAS": [ - -77.5760311618453, - -6.55307936580646 - ], - "LIMATAMBO, ANTA, CUSCO": [ - -72.4455262488306, - -13.4751053914709 - ], - "LIMBANI, SANDIA, PUNO": [ - -69.6074422813108, - -13.7784486430568 - ], - "LINCE, LIMA, LIMA": [ - -77.0356666564943, - -12.0857913986497 - ], - "LINCHA, YAUYOS, LIMA": [ - -75.6306915373648, - -12.8109440533627 - ], - "LIRCAY, ANGARAES, HUANCAVELICA": [ - -74.737559446903, - -13.1037194284544 - ], - "LIVITACA, CHUMBIVILCAS, CUSCO": [ - -71.6463323052371, - -14.3338730704294 - ], - "LLACANORA, CAJAMARCA, CAJAMARCA": [ - -78.4118458061995, - -7.18959858420461 - ], - "LLACLLA, BOLOGNESI, ANCASH": [ - -77.1597586944519, - -10.3099487076956 - ], - "LLACLLIN, RECUAY, ANCASH": [ - -77.587486894671, - -10.1080377067317 - ], - "LLALLI, MELGAR, PUNO": [ - -70.9270740274521, - -14.9874569853546 - ], - "LLAMA, CHOTA, CAJAMARCA": [ - -79.1729048225211, - -6.53902353012976 - ], - "LLAMA, MARISCAL LUZURIAGA, ANCASH": [ - -77.2901408234513, - -8.9095707973677 - ], - "LLAMELLIN, ANTONIO RAYMONDI, ANCASH": [ - -77.0070169280858, - -9.08180668129321 - ], - "LLAPA, SAN MIGUEL, CAJAMARCA": [ - -78.7487035420641, - -6.89137174280869 - ], - "LLAPO, PALLASCA, ANCASH": [ - -78.0302889782042, - -8.51561813690839 - ], - "LLATA, HUAMALIES, HUANUCO": [ - -76.9032699406576, - -9.61397569038553 - ], - "LLAUTA, LUCANAS, AYACUCHO": [ - -74.9405469550763, - -14.2497891482695 - ], - "LLAYLLA, SATIPO, JUNIN": [ - -74.6489923829124, - -11.4629467242807 - ], - "LLIPA, OCROS, ANCASH": [ - -77.2144446948773, - -10.3791130733093 - ], - "LLIPATA, PALPA, ICA": [ - -75.158727488823, - -14.5946604949035 - ], - "LLOCHEGUA, HUANTA, AYACUCHO": [ - -74.0825499098418, - -12.4444380869969 - ], - "LLOCLLAPAMPA, JAUJA, JUNIN": [ - -75.6250488440914, - -11.8348413677208 - ], - "LLOQUE, GENERAL SANCHEZ CERRO, MOQUEGUA": [ - -70.6272476094311, - -16.3035765065428 - ], - "LLUCHUBAMBA, CAJABAMBA, CAJAMARCA": [ - -77.9062974063386, - -7.47437870435429 - ], - "LLUMPA, MARISCAL LUZURIAGA, ANCASH": [ - -77.4563731140651, - -8.9674808141338 - ], - "LLUSCO, CHUMBIVILCAS, CUSCO": [ - -72.2364911611929, - -14.4623483067247 - ], - "LLUTA, CAYLLOMA, AREQUIPA": [ - -72.0184453267416, - -15.9676227044227 - ], - "LOBITOS, TALARA, PIURA": [ - -81.202351039794, - -4.40297227453444 - ], - "LOCROJA, CHURCAMPA, HUANCAVELICA": [ - -74.4547189626373, - -12.7173526101159 - ], - "LOCUMBA, JORGE BASADRE, TACNA": [ - -70.733067474097, - -17.6042299646114 - ], - "LOMAS, CARAVELI, AREQUIPA": [ - -74.9351411350289, - -15.3867630628007 - ], - "LONGAR, RODRIGUEZ DE MENDOZA, AMAZONAS": [ - -77.5660859638343, - -6.35105486539665 - ], - "LONGOTEA, BOLIVAR, LA LIBERTAD": [ - -77.9101180314099, - -7.05648445765294 - ], - "LONGUITA, LUYA, AMAZONAS": [ - -78.0048091161632, - -6.4073053388807 - ], - "LONYA CHICO, LUYA, AMAZONAS": [ - -78.0123758221556, - -6.20744075147243 - ], - "LONYA GRANDE, UTCUBAMBA, AMAZONAS": [ - -78.4106805111003, - -6.06348043759088 - ], - "LOS AQUIJES, ICA, ICA": [ - -75.6406125071867, - -14.0740320789036 - ], - "LOS BA\u00d1OS DEL INCA, CAJAMARCA, CAJAMARCA": [ - -78.4559728769625, - -7.09012347120905 - ], - "LOS ORGANOS, TALARA, PIURA": [ - -81.0641530359217, - -4.19478694576117 - ], - "LOS PALOS, TACNA, TACNA": [ - -70.4390395299144, - -18.2004256887017 - ], - "LUCANAS, LUCANAS, AYACUCHO": [ - -74.3044062802277, - -14.4874501410986 - ], - "LUCMA, GRAN CHIMU, LA LIBERTAD": [ - -78.5765827939074, - -7.62997999934353 - ], - "LUCMA, LA CONVENCION, CUSCO": [ - -73.0511526147575, - -13.0533738291172 - ], - "LUCMA, MARISCAL LUZURIAGA, ANCASH": [ - -77.4451777805996, - -8.92515194743095 - ], - "LUCMAPAMPA, CELENDIN, CAJAMARCA": [ - -78.0696072914303, - -6.93955550598393 - ], - "LUCRE, AYMARAES, APURIMAC": [ - -73.2454538805782, - -13.915877108975 - ], - "LUCRE, QUISPICANCHI, CUSCO": [ - -71.7678315587286, - -13.6449913167289 - ], - "LUNAHUANA, CA\u00d1ETE, LIMA": [ - -76.1173833705106, - -13.0193291357444 - ], - "LURICOCHA, HUANTA, AYACUCHO": [ - -74.2744318416666, - -12.8608119883767 - ], - "LURIN, LIMA, LIMA": [ - -76.8011121547371, - -12.234259392255 - ], - "LUYA VIEJO, LUYA, AMAZONAS": [ - -78.1168099407179, - -6.11249523253568 - ], - "LUYA, LUYA, AMAZONAS": [ - -77.9811869260673, - -6.17185353575652 - ], - "LUYANDO /8, LEONCIO PRADO, HUANUCO": [ - -75.9529309377491, - -9.24011651069842 - ], - "MACA, CAYLLOMA, AREQUIPA": [ - -71.7972769813728, - -15.7313018058623 - ], - "MACACHACRA, HUANTA, AYACUCHO": [ - -74.2182525054861, - -12.9830864573838 - ], - "MACARI, MELGAR, PUNO": [ - -70.9321835411255, - -14.7114187141402 - ], - "MACATE, SANTA, ANCASH": [ - -78.1219901439513, - -8.77654672781173 - ], - "MACHAGUAY, CASTILLA, AREQUIPA": [ - -72.4717592399525, - -15.6011304726549 - ], - "MACHE, OTUZCO, LA LIBERTAD": [ - -78.5338050260255, - -8.03421863768865 - ], - "MACHUPICCHU, URUBAMBA, CUSCO": [ - -72.5001588097209, - -13.2014714949172 - ], - "MACUSANI, CARABAYA, PUNO": [ - -70.4701527733859, - -14.0561766489685 - ], - "MADEAN, YAUYOS, LIMA": [ - -75.6983349944271, - -12.9611396500619 - ], - "MADRIGAL, CAYLLOMA, AREQUIPA": [ - -71.8574428013235, - -15.5413404031596 - ], - "MAGDALENA DE CAO, ASCOPE, LA LIBERTAD": [ - -79.2999228059357, - -7.85515630157276 - ], - "MAGDALENA DEL MAR, LIMA, LIMA": [ - -77.0666944126318, - -12.0938386851282 - ], - "MAGDALENA, CAJAMARCA, CAJAMARCA": [ - -78.6223839280353, - -7.2247288445027 - ], - "MAGDALENA, CHACHAPOYAS, AMAZONAS": [ - -77.8238175383048, - -6.4205641655633 - ], - "MAINO, CHACHAPOYAS, AMAZONAS": [ - -77.8225670100118, - -6.35442044863673 - ], - "MALA, CA\u00d1ETE, LIMA": [ - -76.60163695937, - -12.6535003939062 - ], - "MALVAS, HUARMEY, ANCASH": [ - -77.6646918404758, - -9.92102566994703 - ], - "MAMARA, GRAU, APURIMAC": [ - -72.5667952682269, - -14.2120167370395 - ], - "MANAS, CAJATAMBO, LIMA": [ - -77.2208089442683, - -10.6123676943159 - ], - "MANCORA, TALARA, PIURA": [ - -81.0086063079116, - -4.14830830599587 - ], - "MANCOS, YUNGAY, ANCASH": [ - -77.6501215982453, - -9.19230107533111 - ], - "MANGAS, BOLOGNESI, ANCASH": [ - -77.1047470191598, - -10.3609305787082 - ], - "MANTA, HUANCAVELICA, HUANCAVELICA": [ - -75.1604993668731, - -12.6087651047527 - ], - "MANUEL ANTONIO MESONES MURO, FERRE\u00d1AFE, LAMBAYEQUE": [ - -79.6828299457227, - -6.63533132109602 - ], - "MARA, COTABAMBAS, APURIMAC": [ - -72.1153708916017, - -14.0451411169736 - ], - "MARANGANI, CANCHIS, CUSCO": [ - -71.095631180604, - -14.3736330076097 - ], - "MARANURA, LA CONVENCION, CUSCO": [ - -72.6438218594084, - -12.9375608766095 - ], - "MARAS, URUBAMBA, CUSCO": [ - -72.1621854276445, - -13.3370025800929 - ], - "MARAY, HUAURA, LIMA": [ - -76.8554805732326, - -10.9216976726836 - ], - "MARCA, RECUAY, ANCASH": [ - -77.45434150449, - -10.0742217699243 - ], - "MARCABAL, SANCHEZ CARRION, LA LIBERTAD": [ - -77.9416836665766, - -7.68491390053329 - ], - "MARCABAMBA, PAUCAR DEL SARA SARA, AYACUCHO": [ - -73.3791590061352, - -15.0917256483914 - ], - "MARCAJA, YUNGUYO, PUNO": [ - -68.9722701644852, - -16.2209101575602 - ], - "MARCAPATA, QUISPICANCHI, CUSCO": [ - -70.9126788646332, - -13.6397991741552 - ], - "MARCAPOMACOCHA, YAULI, JUNIN": [ - -76.2576995512796, - -11.4048868363362 - ], - "MARCARA, CARHUAZ, ANCASH": [ - -77.4955272685212, - -9.30371162157544 - ], - "MARCAS, ACOBAMBA, HUANCAVELICA": [ - -74.3977838859997, - -12.8744263279039 - ], - "MARCAVELICA, SULLANA, PIURA": [ - -80.7849327027262, - -4.53705115451013 - ], - "MARCO, JAUJA, JUNIN": [ - -75.5677471578519, - -11.7604504514945 - ], - "MARGOS, HUANUCO, HUANUCO": [ - -76.5331933277573, - -10.0632402868169 - ], - "MARIA, LUYA, AMAZONAS": [ - -77.960795954565, - -6.49656553530174 - ], - "MARIANO MELGAR, AREQUIPA, AREQUIPA": [ - -71.4628766565431, - -16.37538374539 - ], - "MARIAS, DOS DE MAYO, HUANUCO": [ - -76.423514800007, - -9.54691876877704 - ], - "MARIATANA, HUAROCHIRI, LIMA": [ - -76.3653202992643, - -12.2616369340088 - ], - "MARIPOSA, SATIPO, JUNIN": [ - -74.8418596714676, - -11.4137619367243 - ], - "MARISCAL BENAVIDES, RODRIGUEZ DE MENDOZA, AMAZONAS": [ - -77.4851147349923, - -6.29166387847377 - ], - "MARISCAL CACERES, HUANCAVELICA, HUANCAVELICA": [ - -74.9353033718456, - -12.54792399243 - ], - "MARISCAL CACERES, TAYACAJA, HUANCAVELICA": [ - -74.833663714586, - -12.3453362169096 - ], - "MARMOT /13, GRAN CHIMU, LA LIBERTAD": [ - -78.7015060837186, - -7.66253048401297 - ], - "MASIN, HUARI, ANCASH": [ - -77.0925368772189, - -9.3316198024705 - ], - "MASISEA, CORONEL PORTILLO, UCAYALI": [ - -73.6865428195806, - -8.95591229332935 - ], - "MASMA CHICCHE, JAUJA, JUNIN": [ - -75.3646618493748, - -11.7749641460405 - ], - "MASMA, JAUJA, JUNIN": [ - -75.4220187218252, - -11.7808253473452 - ], - "MASSIAPO, SANDIA, PUNO": [ - -69.3344186586459, - -14.0319795462513 - ], - "MATACOTO, YUNGAY, ANCASH": [ - -77.758965332339, - -9.17748956877461 - ], - "MATAHUASI, CONCEPCION, JUNIN": [ - -75.3574342501952, - -11.8818467748275 - ], - "MATALAQUE, GENERAL SANCHEZ CERRO, MOQUEGUA": [ - -70.8365565626555, - -16.5286758501109 - ], - "MATAPALO, ZARUMILLA, TUMBES": [ - -80.2285395937643, - -3.76762627331086 - ], - "MATARA, CAJAMARCA, CAJAMARCA": [ - -78.2594834710128, - -7.27201195503162 - ], - "MATUCANA, HUAROCHIRI, LIMA": [ - -76.3794307877257, - -11.8161477184492 - ], - "MAYOCC, CHURCAMPA, HUANCAVELICA": [ - -74.4100094392632, - -12.7878913633086 - ], - "MAZAN, MAYNAS, LORETO": [ - -73.7521533440522, - -2.99371921087006 - ], - "MAZO CRUZ, EL COLLAO, PUNO": [ - -69.8551974315592, - -16.8357921380636 - ], - "MAZUKO, TAMBOPATA, MADRE DE DIOS": [ - -69.9388448509389, - -12.9767443307914 - ], - "MA\u00d1AZO, PUNO, PUNO": [ - -70.4086169830351, - -15.880794802837 - ], - "MEJIA, ISLAY, AREQUIPA": [ - -71.8785870452114, - -17.0356112362994 - ], - "MENDOZA, RODRIGUEZ DE MENDOZA, AMAZONAS": [ - -77.4389576810386, - -6.37280617986033 - ], - "MI PERU, CALLAO, CALLAO": [ - -77.1205556937766, - -11.8543394624239 - ], - "MILPUC, RODRIGUEZ DE MENDOZA, AMAZONAS": [ - -77.4136453037908, - -6.49865838513237 - ], - "MIRACOSTA, CHOTA, CAJAMARCA": [ - -79.3026174317502, - -6.35776101705834 - ], - "MIRAFLORES, AREQUIPA, AREQUIPA": [ - -71.4712787187925, - -16.3564685917444 - ], - "MIRAFLORES, HUAMALIES, HUANUCO": [ - -76.8707383274177, - -9.4496496189076 - ], - "MIRAFLORES, LIMA, LIMA": [ - -77.0289336383982, - -12.1209111982252 - ], - "MIRAFLORES, YAUYOS, LIMA": [ - -75.8892158709524, - -12.2346418576048 - ], - "MIRGAS, ANTONIO RAYMONDI, ANCASH": [ - -77.1129241118025, - -9.11603716529133 - ], - "MITO, CONCEPCION, JUNIN": [ - -75.351750042795, - -11.9288009816498 - ], - "MOCHE, TRUJILLO, LA LIBERTAD": [ - -79.0006411963477, - -8.15976077177586 - ], - "MOCHUMI, LAMBAYEQUE, LAMBAYEQUE": [ - -79.8875148358986, - -6.56281896525308 - ], - "MOCUPE, CHICLAYO, LAMBAYEQUE": [ - -79.6713012371191, - -7.01442433950705 - ], - "MOHO, MOHO, PUNO": [ - -69.4476079430832, - -15.3508016908865 - ], - "MOLINO, PACHITEA, HUANUCO": [ - -76.058077278956, - -9.99639138101532 - ], - "MOLINOPAMPA, CHACHAPOYAS, AMAZONAS": [ - -77.607260356591, - -6.21243633182935 - ], - "MOLINOS, JAUJA, JUNIN": [ - -75.3392730186435, - -11.5942167442062 - ], - "MOLLEBAMBA, ANTABAMBA, APURIMAC": [ - -72.9083883019291, - -14.5586108366479 - ], - "MOLLEBAMBA, SANTIAGO DE CHUCO, LA LIBERTAD": [ - -77.9808115702686, - -8.12796622871925 - ], - "MOLLEBAYA, AREQUIPA, AREQUIPA": [ - -71.4738447549084, - -16.5040793950594 - ], - "MOLLENDO, ISLAY, AREQUIPA": [ - -71.8788517189548, - -16.8573765358429 - ], - "MOLLEPAMPA, CASTROVIRREYNA, HUANCAVELICA": [ - -75.4319935857278, - -13.2918879569219 - ], - "MOLLEPATA, ANTA, CUSCO": [ - -72.6231609659824, - -13.4635813818295 - ], - "MOLLEPATA, SANTIAGO DE CHUCO, LA LIBERTAD": [ - -77.9420407530216, - -8.1426211436483 - ], - "MONOBAMBA, JAUJA, JUNIN": [ - -75.2310699362786, - -11.4085686910941 - ], - "MONSEFU, CHICLAYO, LAMBAYEQUE": [ - -79.8574813037368, - -6.86572814479676 - ], - "MONTE ALEGRE, PADRE ABAD, UCAYALI": [ - -75.0490310821598, - -8.6412985191896 - ], - "MONTERO, AYABACA, PIURA": [ - -79.8462376103299, - -4.63797029844247 - ], - "MONTEVIDEO, CHACHAPOYAS, AMAZONAS": [ - -77.7184439761781, - -6.62809252872614 - ], - "MONZON, HUAMALIES, HUANUCO": [ - -76.3879356457359, - -9.33124435512163 - ], - "MOQUEGUA, MARISCAL NIETO, MOQUEGUA": [ - -71.0612369473049, - -17.229229464928 - ], - "MORALES, SAN MARTIN, SAN MARTIN": [ - -76.4170101107032, - -6.50806366399031 - ], - "MORCOLLA, SUCRE, AYACUCHO": [ - -73.8344595596877, - -14.1547590009075 - ], - "MORO, SANTA, ANCASH": [ - -78.1239714427425, - -9.16329111557091 - ], - "MORROPE, LAMBAYEQUE, LAMBAYEQUE": [ - -80.1790002336146, - -6.50615032492815 - ], - "MORROPON, MORROPON, PIURA": [ - -79.9983927972534, - -5.15272126896969 - ], - "MOSCA, AMBO, HUANUCO": [ - -76.2873320554491, - -10.332388592522 - ], - "MOSOC LLACTA, ACOMAYO, CUSCO": [ - -71.4789274422065, - -14.1006132805202 - ], - "MOTUPE, LAMBAYEQUE, LAMBAYEQUE": [ - -79.7078752984, - -6.16904660087393 - ], - "MOYA, HUANCAVELICA, HUANCAVELICA": [ - -75.1317711106081, - -12.4637718099766 - ], - "MOYOBAMBA, MOYOBAMBA, SAN MARTIN": [ - -77.1700049518847, - -5.76828168612012 - ], - "MUCLLO, CONCEPCION, JUNIN": [ - -75.1053399317625, - -11.589055005281 - ], - "MUNGUI, LA UNION, AREQUIPA": [ - -72.930220533491, - -14.9895723562505 - ], - "MUQUI, JAUJA, JUNIN": [ - -75.4376555160519, - -11.8384185231543 - ], - "MUQUIYAUYO, JAUJA, JUNIN": [ - -75.459321378402, - -11.8349628865 - ], - "MUSGA, MARISCAL LUZURIAGA, ANCASH": [ - -77.324563442404, - -8.893033111113 - ], - "MU\u00d1ANI, AZANGARO, PUNO": [ - -69.9802696611565, - -14.6857660542848 - ], - "NAMBALLE, SAN IGNACIO, CAJAMARCA": [ - -79.1809966283362, - -5.1072716148615 - ], - "NAMORA, CAJAMARCA, CAJAMARCA": [ - -78.2840758466042, - -7.1843640726435 - ], - "NANCHOC, SAN MIGUEL, CAJAMARCA": [ - -79.2477746491352, - -7.00851771029651 - ], - "NARANJOS, RIOJA, SAN MARTIN": [ - -77.6341464590917, - -5.74870970826647 - ], - "NASCA, NASCA, ICA": [ - -75.0368861739888, - -14.8570345970964 - ], - "NASCA, NAZCA, ICA": [ - -75.0368861739888, - -14.8570345970964 - ], - "NAUTA, LORETO, LORETO": [ - -74.1142036946037, - -4.44271760847669 - ], - "NAVAN, OYON, LIMA": [ - -77.0466440360596, - -10.8571666541307 - ], - "NAVARRO, SAN MARTIN, SAN MARTIN": [ - -75.6669014628808, - -6.43400148503515 - ], - "NEGRITOS, TALARA, PIURA": [ - -81.108182849526, - -4.70385164375641 - ], - "NEPE\u00d1A, SANTA, ANCASH": [ - -78.3031918891688, - -9.14149272066427 - ], - "NICASIO, LAMPA, PUNO": [ - -70.2912182200641, - -15.2183563777241 - ], - "NIEPOS, SAN MIGUEL, CAJAMARCA": [ - -79.1314313207037, - -6.92671538431621 - ], - "NINABAMBA, SANTA CRUZ, CAJAMARCA": [ - -78.7685546386023, - -6.69582552939792 - ], - "NINACACA, PASCO, PASCO": [ - -76.0601268104086, - -10.7920154862774 - ], - "NUEVA ALEJANDRIA (CURINGA), REQUENA, LORETO": [ - -73.7507104045758, - -6.32702643749807 - ], - "NUEVA ARICA, CHICLAYO, LAMBAYEQUE": [ - -79.3708096063888, - -6.93129657692418 - ], - "NUEVA CAJAMARCA, RIOJA, SAN MARTIN": [ - -77.3722452475481, - -5.94435712498387 - ], - "NUEVA MOROCOCHA, YAULI, JUNIN": [ - -76.1233240375509, - -11.5445406818499 - ], - "NUEVA REQUENA, CORONEL PORTILLO, UCAYALI": [ - -75.0147707419283, - -8.1631317491471 - ], - "NUEVO IMPERIAL, CA\u00d1ETE, LIMA": [ - -76.2585641231118, - -12.9604831095699 - ], - "NUEVO LIMA, BELLAVISTA, SAN MARTIN": [ - -76.3413601414628, - -7.18416140522712 - ], - "NUEVO PROGRESO, TOCACHE, SAN MARTIN": [ - -76.2123475282516, - -8.52645739885126 - ], - "NU\u00d1OA, MELGAR, PUNO": [ - -70.67058666781, - -14.3567967235274 - ], - "OBAS, YAROWILCA, HUANUCO": [ - -76.6813198984948, - -9.82692866552509 - ], - "OCALLI, LUYA, AMAZONAS": [ - -78.2168581724036, - -6.22180639206086 - ], - "OCA\u00d1A, LUCANAS, AYACUCHO": [ - -74.8471655927826, - -14.4274632171979 - ], - "OCCORO, HUANCAVELICA, HUANCAVELICA": [ - -75.1392430844766, - -12.7077471447045 - ], - "OCOBAMBA /7, LA CONVENCION, CUSCO": [ - -72.3620442848012, - -12.9163212701555 - ], - "OCOBAMBA, CHINCHEROS, APURIMAC": [ - -73.5196001842792, - -13.5061222178318 - ], - "OCONGATE, QUISPICANCHI, CUSCO": [ - -71.2689613314672, - -13.6876748462455 - ], - "OCORURO, ESPINAR, CUSCO": [ - -71.1389932894661, - -15.0878963173073 - ], - "OCOYO, HUAYTARA, HUANCAVELICA": [ - -75.0348083416751, - -14.0232957542565 - ], - "OCO\u00d1A, CAMANA, AREQUIPA": [ - -73.0109137123391, - -16.2779884237833 - ], - "OCROS, HUAMANGA, AYACUCHO": [ - -73.9003222394574, - -13.3926162865113 - ], - "OCROS, OCROS, ANCASH": [ - -77.3644218204572, - -10.3806100608472 - ], - "OCUCAJE, ICA, ICA": [ - -75.7807516396898, - -14.4841072007106 - ], - "OCUVIRI, LAMPA, PUNO": [ - -70.8501052123344, - -15.1829174687627 - ], - "OLLACHEA, CARABAYA, PUNO": [ - -70.541262187186, - -13.741614347843 - ], - "OLLANTAYTAMBO, URUBAMBA, CUSCO": [ - -72.3164184652829, - -13.236472733276 - ], - "OLLEROS, CHACHAPOYAS, AMAZONAS": [ - -77.6709836177225, - -6.00840896849516 - ], - "OLLEROS, HUARAZ, ANCASH": [ - -77.3716447914624, - -9.62185241513224 - ], - "OLMOS, LAMBAYEQUE, LAMBAYEQUE": [ - -80.0715656823154, - -6.04759915881834 - ], - "OLTO, LUYA, AMAZONAS": [ - -77.9634096332117, - -6.08415657280564 - ], - "OMACHA, PARURO, CUSCO": [ - -71.7863335259502, - -14.1397224975453 - ], - "OMAS, YAUYOS, LIMA": [ - -76.2508044513491, - -12.4763074426962 - ], - "OMATE, GENERAL SANCHEZ CERRO, MOQUEGUA": [ - -70.9629954730671, - -16.646647362942 - ], - "OMIA, RODRIGUEZ DE MENDOZA, AMAZONAS": [ - -77.3544311012303, - -6.4054073187948 - ], - "ONDORES, JUNIN, JUNIN": [ - -76.1819947478505, - -11.0914166101179 - ], - "ONGON, PATAZ, LA LIBERTAD": [ - -77.0924642894727, - -8.20580726946083 - ], - "ONGOY, CHINCHEROS, APURIMAC": [ - -73.6507037943445, - -13.4154510941468 - ], - "ORCOPAMPA, CASTILLA, AREQUIPA": [ - -72.2484958498085, - -15.1160985210165 - ], - "ORCOTUNA, CONCEPCION, JUNIN": [ - -75.3282266244481, - -11.975331649057 - ], - "ORELLANA, UCAYALI, LORETO": [ - -75.094312585077, - -6.93192992248469 - ], - "ORONCCOY, LA MAR, AYACUCHO": [ - -73.3926096273292, - -13.3463273281416 - ], - "OROPESA, ANTABAMBA, APURIMAC": [ - -72.5231260882137, - -14.4359922753781 - ], - "OROPESA, QUISPICANCHI, CUSCO": [ - -71.7886508943504, - -13.5740904074178 - ], - "ORURILLO, MELGAR, PUNO": [ - -70.4876367276092, - -14.6862781583442 - ], - "OTOCA, LUCANAS, AYACUCHO": [ - -74.6602107448942, - -14.4921394942678 - ], - "OTUZCO, OTUZCO, LA LIBERTAD": [ - -78.5821299007268, - -7.84875694758682 - ], - "OXAMARCA, CELENDIN, CAJAMARCA": [ - -78.0613676757753, - -7.05934965999254 - ], - "OXAPAMPA, OXAPAMPA, PASCO": [ - -75.3708217108996, - -10.6504189091517 - ], - "OYOLO, PAUCAR DEL SARA SARA, AYACUCHO": [ - -73.1185961298016, - -15.0230523709151 - ], - "OYON, OYON, LIMA": [ - -76.7577223064341, - -10.6693981980259 - ], - "OYOTUN, CHICLAYO, LAMBAYEQUE": [ - -79.2768504543659, - -6.779639608979 - ], - "PACA, JAUJA, JUNIN": [ - -75.5284508367873, - -11.6831698144522 - ], - "PACAE, LEONCIO PRADO, HUANUCO": [ - -75.9829686404326, - -8.98489681755872 - ], - "PACAIPAMPA, AYABACA, PIURA": [ - -79.6488724282081, - -4.94646608413924 - ], - "PACANGA, CHEPEN, LA LIBERTAD": [ - -79.4476437868397, - -7.07970126312491 - ], - "PACAPAUSA, PARINACOCHAS, AYACUCHO": [ - -73.363023666496, - -14.9519785259769 - ], - "PACARAN, CA\u00d1ETE, LIMA": [ - -76.0704284873973, - -12.8979022279345 - ], - "PACARAOS, HUARAL, LIMA": [ - -76.6648438337268, - -11.1271420003332 - ], - "PACASMAYO, PACASMAYO, LA LIBERTAD": [ - -79.5478191938779, - -7.39990629230715 - ], - "PACAYCASA, HUAMANGA, AYACUCHO": [ - -74.2317768012717, - -13.0534338700137 - ], - "PACCARITAMBO, PARURO, CUSCO": [ - -71.9371298485789, - -13.7686709222089 - ], - "PACCHA HUALLHUA /4, VILCAS HUAMAN, AYACUCHO": [ - -73.8584709256131, - -13.8756567588359 - ], - "PACCHA, CHOTA, CAJAMARCA": [ - -78.3979527741554, - -6.53393769530493 - ], - "PACCHA, JAUJA, JUNIN": [ - -75.5334264756767, - -11.8800496766382 - ], - "PACCHA, YAULI, JUNIN": [ - -75.9922734740459, - -11.440121610018 - ], - "PACCHO, HUAURA, LIMA": [ - -76.9718246749537, - -10.9658600303089 - ], - "PACHACAMAC, LIMA, LIMA": [ - -76.8096200682664, - -12.1599906113138 - ], - "PACHACONAS, ANTABAMBA, APURIMAC": [ - -72.9791217981658, - -14.2190057991846 - ], - "PACHAMARCA, CHURCAMPA, HUANCAVELICA": [ - -74.4604840382805, - -12.5053404690195 - ], - "PACHAS, DOS DE MAYO, HUANUCO": [ - -76.8307409374626, - -9.69197499153229 - ], - "PACHIA, TACNA, TACNA": [ - -70.0235939608744, - -17.7848033834727 - ], - "PACHIZA, MARISCAL CACERES, SAN MARTIN": [ - -77.043321340248, - -6.96921281995337 - ], - "PACLAS, LUYA, AMAZONAS": [ - -78.0457784552411, - -6.0046095304917 - ], - "PACLLON, BOLOGNESI, ANCASH": [ - -77.0034119227313, - -10.2389242228134 - ], - "PACOBAMBA, ANDAHUAYLAS, APURIMAC": [ - -73.1296940687419, - -13.5360383367076 - ], - "PACORA, LAMBAYEQUE, LAMBAYEQUE": [ - -79.879923389532, - -6.43408333720884 - ], - "PACUCHA, ANDAHUAYLAS, APURIMAC": [ - -73.3090528481339, - -13.5983271171654 - ], - "PAICO, SUCRE, AYACUCHO": [ - -73.6665905684395, - -14.012591349106 - ], - "PAIJAN, ASCOPE, LA LIBERTAD": [ - -79.3021210835922, - -7.72870676253064 - ], - "PAIMAS, AYABACA, PIURA": [ - -80.0048896019458, - -4.63701155074858 - ], - "PAITA, PAITA, PIURA": [ - -81.0554208193501, - -5.16720016685149 - ], - "PAJARILLO, MARISCAL CACERES, SAN MARTIN": [ - -76.6356068923382, - -7.31517989390713 - ], - "PALCA, HUANCAVELICA, HUANCAVELICA": [ - -74.9791371498617, - -12.6695814166853 - ], - "PALCA, LAMPA, PUNO": [ - -70.6093904646853, - -15.2993186406191 - ], - "PALCA, TACNA, TACNA": [ - -69.7640323637427, - -17.6569417741457 - ], - "PALCA, TARMA, JUNIN": [ - -75.505163611394, - -11.3171573415664 - ], - "PALCAMAYO, TARMA, JUNIN": [ - -75.7778261440614, - -11.2701925934185 - ], - "PALLANCHACRA, PASCO, PASCO": [ - -76.2514612473444, - -10.4221567481681 - ], - "PALLASCA, PALLASCA, ANCASH": [ - -78.0048637386526, - -8.26343889504962 - ], - "PALMAPAMPA, LA MAR, AYACUCHO": [ - -73.7207445897747, - -12.8602497771964 - ], - "PALPA, PALPA, ICA": [ - -75.1315751412953, - -14.4897349513109 - ], - "PALPACACHI, GRAU, APURIMAC": [ - -72.559670472638, - -13.8306651665111 - ], - "PALTASHACO, MORROPON, PIURA": [ - -79.875617278745, - -5.12578318956712 - ], - "PAMPA CANGALLO, CANGALLO, AYACUCHO": [ - -74.2256616236383, - -13.4942264103531 - ], - "PAMPA DE TATE, ICA, ICA": [ - -75.6516621411057, - -14.1604104767927 - ], - "PAMPA HERMOSA, UCAYALI, LORETO": [ - -75.769709714124, - -7.30260249320946 - ], - "PAMPACHACRA, MARISCAL LUZURIAGA, ANCASH": [ - -77.2203437364385, - -8.88606653537461 - ], - "PAMPACHIRI, ANDAHUAYLAS, APURIMAC": [ - -73.4785255922603, - -14.2960427315243 - ], - "PAMPACOLCA, CASTILLA, AREQUIPA": [ - -72.6190588315354, - -15.6707754786091 - ], - "PAMPAMARCA, CANAS, CUSCO": [ - -71.4465582440009, - -14.1418042247955 - ], - "PAMPAMARCA, YAROWILCA, HUANUCO": [ - -76.7077539949642, - -9.76588508897891 - ], - "PAMPAROMAS, HUAYLAS, ANCASH": [ - -77.9570270837913, - -9.14324183981775 - ], - "PAMPAS CHICO, RECUAY, ANCASH": [ - -77.3732343692553, - -10.094083609591 - ], - "PAMPAS DE HOSPITAL, TUMBES, TUMBES": [ - -80.356357643768, - -3.85174896007502 - ], - "PAMPAS GRANDE, HUARAZ, ANCASH": [ - -77.9103139557044, - -9.64574337333204 - ], - "PAMPAS, LA MAR, AYACUCHO": [ - -73.8910056339433, - -13.2393787836886 - ], - "PAMPAS, PALLASCA, ANCASH": [ - -77.7988390835486, - -8.13850969719521 - ], - "PAMPAS, TAYACAJA, HUANCAVELICA": [ - -74.8517010124255, - -12.4513402392156 - ], - "PANAO, PACHITEA, HUANUCO": [ - -75.8967352690716, - -10.1483680387214 - ], - "PANCAN, JAUJA, JUNIN": [ - -75.4990280205814, - -11.7475124947148 - ], - "PANTOJA, MAYNAS, LORETO": [ - -74.8927304899753, - -1.38914738227837 - ], - "PAPAPLAYA, SAN MARTIN, SAN MARTIN": [ - -75.6382217463478, - -6.2429518628271 - ], - "PAPAYAL, ZARUMILLA, TUMBES": [ - -80.2887581439179, - -3.5720648046655 - ], - "PARACAS, PISCO, ICA": [ - -76.1578071404387, - -14.0469258448643 - ], - "PARAMONGA, BARRANCA, LIMA": [ - -77.7421653584229, - -10.4864470366984 - ], - "PARANDAY, OTUZCO, LA LIBERTAD": [ - -78.6989050434023, - -7.88841225069145 - ], - "PARARCA, PAUCAR DEL SARA SARA, AYACUCHO": [ - -73.4523132130041, - -15.2057223398156 - ], - "PARARIN, RECUAY, ANCASH": [ - -77.6538171122822, - -10.119214747952 - ], - "PARAS, CANGALLO, AYACUCHO": [ - -74.7195768806379, - -13.4607686764291 - ], - "PARATIA, LAMPA, PUNO": [ - -70.7047557834836, - -15.4675470709591 - ], - "PARCO, JAUJA, JUNIN": [ - -75.5406010092633, - -11.8206162791704 - ], - "PARCONA, ICA, ICA": [ - -75.7004484505553, - -14.0568669771549 - ], - "PARCOY, PATAZ, LA LIBERTAD": [ - -77.5098479004498, - -7.99324039134359 - ], - "PARIACOTO, HUARAZ, ANCASH": [ - -77.7946172029061, - -9.48122879874022 - ], - "PARIAHUANCA /10, HUANCAYO, JUNIN": [ - -74.8769760533143, - -11.9521795896219 - ], - "PARIAHUANCA, CARHUAZ, ANCASH": [ - -77.5741964031055, - -9.3560186615653 - ], - "PARINARI, LORETO, LORETO": [ - -74.8635630462879, - -5.03894572341682 - ], - "PAROBAMBA, POMABAMBA, ANCASH": [ - -77.3953133828396, - -8.61275308687886 - ], - "PARURO, PARURO, CUSCO": [ - -71.8557031789722, - -13.7266732919829 - ], - "PASARRAYA, HUALLAGA, SAN MARTIN": [ - -76.9631153089317, - -6.60186149964165 - ], - "PATAMBUCO, SANDIA, PUNO": [ - -69.6312350982406, - -14.3101068921457 - ], - "PATAPO, CHICLAYO, LAMBAYEQUE": [ - -79.5857536872436, - -6.70893093190475 - ], - "PATAYPAMPA, GRAU, APURIMAC": [ - -72.757738748824, - -14.2260595993917 - ], - "PATAZ, PATAZ, LA LIBERTAD": [ - -77.589546138206, - -7.73245137978085 - ], - "PATIVILCA, BARRANCA, LIMA": [ - -77.6859595022531, - -10.6233592093104 - ], - "PAUCAMARCA, SAN MARCOS, CAJAMARCA": [ - -78.1612445415769, - -7.22207398720816 - ], - "PAUCAR, DANIEL ALCIDES CARRION, PASCO": [ - -76.4172799425044, - -10.3408711375571 - ], - "PAUCARA, ACOBAMBA, HUANCAVELICA": [ - -74.7273884965225, - -12.7230617034021 - ], - "PAUCARBAMBA, CHURCAMPA, HUANCAVELICA": [ - -74.5261869657804, - -12.5691526967523 - ], - "PAUCARBAMBA, HUANUCO, HUANUCO": [ - -76.1882204681551, - -9.95023143355452 - ], - "PAUCARBAMBILLA, CHURCAMPA, HUANCAVELICA": [ - -74.4974080847859, - -12.711430017342 - ], - "PAUCARCOLLA, PUNO, PUNO": [ - -70.0671457660859, - -15.726288394989 - ], - "PAUCARPATA, AREQUIPA, AREQUIPA": [ - -71.4779991022798, - -16.4200700684694 - ], - "PAUCARTAMBO, PASCO, PASCO": [ - -75.7733564362593, - -10.7588948077933 - ], - "PAUCARTAMBO, PAUCARTAMBO, CUSCO": [ - -71.4640607254327, - -13.3013731710033 - ], - "PAUCAS, HUARI, ANCASH": [ - -76.8839604237208, - -9.1510910565269 - ], - "PAUSA, PAUCAR DEL SARA SARA, AYACUCHO": [ - -73.3579317669224, - -15.3207078604774 - ], - "PAZOS, TAYACAJA, HUANCAVELICA": [ - -75.0262852248734, - -12.2216526835938 - ], - "PEBAS, MARISCAL RAMON CASTILLA, LORETO": [ - -71.9646746485712, - -3.43271194596031 - ], - "PEDRO RUIZ GALLO, BONGARA, AMAZONAS": [ - -78.0234319489171, - -5.94537414182961 - ], - "PELEJO, SAN MARTIN, SAN MARTIN": [ - -75.8647644194766, - -6.24500125785024 - ], - "PERENE, CHANCHAMAYO, JUNIN": [ - -75.0759840260204, - -10.9401998408849 - ], - "PHARA, SANDIA, PUNO": [ - -69.585045678749, - -14.0678730679613 - ], - "PIAS, PATAZ, LA LIBERTAD": [ - -77.4874497753968, - -7.89367858826597 - ], - "PICHARI, LA CONVENCION, CUSCO": [ - -73.8103496694461, - -12.3681391773592 - ], - "PICHIGUA, ESPINAR, CUSCO": [ - -71.3437551043875, - -14.6793410444862 - ], - "PICHIHUA, AYMARAES, APURIMAC": [ - -73.1978175496884, - -14.1304389716043 - ], - "PICHIRHUA, ABANCAY, APURIMAC": [ - -73.0317318117992, - -13.7847877178602 - ], - "PICHOS, TAYACAJA, HUANCAVELICA": [ - -74.9333640353104, - -12.1814389110528 - ], - "PICOTA, PICOTA, SAN MARTIN": [ - -76.3315754017197, - -6.96450203776762 - ], - "PICSI, CHICLAYO, LAMBAYEQUE": [ - -79.7725787094762, - -6.71639329009776 - ], - "PILCHACA, HUANCAVELICA, HUANCAVELICA": [ - -75.0889916316301, - -12.4136140520906 - ], - "PILCOMAYO, HUANCAYO, JUNIN": [ - -75.2542301519201, - -12.0474749744505 - ], - "PILCUYO, EL COLLAO, PUNO": [ - -69.508623109136, - -16.0958294470911 - ], - "PILLCOPATA, PAUCARTAMBO, CUSCO": [ - -71.4635168167, - -13.0450542891712 - ], - "PILLPINTO, PARURO, CUSCO": [ - -71.7691386398261, - -13.9748416608336 - ], - "PILLUANA, PICOTA, SAN MARTIN": [ - -76.2689700501988, - -6.78342256100002 - ], - "PILPICHACA, HUAYTARA, HUANCAVELICA": [ - -74.9462112426934, - -13.4095487011544 - ], - "PIMENTEL, CHICLAYO, LAMBAYEQUE": [ - -79.9034477036712, - -6.79933111437028 - ], - "PIMPINGOS, CUTERVO, CAJAMARCA": [ - -78.7682740186417, - -6.07091210096749 - ], - "PINRA, HUACAYBAMBA, HUANUCO": [ - -77.0007724909543, - -8.91437358150474 - ], - "PINTO RECODO, LAMAS, SAN MARTIN": [ - -76.7129854869081, - -6.15779866921574 - ], - "PION, CHOTA, CAJAMARCA": [ - -78.4787661061695, - -6.18346707771034 - ], - "PIRA, HUARAZ, ANCASH": [ - -77.6939773692028, - -9.52096305124683 - ], - "PIRCA, HUARAL, LIMA": [ - -76.5951706871761, - -11.2774969032788 - ], - "PISAC, CALCA, CUSCO": [ - -71.8083458641192, - -13.3891385222195 - ], - "PISACOMA, CHUCUITO, PUNO": [ - -69.4476951294387, - -16.9312611332635 - ], - "PISCO, PISCO, ICA": [ - -76.190037819193, - -13.7021784845035 - ], - "PISCOBAMBA, MARISCAL LUZURIAGA, ANCASH": [ - -77.3532340553559, - -8.86212116009016 - ], - "PISCOYACU, HUALLAGA, SAN MARTIN": [ - -76.834184166379, - -7.01413362174884 - ], - "PITIPO, FERRE\u00d1AFE, LAMBAYEQUE": [ - -79.6347838427313, - -6.4862446137273 - ], - "PITUMARCA, CANCHIS, CUSCO": [ - -71.1581667044718, - -13.8887915444732 - ], - "PIURA, PIURA, PIURA": [ - -80.6585271316619, - -5.08199180568756 - ], - "PLATERIA, PUNO, PUNO": [ - -69.8604442019397, - -15.9814905779302 - ], - "POCOHUANCA, AYMARAES, APURIMAC": [ - -73.0876777330495, - -14.2240114681324 - ], - "POCOLLAY, TACNA, TACNA": [ - -70.0740241587771, - -18.0077492346691 - ], - "POCSI, AREQUIPA, AREQUIPA": [ - -71.3321750108357, - -16.4988868931829 - ], - "POLOBAYA GRANDE, AREQUIPA, AREQUIPA": [ - -71.3574228753564, - -16.6419871585026 - ], - "POLVORA, TOCACHE, SAN MARTIN": [ - -76.798964077461, - -8.0156336782281 - ], - "POMABAMBA, CANGALLO, AYACUCHO": [ - -74.2756632812755, - -13.5680638825207 - ], - "POMABAMBA, POMABAMBA, ANCASH": [ - -77.5065263109566, - -8.79036933172516 - ], - "POMACANCHA, JAUJA, JUNIN": [ - -75.6891758906002, - -11.6328906106352 - ], - "POMACANCHI, ACOMAYO, CUSCO": [ - -71.6238979679658, - -14.0536371359069 - ], - "POMACOCHA, ACOBAMBA, HUANCAVELICA": [ - -74.520015371488, - -12.8615713464133 - ], - "POMACOCHA, ANDAHUAYLAS, APURIMAC": [ - -73.4920988533968, - -14.0962803494803 - ], - "POMAHUACA, JAEN, CAJAMARCA": [ - -79.1951178681958, - -5.87539688212403 - ], - "POMALCA, CHICLAYO, LAMBAYEQUE": [ - -79.7590206450002, - -6.78177487784878 - ], - "POMATA, CHUCUITO, PUNO": [ - -69.2882222098296, - -16.3566600390196 - ], - "PONGO DE CAYNARACHI, LAMAS, SAN MARTIN": [ - -76.3342373771502, - -6.19532658426333 - ], - "PONTO, HUARI, ANCASH": [ - -76.9848719752412, - -9.34738118580618 - ], - "POROTO, TRUJILLO, LA LIBERTAD": [ - -78.7540110521668, - -8.03527287293158 - ], - "POROY, CUSCO, CUSCO": [ - -72.0422993622185, - -13.5019171390806 - ], - "POSIC, RIOJA, SAN MARTIN": [ - -77.1721678995265, - -5.98282040579629 - ], - "POTONI, AZANGARO, PUNO": [ - -70.0921737719215, - -14.4164190728675 - ], - "POZUZO, OXAPAMPA, PASCO": [ - -75.5862737962268, - -10.1327283418767 - ], - "PROGRESO, GRAU, APURIMAC": [ - -72.4470150321754, - -14.0986839044884 - ], - "PROVIDENCIA, LUYA, AMAZONAS": [ - -78.2918470876264, - -6.30756494959082 - ], - "PUCACACA, PICOTA, SAN MARTIN": [ - -76.3630476366498, - -6.84023200154123 - ], - "PUCALA, CHICLAYO, LAMBAYEQUE": [ - -79.5137212156405, - -6.79463043190599 - ], - "PUCALLPA, CORONEL PORTILLO, UCAYALI": [ - -74.1601934572243, - -7.96505459685538 - ], - "PUCARA, CHANCHAMAYO, JUNIN": [ - -75.2366032135301, - -11.2650180688799 - ], - "PUCARA, HUANCAYO, JUNIN": [ - -75.1005148131942, - -12.1801997634541 - ], - "PUCARA, JAEN, CAJAMARCA": [ - -79.1236611015041, - -6.04002001500439 - ], - "PUCARA, LAMPA, PUNO": [ - -70.4505278253229, - -15.0794683295889 - ], - "PUCAYACU, LEONCIO PRADO, HUANUCO": [ - -76.0645662003544, - -8.56479857897196 - ], - "PUCUCHO, JAUJA, JUNIN": [ - -75.3915672923924, - -11.8178306715402 - ], - "PUCUSANA, LIMA, LIMA": [ - -76.7756251714908, - -12.4658382705685 - ], - "PUCYURA, ANTA, CUSCO": [ - -72.0936319933256, - -13.4846822110606 - ], - "PUEBLO LIBRE /1, HUAYLAS, ANCASH": [ - -77.8187251031009, - -9.14870455197108 - ], - "PUEBLO LIBRE, LIMA, LIMA": [ - -77.0657431790067, - -12.07508405756 - ], - "PUEBLO NUEVO, CHEPEN, LA LIBERTAD": [ - -79.5863727119727, - -7.19223698303161 - ], - "PUEBLO NUEVO, CHINCHA, ICA": [ - -76.0888844611066, - -13.2584493386944 - ], - "PUEBLO NUEVO, FERRE\u00d1AFE, LAMBAYEQUE": [ - -79.824432706978, - -6.62983026646256 - ], - "PUEBLO NUEVO, ICA, ICA": [ - -75.6758091564898, - -14.1245132259924 - ], - "PUEBLO NUEVO, ILO, MOQUEGUA": [ - -71.3594382479038, - -17.4394611752012 - ], - "PUEBLO NUEVO, LEONCIO PRADO, HUANUCO": [ - -76.0013685060327, - -9.08219785099789 - ], - "PUENTE PIEDRA, LIMA, LIMA": [ - -77.0866514105377, - -11.8721278036553 - ], - "PUERTO ALEGRIA, DATEM DEL MARA\u00d1ON, LORETO": [ - -77.3734689038413, - -3.67912239789789 - ], - "PUERTO BERMUDEZ, OXAPAMPA, PASCO": [ - -74.6367359177403, - -10.4140233819886 - ], - "PUERTO CALLAO, CORONEL PORTILLO, UCAYALI": [ - -74.6566989463484, - -8.24849719008287 - ], - "PUERTO CASMA, CASMA, ANCASH": [ - -78.3552405509514, - -9.51012063759465 - ], - "PUERTO DE MALABRIGO, ASCOPE, LA LIBERTAD": [ - -79.3715126118922, - -7.68689062997937 - ], - "PUERTO GALILEA, CONDORCANQUI, AMAZONAS": [ - -77.8881145418222, - -3.8134497314307 - ], - "PUERTO INCA, PUERTO INCA, HUANUCO": [ - -74.9668485206468, - -9.28893369585593 - ], - "PUERTO MALDONADO, TAMBOPATA, MADRE DE DIOS": [ - -70.2845913088923, - -12.048580147467 - ], - "PUERTO OCOPA, SATIPO, JUNIN": [ - -73.8144351132148, - -11.5310047112373 - ], - "PUERTO RICO, PICOTA, SAN MARTIN": [ - -76.4288522807438, - -6.97850919802748 - ], - "PUERTO ROSARIO DE LABERINTO, TAMBOPATA, MADRE DE DIOS": [ - -69.9233606092856, - -12.5133285839869 - ], - "PUERTO SAN ANTONIO, TAYACAJA, HUANCAVELICA": [ - -74.4578623689465, - -12.2360288930304 - ], - "PULAN, SANTA CRUZ, CAJAMARCA": [ - -78.9212127830426, - -6.74627687912506 - ], - "PULLO, PARINACOCHAS, AYACUCHO": [ - -73.98449274425, - -15.3331746994185 - ], - "PUNCHANA, MAYNAS, LORETO": [ - -73.4544452989397, - -3.53867544051728 - ], - "PUNCHAO, HUAMALIES, HUANUCO": [ - -76.8359043267763, - -9.44141266107263 - ], - "PUNO, PUNO, PUNO": [ - -70.063677025949, - -15.9050032049924 - ], - "PUNTA DE BOMBON, ISLAY, AREQUIPA": [ - -71.5507240668041, - -17.1600354074123 - ], - "PUNTA HERMOSA, LIMA, LIMA": [ - -76.7437898089112, - -12.269272112482 - ], - "PUNTA NEGRA, LIMA, LIMA": [ - -76.7094504639387, - -12.3036413229941 - ], - "PUQUINA, GENERAL SANCHEZ CERRO, MOQUEGUA": [ - -71.1572683792161, - -16.6282949868892 - ], - "PUQUIO, LUCANAS, AYACUCHO": [ - -74.016281977462, - -14.6763018880718 - ], - "PUSI, HUANCANE, PUNO": [ - -69.9896661408454, - -15.4409192993609 - ], - "PUTINA PUNCO, SANDIA, PUNO": [ - -69.1479903603893, - -13.5486352138693 - ], - "PUTINA, SAN ANTONIO DE PUTINA, PUNO": [ - -69.8344863236701, - -14.7091661303509 - ], - "PUYCA, LA UNION, AREQUIPA": [ - -72.5471840107685, - -14.9389606511837 - ], - "PU\u00d1OS, HUAMALIES, HUANUCO": [ - -76.8968717172946, - -9.50306610898908 - ], - "QUEBRADA HONDA, CALCA, CUSCO": [ - -72.1050860349734, - -12.795697131692 - ], - "QUEHUE, CANAS, CUSCO": [ - -71.489506024586, - -14.3656907940811 - ], - "QUELLOUNO, LA CONVENCION, CUSCO": [ - -72.4450699920914, - -12.5071221019803 - ], - "QUEQUE\u00d1A, AREQUIPA, AREQUIPA": [ - -71.4432123317633, - -16.5441759230592 - ], - "QUERCO, HUAYTARA, HUANCAVELICA": [ - -74.8827240008861, - -13.882865437197 - ], - "QUERECOTILLO, SULLANA, PIURA": [ - -80.6042677139141, - -4.72609208454544 - ], - "QUEROBAMBA, SUCRE, AYACUCHO": [ - -73.8048278438998, - -13.9948167244197 - ], - "QUEROCOTILLO, CUTERVO, CAJAMARCA": [ - -79.09164310362, - -6.19681501348958 - ], - "QUEROCOTO, CHOTA, CAJAMARCA": [ - -79.092933457814, - -6.35217480822091 - ], - "QUEROPALCA, LAURICOCHA, HUANUCO": [ - -76.8658581595843, - -10.1875138850734 - ], - "QUIACA, SANDIA, PUNO": [ - -69.3561899547599, - -14.467273537314 - ], - "QUICACHA, CARAVELI, AREQUIPA": [ - -73.7303800493425, - -15.5673607491934 - ], - "QUICHES, SIHUAS, ANCASH": [ - -77.5097555312464, - -8.39597585929514 - ], - "QUICHUAS, TAYACAJA, HUANCAVELICA": [ - -74.7274045500083, - -12.4677947846034 - ], - "QUICHUAY, HUANCAYO, JUNIN": [ - -75.248667675123, - -11.8456037380016 - ], - "QUILAHUANI, CANDARAVE, TACNA": [ - -70.2567520804931, - -17.3328717960138 - ], - "QUILCA, CAMANA, AREQUIPA": [ - -72.3518949423952, - -16.7007142365461 - ], - "QUILCAPUNCU, SAN ANTONIO DE PUTINA, PUNO": [ - -69.6393111714715, - -14.8469682200116 - ], - "QUILCAS, HUANCAYO, JUNIN": [ - -75.1661565084046, - -11.8822453870854 - ], - "QUILCATA, PAUCAR DEL SARA SARA, AYACUCHO": [ - -73.4594916166079, - -15.2600286561126 - ], - "QUILLABAMBA, LA CONVENCION, CUSCO": [ - -72.7433729673663, - -12.8768105615456 - ], - "QUILLO, YUNGAY, ANCASH": [ - -77.9490314807011, - -9.31686588300189 - ], - "QUILMANA, CA\u00d1ETE, LIMA": [ - -76.3452769043684, - -12.869568745968 - ], - "QUINCE MIL, QUISPICANCHI, CUSCO": [ - -70.7489194816845, - -13.342313553995 - ], - "QUINCHES, YAUYOS, LIMA": [ - -76.0917398429024, - -12.3115469713658 - ], - "QUINISTAQUILLAS, GENERAL SANCHEZ CERRO, MOQUEGUA": [ - -70.8798235297165, - -16.7042107920899 - ], - "QUINJALCA, CHACHAPOYAS, AMAZONAS": [ - -77.685503984317, - -6.10813800371406 - ], - "QUINOCAY, YAUYOS, LIMA": [ - -76.2843173931518, - -12.3506381633071 - ], - "QUINUA, HUAMANGA, AYACUCHO": [ - -74.1345422193468, - -13.0614055839569 - ], - "QUINUABAMBA, POMABAMBA, ANCASH": [ - -77.3436941039468, - -8.70232612136309 - ], - "QUIQUIJANA, QUISPICANCHI, CUSCO": [ - -71.5331691727794, - -13.8056124883287 - ], - "QUIRUVILCA, SANTIAGO DE CHUCO, LA LIBERTAD": [ - -78.2511136199463, - -8.01474149366173 - ], - "QUISHUAR, TAYACAJA, HUANCAVELICA": [ - -74.7672173638797, - -12.2497668134813 - ], - "QUITO-ARMA, HUAYTARA, HUANCAVELICA": [ - -75.4060124031395, - -13.5386390273278 - ], - "QUIVILLA, DOS DE MAYO, HUANUCO": [ - -76.687271308623, - -9.57602370128878 - ], - "QUI\u00d1OTA, CHUMBIVILCAS, CUSCO": [ - -72.2052388745054, - -14.3772305425685 - ], - "RAGASH, SIHUAS, ANCASH": [ - -77.696031185026, - -8.45479692591295 - ], - "RAHUAPAMPA, HUARI, ANCASH": [ - -77.0627115759208, - -9.35563179434505 - ], - "RAJAN, OCROS, ANCASH": [ - -77.2284332397196, - -10.4156640622405 - ], - "RANRACANCHA, CHINCHEROS, APURIMAC": [ - -73.5963018008872, - -13.5476379529812 - ], - "RANRAHIRCA, YUNGAY, ANCASH": [ - -77.6966869516465, - -9.16011397832934 - ], - "RAPAYAN, HUARI, ANCASH": [ - -76.776014765392, - -9.27214112976368 - ], - "RAQUIA, BOLOGNESI, ANCASH": [ - -77.4998680055525, - -10.2032435834808 - ], - "RECTA, BONGARA, AMAZONAS": [ - -77.775358670737, - -5.93922123435411 - ], - "RECUAY, RECUAY, ANCASH": [ - -77.447425578561, - -9.70646540836033 - ], - "REMANSO, PUTUMAYO, LORETO": [ - -71.0132099536446, - -2.80433133881498 - ], - "REQUE, CHICLAYO, LAMBAYEQUE": [ - -79.7941930819499, - -6.86348163994451 - ], - "REQUENA, REQUENA, LORETO": [ - -73.8823435082809, - -5.32824080387914 - ], - "RICARDO PALMA, HUAROCHIRI, LIMA": [ - -76.6229549960254, - -11.9377558474032 - ], - "RICRAN, JAUJA, JUNIN": [ - -75.4575208044187, - -11.5600317723153 - ], - "RIMAC, LIMA, LIMA": [ - -77.0326772610911, - -12.0235838177382 - ], - "RIO BLANCO, CHINCHEROS, APURIMAC": [ - -73.791393935005, - -13.3901527858419 - ], - "RIO GRANDE, PALPA, ICA": [ - -75.147570565322, - -14.3457037513205 - ], - "RIO NEGRO, SATIPO, JUNIN": [ - -74.6909676556607, - -11.103172005835 - ], - "RIOJA, RIOJA, SAN MARTIN": [ - -77.2098953061679, - -6.0786884250297 - ], - "RIPAN, DOS DE MAYO, HUANUCO": [ - -76.8436913575414, - -9.81053293539821 - ], - "ROCCHACC, CHINCHEROS, APURIMAC": [ - -73.617226846261, - -13.4555662585194 - ], - "RONDOCAN, ACOMAYO, CUSCO": [ - -71.7654035755654, - -13.7876322223758 - ], - "RONDOS, LAURICOCHA, HUANUCO": [ - -76.7204353785546, - -9.96848729212744 - ], - "ROQUE, LAMAS, SAN MARTIN": [ - -76.7729541416229, - -6.31131767991961 - ], - "ROSARIO, ACOBAMBA, HUANCAVELICA": [ - -74.5999404048129, - -12.7423265904731 - ], - "ROSASPATA, HUANCANE, PUNO": [ - -69.487429327592, - -15.2095106723763 - ], - "RUMISAPA, LAMAS, SAN MARTIN": [ - -76.4725723592101, - -6.44375616616409 - ], - "SABAINO, ANTABAMBA, APURIMAC": [ - -72.9801581086528, - -14.3229723896077 - ], - "SABANDIA, AREQUIPA, AREQUIPA": [ - -71.4602063149999, - -16.4482665970118 - ], - "SACANCHE, HUALLAGA, SAN MARTIN": [ - -76.7628091557476, - -7.08954700314048 - ], - "SACHACA, AREQUIPA, AREQUIPA": [ - -71.5762452016594, - -16.4211693167109 - ], - "SACSAMARCA, HUANCA SANCOS, AYACUCHO": [ - -74.2225628311509, - -13.9839748421296 - ], - "SAISA, LUCANAS, AYACUCHO": [ - -74.3744851086421, - -14.9558838891848 - ], - "SALAMANCA, CONDESUYOS, AREQUIPA": [ - -72.6974434700739, - -15.4061671402895 - ], - "SALAS, LAMBAYEQUE, LAMBAYEQUE": [ - -79.5379482346434, - -6.15088718450674 - ], - "SALAVERRY, TRUJILLO, LA LIBERTAD": [ - -78.8989141795414, - -8.25392014263905 - ], - "SALCABAMBA, TAYACAJA, HUANCAVELICA": [ - -74.7832321984786, - -12.1949168321819 - ], - "SALCAHUASI, TAYACAJA, HUANCAVELICA": [ - -74.7514426975928, - -12.1065086684299 - ], - "SALITRAL, MORROPON, PIURA": [ - -79.8277046840937, - -5.43705456139758 - ], - "SALITRAL, SULLANA, PIURA": [ - -80.6832537495019, - -4.83830060989439 - ], - "SALLIQUE, JAEN, CAJAMARCA": [ - -79.3120772248498, - -5.62557760376588 - ], - "SALPO, OTUZCO, LA LIBERTAD": [ - -78.6362747076278, - -8.03289550960087 - ], - "SALVACION, MANU, MADRE DE DIOS": [ - -71.5183644808934, - -12.3620055356009 - ], - "SAMA GRANDE, TACNA, TACNA": [ - -70.423564773334, - -17.681164605854 - ], - "SAMAN, AZANGARO, PUNO": [ - -70.0168514081479, - -15.2698484352032 - ], - "SAMANCO, SANTA, ANCASH": [ - -78.442452894877, - -9.27947031461358 - ], - "SAMEGUA, MARISCAL NIETO, MOQUEGUA": [ - -70.8526004521463, - -17.1566784684127 - ], - "SAN AGUSTIN DE HUAYOPAMPA, HUARAL, LIMA": [ - -76.7610537146638, - -11.3464536275731 - ], - "SAN AGUSTIN, HUANCAYO, JUNIN": [ - -75.2344784796031, - -11.9890090903602 - ], - "SAN ALEJANDRO, PADRE ABAD, UCAYALI": [ - -75.2799184192192, - -8.95051640945597 - ], - "SAN ANDRES DE CUTERVO, CUTERVO, CAJAMARCA": [ - -78.7423287544127, - -6.22407305704891 - ], - "SAN ANDRES DE TUPICOCHA, HUAROCHIRI, LIMA": [ - -76.4580384183596, - -11.9880606911325 - ], - "SAN ANDRES, PISCO, ICA": [ - -76.1068457732641, - -13.8042052153596 - ], - "SAN ANTON, AZANGARO, PUNO": [ - -70.25669660063, - -14.5226212027112 - ], - "SAN ANTONIO DE CACHI, ANDAHUAYLAS, APURIMAC": [ - -73.6575829429929, - -13.789481181588 - ], - "SAN ANTONIO DE CHUCA /3, CAYLLOMA, AREQUIPA": [ - -71.097492334096, - -15.8309291705688 - ], - "SAN ANTONIO DE ESQUILACHE /15, PUNO, PUNO": [ - -70.3023606995469, - -16.0802761459315 - ], - "SAN ANTONIO DE OCOPA, CONCEPCION, JUNIN": [ - -75.2817782004065, - -11.8387402040177 - ], - "SAN ANTONIO DE RANCAS, PASCO, PASCO": [ - -76.4167994437143, - -10.7265230431232 - ], - "SAN ANTONIO DEL ESTRECHO, PUTUMAYO, LORETO": [ - -72.7839065834812, - -2.46877140991324 - ], - "SAN ANTONIO, CA\u00d1ETE, LIMA": [ - -76.6741515380091, - -12.6132206636229 - ], - "SAN ANTONIO, GRAU, APURIMAC": [ - -72.6062420978175, - -14.1756499580749 - ], - "SAN ANTONIO, SAN MARTIN, SAN MARTIN": [ - -76.3820896623653, - -6.39934333866806 - ], - "SAN BARTOLO, LIMA, LIMA": [ - -76.7241409241258, - -12.3693753155603 - ], - "SAN BARTOLOME, HUAROCHIRI, LIMA": [ - -76.5013128348331, - -11.9140934822067 - ], - "SAN BENITO, CONTUMAZA, CAJAMARCA": [ - -78.9623270693415, - -7.50280601502796 - ], - "SAN BERNARDINO, SAN PABLO, CAJAMARCA": [ - -78.7856571104043, - -7.1749820867193 - ], - "SAN BUENAVENTURA, CANTA, LIMA": [ - -76.662937430525, - -11.4405027109143 - ], - "SAN BUENAVENTURA, MARA\u00d1ON, HUANUCO": [ - -77.1480332158705, - -8.76878663976682 - ], - "SAN CARLOS, BONGARA, AMAZONAS": [ - -77.8790593251738, - -5.99638875600878 - ], - "SAN CARLOS, CHICLAYO, LAMBAYEQUE": [ - -79.8423564331693, - -6.73989814921078 - ], - "SAN CLEMENTE, PISCO, ICA": [ - -76.1429752728888, - -13.6420735538562 - ], - "SAN CRISTO, SECHURA, PIURA": [ - -80.6409772959676, - -5.53518828391733 - ], - "SAN CRISTOBAL DE JACAS CHICO, YAROWILCA, HUANUCO": [ - -76.5090871905068, - -9.87516802203861 - ], - "SAN CRISTOBAL DE SISA, PICOTA, SAN MARTIN": [ - -76.4868374884952, - -6.93945431574083 - ], - "SAN CRISTOBAL, LUCANAS, AYACUCHO": [ - -74.2543576514999, - -14.7917829603646 - ], - "SAN DAMIAN, HUAROCHIRI, LIMA": [ - -76.3329898563199, - -11.9644708451544 - ], - "SAN FELIPE DE VICHAYAL, PAITA, PIURA": [ - -81.1073112086454, - -4.83842715498063 - ], - "SAN FELIPE, JAEN, CAJAMARCA": [ - -79.3097836943858, - -5.78623773823567 - ], - "SAN FERNANDO, CORONEL PORTILLO, UCAYALI": [ - -74.5091608243491, - -8.5384458126438 - ], - "SAN FERNANDO, RIOJA, SAN MARTIN": [ - -77.2748920044514, - -5.8589677680972 - ], - "SAN FRANCISCO DE BORJA, LIMA, LIMA": [ - -76.9952085585793, - -12.0975463369304 - ], - "SAN FRANCISCO DE RAVACAYCO, PARINACOCHAS, AYACUCHO": [ - -73.3631793870598, - -15.0058301841237 - ], - "SAN FRANCISCO DE SANGAYAICO, HUAYTARA, HUANCAVELICA": [ - -75.2807751278377, - -13.7819471988893 - ], - "SAN FRANCISCO DEL YESO, LUYA, AMAZONAS": [ - -77.8595239828286, - -6.65901613904206 - ], - "SAN FRANCISCO, LA MAR, AYACUCHO": [ - -73.8909050685243, - -12.7284768625236 - ], - "SAN GREGORIO, CAMANA, AREQUIPA": [ - -72.6341387590988, - -16.4794450699468 - ], - "SAN GREGORIO, SAN MIGUEL, CAJAMARCA": [ - -79.1609782658254, - -7.1179806015135 - ], - "SAN IGNACIO, SAN IGNACIO, CAJAMARCA": [ - -79.0077562860754, - -5.14042273783426 - ], - "SAN ISIDRO, LIMA, LIMA": [ - -77.0366720490895, - -12.0989805902058 - ], - "SAN JACINTO, SULLANA, PIURA": [ - -80.8856469185089, - -4.82673372940049 - ], - "SAN JACINTO, TUMBES, TUMBES": [ - -80.5109119782331, - -3.90593898320759 - ], - "SAN JAVIER DE ALPABAMBA, PAUCAR DEL SARA SARA, AYACUCHO": [ - -73.2943882771966, - -15.0482095950398 - ], - "SAN JERONIMO DE TUNAN, HUANCAYO, JUNIN": [ - -75.286373974373, - -11.9374098091063 - ], - "SAN JERONIMO, ANDAHUAYLAS, APURIMAC": [ - -73.2740639980816, - -13.7166502762213 - ], - "SAN JERONIMO, CUSCO, CUSCO": [ - -71.8674242440679, - -13.5574108920957 - ], - "SAN JOAQUIN, YAUYOS, LIMA": [ - -76.1056526783517, - -12.2459325095648 - ], - "SAN JOSE DE LOS CHORRILLOS, HUAROCHIRI, LIMA": [ - -76.4569186444848, - -12.1565295670283 - ], - "SAN JOSE DE LOS MOLINOS, ICA, ICA": [ - -75.6124401200747, - -13.8820828293681 - ], - "SAN JOSE DE LOURDES, SAN IGNACIO, CAJAMARCA": [ - -78.8318255560063, - -4.91601550530389 - ], - "SAN JOSE DE QUERO, CONCEPCION, JUNIN": [ - -75.5726813907555, - -12.0762558920991 - ], - "SAN JOSE DE SECCE, HUANTA, AYACUCHO": [ - -74.2420038181568, - -12.6712124005525 - ], - "SAN JOSE DE SISA, EL DORADO, SAN MARTIN": [ - -76.7202140225953, - -6.61161719004875 - ], - "SAN JOSE DE USHUA, PAUCAR DEL SARA SARA, AYACUCHO": [ - -73.1961326963495, - -15.2235444987734 - ], - "SAN JOSE DEL ALTO, JAEN, CAJAMARCA": [ - -79.0550401330461, - -5.51732759161108 - ], - "SAN JOSE, AZANGARO, PUNO": [ - -70.1786558205591, - -14.6911534097221 - ], - "SAN JOSE, CAMANA, AREQUIPA": [ - -72.832257925505, - -16.4556298968933 - ], - "SAN JOSE, LAMBAYEQUE, LAMBAYEQUE": [ - -79.9366144066539, - -6.76608145820992 - ], - "SAN JOSE, PACASMAYO, LA LIBERTAD": [ - -79.3856477170933, - -7.3698176203163 - ], - "SAN JUAN BAUTISTA, HUAMANGA, AYACUCHO": [ - -74.2114806332079, - -13.1953033481368 - ], - "SAN JUAN BAUTISTA, ICA, ICA": [ - -75.7332082260108, - -13.9735686848054 - ], - "SAN JUAN DE CHAC\u00d1A, AYMARAES, APURIMAC": [ - -73.1938206899924, - -13.8849874096108 - ], - "SAN JUAN DE CUTERVO, CUTERVO, CAJAMARCA": [ - -78.6007349753127, - -6.17218221039734 - ], - "SAN JUAN DE CUTURAPI, YUNGUYO, PUNO": [ - -69.1805682273346, - -16.2930857337766 - ], - "SAN JUAN DE HUIRPACANCHA, HUAYTARA, HUANCAVELICA": [ - -75.2344349337339, - -13.9735590011231 - ], - "SAN JUAN DE IRIS, HUAROCHIRI, LIMA": [ - -76.4690906845532, - -11.7189685959768 - ], - "SAN JUAN DE LA VIRGEN, TUMBES, TUMBES": [ - -80.3629190256385, - -3.65859092752873 - ], - "SAN JUAN DE LANCA, HUAROCHIRI, LIMA": [ - -76.5304317235911, - -11.8405938260111 - ], - "SAN JUAN DE LOPECANCHA, LUYA, AMAZONAS": [ - -77.8917564807879, - -6.48274300813563 - ], - "SAN JUAN DE LURIGANCHO, LIMA, LIMA": [ - -76.971494911047, - -11.9459661263456 - ], - "SAN JUAN DE RONTOY, ANTONIO RAYMONDI, ANCASH": [ - -77.0417406344016, - -9.21843068015379 - ], - "SAN JUAN DE SALINAS, AZANGARO, PUNO": [ - -70.1261890441943, - -15.0007970825951 - ], - "SAN JUAN DE SIGUAS /2, AREQUIPA, AREQUIPA": [ - -72.1633255745486, - -16.4051247239757 - ], - "SAN JUAN DE SONCHE, CHACHAPOYAS, AMAZONAS": [ - -77.7964052392717, - -6.1759745319798 - ], - "SAN JUAN DE TANTARANCHE, HUAROCHIRI, LIMA": [ - -76.1569924505589, - -11.9929092195719 - ], - "SAN JUAN DE VIRUNDO, GRAU, APURIMAC": [ - -72.6773355300552, - -14.2910556945174 - ], - "SAN JUAN DE YANAC, CHINCHA, ICA": [ - -75.8143205227703, - -13.2247139097545 - ], - "SAN JUAN DEL ORO, SANDIA, PUNO": [ - -69.1004561656379, - -14.1939658232185 - ], - "SAN JUAN, CAJAMARCA, CAJAMARCA": [ - -78.481978552961, - -7.27390964349545 - ], - "SAN JUAN, CASTROVIRREYNA, HUANCAVELICA": [ - -75.6882412557888, - -13.271951841109 - ], - "SAN JUAN, LUCANAS, AYACUCHO": [ - -74.1864030197339, - -14.6539921138375 - ], - "SAN JUAN, MAYNAS, LORETO": [ - -73.6658988068188, - -4.14906484281448 - ], - "SAN JUAN, NASCA, ICA": [ - -75.0693586349441, - -15.1424393719802 - ], - "SAN JUAN, NAZCA, ICA": [ - -75.0693586349441, - -15.1424393719802 - ], - "SAN LORENZO DE HUACHUPAMPA, HUAROCHIRI, LIMA": [ - -76.5957974939126, - -11.6968546203899 - ], - "SAN LORENZO DE PUTINZA, YAUYOS, LIMA": [ - -75.9227687928709, - -12.6665109363051 - ], - "SAN LORENZO DE QUINTI, HUAROCHIRI, LIMA": [ - -76.118854946041, - -12.108944582644 - ], - "SAN LORENZO, DATEM DEL MARA\u00d1ON, LORETO": [ - -77.1108142476695, - -5.0211158177482 - ], - "SAN LORENZO, JAUJA, JUNIN": [ - -75.3785273373828, - -11.8386703857553 - ], - "SAN LORENZO, TAHUAMANU, MADRE DE DIOS": [ - -69.5319942302218, - -11.6796310458601 - ], - "SAN LUCAS (PUEBLO NUEVO DE COLAN), PAITA, PIURA": [ - -81.0709427838977, - -4.93061687664454 - ], - "SAN LUIS DE LUCMA, CUTERVO, CAJAMARCA": [ - -78.5821695298254, - -6.26868141043627 - ], - "SAN LUIS DE SHUARO, CHANCHAMAYO, JUNIN": [ - -75.2727658197265, - -10.8432798753174 - ], - "SAN LUIS GRANDE, SAN PABLO, CAJAMARCA": [ - -78.8730853909849, - -7.15904768400335 - ], - "SAN LUIS, CARLOS FERMIN FITZCARRALD, ANCASH": [ - -77.2909616834533, - -9.09716330854625 - ], - "SAN LUIS, CA\u00d1ETE, LIMA": [ - -76.423719010956, - -13.0519962171195 - ], - "SAN LUIS, LIMA, LIMA": [ - -76.9972394465877, - -12.0740865463895 - ], - "SAN MARCOS DE ROCCHAC, TAYACAJA, HUANCAVELICA": [ - -74.9488760546086, - -12.0792381064899 - ], - "SAN MARCOS, HUARI, ANCASH": [ - -77.0918967208327, - -9.62815173014206 - ], - "SAN MARCOS, SAN MARCOS, CAJAMARCA": [ - -78.1712498974717, - -7.3291583053747 - ], - "SAN MARTIN, EL DORADO, SAN MARTIN": [ - -76.8373409478316, - -6.42328605806938 - ], - "SAN MARTIN, PIURA, PIURA": [ - -80.6965430501692, - -5.16138409202853 - ], - "SAN MATEO, HUAROCHIRI, LIMA": [ - -76.2189827902887, - -11.8197847420302 - ], - "SAN MIGUEL DE EL FAIQUE, HUANCABAMBA, PIURA": [ - -79.6049706200152, - -5.42460088291056 - ], - "SAN MIGUEL DE OLLARAYA, YUNGUYO, PUNO": [ - -68.9969556218396, - -16.2359269682706 - ], - "SAN MIGUEL DE PALLAQUES, SAN MIGUEL, CAJAMARCA": [ - -78.922376922569, - -7.07750525133226 - ], - "SAN MIGUEL DEL ENE, SATIPO, JUNIN": [ - -74.1865651800141, - -12.2023524381335 - ], - "SAN MIGUEL, CONCEPCION, JUNIN": [ - -75.3644782797056, - -12.001889687624 - ], - "SAN MIGUEL, LA MAR, AYACUCHO": [ - -73.9426501881268, - -13.036064879738 - ], - "SAN MIGUEL, LIMA, LIMA": [ - -77.090067121944, - -12.0764449143481 - ], - "SAN MIGUEL, SAN ROMAN, PUNO": [ - -70.1264189296883, - -15.406228390998 - ], - "SAN NICOLAS, CARLOS FERMIN FITZCARRALD, ANCASH": [ - -77.1695739586755, - -9.01120778372953 - ], - "SAN PABLO DE LORETO, MARISCAL RAMON CASTILLA, LORETO": [ - -71.3389666805262, - -3.86675835039228 - ], - "SAN PABLO DE PILLAO, HUANUCO, HUANUCO": [ - -75.9384495292795, - -9.70775509298174 - ], - "SAN PABLO, BELLAVISTA, SAN MARTIN": [ - -76.5865168934654, - -6.8388760292123 - ], - "SAN PABLO, CANCHIS, CUSCO": [ - -71.0876050335629, - -14.1517621411319 - ], - "SAN PABLO, SAN PABLO, CAJAMARCA": [ - -78.7857840738469, - -7.08601207696343 - ], - "SAN PEDRO DE CACHI, HUAMANGA, AYACUCHO": [ - -74.364178490527, - -13.0747162719584 - ], - "SAN PEDRO DE CAJAS, TARMA, JUNIN": [ - -75.7857736554659, - -11.1233987632674 - ], - "SAN PEDRO DE CASTA, HUAROCHIRI, LIMA": [ - -76.5552089019347, - -11.7651019640751 - ], - "SAN PEDRO DE CHONTA, MARA\u00d1ON, HUANUCO": [ - -76.7409594863993, - -8.65807559280272 - ], - "SAN PEDRO DE CHUNAN, JAUJA, JUNIN": [ - -75.4893098639577, - -11.7189240482454 - ], - "SAN PEDRO DE CORIS, CHURCAMPA, HUANCAVELICA": [ - -74.4002345755677, - -12.607344140201 - ], - "SAN PEDRO DE HUACARPANA, CHINCHA, ICA": [ - -75.7283694925266, - -13.0786172083211 - ], - "SAN PEDRO DE HUALLA, VICTOR FAJARDO, AYACUCHO": [ - -73.9791987221368, - -13.8780300700517 - ], - "SAN PEDRO DE LARCAY, SUCRE, AYACUCHO": [ - -73.5895827125156, - -14.2835030063534 - ], - "SAN PEDRO DE LLOC, PACASMAYO, LA LIBERTAD": [ - -79.4048784902566, - -7.48357163346638 - ], - "SAN PEDRO DE LOS INCAS, TUMBES, TUMBES": [ - -80.5030134485542, - -3.59957715484509 - ], - "SAN PEDRO DE PALCO, LUCANAS, AYACUCHO": [ - -74.4942603965913, - -14.2913076215843 - ], - "SAN PEDRO DE PILAS, YAUYOS, LIMA": [ - -76.1860933422428, - -12.4929821499458 - ], - "SAN PEDRO DE PILLAO, DANIEL ALCIDES CARRION, PASCO": [ - -76.5359209014085, - -10.4161978846639 - ], - "SAN PEDRO HUAMBURQUE, CHINCHEROS, APURIMAC": [ - -73.5551397452393, - -13.3977196404944 - ], - "SAN PEDRO, CANCHIS, CUSCO": [ - -71.332823022131, - -14.1660527256835 - ], - "SAN PEDRO, CHINCHA, ICA": [ - -76.1673894195252, - -13.3114448742726 - ], - "SAN PEDRO, HUAROCHIRI, LIMA": [ - -76.1966380538495, - -12.0867091489762 - ], - "SAN PEDRO, LUCANAS, AYACUCHO": [ - -74.2079400915162, - -14.9711193059556 - ], - "SAN RAFAEL, AMBO, HUANUCO": [ - -76.1263364122094, - -10.3289356198156 - ], - "SAN RAFAEL, BELLAVISTA, SAN MARTIN": [ - -76.4956790438478, - -7.02643974824393 - ], - "SAN RAMON, CHANCHAMAYO, JUNIN": [ - -75.4050973514709, - -11.1568076542558 - ], - "SAN ROQUE DE CUMBAZA, LAMAS, SAN MARTIN": [ - -76.5385782872339, - -6.20373368685898 - ], - "SAN SALVADOR DE QUIJE, SUCRE, AYACUCHO": [ - -73.7177638629186, - -13.9832708913203 - ], - "SAN SALVADOR, CALCA, CUSCO": [ - -71.77420296771, - -13.4882146159994 - ], - "SAN SEBASTIAN, CUSCO, CUSCO": [ - -71.9257463834217, - -13.5332536720993 - ], - "SAN SILVESTRE DE COCHAN, SAN MIGUEL, CAJAMARCA": [ - -78.7253004700606, - -6.93144299784859 - ], - "SAN VICENTE DE CA\u00d1ETE, CA\u00d1ETE, LIMA": [ - -76.257405403417, - -13.1719778231755 - ], - "SANACHGAN, MARISCAL LUZURIAGA, ANCASH": [ - -77.2772025502222, - -8.78492154214412 - ], - "SANAGORAN, SANCHEZ CARRION, LA LIBERTAD": [ - -78.1756391870192, - -7.79264730359339 - ], - "SANCOS, LUCANAS, AYACUCHO": [ - -74.1584138442854, - -15.1470873965277 - ], - "SANDIA, SANDIA, PUNO": [ - -69.4369604582816, - -14.2919312773358 - ], - "SANGALLAYA, HUAROCHIRI, LIMA": [ - -76.2627067801574, - -12.2191486232448 - ], - "SANGARARA, ACOMAYO, CUSCO": [ - -71.5707661020036, - -13.9539366562614 - ], - "SANTA ANA DE HUAYCAHUACHO, LUCANAS, AYACUCHO": [ - -73.9256090477274, - -14.2208735510005 - ], - "SANTA ANA DE TUSI, DANIEL ALCIDES CARRION, PASCO": [ - -76.3232546725997, - -10.478831344669 - ], - "SANTA ANA, CASTROVIRREYNA, HUANCAVELICA": [ - -75.1311804436012, - -13.088163230521 - ], - "SANTA ANITA - LOS FICUS, LIMA, LIMA": [ - -76.9631402249756, - -12.043207022412 - ], - "SANTA BARBARA DE CARHUACAYAN, YAULI, JUNIN": [ - -76.3648509380846, - -11.1980488840802 - ], - "SANTA CATALINA, LUYA, AMAZONAS": [ - -78.0935130847955, - -6.05696957422783 - ], - "SANTA CLARA DE COSME, CHURCAMPA, HUANCAVELICA": [ - -74.6452413592414, - -12.5705115599551 - ], - "SANTA CLOTILDE, MAYNAS, LORETO": [ - -74.4071146194054, - -2.0991287032543 - ], - "SANTA CRUZ DE ANDAMARCA, HUARAL, LIMA": [ - -76.5655222433029, - -11.1470191666982 - ], - "SANTA CRUZ DE CHUCA, SANTIAGO DE CHUCO, LA LIBERTAD": [ - -78.0970048952632, - -8.18744415053658 - ], - "SANTA CRUZ DE FLORES, CA\u00d1ETE, LIMA": [ - -76.6461847047249, - -12.5499366540093 - ], - "SANTA CRUZ DE SUCCHABAMBA, SANTA CRUZ, CAJAMARCA": [ - -78.9415396209312, - -6.62735535750624 - ], - "SANTA CRUZ DE TOLED, CONTUMAZA, CAJAMARCA": [ - -78.8633984122542, - -7.32766232600047 - ], - "SANTA CRUZ, ALTO AMAZONAS, LORETO": [ - -75.7490051696339, - -5.65827722335356 - ], - "SANTA CRUZ, CUTERVO, CAJAMARCA": [ - -78.8414310210027, - -6.10636334912511 - ], - "SANTA CRUZ, HUAURA, LIMA": [ - -76.9185554534536, - -11.0508061429578 - ], - "SANTA CRUZ, PALPA, ICA": [ - -75.2576988684759, - -14.4711961938598 - ], - "SANTA ELENA, REQUENA, LORETO": [ - -74.1894361886538, - -6.81833930452344 - ], - "SANTA EULALIA, HUAROCHIRI, LIMA": [ - -76.6490091322108, - -11.858278826564 - ], - "SANTA ISABEL DE SIGUAS, AREQUIPA, AREQUIPA": [ - -72.063225693566, - -16.2676896601896 - ], - "SANTA ISABEL, REQUENA, LORETO": [ - -74.7295110771846, - -6.38533269471229 - ], - "SANTA LUCIA, LAMPA, PUNO": [ - -70.7846582552924, - -15.6014409284179 - ], - "SANTA LUCIA, LUCANAS, AYACUCHO": [ - -74.5458042399976, - -14.9327953993886 - ], - "SANTA MARIA DE CAHUAPANAS, DATEM DEL MARA\u00d1ON, LORETO": [ - -76.8557284937114, - -5.24009776983291 - ], - "SANTA MARIA DE CHICMO, ANDAHUAYLAS, APURIMAC": [ - -73.5462698679236, - -13.6611571173255 - ], - "SANTA MARIA DE NANAY, MAYNAS, LORETO": [ - -74.285520529343, - -3.36163918314611 - ], - "SANTA MARIA DE NIEVA, CONDORCANQUI, AMAZONAS": [ - -77.9303731737118, - -4.84542434451876 - ], - "SANTA MARIA DEL MAR, LIMA, LIMA": [ - -76.7673969965789, - -12.4085768010731 - ], - "SANTA MARIA DEL VALLE, HUANUCO, HUANUCO": [ - -76.3126576520019, - -9.79339114014052 - ], - "SANTA MERCEDES, PUTUMAYO, LORETO": [ - -73.8657207070731, - -1.55841373418676 - ], - "SANTA RITA DE SIGUAS, AREQUIPA, AREQUIPA": [ - -72.1441125300091, - -16.522923449129 - ], - "SANTA ROSA DE ALTO YANAJANCA, MARA\u00d1ON, HUANUCO": [ - -76.5083123785993, - -8.78929766710261 - ], - "SANTA ROSA DE HUAYABAMBA, RODRIGUEZ DE MENDOZA, AMAZONAS": [ - -77.4584164469958, - -6.45523418101939 - ], - "SANTA ROSA DE SACCO, YAULI, JUNIN": [ - -75.9864540523318, - -11.5576036161536 - ], - "SANTA ROSA, CHICLAYO, LAMBAYEQUE": [ - -79.9042597687995, - -6.88074640183522 - ], - "SANTA ROSA, CONCEPCION, JUNIN": [ - -75.3068467707559, - -11.8699305599136 - ], - "SANTA ROSA, EL DORADO, SAN MARTIN": [ - -76.5992627595185, - -6.70538910996057 - ], - "SANTA ROSA, GRAU, APURIMAC": [ - -72.6604438296572, - -14.1259575077905 - ], - "SANTA ROSA, JAEN, CAJAMARCA": [ - -78.6008835328494, - -5.42771007581264 - ], - "SANTA ROSA, LA MAR, AYACUCHO": [ - -73.7893425163542, - -12.7645980204369 - ], - "SANTA ROSA, LIMA, LIMA": [ - -77.1632527535596, - -11.8050066914338 - ], - "SANTA ROSA, MELGAR, PUNO": [ - -70.8120190357395, - -14.5743397530001 - ], - "SANTA ROSA, PALLASCA, ANCASH": [ - -78.1384437060385, - -8.56845677496509 - ], - "SANTA TERESA, LA CONVENCION, CUSCO": [ - -72.7329816106818, - -13.2443822649214 - ], - "SANTA, SANTA, ANCASH": [ - -78.6092269698969, - -8.99217023338699 - ], - "SANTIAGO DE ANCHUCAYA, HUAROCHIRI, LIMA": [ - -76.1996048307944, - -12.0319181467674 - ], - "SANTIAGO DE CAO, ASCOPE, LA LIBERTAD": [ - -79.2177399798607, - -7.92475332351324 - ], - "SANTIAGO DE CHILCAS, OCROS, ANCASH": [ - -77.3586934374385, - -10.440170422806 - ], - "SANTIAGO DE CHOCORVOS, HUAYTARA, HUANCAVELICA": [ - -75.214941271035, - -13.8133866397921 - ], - "SANTIAGO DE CHUCO, SANTIAGO DE CHUCO, LA LIBERTAD": [ - -78.2446120676059, - -8.34914124186636 - ], - "SANTIAGO DE LUCANAMARCA, HUANCA SANCOS, AYACUCHO": [ - -74.5329245336248, - -13.8262855941978 - ], - "SANTIAGO DE PAUCARAY, SUCRE, AYACUCHO": [ - -73.653380750004, - -14.0874772121103 - ], - "SANTIAGO DE PUPUJA, AZANGARO, PUNO": [ - -70.2503519942043, - -15.0834053329088 - ], - "SANTIAGO DE QUIRAHUARA, HUAYTARA, HUANCAVELICA": [ - -74.8922766829085, - -14.0553969778959 - ], - "SANTIAGO DE SURCO, LIMA, LIMA": [ - -76.9843080557576, - -12.1269920818655 - ], - "SANTIAGO DE TUCUMA, TAYACAJA, HUANCAVELICA": [ - -74.8869587146369, - -12.3175664447101 - ], - "SANTIAGO DE TUNA, HUAROCHIRI, LIMA": [ - -76.5284599958612, - -11.9780619319105 - ], - "SANTIAGO, CUSCO, CUSCO": [ - -71.9785437397185, - -13.5730453793247 - ], - "SANTIAGO, ICA, ICA": [ - -75.5152730453598, - -14.5107474974163 - ], - "SANTO DOMINGO DE ACOBAMBA, HUANCAYO, JUNIN": [ - -74.6936122851464, - -11.8547704559814 - ], - "SANTO DOMINGO DE CAPILLAS, HUAYTARA, HUANCAVELICA": [ - -75.1838168345108, - -13.6712296276168 - ], - "SANTO DOMINGO DE LA CAPILLA, CUTERVO, CAJAMARCA": [ - -78.8427210977712, - -6.25796193311939 - ], - "SANTO DOMINGO DE LOS OLLEROS, HUAROCHIRI, LIMA": [ - -76.5362039042379, - -12.2613201156656 - ], - "SANTO DOMINGO DEL PRADO, CONCEPCION, JUNIN": [ - -75.3146269015526, - -11.8898993177684 - ], - "SANTO DOMINGO, MORROPON, PIURA": [ - -79.9106809725363, - -5.05314753513048 - ], - "SANTO TOMAS DE PATA, ANGARAES, HUANCAVELICA": [ - -74.4710080627072, - -13.1435419718366 - ], - "SANTO TOMAS, CHUMBIVILCAS, CUSCO": [ - -72.2087069763828, - -14.6507971840841 - ], - "SANTO TOMAS, CUTERVO, CAJAMARCA": [ - -78.6776466170304, - -6.11859833179335 - ], - "SANTO TOMAS, LUYA, AMAZONAS": [ - -77.892476846641, - -6.56905877272358 - ], - "SANTO TORIBIO, HUAYLAS, ANCASH": [ - -77.9524947529469, - -8.84639817298939 - ], - "SAPALACHE, HUANCABAMBA, PIURA": [ - -79.3672526271352, - -5.02280415721348 - ], - "SAPALLANGA, HUANCAYO, JUNIN": [ - -75.1397435960938, - -12.1138593849333 - ], - "SAPILLICA, AYABACA, PIURA": [ - -79.9892052080543, - -4.78362182734737 - ], - "SAPOSOA, HUALLAGA, SAN MARTIN": [ - -76.8737513595706, - -6.88883320602482 - ], - "SARAMIRIZA, DATEM DEL MARA\u00d1ON, LORETO": [ - -77.5185118691006, - -4.72759642242815 - ], - "SARHUA, VICTOR FAJARDO, AYACUCHO": [ - -74.4098401728754, - -13.6902848026043 - ], - "SARIN, SANCHEZ CARRION, LA LIBERTAD": [ - -77.8800927470761, - -7.93982713977153 - ], - "SARTIMBAMBA, SANCHEZ CARRION, LA LIBERTAD": [ - -77.766147893736, - -7.61268111579634 - ], - "SATIPO, SATIPO, JUNIN": [ - -74.6118560251711, - -11.1796000494081 - ], - "SAUCE, SAN MARTIN, SAN MARTIN": [ - -76.2046188507205, - -6.70275954744533 - ], - "SAUCEPAMPA, SANTA CRUZ, CAJAMARCA": [ - -78.908100362906, - -6.68260455781141 - ], - "SAURAMA, VILCAS HUAMAN, AYACUCHO": [ - -73.7503468746451, - -13.70102191379 - ], - "SAUSA, JAUJA, JUNIN": [ - -75.4832910995988, - -11.7926532567957 - ], - "SAYAN, HUAURA, LIMA": [ - -77.2338038262745, - -11.1458636207759 - ], - "SAYAPULLO, GRAN CHIMU, LA LIBERTAD": [ - -78.431724611322, - -7.56789981926818 - ], - "SAYLA, LA UNION, AREQUIPA": [ - -73.245333106905, - -15.3249818755353 - ], - "SAYLLA, CUSCO, CUSCO": [ - -71.8317557542491, - -13.5530044401981 - ], - "SA\u00d1A, CHICLAYO, LAMBAYEQUE": [ - -79.6379959916964, - -6.88714205012368 - ], - "SA\u00d1AYCA, AYMARAES, APURIMAC": [ - -73.3582653609304, - -14.3325664320636 - ], - "SA\u00d1O, HUANCAYO, JUNIN": [ - -75.246884368985, - -11.9506179429833 - ], - "SECCLLA, ANGARAES, HUANCAVELICA": [ - -74.5415169218742, - -13.0808402669539 - ], - "SECHURA, SECHURA, PIURA": [ - -80.660478156597, - -5.91946744795109 - ], - "SEGUNDA JERUSALEN-AZUNGUILLO, RIOJA, SAN MARTIN": [ - -77.2972962883463, - -6.04638884261892 - ], - "SELVA ALEGRE, AREQUIPA, AREQUIPA": [ - -71.4858571369911, - -16.33096182569 - ], - "SEPAHUA, ATALAYA, UCAYALI": [ - -72.8138397934727, - -11.0837036360311 - ], - "SEXI, SANTA CRUZ, CAJAMARCA": [ - -79.0361795350928, - -6.58548514320499 - ], - "SHAMBOYACU, PICOTA, SAN MARTIN": [ - -76.0945592858447, - -7.05176863085458 - ], - "SHANAO, LAMAS, SAN MARTIN": [ - -76.5778777975212, - -6.40809472212607 - ], - "SHAPAJA, SAN MARTIN, SAN MARTIN": [ - -76.2132319413315, - -6.58841789104949 - ], - "SHATOJA, EL DORADO, SAN MARTIN": [ - -76.699114983726, - -6.52380403659094 - ], - "SHILLA, CARHUAZ, ANCASH": [ - -77.5647181714931, - -9.15442255633512 - ], - "SHIPASBAMBA, BONGARA, AMAZONAS": [ - -78.0520892810855, - -5.88374693567417 - ], - "SHIRAC, SAN MARCOS, CAJAMARCA": [ - -78.0209706961173, - -7.35601686496337 - ], - "SHUCUSHUYACU, ALTO AMAZONAS, LORETO": [ - -75.8220446502314, - -5.98771172818678 - ], - "SHUNQUI, DOS DE MAYO, HUANUCO": [ - -76.8097734343628, - -9.75051626253545 - ], - "SHUPLUY, YUNGAY, ANCASH": [ - -77.78949860413, - -9.3444450246016 - ], - "SIBAYO, CAYLLOMA, AREQUIPA": [ - -71.5459568721043, - -15.3617497850169 - ], - "SICAYA, HUANCAYO, JUNIN": [ - -75.2875122037368, - -12.0190115141739 - ], - "SICCHEZ, AYABACA, PIURA": [ - -79.7770490716534, - -4.57239365567064 - ], - "SICUANI, CANCHIS, CUSCO": [ - -71.1036085677679, - -14.2510172254898 - ], - "SIHUAS, SIHUAS, ANCASH": [ - -77.6154349046471, - -8.54029100313136 - ], - "SILLAPATA, DOS DE MAYO, HUANUCO": [ - -76.7668628797064, - -9.79382585994769 - ], - "SIMBAL, TRUJILLO, LA LIBERTAD": [ - -78.8270851155447, - -7.91836902028192 - ], - "SINA, SAN ANTONIO DE PUTINA, PUNO": [ - -69.2400295231013, - -14.5114493481895 - ], - "SINCHAO, PIURA, PIURA": [ - -80.6113687221145, - -5.44129534924409 - ], - "SINCOS, JAUJA, JUNIN": [ - -75.513112072342, - -11.9420648846642 - ], - "SINGA, HUAMALIES, HUANUCO": [ - -76.8353045288966, - -9.36260289188809 - ], - "SINSICAP, OTUZCO, LA LIBERTAD": [ - -78.7791842062966, - -7.75449796661443 - ], - "SITABAMBA, SANTIAGO DE CHUCO, LA LIBERTAD": [ - -77.8004474035836, - -8.026282388646 - ], - "SITAJARA, TARATA, TACNA": [ - -70.153388988796, - -17.3945685640572 - ], - "SIVIA, HUANTA, AYACUCHO": [ - -73.9964483179422, - -12.6038228663422 - ], - "SOCABAYA, AREQUIPA, AREQUIPA": [ - -71.5346798143882, - -16.4736421724009 - ], - "SOCOS, HUAMANGA, AYACUCHO": [ - -74.2844271131462, - -13.2614568039096 - ], - "SOCOTA, CUTERVO, CAJAMARCA": [ - -78.6968579355206, - -6.28747259125881 - ], - "SOJO, SULLANA, PIURA": [ - -80.7884236176804, - -5.04853448525903 - ], - "SOLOCO, CHACHAPOYAS, AMAZONAS": [ - -77.7463548911186, - -6.30911012562556 - ], - "SONDOR, HUANCABAMBA, PIURA": [ - -79.3624581447595, - -5.40349430397246 - ], - "SONDORILLO, HUANCABAMBA, PIURA": [ - -79.4600615886836, - -5.39788217898114 - ], - "SOPLIN VARGAS, PUTUMAYO, LORETO": [ - -74.7313005554548, - -0.655651640923995 - ], - "SORAS, SUCRE, AYACUCHO": [ - -73.6909928594108, - -14.2095609367198 - ], - "SORAYA, AYMARAES, APURIMAC": [ - -73.2840070513857, - -14.1707510843618 - ], - "SORITOR, MOYOBAMBA, SAN MARTIN": [ - -77.0541425163936, - -6.27274272660693 - ], - "SOROCHUCO, CELENDIN, CAJAMARCA": [ - -78.2971565767239, - -6.93421987933296 - ], - "SUBTANJALLA, ICA, ICA": [ - -75.8932386557159, - -14.0481568908235 - ], - "SUCCHA, AIJA, ANCASH": [ - -77.635759258308, - -9.83799954638798 - ], - "SUCRE, CELENDIN, CAJAMARCA": [ - -78.1713102712086, - -7.01874681429502 - ], - "SUCRE, HUAYLAS, ANCASH": [ - -77.8909653979526, - -8.95802809991649 - ], - "SUITUCANCHA, YAULI, JUNIN": [ - -75.9781833363861, - -11.8333174192974 - ], - "SULLANA, SULLANA, PIURA": [ - -80.5466774765944, - -4.82576697050103 - ], - "SUMBILCA, HUARAL, LIMA": [ - -76.8554252555057, - -11.3943983992834 - ], - "SUNAMPE, CHINCHA, ICA": [ - -76.1628427530459, - -13.4268898540702 - ], - "SUPE PUERTO, BARRANCA, LIMA": [ - -77.7256801900956, - -10.7852466109974 - ], - "SUPE, BARRANCA, LIMA": [ - -77.5623061389748, - -10.8096115352055 - ], - "SURCO, HUAROCHIRI, LIMA": [ - -76.4453586608229, - -11.8771124046428 - ], - "SURCUBAMBA, TAYACAJA, HUANCAVELICA": [ - -74.6523869886951, - -12.1507595111134 - ], - "SURQUILLO, LIMA, LIMA": [ - -77.0129857546458, - -12.1134363133491 - ], - "SUSAPAYA, TARATA, TACNA": [ - -70.0466818766733, - -17.2245659717635 - ], - "SUYCKUTAMBO /5, ESPINAR, CUSCO": [ - -71.6582268202033, - -15.0011511230454 - ], - "SUYO, AYABACA, PIURA": [ - -80.0627248732016, - -4.46136676413212 - ], - "TABACONAS, SAN IGNACIO, CAJAMARCA": [ - -79.2154078046256, - -5.32438082697804 - ], - "TABALOSOS, LAMAS, SAN MARTIN": [ - -76.6552455703616, - -6.38864068828329 - ], - "TACABAMBA, CHOTA, CAJAMARCA": [ - -78.5561113484299, - -6.39870169157903 - ], - "TACNA, TACNA, TACNA": [ - -70.1690823072449, - -18.1130108207229 - ], - "TALARA, TALARA, PIURA": [ - -81.0435295834974, - -4.49884875198225 - ], - "TALAVERA, ANDAHUAYLAS, APURIMAC": [ - -73.4530287998334, - -13.6275029769814 - ], - "TAMANCO, REQUENA, LORETO": [ - -74.4540463434201, - -6.20137532111786 - ], - "TAMARINDO, PAITA, PIURA": [ - -80.9626274875138, - -4.83748437072928 - ], - "TAMBILLO, HUAMANGA, AYACUCHO": [ - -74.142179082367, - -13.1902249606025 - ], - "TAMBO DE MORA, CHINCHA, ICA": [ - -76.1827449482579, - -13.4618344603745 - ], - "TAMBO DE PAJA /18, TOCACHE, SAN MARTIN": [ - -76.8767030773677, - -8.42326215461851 - ], - "TAMBO GRANDE, PIURA, PIURA": [ - -80.3309466398931, - -4.91944862471373 - ], - "TAMBO QUEMADO, LUCANAS, AYACUCHO": [ - -74.6157225089164, - -14.6714813369307 - ], - "TAMBO, HUAYTARA, HUANCAVELICA": [ - -75.1762620449432, - -13.5897165917679 - ], - "TAMBO, LA MAR, AYACUCHO": [ - -74.0230995805116, - -12.9122955076975 - ], - "TAMBOBAMBA, COTABAMBAS, APURIMAC": [ - -72.2129157814478, - -13.9170707947247 - ], - "TAMBURCO, ABANCAY, APURIMAC": [ - -72.8719628125642, - -13.5781378303833 - ], - "TAMSHIYACU, MAYNAS, LORETO": [ - -73.1148146436675, - -4.27912451535227 - ], - "TANTA, YAUYOS, LIMA": [ - -75.9913298919651, - -12.1320399119511 - ], - "TANTAMAYO, HUAMALIES, HUANUCO": [ - -76.6699491052987, - -9.37563012006746 - ], - "TANTARA, CASTROVIRREYNA, HUANCAVELICA": [ - -75.6213616136604, - -13.1265595866579 - ], - "TAPACOCHA, RECUAY, ANCASH": [ - -77.5398859940765, - -10.0027529957447 - ], - "TAPAIRIHUA, AYMARAES, APURIMAC": [ - -73.1179366657483, - -14.1056201741407 - ], - "TAPAY, CAYLLOMA, AREQUIPA": [ - -71.9359994605369, - -15.4268314194912 - ], - "TAPO, TARMA, JUNIN": [ - -75.5284173275649, - -11.429562573919 - ], - "TAPUC, DANIEL ALCIDES CARRION, PASCO": [ - -76.468245683831, - -10.4189600882946 - ], - "TARACO, HUANCANE, PUNO": [ - -69.9275345937596, - -15.3080956068296 - ], - "TARAPOTO, SAN MARTIN, SAN MARTIN": [ - -76.369666199388, - -6.49414473393611 - ], - "TARATA, TARATA, TACNA": [ - -69.7513556008735, - -17.3770327602578 - ], - "TARAY, CALCA, CUSCO": [ - -71.8838297112024, - -13.460219194307 - ], - "TARICA, HUARAZ, ANCASH": [ - -77.4820297785549, - -9.3926076103842 - ], - "TARMA, TARMA, JUNIN": [ - -75.7587693065744, - -11.4555567728438 - ], - "TARUCACHI, TARATA, TACNA": [ - -69.9580480608334, - -17.5018815605731 - ], - "TARUCANI, AREQUIPA, AREQUIPA": [ - -71.0980403357042, - -16.1982117204238 - ], - "TATE DE LA CAPILLA, ICA, ICA": [ - -75.7032582431302, - -14.1515535821781 - ], - "TAUCA, PALLASCA, ANCASH": [ - -78.0555678996006, - -8.44606943029654 - ], - "TAURIA, LA UNION, AREQUIPA": [ - -73.1726466219202, - -15.4042085198669 - ], - "TAURIJA, PATAZ, LA LIBERTAD": [ - -77.4331651434306, - -8.27946094605945 - ], - "TAURIPAMPA, YAUYOS, LIMA": [ - -76.1814440214017, - -12.6831748285537 - ], - "TAURISMA, LA UNION, AREQUIPA": [ - -72.7614813242684, - -14.8749573667108 - ], - "TAYABAMBA, PATAZ, LA LIBERTAD": [ - -77.2563544700654, - -8.31424349358439 - ], - "TEMBLADERA, CONTUMAZA, CAJAMARCA": [ - -79.1691391062752, - -7.27762182862079 - ], - "TIABAYA, AREQUIPA, AREQUIPA": [ - -71.5990135276426, - -16.4634522843422 - ], - "TIBILLO, PALPA, ICA": [ - -75.1609354013162, - -14.150392188356 - ], - "TICACO, TARATA, TACNA": [ - -69.9635986161318, - -17.3347475061109 - ], - "TICAPAMPA, RECUAY, ANCASH": [ - -77.3922855726758, - -9.73783481891967 - ], - "TICLACAYAN, PASCO, PASCO": [ - -76.0337928509288, - -10.553652394841 - ], - "TICLLAS, HUAMANGA, AYACUCHO": [ - -74.3263336744314, - -13.1250293249797 - ], - "TICLLOS, BOLOGNESI, ANCASH": [ - -77.2080327621823, - -10.2324771856193 - ], - "TICRAPO, CASTROVIRREYNA, HUANCAVELICA": [ - -75.4097327091524, - -13.4180486580402 - ], - "TILALI, MOHO, PUNO": [ - -69.3420774301434, - -15.4916784264747 - ], - "TINCO, CARHUAZ, ANCASH": [ - -77.6617920247196, - -9.25893871165432 - ], - "TINGO DE PONASA, PICOTA, SAN MARTIN": [ - -76.2121161571412, - -6.97034231205456 - ], - "TINGO DE SAPOSOA, HUALLAGA, SAN MARTIN": [ - -76.6565104096767, - -7.06414697697723 - ], - "TINGO MARIA, LEONCIO PRADO, HUANUCO": [ - -76.1041061421126, - -9.19118487308078 - ], - "TINGO, LUYA, AMAZONAS": [ - -77.9435261872091, - -6.3868643680651 - ], - "TINICACHI, YUNGUYO, PUNO": [ - -68.9715154789768, - -16.1979688308661 - ], - "TINTA, CANCHIS, CUSCO": [ - -71.3922979940975, - -14.1587409539734 - ], - "TINTAY, AYMARAES, APURIMAC": [ - -73.1344804901465, - -13.9034979026609 - ], - "TINTAY, TAYACAJA, HUANCAVELICA": [ - -74.5039803033196, - -12.1771370379746 - ], - "TINYAHUARCO (SMELTER), PASCO, PASCO": [ - -76.2483905606471, - -10.7605473621798 - ], - "TIPAN, CASTILLA, AREQUIPA": [ - -72.499683565637, - -15.7507676222888 - ], - "TIQUILLACA, PUNO, PUNO": [ - -70.2714315504892, - -15.9236809589671 - ], - "TIRAPATA, AZANGARO, PUNO": [ - -70.383779684878, - -14.9223736051868 - ], - "TIRUNTAN, UCAYALI, LORETO": [ - -74.9143173100919, - -7.87940345423282 - ], - "TISCO, CAYLLOMA, AREQUIPA": [ - -71.3922653712899, - -15.2126997908454 - ], - "TOCACHE, TOCACHE, SAN MARTIN": [ - -76.5462312439842, - -8.27741495375467 - ], - "TOCMOCHE, CHOTA, CAJAMARCA": [ - -79.3759344878676, - -6.45681884076692 - ], - "TOCOTA, CARAVELI, AREQUIPA": [ - -74.0628267718308, - -15.5557413238229 - ], - "TOMAS, YAUYOS, LIMA": [ - -75.706829163421, - -12.1639274802064 - ], - "TOMAY KICHWA, AMBO, HUANUCO": [ - -76.1791477957037, - -10.0648745572447 - ], - "TOMEPAMPA, LA UNION, AREQUIPA": [ - -72.7853028354329, - -15.2132679932744 - ], - "TONGOD, SAN MIGUEL, CAJAMARCA": [ - -78.8335391952975, - -6.78813739590565 - ], - "TORATA, MARISCAL NIETO, MOQUEGUA": [ - -70.7383213205242, - -16.998119052281 - ], - "TORAYA, AYMARAES, APURIMAC": [ - -73.3137272598551, - -14.0246552041556 - ], - "TORO, LA UNION, AREQUIPA": [ - -73.016123267709, - -15.404762256408 - ], - "TOTORA, RODRIGUEZ DE MENDOZA, AMAZONAS": [ - -77.4671567823796, - -6.49135074131675 - ], - "TOTOS, CANGALLO, AYACUCHO": [ - -74.5011848322704, - -13.5561667415952 - ], - "TOURNAVISTA, PUERTO INCA, HUANUCO": [ - -74.8663849513758, - -9.00131862751394 - ], - "TRES DE DICIEMBRE, CHUPACA, JUNIN": [ - -75.2458510741704, - -12.1140162946782 - ], - "TRES UNIDOS, PICOTA, SAN MARTIN": [ - -76.1286175267262, - -6.81743258624548 - ], - "TRINIDAD, CONTUMAZA, CAJAMARCA": [ - -79.0665716448416, - -7.3734651079094 - ], - "TRITA, LUYA, AMAZONAS": [ - -77.9811384132191, - -6.15647231807174 - ], - "TRUJILLO, TRUJILLO, LA LIBERTAD": [ - -79.0238582661895, - -8.11258545945694 - ], - "TUCUME, LAMBAYEQUE, LAMBAYEQUE": [ - -79.8762752922609, - -6.50330856446158 - ], - "TUMAN, CHICLAYO, LAMBAYEQUE": [ - -79.6944488015406, - -6.77372970290645 - ], - "TUMBADEN, SAN PABLO, CAJAMARCA": [ - -78.6761624821227, - -6.98750836823469 - ], - "TUMBES, TUMBES, TUMBES": [ - -80.4161725038087, - -3.55366029025469 - ], - "TUNAL, HUANCABAMBA, PIURA": [ - -79.6648826157421, - -5.17202309066159 - ], - "TUNGASUCA, CANAS, CUSCO": [ - -71.52705111458, - -14.1510123508016 - ], - "TUPAC AMARU, PISCO, ICA": [ - -76.1106814999178, - -13.7258689435317 - ], - "TUPE, YAUYOS, LIMA": [ - -75.7360980235161, - -12.6902904090891 - ], - "TURPAY, GRAU, APURIMAC": [ - -72.6370455171977, - -14.2320036481741 - ], - "TURPO, ANDAHUAYLAS, APURIMAC": [ - -73.4722065233019, - -13.7905951429556 - ], - "TUTI, CAYLLOMA, AREQUIPA": [ - -71.5976134169964, - -15.4830670636133 - ], - "UBINAS, GENERAL SANCHEZ CERRO, MOQUEGUA": [ - -70.8051529523494, - -16.217538730193 - ], - "UCHIZA, TOCACHE, SAN MARTIN": [ - -76.3976749211277, - -8.35834291761204 - ], - "UCHUMARCA, BOLIVAR, LA LIBERTAD": [ - -77.8058860479108, - -7.0261006498535 - ], - "UCHUMAYO, AREQUIPA, AREQUIPA": [ - -71.6905393119515, - -16.4609304782698 - ], - "UCO, HUARI, ANCASH": [ - -76.931129342349, - -9.19119598356834 - ], - "UCUNCHA, BOLIVAR, LA LIBERTAD": [ - -77.8505971561047, - -7.15323363212601 - ], - "ULCUMAYO, JUNIN, JUNIN": [ - -75.6839602830458, - -10.9044616702576 - ], - "ULLPAYACU, DATEM DEL MARA\u00d1ON, LORETO": [ - -76.6377392595385, - -4.27660777656263 - ], - "ULLULLUCO, SIHUAS, ANCASH": [ - -77.4435212234193, - -8.46775384212263 - ], - "UMACHIRI, MELGAR, PUNO": [ - -70.7489887636246, - -14.8785753320409 - ], - "UMAMARCA, ANDAHUAYLAS, APURIMAC": [ - -73.458199457016, - -13.9692351526379 - ], - "UMARI (TAMBILLO), PACHITEA, HUANUCO": [ - -76.0279012039615, - -9.86814788450046 - ], - "UMBE, SIHUAS, ANCASH": [ - -77.5292835482862, - -8.63053239154383 - ], - "UPAHUACHO, PARINACOCHAS, AYACUCHO": [ - -73.5294357133783, - -14.883480301839 - ], - "URANMARCA, CHINCHEROS, APURIMAC": [ - -73.6525014676157, - -13.6684590523307 - ], - "URASQUI, CAMANA, AREQUIPA": [ - -73.1361177546738, - -16.0782633814461 - ], - "URCOS, QUISPICANCHI, CUSCO": [ - -71.5991388625788, - -13.6878743371413 - ], - "URIPA, CHINCHEROS, APURIMAC": [ - -73.6692713137571, - -13.544299516039 - ], - "URPAY, PATAZ, LA LIBERTAD": [ - -77.3755473093386, - -8.32817787742743 - ], - "URUBAMBA, URUBAMBA, CUSCO": [ - -72.1312678099346, - -13.244943572452 - ], - "USICAYOS, CARABAYA, PUNO": [ - -69.9383077987735, - -14.1407751889484 - ], - "USQUIL, OTUZCO, LA LIBERTAD": [ - -78.3616459467192, - -7.80063514503382 - ], - "UTCO, CELENDIN, CAJAMARCA": [ - -78.0579921249718, - -6.88139097501182 - ], - "UTCURARCA, SAN MARTIN, SAN MARTIN": [ - -76.2601213298308, - -6.68366694525728 - ], - "UTICYACU, SANTA CRUZ, CAJAMARCA": [ - -78.7904757312466, - -6.61481245200984 - ], - "U\u00d1ON, CASTILLA, AREQUIPA": [ - -72.3831461821974, - -15.7570885836212 - ], - "VALERA (SAN PABLO), BONGARA, AMAZONAS": [ - -77.8691715878754, - -6.08063376261261 - ], - "VEGUETA, HUAURA, LIMA": [ - -77.6041168002861, - -10.9501914271908 - ], - "VELILLE, CHUMBIVILCAS, CUSCO": [ - -71.8491636322822, - -14.5490043830035 - ], - "VELINGA, LA UNION, AREQUIPA": [ - -73.0704268348698, - -15.2898099847784 - ], - "VENECIA, SAN MARCOS, CAJAMARCA": [ - -77.9681824314284, - -7.22678675970454 - ], - "VENTANILLA, CALLAO, CALLAO": [ - -77.1308636650625, - -11.8791245763359 - ], - "VICCO, PASCO, PASCO": [ - -76.2332293533725, - -10.8639688056741 - ], - "VICE, SECHURA, PIURA": [ - -80.8745447941595, - -5.43861615934226 - ], - "VILAVILA, LAMPA, PUNO": [ - -70.6503483111407, - -15.1749601890921 - ], - "VILCA, HUANCAVELICA, HUANCAVELICA": [ - -75.2688746357086, - -12.5330229191105 - ], - "VILCABAMBA, DANIEL ALCIDES CARRION, PASCO": [ - -76.4479921748985, - -10.5357745699185 - ], - "VILCABAMBA, GRAU, APURIMAC": [ - -72.6362347683255, - -14.0786464182476 - ], - "VILCANCHOS, VICTOR FAJARDO, AYACUCHO": [ - -74.6431838518056, - -13.6523813285896 - ], - "VILCAS HUAMAN, VILCAS HUAMAN, AYACUCHO": [ - -73.8963212206714, - -13.6557014742741 - ], - "VILLA EL SALVADOR, LIMA, LIMA": [ - -76.9452748094365, - -12.2192786910069 - ], - "VILLA KINTIARINA, LA CONVENCION, CUSCO": [ - -73.477929607533, - -12.9093950770101 - ], - "VILLA MARIA DEL TRIUNFO, LIMA, LIMA": [ - -76.9189867663915, - -12.1703915692313 - ], - "VILLA RICA, OXAPAMPA, PASCO": [ - -75.175920802982, - -10.6341125687566 - ], - "VILLA TROMPETEROS, LORETO, LORETO": [ - -75.8368781499906, - -3.1963235020799 - ], - "VILLA VIRGEN, LA CONVENCION, CUSCO": [ - -73.3396447957436, - -13.0544415502435 - ], - "VILQUE CHICO, HUANCANE, PUNO": [ - -69.6095011012721, - -15.1380055654182 - ], - "VILQUE, PUNO, PUNO": [ - -70.2631556849944, - -15.7802168427446 - ], - "VINCHOS, HUAMANGA, AYACUCHO": [ - -74.4564662089925, - -13.3062829397109 - ], - "VIQUES, HUANCAYO, JUNIN": [ - -75.2276761352205, - -12.1605324170701 - ], - "VIRACO, CASTILLA, AREQUIPA": [ - -72.5669024882285, - -15.6163736294531 - ], - "VIRACOCHAN, HUANTA, AYACUCHO": [ - -74.3053940098996, - -12.531530515879 - ], - "VIRU, VIRU, LA LIBERTAD": [ - -78.7352552374797, - -8.35330372117308 - ], - "VISCHONGO, VILCAS HUAMAN, AYACUCHO": [ - -74.0136910344875, - -13.5537106550313 - ], - "VISTA ALEGRE, NASCA, ICA": [ - -74.8280058437458, - -14.9284661610987 - ], - "VISTA ALEGRE, NAZCA, ICA": [ - -74.8280058437458, - -14.9284661610987 - ], - "VISTA ALEGRE, RODRIGUEZ DE MENDOZA, AMAZONAS": [ - -77.3342252097032, - -6.2071994051163 - ], - "VITARTE, LIMA, LIMA": [ - -76.8774801973828, - -12.032570611012 - ], - "VITIS, YAUYOS, LIMA": [ - -75.8575404641785, - -12.1694446525108 - ], - "VITOR, AREQUIPA, AREQUIPA": [ - -71.987800961218, - -16.4893108836053 - ], - "VI\u00d1AC, YAUYOS, LIMA": [ - -75.7704274270773, - -12.8875592327759 - ], - "WANCHAQ, CUSCO, CUSCO": [ - -71.9512043507476, - -13.5312818423902 - ], - "YACUS, HUANUCO, HUANUCO": [ - -76.5112464745966, - -9.9460546357947 - ], - "YAMANGO, MORROPON, PIURA": [ - -79.7695355223883, - -5.15651296173274 - ], - "YAMBRASBAMBA, BONGARA, AMAZONAS": [ - -77.8605491002651, - -5.52432940961063 - ], - "YAMON, UTCUBAMBA, AMAZONAS": [ - -78.5241065920283, - -6.0120091229609 - ], - "YANAC, CORONGO, ANCASH": [ - -77.8471521262357, - -8.62509164366676 - ], - "YANACA, AYMARAES, APURIMAC": [ - -73.1598035209095, - -14.2313253913771 - ], - "YANACANCHA, CHUPACA, JUNIN": [ - -75.4738048357885, - -12.2536896242596 - ], - "YANACANCHA, PASCO, PASCO": [ - -76.1942788045612, - -10.6434321049398 - ], - "YANAHUANCA, DANIEL ALCIDES CARRION, PASCO": [ - -76.5724465409092, - -10.5629051756944 - ], - "YANAHUARA, AREQUIPA, AREQUIPA": [ - -71.5504057075325, - -16.3947446702014 - ], - "YANAHUAYA, SANDIA, PUNO": [ - -69.1270554743212, - -14.3311418461305 - ], - "YANAMA, YUNGAY, ANCASH": [ - -77.4980547568647, - -9.02411597615933 - ], - "YANAOCA, CANAS, CUSCO": [ - -71.4420440725093, - -14.2737796067242 - ], - "YANAQUIHUA, CONDESUYOS, AREQUIPA": [ - -73.0291167590275, - -15.7019766666613 - ], - "YANAS, DOS DE MAYO, HUANUCO": [ - -76.7315350758526, - -9.7146599775843 - ], - "YANGAS, CANTA, LIMA": [ - -76.8431484015992, - -11.6710383466169 - ], - "YANQUE, CAYLLOMA, AREQUIPA": [ - -71.4553206953741, - -15.7900988382437 - ], - "YANTALO, MOYOBAMBA, SAN MARTIN": [ - -77.0663736029116, - -5.96378246679547 - ], - "YARABAMBA, AREQUIPA, AREQUIPA": [ - -71.5498751682359, - -16.6135208735939 - ], - "YARUMAYO, HUANUCO, HUANUCO": [ - -76.4401674467641, - -9.95583057475085 - ], - "YARUSYACAN, PASCO, PASCO": [ - -76.2283152055011, - -10.5527120079462 - ], - "YAUCA, CARAVELI, AREQUIPA": [ - -74.4287684994597, - -15.6335217507479 - ], - "YAULI, HUANCAVELICA, HUANCAVELICA": [ - -74.8290157598146, - -12.8171787406422 - ], - "YAULI, JAUJA, JUNIN": [ - -75.4713470478995, - -11.6788490158586 - ], - "YAULI, YAULI, JUNIN": [ - -76.0981386410109, - -11.7096217376318 - ], - "YAURI, ESPINAR, CUSCO": [ - -71.3528665028169, - -14.9253851303188 - ], - "YAURISQUE, PARURO, CUSCO": [ - -71.9125913308376, - -13.6509183364595 - ], - "YAUTAN, CASMA, ANCASH": [ - -78.0203052648499, - -9.50589847612807 - ], - "YAUYA, CARLOS FERMIN FITZCARRALD, ANCASH": [ - -77.2564348937017, - -9.00766565069422 - ], - "YAUYOS, JAUJA, JUNIN": [ - -75.5142763850386, - -11.7958382820028 - ], - "YAUYOS, YAUYOS, LIMA": [ - -75.9551069865516, - -12.4725743145463 - ], - "YAUYUCAN, SANTA CRUZ, CAJAMARCA": [ - -78.8493112845247, - -6.68287505433639 - ], - "YOMBLON, LUYA, AMAZONAS": [ - -78.0862589745845, - -6.47473052273269 - ], - "YORONGOS, RIOJA, SAN MARTIN": [ - -77.161718583265, - -6.17529921512651 - ], - "YUCAY, URUBAMBA, CUSCO": [ - -72.0732270737177, - -13.2942402087115 - ], - "YUNGA, GENERAL SANCHEZ CERRO, MOQUEGUA": [ - -70.6600162926972, - -16.2276082342951 - ], - "YUNGAR, CARHUAZ, ANCASH": [ - -77.6309279606652, - -9.40408339503545 - ], - "YUNGAY, YUNGAY, ANCASH": [ - -77.6664013711902, - -9.09348638359855 - ], - "YUNGUYO, YUNGUYO, PUNO": [ - -69.0901932213325, - -16.2828061677694 - ], - "YUPAN, CORONGO, ANCASH": [ - -77.9700953318261, - -8.6414906524169 - ], - "YURA, AREQUIPA, AREQUIPA": [ - -71.6063382805897, - -16.1309440272686 - ], - "YURACMARCA, HUAYLAS, ANCASH": [ - -77.7411666964647, - -8.76193314137339 - ], - "YURACYACU, RIOJA, SAN MARTIN": [ - -77.2327670859691, - -5.93538675705549 - ], - "YURIMAGUAS, ALTO AMAZONAS, LORETO": [ - -76.1615819593371, - -5.84587992921817 - ], - "YUYAPICHIS, PUERTO INCA, HUANUCO": [ - -74.9984928570259, - -9.64735320500752 - ], - "ZAPATERO, LAMAS, SAN MARTIN": [ - -76.5306397287311, - -6.55014788298995 - ], - "ZARUMILLA, ZARUMILLA, TUMBES": [ - -80.3013900855648, - -3.46440141060353 - ], - "ZEPITA, CHUCUITO, PUNO": [ - -69.1778473569732, - -16.4945394703273 - ], - "ZORRITOS, CONTRALMIRANTE VILLAR, TUMBES": [ - -80.7043381462799, - -3.81644515410758 - ], - "ZURITE, ANTA, CUSCO": [ - -72.2466196785754, - -13.465722637907 - ], - "ZU\u00d1IGA, CA\u00d1ETE, LIMA": [ - -76.0140631026387, - -12.8298663421598 - ], - "nan, SATIPO, JUNIN": [ - -74.3194531297738, - -11.6797432310785 - ], - "\u00d1AHUIMPUQUIO, TAYACAJA, HUANCAVELICA": [ - -75.091105375023, - -12.3291868694971 - ] - }, - "place_coords_dict": { - "ABANCAY, ABANCAY, APURIMAC": [ - -72.8716116233402, - -13.6358415130218 - ], - "ABELARDO PARDO LEZAMETA, BOLOGNESI, ANCASH": [ - -77.1597586944519, - -10.3099487076956 - ], - "ACARI, CARAVELI, AREQUIPA": [ - -74.5582426042272, - -15.3416727972364 - ], - "ACAS, OCROS, ANCASH": [ - -77.3394544625876, - -10.5182987311482 - ], - "ACCHA, PARURO, CUSCO": [ - -71.8626394672192, - -13.9885106516486 - ], - "ACCOMARCA, VILCAS HUAMAN, AYACUCHO": [ - -73.8674019875557, - -13.8062372642835 - ], - "ACHAYA, AZANGARO, PUNO": [ - -70.1777000216524, - -15.240697297148 - ], - "ACHOMA, CAYLLOMA, AREQUIPA": [ - -71.6958456419628, - -15.8221400046491 - ], - "ACO, CONCEPCION, JUNIN": [ - -75.3970799999209, - -11.9553363367792 - ], - "ACO, CORONGO, ANCASH": [ - -77.8834851319363, - -8.50803027348624 - ], - "ACOBAMBA, ACOBAMBA, HUANCAVELICA": [ - -74.5663960124243, - -12.8233134643166 - ], - "ACOBAMBA, SIHUAS, ANCASH": [ - -77.560736533207, - -8.30019592739892 - ], - "ACOBAMBA, TARMA, JUNIN": [ - -75.6568304668378, - -11.3491346944261 - ], - "ACOBAMBILLA, HUANCAVELICA, HUANCAVELICA": [ - -75.3712732321472, - -12.7040921473773 - ], - "ACOCHACA, ASUNCION, ANCASH": [ - -77.4057481205272, - -9.09720867169475 - ], - "ACOCRO, HUAMANGA, AYACUCHO": [ - -74.0209562966421, - -13.3042984943808 - ], - "ACOLLA, JAUJA, JUNIN": [ - -75.5675652983633, - -11.6626625342866 - ], - "ACOMAYO, ACOMAYO, CUSCO": [ - -71.6724776075014, - -13.8931515380544 - ], - "ACOPAMPA, CARHUAZ, ANCASH": [ - -77.6100103595032, - -9.29003462978671 - ], - "ACOPIA, ACOMAYO, CUSCO": [ - -71.5064659910482, - -14.047070703867 - ], - "ACORA, PUNO, PUNO": [ - -69.9093845433234, - -16.2887543666248 - ], - "ACORIA, HUANCAVELICA, HUANCAVELICA": [ - -74.8235282305523, - -12.5995765559794 - ], - "ACOS VINCHOS, HUAMANGA, AYACUCHO": [ - -74.0556089233433, - -13.1279423878572 - ], - "ACOS, ACOMAYO, CUSCO": [ - -71.7302516176163, - -13.9392922394672 - ], - "ACOSTAMBO, TAYACAJA, HUANCAVELICA": [ - -75.0117600766547, - -12.4126819821413 - ], - "ACRAQUIA, TAYACAJA, HUANCAVELICA": [ - -74.9392688312603, - -12.3963805447133 - ], - "ACZO, ANTONIO RAYMONDI, ANCASH": [ - -76.9983325300693, - -9.22002148587248 - ], - "AGALLPAMPA, OTUZCO, LA LIBERTAD": [ - -78.4640042298, - -7.94554981517569 - ], - "AGUA BLANCA, EL DORADO, SAN MARTIN": [ - -76.7056971970064, - -6.72414337270179 - ], - "AGUAS VERDES, ZARUMILLA, TUMBES": [ - -80.242445617991, - -3.49151627088843 - ], - "AHUAC, CHUPACA, JUNIN": [ - -75.3515546083106, - -12.0819994248809 - ], - "AHUAYCHA, TAYACAJA, HUANCAVELICA": [ - -74.906166747806, - -12.4441733384983 - ], - "AIJA, AIJA, ANCASH": [ - -77.5676294614706, - -9.80042157002845 - ], - "AJOYANI, CARABAYA, PUNO": [ - -70.2268920335216, - -14.1740360843438 - ], - "ALBERTO LEVEAU, SAN MARTIN, SAN MARTIN": [ - -76.2601213298308, - -6.68366694525728 - ], - "ALCA, LA UNION, AREQUIPA": [ - -72.7118703369673, - -15.1674820301897 - ], - "ALCAMENCA, VICTOR FAJARDO, AYACUCHO": [ - -74.2104510250195, - -13.6655360408103 - ], - "ALEXANDER VON HUMBOLDT, PADRE ABAD, UCAYALI": [ - -75.0480213639949, - -8.82492774714689 - ], - "ALFONSO UGARTE, SIHUAS, ANCASH": [ - -77.4435212234193, - -8.46775384212263 - ], - "ALIS, YAUYOS, LIMA": [ - -75.7039648540287, - -12.2887825722961 - ], - "ALLAUCA, YAUYOS, LIMA": [ - -76.0383592683498, - -12.6400704940543 - ], - "ALONSO DE ALVARADO, LAMAS, SAN MARTIN": [ - -76.7729541416229, - -6.31131767991961 - ], - "ALTO BIAVO, BELLAVISTA, SAN MARTIN": [ - -76.2741149135452, - -7.82214808985679 - ], - "ALTO DE LA ALIANZA, TACNA, TACNA": [ - -70.2788960988511, - -17.8333562119029 - ], - "ALTO INAMBARI, SANDIA, PUNO": [ - -69.3344186586459, - -14.0319795462513 - ], - "ALTO LARAN, CHINCHA, ICA": [ - -75.9388182251244, - -13.3821559926028 - ], - "ALTO NANAY, MAYNAS, LORETO": [ - -74.285520529343, - -3.36163918314611 - ], - "ALTO PICHIGUA, ESPINAR, CUSCO": [ - -71.222670942571, - -14.7379441150145 - ], - "ALTO SAPOSOA, HUALLAGA, SAN MARTIN": [ - -76.9631153089317, - -6.60186149964165 - ], - "ALTO SELVA ALEGRE, AREQUIPA, AREQUIPA": [ - -71.4858571369911, - -16.33096182569 - ], - "ALTO TAPICHE, REQUENA, LORETO": [ - -74.1894361886538, - -6.81833930452344 - ], - "AMANTANI, PUNO, PUNO": [ - -69.7106659655394, - -15.6645415266568 - ], - "AMARILIS, HUANUCO, HUANUCO": [ - -76.1882204681551, - -9.95023143355452 - ], - "AMASHCA, CARHUAZ, ANCASH": [ - -77.6448836859484, - -9.22352629340624 - ], - "AMBAR, HUAURA, LIMA": [ - -77.2677511820886, - -10.7823049380876 - ], - "AMBO, AMBO, HUANUCO": [ - -76.1411772790817, - -10.1501386374297 - ], - "AMOTAPE, PAITA, PIURA": [ - -81.0067650422148, - -4.8355349636955 - ], - "ANANEA, SAN ANTONIO DE PUTINA, PUNO": [ - -69.5049882063517, - -14.6924837966793 - ], - "ANAPIA, YUNGUYO, PUNO": [ - -68.8788268375351, - -16.3253835042672 - ], - "ANCAHUASI, ANTA, CUSCO": [ - -72.3222295790569, - -13.4616252908857 - ], - "ANCHIHUAY, LA MAR, AYACUCHO": [ - -73.7127242786983, - -12.9564943811039 - ], - "ANCHONGA, ANGARAES, HUANCAVELICA": [ - -74.7060384708175, - -12.8873240700046 - ], - "ANCO, CHURCAMPA, HUANCAVELICA": [ - -74.563053719002, - -12.6435333472702 - ], - "ANCO, LA MAR, AYACUCHO": [ - -73.6433486605367, - -13.0647121238044 - ], - "ANCON, LIMA, LIMA": [ - -77.0958073070431, - -11.7025343029234 - ], - "ANCO_HUALLO, CHINCHEROS, APURIMAC": [ - -73.6692713137571, - -13.544299516039 - ], - "ANDABAMBA, ACOBAMBA, HUANCAVELICA": [ - -74.6549284327827, - -12.6611871850892 - ], - "ANDABAMBA, SANTA CRUZ, CAJAMARCA": [ - -78.8095483610502, - -6.66399333110645 - ], - "ANDAGUA, CASTILLA, AREQUIPA": [ - -72.376817619411, - -15.4850465121236 - ], - "ANDAHUAYLAS, ANDAHUAYLAS, APURIMAC": [ - -73.3879719328062, - -13.7682169211928 - ], - "ANDAHUAYLILLAS, QUISPICANCHI, CUSCO": [ - -71.7003239695908, - -13.6657694234993 - ], - "ANDAJES, OYON, LIMA": [ - -76.9271502108519, - -10.7776031757941 - ], - "ANDAMARCA, CONCEPCION, JUNIN": [ - -74.8571869475326, - -11.696353573419 - ], - "ANDARAPA, ANDAHUAYLAS, APURIMAC": [ - -73.3885793315134, - -13.4974434507192 - ], - "ANDARAY, CONDESUYOS, AREQUIPA": [ - -72.8438585246931, - -15.8525163763654 - ], - "ANDAYMARCA, TAYACAJA, HUANCAVELICA": [ - -74.6327374860066, - -12.2985421832864 - ], - "ANDOAS, DATEM DEL MARA\u00d1ON, LORETO": [ - -76.6724137783051, - -3.27440540400455 - ], - "ANDRES AVELINO CACERES D., HUAMANGA, AYACUCHO": [ - -74.20020433, - -13.15460081 - ], - "ANDRES AVELINO CACERES DORREGARAY, HUAMANGA, AYACUCHO": [ - -74.2002043296657, - -13.1546008135357 - ], - "ANGASMARCA, SANTIAGO DE CHUCO, LA LIBERTAD": [ - -78.0330414634898, - -8.14783730000842 - ], - "ANGUIA, CHOTA, CAJAMARCA": [ - -78.5751986963862, - -6.33807917997495 - ], - "ANRA, HUARI, ANCASH": [ - -76.9044566271285, - -9.25252807898609 - ], - "ANTA, ACOBAMBA, HUANCAVELICA": [ - -74.6638481693528, - -12.8172812734049 - ], - "ANTA, ANTA, CUSCO": [ - -72.1599768937721, - -13.4879086614161 - ], - "ANTA, CARHUAZ, ANCASH": [ - -77.6324228738074, - -9.36102152220949 - ], - "ANTABAMBA, ANTABAMBA, APURIMAC": [ - -72.7501192820734, - -14.5179968764682 - ], - "ANTAUTA, MELGAR, PUNO": [ - -70.3841406206513, - -14.3546463857476 - ], - "ANTIOQUIA, HUAROCHIRI, LIMA": [ - -76.5890933941509, - -12.0615464050898 - ], - "ANTONIO RAYMONDI, BOLOGNESI, ANCASH": [ - -77.4998680055525, - -10.2032435834808 - ], - "APARICIO POMARES, YAROWILCA, HUANUCO": [ - -76.5768712821809, - -9.71624219187614 - ], - "APATA, JAUJA, JUNIN": [ - -75.2725231386646, - -11.6806677981864 - ], - "APLAO, CASTILLA, AREQUIPA": [ - -72.5682007880104, - -16.0272469434307 - ], - "APONGO, VICTOR FAJARDO, AYACUCHO": [ - -74.006856532142, - -14.0649574044449 - ], - "AQUIA, BOLOGNESI, ANCASH": [ - -77.1309657217238, - -9.96578613478178 - ], - "ARAHUAY, CANTA, LIMA": [ - -76.6751058947839, - -11.640712746722 - ], - "ARAMANGO, BAGUA, AMAZONAS": [ - -78.4483373488544, - -5.38043211432585 - ], - "ARANCAY, HUAMALIES, HUANUCO": [ - -76.7331496024112, - -9.137472061268 - ], - "ARAPA, AZANGARO, PUNO": [ - -70.0846096386864, - -15.0900440038403 - ], - "ARENAL, PAITA, PIURA": [ - -81.0300369214841, - -4.89957308010288 - ], - "AREQUIPA, AREQUIPA, AREQUIPA": [ - -71.5384595874357, - -16.4066582473659 - ], - "ARMA, CASTROVIRREYNA, HUANCAVELICA": [ - -75.5111486866253, - -13.110484915431 - ], - "ASCENSION, HUANCAVELICA, HUANCAVELICA": [ - -75.1866179731032, - -12.8284340763289 - ], - "ASCOPE, ASCOPE, LA LIBERTAD": [ - -79.0820845058183, - -7.66089959451423 - ], - "ASIA, CA\u00d1ETE, LIMA": [ - -76.5112380793467, - -12.7967282894497 - ], - "ASILLO, AZANGARO, PUNO": [ - -70.35381907297, - -14.7408055834437 - ], - "ASQUIPATA, VICTOR FAJARDO, AYACUCHO": [ - -73.9378099843248, - -14.0758172295536 - ], - "ASUNCION, CAJAMARCA, CAJAMARCA": [ - -78.5271832843612, - -7.33823542571275 - ], - "ASUNCION, CHACHAPOYAS, AMAZONAS": [ - -77.7432008885819, - -5.99613485445976 - ], - "ATAQUERO, CARHUAZ, ANCASH": [ - -77.7292991377802, - -9.2901935145351 - ], - "ATAURA, JAUJA, JUNIN": [ - -75.4471376351895, - -11.7953861720664 - ], - "ATAVILLOS ALTO, HUARAL, LIMA": [ - -76.5951706871761, - -11.2774969032788 - ], - "ATAVILLOS BAJO, HUARAL, LIMA": [ - -76.7610537146638, - -11.3464536275731 - ], - "ATE, LIMA, LIMA": [ - -76.8774801973828, - -12.032570611012 - ], - "ATICO, CARAVELI, AREQUIPA": [ - -73.5382713001717, - -16.0530366620608 - ], - "ATIQUIPA, CARAVELI, AREQUIPA": [ - -74.3036795716858, - -15.6892006410673 - ], - "ATUNCOLLA, PUNO, PUNO": [ - -70.1570529254666, - -15.6784572581415 - ], - "AUCALLAMA, HUARAL, LIMA": [ - -77.0498649795368, - -11.5176653247602 - ], - "AUCARA, LUCANAS, AYACUCHO": [ - -74.1539496043417, - -14.1944627449291 - ], - "AURAHUA, CASTROVIRREYNA, HUANCAVELICA": [ - -75.4427950886895, - -12.9566716386231 - ], - "AWAJUN, RIOJA, SAN MARTIN": [ - -77.4365073108882, - -5.85918841408146 - ], - "AYABACA, AYABACA, PIURA": [ - -79.6076829284005, - -4.68275461240726 - ], - "AYACUCHO, HUAMANGA, AYACUCHO": [ - -74.251978088752, - -13.1347558322497 - ], - "AYAHUANCO, HUANTA, AYACUCHO": [ - -74.3053940098996, - -12.531530515879 - ], - "AYAPATA, CARABAYA, PUNO": [ - -70.2435379349845, - -13.5010843298321 - ], - "AYAVI, HUAYTARA, HUANCAVELICA": [ - -75.3682601951885, - -13.7145851047812 - ], - "AYAVIRI, MELGAR, PUNO": [ - -70.6057581442103, - -14.9315548582185 - ], - "AYAVIRI, YAUYOS, LIMA": [ - -76.0422951589328, - -12.3654601640701 - ], - "AYNA, LA MAR, AYACUCHO": [ - -73.8909050685243, - -12.7284768625236 - ], - "AYO, CASTILLA, AREQUIPA": [ - -72.285088916581, - -15.6409571727894 - ], - "AZANGARO, AZANGARO, PUNO": [ - -70.1492220425376, - -14.8809574748844 - ], - "AZANGARO, YAUYOS, LIMA": [ - -75.8255631815951, - -13.0090798911933 - ], - "BAGUA GRANDE, UTCUBAMBA, AMAZONAS": [ - -78.4399998981214, - -5.8388418149819 - ], - "BAGUA, BAGUA, AMAZONAS": [ - -78.5209826944256, - -5.58091287465729 - ], - "BAJO BIAVO, BELLAVISTA, SAN MARTIN": [ - -76.3413601414628, - -7.18416140522712 - ], - "BALSAPUERTO, ALTO AMAZONAS, LORETO": [ - -76.5866803770818, - -5.73771006247065 - ], - "BALSAS, CHACHAPOYAS, AMAZONAS": [ - -77.9494215421574, - -6.80783943835509 - ], - "BAMBAMARCA, BOLIVAR, LA LIBERTAD": [ - -77.6883398414389, - -7.46463610094446 - ], - "BAMBAMARCA, HUALGAYOC, CAJAMARCA": [ - -78.4795120755161, - -6.69309602877751 - ], - "BAMBAS, CORONGO, ANCASH": [ - -78.0468559349284, - -8.60481104918683 - ], - "BARRANCA, BARRANCA, LIMA": [ - -77.6826923458819, - -10.7149260203657 - ], - "BARRANCA, DATEM DEL MARA\u00d1ON, LORETO": [ - -77.1108142476695, - -5.0211158177482 - ], - "BARRANCO, LIMA, LIMA": [ - -77.0208625216697, - -12.1440295171995 - ], - "BARRANQUITA, LAMAS, SAN MARTIN": [ - -76.0487066463129, - -6.30627300643987 - ], - "BA\u00d1OS, LAURICOCHA, HUANUCO": [ - -76.7838628922737, - -10.1073679469059 - ], - "BELEN, MAYNAS, LORETO": [ - -73.2119985583267, - -3.81156402042639 - ], - "BELEN, SUCRE, AYACUCHO": [ - -73.767257920992, - -13.8043146282798 - ], - "BELLA UNION, CARAVELI, AREQUIPA": [ - -74.7615764194503, - -15.3754119835032 - ], - "BELLAVISTA DE LA UNION, SECHURA, PIURA": [ - -80.7428964265902, - -5.42651668767646 - ], - "BELLAVISTA, BELLAVISTA, SAN MARTIN": [ - -76.6006118397694, - -6.99102691703072 - ], - "BELLAVISTA, CALLAO, CALLAO": [ - -77.1099033268696, - -12.0600062849559 - ], - "BELLAVISTA, JAEN, CAJAMARCA": [ - -78.7426463601639, - -5.56458733715936 - ], - "BELLAVISTA, SULLANA, PIURA": [ - -80.6749040482833, - -4.89080080182046 - ], - "BERNAL, SECHURA, PIURA": [ - -80.7020022911086, - -5.4577524803448 - ], - "BOLIVAR, BOLIVAR, LA LIBERTAD": [ - -77.7339034553527, - -7.26459772266379 - ], - "BOLIVAR, SAN MIGUEL, CAJAMARCA": [ - -79.1624871058557, - -6.97591143586301 - ], - "BOLOGNESI, PALLASCA, ANCASH": [ - -78.0699629501881, - -8.34272648350281 - ], - "BRE\u00d1A, LIMA, LIMA": [ - -77.050592430808, - -12.0591639133589 - ], - "BUENA VISTA ALTA, CASMA, ANCASH": [ - -78.1427106810178, - -9.37298777033197 - ], - "BUENOS AIRES, MORROPON, PIURA": [ - -79.9250472706554, - -5.26448517295085 - ], - "BUENOS AIRES, PICOTA, SAN MARTIN": [ - -76.3970297862686, - -6.73971460261252 - ], - "BULDIBUYO, PATAZ, LA LIBERTAD": [ - -77.3827568426383, - -8.12441918007943 - ], - "CABANA, LUCANAS, AYACUCHO": [ - -74.0775043266508, - -14.3621379017731 - ], - "CABANA, PALLASCA, ANCASH": [ - -77.9593183505109, - -8.40387557874182 - ], - "CABANA, SAN ROMAN, PUNO": [ - -70.2798290611778, - -15.6428809847668 - ], - "CABANACONDE, CAYLLOMA, AREQUIPA": [ - -71.9594173738653, - -15.6746419428287 - ], - "CABANILLA, LAMPA, PUNO": [ - -70.3900899762315, - -15.569375991145 - ], - "CABANILLAS, SAN ROMAN, PUNO": [ - -70.6224573602141, - -15.853368489896 - ], - "CACATACHI, SAN MARTIN, SAN MARTIN": [ - -76.4384114546016, - -6.46781171176781 - ], - "CACERES DEL PERU, SANTA, ANCASH": [ - -78.076414817062, - -8.96100155209023 - ], - "CACHACHI, CAJABAMBA, CAJAMARCA": [ - -78.2533288091185, - -7.56770062426083 - ], - "CACHICADAN, SANTIAGO DE CHUCO, LA LIBERTAD": [ - -78.0643557336426, - -8.0172816910563 - ], - "CACHIMAYO, ANTA, CUSCO": [ - -72.0553872594671, - -13.4635010523233 - ], - "CACRA, YAUYOS, LIMA": [ - -75.7479685102651, - -12.7662258669316 - ], - "CAHUAC, YAROWILCA, HUANUCO": [ - -76.6493228341416, - -9.86463169667706 - ], - "CAHUACHO, CARAVELI, AREQUIPA": [ - -73.431758118851, - -15.5406474580859 - ], - "CAHUAPANAS, DATEM DEL MARA\u00d1ON, LORETO": [ - -76.8557284937114, - -5.24009776983291 - ], - "CAICAY, PAUCARTAMBO, CUSCO": [ - -71.6764519561073, - -13.5643060348803 - ], - "CAIRANI, CANDARAVE, TACNA": [ - -70.3408234064557, - -17.1878290824297 - ], - "CAJA, ACOBAMBA, HUANCAVELICA": [ - -74.4734204392933, - -12.8728793369793 - ], - "CAJABAMBA, CAJABAMBA, CAJAMARCA": [ - -78.0321481124752, - -7.6314507349105 - ], - "CAJACAY, BOLOGNESI, ANCASH": [ - -77.342480706522, - -10.1904465919637 - ], - "CAJAMARCA, CAJAMARCA, CAJAMARCA": [ - -78.5610881230837, - -7.07751246953789 - ], - "CAJAMARQUILLA, OCROS, ANCASH": [ - -77.2400396984947, - -10.3209133329033 - ], - "CAJARURO, UTCUBAMBA, AMAZONAS": [ - -78.1747783383787, - -5.61429849632456 - ], - "CAJATAMBO, CAJATAMBO, LIMA": [ - -76.9438396837041, - -10.455139913038 - ], - "CAJAY, HUARI, ANCASH": [ - -77.1314097335223, - -9.25703065066834 - ], - "CALAMARCA, JULCAN, LA LIBERTAD": [ - -78.3807798724692, - -8.12034230224005 - ], - "CALANA, TACNA, TACNA": [ - -70.1462231445025, - -17.9542172033629 - ], - "CALANGO, CA\u00d1ETE, LIMA": [ - -76.4546171322687, - -12.4870660247686 - ], - "CALAPUJA, LAMPA, PUNO": [ - -70.236469357446, - -15.3110585604739 - ], - "CALCA, CALCA, CUSCO": [ - -71.9577770486071, - -13.2687223142149 - ], - "CALETA DE CARQUIN, HUAURA, LIMA": [ - -77.6200247395693, - -11.0879788825077 - ], - "CALLAHUANCA, HUAROCHIRI, LIMA": [ - -76.5752045801539, - -11.8137053284318 - ], - "CALLALLI, CAYLLOMA, AREQUIPA": [ - -71.24853477838, - -15.5211500600524 - ], - "CALLANMARCA, ANGARAES, HUANCAVELICA": [ - -74.6245407188146, - -12.8785735283243 - ], - "CALLAO, CALLAO, CALLAO": [ - -77.1211330017318, - -12.0167524628215 - ], - "CALLAYUC, CUTERVO, CAJAMARCA": [ - -78.9310334994841, - -6.12738088268682 - ], - "CALLERIA, CORONEL PORTILLO, UCAYALI": [ - -74.1601934572243, - -7.96505459685538 - ], - "CALQUIS, SAN MIGUEL, CAJAMARCA": [ - -78.953088293593, - -6.91374894684525 - ], - "CALZADA, MOYOBAMBA, SAN MARTIN": [ - -77.0957553952807, - -6.01453946633221 - ], - "CAMANA, CAMANA, AREQUIPA": [ - -72.7128812179551, - -16.6309120718077 - ], - "CAMANTI, QUISPICANCHI, CUSCO": [ - -70.7489194816845, - -13.342313553995 - ], - "CAMILACA, CANDARAVE, TACNA": [ - -70.4327437032204, - -17.1650684964339 - ], - "CAMINACA, AZANGARO, PUNO": [ - -70.0943279163374, - -15.30282510695 - ], - "CAMPANILLA, MARISCAL CACERES, SAN MARTIN": [ - -76.8091613211374, - -7.6520486796585 - ], - "CAMPORREDONDO, LUYA, AMAZONAS": [ - -78.3344759051519, - -6.17779919238366 - ], - "CAMPOVERDE, CORONEL PORTILLO, UCAYALI": [ - -74.845516823545, - -8.52057547007321 - ], - "CANARIA, VICTOR FAJARDO, AYACUCHO": [ - -73.9945562806845, - -13.9615495588555 - ], - "CANAYRE, HUANTA, AYACUCHO": [ - -74.1021148071968, - -12.3406200404007 - ], - "CANCHABAMBA, HUACAYBAMBA, HUANUCO": [ - -77.1077537535022, - -8.84742209441864 - ], - "CANCHAQUE, HUANCABAMBA, PIURA": [ - -79.6258326376722, - -5.31206763803808 - ], - "CANCHAYLLO, JAUJA, JUNIN": [ - -75.8000061397634, - -11.9149666039658 - ], - "CANDARAVE, CANDARAVE, TACNA": [ - -70.2478566120181, - -17.0419322309195 - ], - "CANGALLO, CANGALLO, AYACUCHO": [ - -74.1100725868451, - -13.59973533993 - ], - "CANIS, BOLOGNESI, ANCASH": [ - -77.1909790633666, - -10.3344552026342 - ], - "CANOAS DE PUNTA SAL, CONTRALMIRANTE VILLAR, TUMBES": [ - -80.8903609555939, - -4.04094123617315 - ], - "CANTA, CANTA, LIMA": [ - -76.5822969457275, - -11.4753061524043 - ], - "CAPACHICA, PUNO, PUNO": [ - -69.8244737188459, - -15.6404258384226 - ], - "CAPACMARCA, CHUMBIVILCAS, CUSCO": [ - -71.9934867181348, - -14.0438332122428 - ], - "CAPAYA, AYMARAES, APURIMAC": [ - -73.353854952599, - -14.1155992763516 - ], - "CAPAZO, EL COLLAO, PUNO": [ - -69.7020167717451, - -17.1098494944924 - ], - "CAPELO, REQUENA, LORETO": [ - -74.1269200106895, - -5.36637332324868 - ], - "CAPILLAS, CASTROVIRREYNA, HUANCAVELICA": [ - -75.6110525541878, - -13.3424529741639 - ], - "CARABAMBA, JULCAN, LA LIBERTAD": [ - -78.5820151494512, - -8.1465773052052 - ], - "CARABAYLLO, LIMA, LIMA": [ - -76.9729270845038, - -11.8073838464182 - ], - "CARACOTO, SAN ROMAN, PUNO": [ - -70.0879018303573, - -15.5574659577251 - ], - "CARAMPOMA, HUAROCHIRI, LIMA": [ - -76.3830419966992, - -11.6397021991101 - ], - "CARANIA, YAUYOS, LIMA": [ - -75.8816402968919, - -12.3558656479666 - ], - "CARAPO, HUANCA SANCOS, AYACUCHO": [ - -74.3034382012863, - -13.8120595924894 - ], - "CARAVELI, CARAVELI, AREQUIPA": [ - -73.3318178520816, - -15.8291785754744 - ], - "CARAYBAMBA, AYMARAES, APURIMAC": [ - -73.0945036109956, - -14.4193682069698 - ], - "CARAZ, HUAYLAS, ANCASH": [ - -77.7497708330429, - -9.0225172663955 - ], - "CARHUACALLANGA, HUANCAYO, JUNIN": [ - -75.2025810764228, - -12.3554296753622 - ], - "CARHUAMAYO, JUNIN, JUNIN": [ - -76.0209880336546, - -10.9139335532403 - ], - "CARHUANCA, VILCAS HUAMAN, AYACUCHO": [ - -73.7820672130959, - -13.7394386455665 - ], - "CARHUAPAMPA, OCROS, ANCASH": [ - -77.2248286784743, - -10.5034719628979 - ], - "CARHUAZ, CARHUAZ, ANCASH": [ - -77.6396359755176, - -9.29359697306236 - ], - "CARMEN ALTO, HUAMANGA, AYACUCHO": [ - -74.2349683309207, - -13.2045249446694 - ], - "CARMEN DE LA LEGUA REYNOSO, CALLAO, CALLAO": [ - -77.0904177079874, - -12.042884628664 - ], - "CARMEN SALCEDO, LUCANAS, AYACUCHO": [ - -73.98178561636, - -14.4658193089554 - ], - "CARUMAS, MARISCAL NIETO, MOQUEGUA": [ - -70.3714119533903, - -16.728430234359 - ], - "CASA GRANDE, ASCOPE, LA LIBERTAD": [ - -79.1949415022906, - -7.57668519003391 - ], - "CASCA, MARISCAL LUZURIAGA, ANCASH": [ - -77.3876640920165, - -8.82313871603465 - ], - "CASCAPARA, YUNGAY, ANCASH": [ - -77.8327104527901, - -9.31612413703025 - ], - "CASCAS, GRAN CHIMU, LA LIBERTAD": [ - -78.7639642739784, - -7.50151069298087 - ], - "CASHAPAMPA, SIHUAS, ANCASH": [ - -77.6532051901592, - -8.5878110929031 - ], - "CASITAS, CONTRALMIRANTE VILLAR, TUMBES": [ - -80.6592750752784, - -4.03383471230043 - ], - "CASMA, CASMA, ANCASH": [ - -78.2231984391643, - -9.51815087920089 - ], - "CASPISAPA, PICOTA, SAN MARTIN": [ - -76.4220117961079, - -6.92050640807534 - ], - "CASTILLA, PIURA, PIURA": [ - -80.5151818242225, - -5.13095183262086 - ], - "CASTILLO GRANDE, LEONCIO PRADO, HUANUCO": [ - -76.0379769094941, - -9.20807808979561 - ], - "CASTROVIRREYNA, CASTROVIRREYNA, HUANCAVELICA": [ - -75.2913802574621, - -13.153666359797 - ], - "CATAC, RECUAY, ANCASH": [ - -77.3170575974514, - -9.91121253958595 - ], - "CATACAOS, PIURA, PIURA": [ - -80.3651285521636, - -5.47050947479848 - ], - "CATACHE, SANTA CRUZ, CAJAMARCA": [ - -79.0768825187274, - -6.7493472233318 - ], - "CATAHUASI, YAUYOS, LIMA": [ - -75.8820021218917, - -12.7427843266223 - ], - "CATILLUC, SAN MIGUEL, CAJAMARCA": [ - -78.7338414464924, - -6.80427830914586 - ], - "CAUJUL, OYON, LIMA": [ - -76.9866870761381, - -10.7564009696703 - ], - "CAYALTI, CHICLAYO, LAMBAYEQUE": [ - -79.5066821601742, - -6.88870086412949 - ], - "CAYARA, VICTOR FAJARDO, AYACUCHO": [ - -73.9886787367262, - -13.7928459968113 - ], - "CAYARANI, CONDESUYOS, AREQUIPA": [ - -72.2891387355625, - -15.0147131388838 - ], - "CAYLLOMA, CAYLLOMA, AREQUIPA": [ - -71.7966184476263, - -15.1516885534415 - ], - "CAYMA, AREQUIPA, AREQUIPA": [ - -71.4569615386198, - -16.25268575418 - ], - "CAYNA, AMBO, HUANUCO": [ - -76.3706024743277, - -10.2152122279029 - ], - "CAYNARACHI, LAMAS, SAN MARTIN": [ - -76.3342373771502, - -6.19532658426333 - ], - "CA\u00d1ARIS, FERRE\u00d1AFE, LAMBAYEQUE": [ - -79.3046889268117, - -6.06021533872913 - ], - "CCAPI, PARURO, CUSCO": [ - -72.0194253699714, - -13.8606810105031 - ], - "CCARHUAYO, QUISPICANCHI, CUSCO": [ - -71.3440122428196, - -13.5369810013137 - ], - "CCATCA, QUISPICANCHI, CUSCO": [ - -71.50577025841, - -13.6003880986264 - ], - "CCOCHACCASA, ANGARAES, HUANCAVELICA": [ - -74.8051840148668, - -12.9350573436591 - ], - "CCORCA, CUSCO, CUSCO": [ - -72.0871066052166, - -13.5895650008273 - ], - "CELENDIN, CELENDIN, CAJAMARCA": [ - -78.1176113963708, - -6.77519803381067 - ], - "CERRO AZUL, CA\u00d1ETE, LIMA": [ - -76.4647783204431, - -12.9659892155165 - ], - "CERRO COLORADO, AREQUIPA, AREQUIPA": [ - -71.5765993129701, - -16.3044653071168 - ], - "CHACA, HUANTA, AYACUCHO": [ - -74.1915467902051, - -12.7835580583156 - ], - "CHACABAMBA, YAROWILCA, HUANUCO": [ - -76.6321369861679, - -9.90056872358094 - ], - "CHACAPALPA, YAULI, JUNIN": [ - -75.8212406972738, - -11.7246231829912 - ], - "CHACAPAMPA, HUANCAYO, JUNIN": [ - -75.2571328245283, - -12.4104203627029 - ], - "CHACAS, ASUNCION, ANCASH": [ - -77.397598324224, - -9.20558137048627 - ], - "CHACAYAN, DANIEL ALCIDES CARRION, PASCO": [ - -76.3925463792438, - -10.4795738944575 - ], - "CHACCHO, ANTONIO RAYMONDI, ANCASH": [ - -77.0720420298997, - -9.02773901521096 - ], - "CHACHAPOYAS, CHACHAPOYAS, AMAZONAS": [ - -77.8564917257644, - -6.24773573316975 - ], - "CHACHAS, CASTILLA, AREQUIPA": [ - -72.1161918991354, - -15.1821384947072 - ], - "CHACLACAYO, LIMA, LIMA": [ - -76.7669513497193, - -11.9916361158908 - ], - "CHACOCHE, ABANCAY, APURIMAC": [ - -72.9912885694406, - -13.9974272305512 - ], - "CHADIN, CHOTA, CAJAMARCA": [ - -78.4127942670906, - -6.43986876884304 - ], - "CHAGLLA, PACHITEA, HUANUCO": [ - -75.79753851925, - -9.73697141979583 - ], - "CHALA, CARAVELI, AREQUIPA": [ - -74.1897431829963, - -15.7695010007125 - ], - "CHALACO, MORROPON, PIURA": [ - -79.7928094655505, - -5.06634587812567 - ], - "CHALAMARCA, CHOTA, CAJAMARCA": [ - -78.4951407777507, - -6.51763624355207 - ], - "CHALCOS, SUCRE, AYACUCHO": [ - -73.7526066791788, - -13.8509550803906 - ], - "CHALHUANCA, AYMARAES, APURIMAC": [ - -73.2292836178048, - -14.2942553089155 - ], - "CHALLABAMBA, PAUCARTAMBO, CUSCO": [ - -71.7693107197923, - -13.1392818313489 - ], - "CHALLHUAHUACHO, COTABAMBAS, APURIMAC": [ - -72.3104130650274, - -14.1714371189327 - ], - "CHAMACA, CHUMBIVILCAS, CUSCO": [ - -71.8769132207192, - -14.3344207276266 - ], - "CHAMBARA, CONCEPCION, JUNIN": [ - -75.4364831609119, - -12.0056060980413 - ], - "CHANCAY, HUARAL, LIMA": [ - -77.2918726127934, - -11.5009753537626 - ], - "CHANCAY, SAN MARCOS, CAJAMARCA": [ - -78.1173080543069, - -7.40943882712661 - ], - "CHANCAYBA\u00d1OS, SANTA CRUZ, CAJAMARCA": [ - -78.877409850247, - -6.55598727194903 - ], - "CHANCHAMAYO, CHANCHAMAYO, JUNIN": [ - -75.3564273111599, - -11.032763801939 - ], - "CHANGUILLO, NASCA, ICA": [ - -75.334396794657, - -14.8016716802307 - ], - "CHANGUILLO, NAZCA, ICA": [ - -75.334396794657, - -14.8016716802307 - ], - "CHAO, VIRU, LA LIBERTAD": [ - -78.5064078498177, - -8.55989569590649 - ], - "CHAPARRA, CARAVELI, AREQUIPA": [ - -73.9451650156371, - -15.8248564215061 - ], - "CHAPIMARCA, AYMARAES, APURIMAC": [ - -73.0867762677187, - -14.0078088866977 - ], - "CHARACATO, AREQUIPA, AREQUIPA": [ - -71.3828615258431, - -16.4577422602022 - ], - "CHARAT, OTUZCO, LA LIBERTAD": [ - -78.4738226819714, - -7.8086661873186 - ], - "CHARCANA, LA UNION, AREQUIPA": [ - -73.0487835030819, - -15.2108697127443 - ], - "CHAUPIMARCA, PASCO, PASCO": [ - -76.2465887267404, - -10.7011694914734 - ], - "CHAVIN DE HUANTAR, HUARI, ANCASH": [ - -77.2117245983931, - -9.65543193693013 - ], - "CHAVIN DE PARIARCA, HUAMALIES, HUANUCO": [ - -76.7547060973049, - -9.43755795377609 - ], - "CHAVIN, CHINCHA, ICA": [ - -75.9426634309584, - -13.1202620412323 - ], - "CHAVINILLO, YAROWILCA, HUANUCO": [ - -76.5512878924768, - -9.80806947508392 - ], - "CHAVI\u00d1A, LUCANAS, AYACUCHO": [ - -73.883665677648, - -14.9827250510098 - ], - "CHAZUTA, SAN MARTIN, SAN MARTIN": [ - -75.9894181822517, - -6.61795845104842 - ], - "CHECACUPE, CANCHIS, CUSCO": [ - -71.0667868395658, - -14.0059389745645 - ], - "CHECCA, CANAS, CUSCO": [ - -71.4777304364404, - -14.4916049769779 - ], - "CHECRAS, HUAURA, LIMA": [ - -76.8554805732326, - -10.9216976726836 - ], - "CHEPEN, CHEPEN, LA LIBERTAD": [ - -79.3538439777794, - -7.22852678067268 - ], - "CHETILLA, CAJAMARCA, CAJAMARCA": [ - -78.6540285201032, - -7.14250490323991 - ], - "CHETO, CHACHAPOYAS, AMAZONAS": [ - -77.6771662977474, - -6.29796980786315 - ], - "CHIARA, ANDAHUAYLAS, APURIMAC": [ - -73.6155652263205, - -13.8798451348732 - ], - "CHIARA, HUAMANGA, AYACUCHO": [ - -74.1586260614594, - -13.3757478927841 - ], - "CHICAMA, ASCOPE, LA LIBERTAD": [ - -79.0082256879314, - -7.80498197967665 - ], - "CHICCHE, HUANCAYO, JUNIN": [ - -75.2933879365356, - -12.2907558174468 - ], - "CHICHAS, CONDESUYOS, AREQUIPA": [ - -72.9457116169387, - -15.5345032131505 - ], - "CHICLA, HUAROCHIRI, LIMA": [ - -76.2437979289636, - -11.6644988531773 - ], - "CHICLAYO, CHICLAYO, LAMBAYEQUE": [ - -79.8258745796224, - -6.78300812326378 - ], - "CHIGUATA, AREQUIPA, AREQUIPA": [ - -71.3586444996881, - -16.3755757259576 - ], - "CHIGUIRIP, CHOTA, CAJAMARCA": [ - -78.7080371064415, - -6.42508063731485 - ], - "CHILCA, CA\u00d1ETE, LIMA": [ - -76.6299398205862, - -12.4298097070367 - ], - "CHILCA, HUANCAYO, JUNIN": [ - -75.1831548155222, - -12.0790510496107 - ], - "CHILCAS, LA MAR, AYACUCHO": [ - -73.866039111048, - -13.1686099211042 - ], - "CHILCAYMARCA, CASTILLA, AREQUIPA": [ - -72.3852756226445, - -15.3506202521996 - ], - "CHILCAYOC, SUCRE, AYACUCHO": [ - -73.7217606118029, - -13.8912385922383 - ], - "CHILETE, CONTUMAZA, CAJAMARCA": [ - -78.8216660079901, - -7.25634404127422 - ], - "CHILIQUIN, CHACHAPOYAS, AMAZONAS": [ - -77.7558680688655, - -6.07820669347796 - ], - "CHILLIA, PATAZ, LA LIBERTAD": [ - -77.5208976611016, - -8.16082663051885 - ], - "CHIMBAN, CHOTA, CAJAMARCA": [ - -78.4484400317904, - -6.28455379267197 - ], - "CHIMBOTE, SANTA, ANCASH": [ - -78.4011906423706, - -8.87768922488972 - ], - "CHINCHA ALTA, CHINCHA, ICA": [ - -76.0345541723679, - -13.3245339119626 - ], - "CHINCHA BAJA, CHINCHA, ICA": [ - -76.1508444125596, - -13.4966756861187 - ], - "CHINCHAO, HUANUCO, HUANUCO": [ - -76.1107146570563, - -9.61537834385267 - ], - "CHINCHAYPUJIO, ANTA, CUSCO": [ - -72.2715520620687, - -13.612930810587 - ], - "CHINCHERO, URUBAMBA, CUSCO": [ - -72.0387779231763, - -13.4093831008485 - ], - "CHINCHEROS, CHINCHEROS, APURIMAC": [ - -73.7481759289118, - -13.5186387873608 - ], - "CHINCHIHUASI, CHURCAMPA, HUANCAVELICA": [ - -74.5699472143297, - -12.4522676645686 - ], - "CHINCHO, ANGARAES, HUANCAVELICA": [ - -74.3427852073098, - -12.9850791515231 - ], - "CHINGALPO, SIHUAS, ANCASH": [ - -77.6459853393143, - -8.36287402159413 - ], - "CHINGAS, ANTONIO RAYMONDI, ANCASH": [ - -77.0071404629649, - -9.13929025206044 - ], - "CHIPAO, LUCANAS, AYACUCHO": [ - -73.7574180444943, - -14.4771648737549 - ], - "CHIPURANA, SAN MARTIN, SAN MARTIN": [ - -75.6669014628808, - -6.43400148503515 - ], - "CHIQUIAN, BOLOGNESI, ANCASH": [ - -77.1792448233481, - -10.1781992402107 - ], - "CHIRIMOTO, RODRIGUEZ DE MENDOZA, AMAZONAS": [ - -77.4200108618785, - -6.54747068291654 - ], - "CHIRINOS, SAN IGNACIO, CAJAMARCA": [ - -78.8827842580235, - -5.30757708273862 - ], - "CHISQUILLA, BONGARA, AMAZONAS": [ - -77.7257952512311, - -5.89484724059652 - ], - "CHIVAY, CAYLLOMA, AREQUIPA": [ - -71.5501476541934, - -15.6400950681744 - ], - "CHOCHOPE, LAMBAYEQUE, LAMBAYEQUE": [ - -79.613589931034, - -6.15523258480321 - ], - "CHOCO, CASTILLA, AREQUIPA": [ - -72.0687465229776, - -15.4141381712445 - ], - "CHOCOPE, ASCOPE, LA LIBERTAD": [ - -79.2263868712783, - -7.79049674780247 - ], - "CHOCOS, YAUYOS, LIMA": [ - -75.9240588232503, - -12.922385358404 - ], - "CHOJATA, GENERAL SANCHEZ CERRO, MOQUEGUA": [ - -70.5712577713913, - -16.4570250724392 - ], - "CHOLON, MARA\u00d1ON, HUANUCO": [ - -76.7409594863993, - -8.65807559280272 - ], - "CHONGOS ALTO, HUANCAYO, JUNIN": [ - -75.4372524102107, - -12.4856577759153 - ], - "CHONGOS BAJO, CHUPACA, JUNIN": [ - -75.2844333012705, - -12.1948350215022 - ], - "CHONGOYAPE, CHICLAYO, LAMBAYEQUE": [ - -79.4645634553848, - -6.62686259016377 - ], - "CHONTABAMBA, OXAPAMPA, PASCO": [ - -75.5063390707304, - -10.6233198799421 - ], - "CHONTALI, JAEN, CAJAMARCA": [ - -79.133155396685, - -5.63382971414205 - ], - "CHORAS, YAROWILCA, HUANUCO": [ - -76.5718170532428, - -9.91181503213836 - ], - "CHOROPAMPA, CHOTA, CAJAMARCA": [ - -78.3690236402212, - -6.37005886377953 - ], - "CHOROS, CUTERVO, CAJAMARCA": [ - -78.7734754941915, - -5.92471668695182 - ], - "CHORRILLOS, LIMA, LIMA": [ - -77.0058884465196, - -12.1926451966803 - ], - "CHOTA, CHOTA, CAJAMARCA": [ - -78.6426259142255, - -6.5600295236805 - ], - "CHUCUITO, PUNO, PUNO": [ - -69.9195914666432, - -15.9326693878329 - ], - "CHUGAY, SANCHEZ CARRION, LA LIBERTAD": [ - -77.7980900105249, - -7.82233417823115 - ], - "CHUGUR, HUALGAYOC, CAJAMARCA": [ - -78.7076815559111, - -6.68551904677207 - ], - "CHULUCANAS, MORROPON, PIURA": [ - -80.1944093596614, - -5.12169604783907 - ], - "CHUMPI, PARINACOCHAS, AYACUCHO": [ - -73.6999285266146, - -15.1058161000231 - ], - "CHUMUCH, CELENDIN, CAJAMARCA": [ - -78.1870561089263, - -6.57052616716341 - ], - "CHUNGUI, LA MAR, AYACUCHO": [ - -73.5704053121852, - -13.230006622345 - ], - "CHUPA, AZANGARO, PUNO": [ - -69.9519675380968, - -15.1062775945874 - ], - "CHUPACA, CHUPACA, JUNIN": [ - -75.2861146209686, - -12.0708257417027 - ], - "CHUPAMARCA, CASTROVIRREYNA, HUANCAVELICA": [ - -75.5296558486149, - -12.8940307892575 - ], - "CHUPURO, HUANCAYO, JUNIN": [ - -75.2411338307498, - -12.2098279199507 - ], - "CHUQUIBAMBA, CHACHAPOYAS, AMAZONAS": [ - -77.8951903591654, - -6.93490198483361 - ], - "CHUQUIBAMBA, CONDESUYOS, AREQUIPA": [ - -72.7208606823176, - -16.0433819817056 - ], - "CHUQUIBAMBILLA, GRAU, APURIMAC": [ - -72.7746263792499, - -14.1173719148188 - ], - "CHUQUIS, DOS DE MAYO, HUANUCO": [ - -76.6323299591608, - -9.64827707523785 - ], - "CHURCAMPA, CHURCAMPA, HUANCAVELICA": [ - -74.3848798576814, - -12.710491656069 - ], - "CHURUBAMBA, HUANUCO, HUANUCO": [ - -76.2657330507641, - -9.6852555184602 - ], - "CHURUJA, BONGARA, AMAZONAS": [ - -77.9303641214897, - -6.00779616601285 - ], - "CHUSCHI, CANGALLO, AYACUCHO": [ - -74.4362056184944, - -13.493130513321 - ], - "CIENEGUILLA, LIMA, LIMA": [ - -76.7775258876874, - -12.0764633993373 - ], - "CIRCA, ABANCAY, APURIMAC": [ - -72.8915215793942, - -13.9741939974451 - ], - "CIUDAD NUEVA, TACNA, TACNA": [ - -70.1903380012711, - -17.8578365817098 - ], - "COALAQUE, GENERAL SANCHEZ CERRO, MOQUEGUA": [ - -71.046088816601, - -16.5758064712456 - ], - "COASA, CARABAYA, PUNO": [ - -69.8975059797635, - -13.6433384632222 - ], - "COATA, PUNO, PUNO": [ - -69.9237965747034, - -15.5606498572077 - ], - "COAYLLO, CA\u00d1ETE, LIMA": [ - -76.4067248734426, - -12.6587222771079 - ], - "COCABAMBA, LUYA, AMAZONAS": [ - -78.0155621744324, - -6.62720663794254 - ], - "COCACHACRA, ISLAY, AREQUIPA": [ - -71.5995223839544, - -16.9288764200261 - ], - "COCAS, CASTROVIRREYNA, HUANCAVELICA": [ - -75.363087894178, - -13.2741706428082 - ], - "COCHABAMBA, CHOTA, CAJAMARCA": [ - -78.85188438319, - -6.4831530365583 - ], - "COCHABAMBA, HUACAYBAMBA, HUANUCO": [ - -76.6266547467193, - -9.097457256593 - ], - "COCHABAMBA, HUARAZ, ANCASH": [ - -77.8515620316629, - -9.46607072139994 - ], - "COCHAMAL, RODRIGUEZ DE MENDOZA, AMAZONAS": [ - -77.6654526252267, - -6.38621788319943 - ], - "COCHAMARCA, OYON, LIMA": [ - -77.1279201555717, - -10.8835563933752 - ], - "COCHAPETI, HUARMEY, ANCASH": [ - -77.6922731178704, - -9.98584869647894 - ], - "COCHARCAS, CHINCHEROS, APURIMAC": [ - -73.7478500643694, - -13.6115547596379 - ], - "COCHAS, CONCEPCION, JUNIN": [ - -75.1413624459352, - -11.6200665328546 - ], - "COCHAS, OCROS, ANCASH": [ - -77.4870297103395, - -10.6492564990729 - ], - "COCHAS, YAUYOS, LIMA": [ - -76.1958993732045, - -12.2858328727527 - ], - "COCHORCO, SANCHEZ CARRION, LA LIBERTAD": [ - -77.6960828656256, - -7.82158859841187 - ], - "CODO DEL POZUZO, PUERTO INCA, HUANUCO": [ - -75.4665400060377, - -9.63436387936021 - ], - "COISHCO, SANTA, ANCASH": [ - -78.6178872192869, - -9.02746064712588 - ], - "COJATA, HUANCANE, PUNO": [ - -69.3931749352134, - -15.0081746464212 - ], - "COLAN, PAITA, PIURA": [ - -81.0709427838977, - -4.93061687664454 - ], - "COLASAY, JAEN, CAJAMARCA": [ - -78.9794632044882, - -5.9009451042654 - ], - "COLCA, HUANCAYO, JUNIN": [ - -75.19123874618, - -12.3142242806345 - ], - "COLCA, VICTOR FAJARDO, AYACUCHO": [ - -74.03793213013, - -13.7148600455261 - ], - "COLCABAMBA, AYMARAES, APURIMAC": [ - -73.2582708920003, - -13.9769172871096 - ], - "COLCABAMBA, HUARAZ, ANCASH": [ - -77.8216383504041, - -9.57633145734425 - ], - "COLCABAMBA, TAYACAJA, HUANCAVELICA": [ - -74.7004458851228, - -12.3850963169451 - ], - "COLCAMAR, LUYA, AMAZONAS": [ - -78.0106348368711, - -6.31002679144285 - ], - "COLCHA, PARURO, CUSCO": [ - -71.8670124387388, - -13.8709369435874 - ], - "COLONIA, YAUYOS, LIMA": [ - -75.8459798081653, - -12.5842714426585 - ], - "COLPAS, AMBO, HUANUCO": [ - -76.4643577947427, - -10.2443983188281 - ], - "COLQUEMARCA, CHUMBIVILCAS, CUSCO": [ - -72.0146325413154, - -14.2377221156797 - ], - "COLQUEPATA, PAUCARTAMBO, CUSCO": [ - -71.6542271123515, - -13.4030344704621 - ], - "COLQUIOC, BOLOGNESI, ANCASH": [ - -77.585532981517, - -10.3013913189737 - ], - "COLTA, PAUCAR DEL SARA SARA, AYACUCHO": [ - -73.2505709895432, - -15.1277616984369 - ], - "COMANDANTE NOEL, CASMA, ANCASH": [ - -78.3552405509514, - -9.51012063759465 - ], - "COMAS, CONCEPCION, JUNIN": [ - -75.0489918360374, - -11.665502270188 - ], - "COMAS, LIMA, LIMA": [ - -77.038900724795, - -11.9290645806825 - ], - "COMBAPATA, CANCHIS, CUSCO": [ - -71.3341433293408, - -14.0881427738125 - ], - "CONAYCA, HUANCAVELICA, HUANCAVELICA": [ - -75.039818173022, - -12.5179571196675 - ], - "CONCEPCION, CONCEPCION, JUNIN": [ - -75.3135151620756, - -11.9124616399222 - ], - "CONCEPCION, VILCAS HUAMAN, AYACUCHO": [ - -73.8804072371117, - -13.5421020011487 - ], - "CONCHAMARCA, AMBO, HUANUCO": [ - -76.2095977741945, - -10.0486769559899 - ], - "CONCHAN, CHOTA, CAJAMARCA": [ - -78.6024506268036, - -6.47060841832678 - ], - "CONCHUCOS, PALLASCA, ANCASH": [ - -77.7306554794962, - -8.25811864461607 - ], - "CONDEBAMBA, CAJABAMBA, CAJAMARCA": [ - -78.0911434355364, - -7.53011598103817 - ], - "CONDORMARCA, BOLIVAR, LA LIBERTAD": [ - -77.5975426104859, - -7.56156077221188 - ], - "CONDOROMA, ESPINAR, CUSCO": [ - -71.0740422036904, - -15.3007847624031 - ], - "CONDURIRI, EL COLLAO, PUNO": [ - -69.6334714449692, - -16.5526536308835 - ], - "CONGALLA, ANGARAES, HUANCAVELICA": [ - -74.5404764500107, - -12.9818037995542 - ], - "CONGAS, OCROS, ANCASH": [ - -77.4240811929044, - -10.3193720072688 - ], - "CONILA, LUYA, AMAZONAS": [ - -78.191191729999, - -6.12653870724589 - ], - "CONIMA, MOHO, PUNO": [ - -69.4120435125063, - -15.4493046332036 - ], - "CONSTITUCION, OXAPAMPA, PASCO": [ - -74.7846229854987, - -9.82583191866923 - ], - "CONTAMANA, UCAYALI, LORETO": [ - -75.3493778991756, - -7.78112464051196 - ], - "CONTUMAZA, CONTUMAZA, CAJAMARCA": [ - -78.736804868326, - -7.33474917069705 - ], - "COPA, CAJATAMBO, LIMA": [ - -77.0233792431247, - -10.3644796448955 - ], - "COPALLIN, BAGUA, AMAZONAS": [ - -78.3997554651562, - -5.64770028745191 - ], - "COPANI, YUNGUYO, PUNO": [ - -69.0732350309725, - -16.3710222246354 - ], - "COPORAQUE, CAYLLOMA, AREQUIPA": [ - -71.6412296272643, - -15.5913324279424 - ], - "COPORAQUE, ESPINAR, CUSCO": [ - -71.6353572148063, - -14.7572037585753 - ], - "CORACORA, PARINACOCHAS, AYACUCHO": [ - -73.6993401926905, - -14.8157595667868 - ], - "CORANI, CARABAYA, PUNO": [ - -70.7051544074335, - -13.923634284816 - ], - "CORCULLA, PAUCAR DEL SARA SARA, AYACUCHO": [ - -73.2186525373388, - -15.261823469542 - ], - "CORDOVA, HUAYTARA, HUANCAVELICA": [ - -75.151973678959, - -14.0115591689604 - ], - "CORIS, AIJA, ANCASH": [ - -77.7961441124832, - -9.80759338820343 - ], - "CORONEL CASTA\u00d1EDA, PARINACOCHAS, AYACUCHO": [ - -73.1640500725484, - -14.7782737735458 - ], - "CORONEL GREGORIO ALBARRACIN LANCHIPA, TACNA, TACNA": [ - -70.2409451601948, - -18.1076693553858 - ], - "CORONGO, CORONGO, ANCASH": [ - -77.9290331055776, - -8.54891503626491 - ], - "COROSHA, BONGARA, AMAZONAS": [ - -77.8107241806685, - -5.81751871097102 - ], - "CORRALES, TUMBES, TUMBES": [ - -80.5030134485542, - -3.59957715484509 - ], - "CORTEGANA, CELENDIN, CAJAMARCA": [ - -78.2855239902207, - -6.48769432724889 - ], - "COSME, CHURCAMPA, HUANCAVELICA": [ - -74.6452413592414, - -12.5705115599551 - ], - "COSPAN, CAJAMARCA, CAJAMARCA": [ - -78.5168650168699, - -7.45302918746221 - ], - "COTABAMBAS, COTABAMBAS, APURIMAC": [ - -72.3412863620817, - -13.7512826812773 - ], - "COTAHUASI, LA UNION, AREQUIPA": [ - -72.861459781114, - -15.2763159491791 - ], - "COTAPARACO, RECUAY, ANCASH": [ - -77.54093133938, - -9.93755523980733 - ], - "COTARUSE, AYMARAES, APURIMAC": [ - -73.2951751135067, - -14.5889200791663 - ], - "COVIRIALI, SATIPO, JUNIN": [ - -74.6514739883331, - -11.3174655966858 - ], - "COYA, CALCA, CUSCO": [ - -71.9153272241254, - -13.4024157862149 - ], - "COYLLURQUI, COTABAMBAS, APURIMAC": [ - -72.39526047097, - -13.9189697833699 - ], - "CRISTO NOS VALGA, SECHURA, PIURA": [ - -80.6409772959676, - -5.53518828391733 - ], - "CRUCERO, CARABAYA, PUNO": [ - -69.9288834767308, - -14.3363751356546 - ], - "CUCHUMBAYA, MARISCAL NIETO, MOQUEGUA": [ - -70.6676287515439, - -16.7686536562474 - ], - "CUENCA, HUANCAVELICA, HUANCAVELICA": [ - -75.0558028009246, - -12.4599037876794 - ], - "CUENCA, HUAROCHIRI, LIMA": [ - -76.4569186444848, - -12.1565295670283 - ], - "CUISPES, BONGARA, AMAZONAS": [ - -77.9147926976479, - -5.91114536058822 - ], - "CUJILLO, CUTERVO, CAJAMARCA": [ - -78.559324065091, - -6.11656790794088 - ], - "CULEBRAS, HUARMEY, ANCASH": [ - -78.1034619728267, - -9.82261258145535 - ], - "CULLHUAS, HUANCAYO, JUNIN": [ - -75.1547028635111, - -12.2517931016354 - ], - "CUMBA, UTCUBAMBA, AMAZONAS": [ - -78.6077509544416, - -5.91680497059722 - ], - "CUPI, MELGAR, PUNO": [ - -70.8942616129024, - -14.8900967869389 - ], - "CUPISNIQUE, CONTUMAZA, CAJAMARCA": [ - -79.0665716448416, - -7.3734651079094 - ], - "CURA MORI, PIURA, PIURA": [ - -80.5860498675313, - -5.3575904430697 - ], - "CURAHUASI, ABANCAY, APURIMAC": [ - -72.6181195644358, - -13.6388531133154 - ], - "CURASCO, GRAU, APURIMAC": [ - -72.5320377324999, - -14.1027798514328 - ], - "CURGOS, SANCHEZ CARRION, LA LIBERTAD": [ - -77.9534954641068, - -7.8477410511119 - ], - "CURIBAYA, CANDARAVE, TACNA": [ - -70.3338525404212, - -17.3940874896584 - ], - "CURICACA, JAUJA, JUNIN": [ - -75.669160229964, - -11.7684415151729 - ], - "CURIMANA, PADRE ABAD, UCAYALI": [ - -75.2971136503234, - -8.41738004677085 - ], - "CURPAHUASI, GRAU, APURIMAC": [ - -72.6498193720242, - -13.9688786773201 - ], - "CUSCA, CORONGO, ANCASH": [ - -77.7889320286036, - -8.52329455757695 - ], - "CUSCO, CUSCO, CUSCO": [ - -71.9876065965117, - -13.492540852511 - ], - "CUSIPATA, QUISPICANCHI, CUSCO": [ - -71.4379172032332, - -13.8859747513413 - ], - "CUTERVO, CUTERVO, CAJAMARCA": [ - -78.8329612065848, - -6.38002946196422 - ], - "CUTURAPI, YUNGUYO, PUNO": [ - -69.1805682273346, - -16.2930857337766 - ], - "CUYOCUYO, SANDIA, PUNO": [ - -69.5576680126334, - -14.5238141174569 - ], - "CU\u00d1UMBUQUI, LAMAS, SAN MARTIN": [ - -76.4683768048648, - -6.6156585954741 - ], - "DANIEL ALOMIA ROBLES, LEONCIO PRADO, HUANUCO": [ - -75.775162232684, - -9.36044775263213 - ], - "DANIEL HERNANDEZ, TAYACAJA, HUANCAVELICA": [ - -74.833663714586, - -12.3453362169096 - ], - "DEAN VALDIVIA, ISLAY, AREQUIPA": [ - -71.8293991571818, - -17.097994148073 - ], - "DESAGUADERO, CHUCUITO, PUNO": [ - -69.080280446002, - -16.6201520013777 - ], - "ECHARATE, LA CONVENCION, CUSCO": [ - -72.9831341316442, - -12.4182530845002 - ], - "EDUARDO VILLANUEVA, SAN MARCOS, CAJAMARCA": [ - -78.1434022439999, - -7.44123441822372 - ], - "EL AGUSTINO, LIMA, LIMA": [ - -76.9874046804472, - -12.0400969138003 - ], - "EL ALGARROBAL, ILO, MOQUEGUA": [ - -71.1415329490817, - -17.5830471148697 - ], - "EL ALTO, TALARA, PIURA": [ - -81.0801505266464, - -4.29150873178569 - ], - "EL CARMEN DE LA FRONTERA, HUANCABAMBA, PIURA": [ - -79.3672526271352, - -5.02280415721348 - ], - "EL CARMEN, CHINCHA, ICA": [ - -75.915387743302, - -13.5121999134551 - ], - "EL CARMEN, CHURCAMPA, HUANCAVELICA": [ - -74.4974080847859, - -12.711430017342 - ], - "EL CENEPA, CONDORCANQUI, AMAZONAS": [ - -78.3358932903866, - -4.1685381325832 - ], - "EL ESLABON, HUALLAGA, SAN MARTIN": [ - -76.7058137959861, - -6.99155538076392 - ], - "EL INGENIO, NASCA, ICA": [ - -75.0071063972804, - -14.6777456111477 - ], - "EL INGENIO, NAZCA, ICA": [ - -75.0071063972804, - -14.6777456111477 - ], - "EL MANTARO, JAUJA, JUNIN": [ - -75.3915672923924, - -11.8178306715402 - ], - "EL MILAGRO, UTCUBAMBA, AMAZONAS": [ - -78.6113231002461, - -5.71733767807965 - ], - "EL ORO, ANTABAMBA, APURIMAC": [ - -73.0352163628739, - -14.1578087736846 - ], - "EL PARCO, BAGUA, AMAZONAS": [ - -78.4739696760451, - -5.62263827334525 - ], - "EL PORVENIR, CHINCHEROS, APURIMAC": [ - -73.5551397452393, - -13.3977196404944 - ], - "EL PORVENIR, SAN MARTIN, SAN MARTIN": [ - -75.8647644194766, - -6.24500125785024 - ], - "EL PORVENIR, TRUJILLO, LA LIBERTAD": [ - -78.9959602589307, - -8.05161310049898 - ], - "EL PRADO, SAN MIGUEL, CAJAMARCA": [ - -79.0033168838485, - -7.0380424039574 - ], - "EL TALLAN, PIURA, PIURA": [ - -80.6113687221145, - -5.44129534924409 - ], - "EL TAMBO, HUANCAYO, JUNIN": [ - -75.1610888091066, - -11.9719552542269 - ], - "ELEAZAR GUZMAN BARRON, MARISCAL LUZURIAGA, ANCASH": [ - -77.2203437364385, - -8.88606653537461 - ], - "ELIAS SOPLIN VARGAS, RIOJA, SAN MARTIN": [ - -77.2972962883463, - -6.04638884261892 - ], - "EMILIO SAN MARTIN, REQUENA, LORETO": [ - -74.4540463434201, - -6.20137532111786 - ], - "ENCA\u00d1ADA, CAJAMARCA, CAJAMARCA": [ - -78.4029394499717, - -6.98519968591838 - ], - "ESPINAR, ESPINAR, CUSCO": [ - -71.3528665028169, - -14.9253851303188 - ], - "ESTIQUE, TARATA, TACNA": [ - -70.0251118501106, - -17.6237013757844 - ], - "ESTIQUE-PAMPA, TARATA, TACNA": [ - -70.1138484128749, - -17.6125217257129 - ], - "ETEN PUERTO, CHICLAYO, LAMBAYEQUE": [ - -79.8469587479606, - -6.95042146080356 - ], - "ETEN, CHICLAYO, LAMBAYEQUE": [ - -79.8157876850959, - -6.93048303290067 - ], - "FERNANDO LORES, MAYNAS, LORETO": [ - -73.1148146436675, - -4.27912451535227 - ], - "FERRE\u00d1AFE, FERRE\u00d1AFE, LAMBAYEQUE": [ - -79.7911185840526, - -6.62052434308725 - ], - "FIDEL OLIVAS ESCUDERO, MARISCAL LUZURIAGA, ANCASH": [ - -77.2772025502222, - -8.78492154214412 - ], - "FITZCARRALD, MANU, MADRE DE DIOS": [ - -71.6346638135877, - -11.8504051472259 - ], - "FLORENCIA DE MORA, TRUJILLO, LA LIBERTAD": [ - -79.0214095600705, - -8.08242993064463 - ], - "FLORIDA, BONGARA, AMAZONAS": [ - -77.9592016275404, - -5.82360449741324 - ], - "FRIAS, AYABACA, PIURA": [ - -79.9709154147483, - -4.9272147733252 - ], - "GAMARRA, GRAU, APURIMAC": [ - -72.559670472638, - -13.8306651665111 - ], - "GORGOR, CAJATAMBO, LIMA": [ - -76.9919108917448, - -10.6216407124347 - ], - "GOYLLARISQUIZGA, DANIEL ALCIDES CARRION, PASCO": [ - -76.4039621112516, - -10.4867472418906 - ], - "GRANADA, CHACHAPOYAS, AMAZONAS": [ - -77.5765977572062, - -6.09998536074605 - ], - "GREGORIO PITA, SAN MARCOS, CAJAMARCA": [ - -78.1612445415769, - -7.22207398720816 - ], - "GROCIO PRADO, CHINCHA, ICA": [ - -76.1673894195252, - -13.3114448742726 - ], - "GUADALUPE, PACASMAYO, LA LIBERTAD": [ - -79.4878867018038, - -7.2881352091473 - ], - "GUADALUPITO, VIRU, LA LIBERTAD": [ - -78.6497460929762, - -8.80172327077203 - ], - "GUZMANGO, CONTUMAZA, CAJAMARCA": [ - -78.9176892863048, - -7.36430406444282 - ], - "HABANA, MOYOBAMBA, SAN MARTIN": [ - -77.1000936990825, - -6.08890186233433 - ], - "HAQUIRA, COTABAMBAS, APURIMAC": [ - -72.2305865606366, - -14.2771697955222 - ], - "HERMILIO VALDIZAN, LEONCIO PRADO, HUANUCO": [ - -75.8755233772786, - -9.13951071601705 - ], - "HEROES ALBARRACIN, TARATA, TACNA": [ - -70.2145381422877, - -17.499409270151 - ], - "HEROINAS TOLEDO, CONCEPCION, JUNIN": [ - -75.2817782004065, - -11.8387402040177 - ], - "HONGOS, YAUYOS, LIMA": [ - -75.672838105401, - -12.7664935882319 - ], - "HONORIA, PUERTO INCA, HUANUCO": [ - -74.6968415439037, - -8.71386510893011 - ], - "HUABAL, JAEN, CAJAMARCA": [ - -78.905860523931, - -5.60492868478835 - ], - "HUAC-HUAS, LUCANAS, AYACUCHO": [ - -74.9936613590631, - -14.1664038094055 - ], - "HUACACHI, HUARI, ANCASH": [ - -76.9295331550547, - -9.30857432706202 - ], - "HUACAR, AMBO, HUANUCO": [ - -76.2696040228566, - -10.1953034796004 - ], - "HUACASCHUQUE, PALLASCA, ANCASH": [ - -77.9923664567574, - -8.30283578478079 - ], - "HUACAYBAMBA, HUACAYBAMBA, HUANUCO": [ - -76.8391097881263, - -8.9586133906167 - ], - "HUACA\u00d1A, SUCRE, AYACUCHO": [ - -73.8646680098338, - -14.2141283193713 - ], - "HUACCANA, CHINCHEROS, APURIMAC": [ - -73.7312119066422, - -13.3195065115051 - ], - "HUACCHIS, HUARI, ANCASH": [ - -76.8080498637904, - -9.1886637694589 - ], - "HUACHAC, CHUPACA, JUNIN": [ - -75.3427301692403, - -12.0355696713206 - ], - "HUACHIS, HUARI, ANCASH": [ - -77.0781527208679, - -9.42639022926456 - ], - "HUACHO, HUAURA, LIMA": [ - -77.4927671198211, - -11.2716617706088 - ], - "HUACHOCOLPA, HUANCAVELICA, HUANCAVELICA": [ - -74.9570050435568, - -13.0458930528339 - ], - "HUACHOCOLPA, TAYACAJA, HUANCAVELICA": [ - -74.5458328004275, - -12.0566739046602 - ], - "HUACHON, PASCO, PASCO": [ - -75.7854802448138, - -10.5742546655225 - ], - "HUACHOS, CASTROVIRREYNA, HUANCAVELICA": [ - -75.4834042520299, - -13.214711377885 - ], - "HUACHUPAMPA, HUAROCHIRI, LIMA": [ - -76.5957974939126, - -11.6968546203899 - ], - "HUACLLAN, AIJA, ANCASH": [ - -77.678744258243, - -9.78608413332896 - ], - "HUACRACHUCO, MARA\u00d1ON, HUANUCO": [ - -77.1730525711687, - -8.60482185666154 - ], - "HUACRAPUQUIO, HUANCAYO, JUNIN": [ - -75.2093509293734, - -12.1866998604595 - ], - "HUACULLANI, CHUCUITO, PUNO": [ - -69.3988758380446, - -16.6041510263666 - ], - "HUALGAYOC, HUALGAYOC, CAJAMARCA": [ - -78.6003053099917, - -6.75268786138857 - ], - "HUALHUAS, HUANCAYO, JUNIN": [ - -75.2441232080083, - -11.9679755363801 - ], - "HUALLA, VICTOR FAJARDO, AYACUCHO": [ - -73.9791987221368, - -13.8780300700517 - ], - "HUALLAGA, BELLAVISTA, SAN MARTIN": [ - -76.5688433860277, - -7.29422243940639 - ], - "HUALLANCA, BOLOGNESI, ANCASH": [ - -76.9438141392498, - -9.91718302114329 - ], - "HUALLANCA, HUAYLAS, ANCASH": [ - -77.9175191960737, - -8.78789641557126 - ], - "HUALMAY, HUAURA, LIMA": [ - -77.6069579552012, - -11.0927872750319 - ], - "HUAMACHUCO, SANCHEZ CARRION, LA LIBERTAD": [ - -78.0460793091492, - -7.82673306698598 - ], - "HUAMALI, JAUJA, JUNIN": [ - -75.4040905335279, - -11.7896290561628 - ], - "HUAMANCACA CHICO, CHUPACA, JUNIN": [ - -75.248767340808, - -12.0796503111749 - ], - "HUAMANGUILLA, HUANTA, AYACUCHO": [ - -74.1589464492153, - -12.9926548840502 - ], - "HUAMANQUIQUIA, VICTOR FAJARDO, AYACUCHO": [ - -74.2757165259385, - -13.7160784261069 - ], - "HUAMANTANGA, CANTA, LIMA": [ - -76.8438160400722, - -11.5503461367891 - ], - "HUAMATAMBO, CASTROVIRREYNA, HUANCAVELICA": [ - -75.6825045069007, - -13.1089464747428 - ], - "HUAMBALPA, VILCAS HUAMAN, AYACUCHO": [ - -73.8879094012635, - -13.7443085870251 - ], - "HUAMBO, CAYLLOMA, AREQUIPA": [ - -72.1604831315002, - -15.7962502451318 - ], - "HUAMBO, RODRIGUEZ DE MENDOZA, AMAZONAS": [ - -77.5305644025492, - -6.43557149848692 - ], - "HUAMBOS, CHOTA, CAJAMARCA": [ - -78.9702296821211, - -6.44374243619551 - ], - "HUAMPARA, YAUYOS, LIMA": [ - -76.1905986950694, - -12.3542955588713 - ], - "HUANCA, CAYLLOMA, AREQUIPA": [ - -71.8279663861264, - -16.0064314609265 - ], - "HUANCA-HUANCA, ANGARAES, HUANCAVELICA": [ - -74.6264648272352, - -12.9647996907394 - ], - "HUANCABAMBA, HUANCABAMBA, PIURA": [ - -79.4974708547698, - -5.19683621763501 - ], - "HUANCABAMBA, OXAPAMPA, PASCO": [ - -75.6386321647265, - -10.3905114901338 - ], - "HUANCAN, HUANCAYO, JUNIN": [ - -75.204099270795, - -12.110516730553 - ], - "HUANCANE, HUANCANE, PUNO": [ - -69.8090201238396, - -15.1832078769793 - ], - "HUANCANO, PISCO, ICA": [ - -75.615906699894, - -13.5551905052522 - ], - "HUANCAPI, VICTOR FAJARDO, AYACUCHO": [ - -74.0898403565012, - -13.8046582165024 - ], - "HUANCAPON, CAJATAMBO, LIMA": [ - -77.1089326593627, - -10.521692018886 - ], - "HUANCARAMA, ANDAHUAYLAS, APURIMAC": [ - -73.0283084812514, - -13.6568619053323 - ], - "HUANCARANI, PAUCARTAMBO, CUSCO": [ - -71.6311427416849, - -13.510998672382 - ], - "HUANCARAY, ANDAHUAYLAS, APURIMAC": [ - -73.5471998572166, - -13.7696234088544 - ], - "HUANCARAYLLA, VICTOR FAJARDO, AYACUCHO": [ - -74.1698708626338, - -13.7490758789268 - ], - "HUANCARQUI, CASTILLA, AREQUIPA": [ - -72.3681882063559, - -16.0123989265889 - ], - "HUANCAS, CHACHAPOYAS, AMAZONAS": [ - -77.8749736813187, - -6.1561387768197 - ], - "HUANCASPATA, PATAZ, LA LIBERTAD": [ - -77.2681887170076, - -8.43914764932042 - ], - "HUANCAVELICA, HUANCAVELICA, HUANCAVELICA": [ - -75.0086414812063, - -12.8628485494324 - ], - "HUANCAYA, YAUYOS, LIMA": [ - -75.8347862883788, - -12.0905096900704 - ], - "HUANCAYO, HUANCAYO, JUNIN": [ - -75.0712797803089, - -11.9933231240794 - ], - "HUANCHACO, TRUJILLO, LA LIBERTAD": [ - -79.05849480098, - -8.00098029731493 - ], - "HUANCHAY, HUARAZ, ANCASH": [ - -77.8193337257751, - -9.73105679220459 - ], - "HUANDO, HUANCAVELICA, HUANCAVELICA": [ - -75.0136079101945, - -12.627284592917 - ], - "HUANDOVAL, PALLASCA, ANCASH": [ - -77.945598106696, - -8.33456823658252 - ], - "HUANGASCAR, YAUYOS, LIMA": [ - -75.8218496051551, - -12.9415584167008 - ], - "HUANIPACA, ABANCAY, APURIMAC": [ - -72.9752848562508, - -13.4760904999523 - ], - "HUANOQUITE, PARURO, CUSCO": [ - -72.079213338247, - -13.6988092285409 - ], - "HUANTA, HUANTA, AYACUCHO": [ - -74.2114592985681, - -12.9120374963411 - ], - "HUANTAN, YAUYOS, LIMA": [ - -75.70407971749, - -12.5130670450619 - ], - "HUANTAR, HUARI, ANCASH": [ - -77.236164872829, - -9.46782655205434 - ], - "HUANUARA, CANDARAVE, TACNA": [ - -70.3304636172564, - -17.3085360236381 - ], - "HUANUCO, HUANUCO, HUANUCO": [ - -76.296672147182, - -9.89658247664458 - ], - "HUANUHUANU, CARAVELI, AREQUIPA": [ - -74.0628267718308, - -15.5557413238229 - ], - "HUANZA, HUAROCHIRI, LIMA": [ - -76.4436514835191, - -11.5611438020127 - ], - "HUAQUIRCA, ANTABAMBA, APURIMAC": [ - -72.786688417167, - -14.3402713726486 - ], - "HUARAL, HUARAL, LIMA": [ - -77.1711034164779, - -11.3870920091398 - ], - "HUARANCHAL, OTUZCO, LA LIBERTAD": [ - -78.451799291133, - -7.69051249852008 - ], - "HUARANGO, SAN IGNACIO, CAJAMARCA": [ - -78.7153004144198, - -5.09645367033109 - ], - "HUARAZ, HUARAZ, ANCASH": [ - -77.4715366763244, - -9.57041619942402 - ], - "HUARI, HUARI, ANCASH": [ - -77.2328962322916, - -9.32314104654057 - ], - "HUARIACA, PASCO, PASCO": [ - -76.154112085472, - -10.4517724336074 - ], - "HUARIBAMBA, TAYACAJA, HUANCAVELICA": [ - -74.9089154641379, - -12.2620899378646 - ], - "HUARICOLCA, TARMA, JUNIN": [ - -75.6169726440968, - -11.5256485421098 - ], - "HUARIPAMPA, JAUJA, JUNIN": [ - -75.4806050849648, - -11.8212801828235 - ], - "HUARMACA, HUANCABAMBA, PIURA": [ - -79.5609933402671, - -5.69472861199322 - ], - "HUARMEY, HUARMEY, ANCASH": [ - -77.918617565767, - -10.1738310203879 - ], - "HUARO, QUISPICANCHI, CUSCO": [ - -71.6724000496577, - -13.7553194609384 - ], - "HUAROCHIRI, HUAROCHIRI, LIMA": [ - -76.2725837881267, - -12.069474368604 - ], - "HUAROCONDO, ANTA, CUSCO": [ - -72.2767056648601, - -13.3696553180378 - ], - "HUAROS, CANTA, LIMA": [ - -76.5023974499611, - -11.401312856858 - ], - "HUASAHUASI, TARMA, JUNIN": [ - -75.6257397022023, - -11.1276239227155 - ], - "HUASICANCHA, HUANCAYO, JUNIN": [ - -75.2860889365955, - -12.3712236914953 - ], - "HUASMIN, CELENDIN, CAJAMARCA": [ - -78.3256328996798, - -6.82828186530502 - ], - "HUASO, JULCAN, LA LIBERTAD": [ - -78.4405302494605, - -8.26159022428641 - ], - "HUASTA, BOLOGNESI, ANCASH": [ - -77.0315610520593, - -10.1139260243821 - ], - "HUATA, HUAYLAS, ANCASH": [ - -77.8765826547594, - -9.03006918062392 - ], - "HUATA, PUNO, PUNO": [ - -69.9977989057883, - -15.6216181788146 - ], - "HUATASANI, HUANCANE, PUNO": [ - -69.7996159221377, - -15.0189298696294 - ], - "HUAURA, HUAURA, LIMA": [ - -77.4452284130144, - -11.0035804613591 - ], - "HUAY-HUAY, YAULI, JUNIN": [ - -75.9653315451653, - -11.717136846884 - ], - "HUAYACUNDO ARMA, HUAYTARA, HUANCAVELICA": [ - -75.3117469226151, - -13.5548801389436 - ], - "HUAYAN, HUARMEY, ANCASH": [ - -77.7441392579254, - -9.89712100961778 - ], - "HUAYANA, ANDAHUAYLAS, APURIMAC": [ - -73.5509679806645, - -13.9895898436307 - ], - "HUAYLAS, HUAYLAS, ANCASH": [ - -77.8940178640664, - -8.88969301045192 - ], - "HUAYLILLAS, PATAZ, LA LIBERTAD": [ - -77.2936995486645, - -8.19040304270327 - ], - "HUAYLLABAMBA, SIHUAS, ANCASH": [ - -77.5300570667942, - -8.51213165162543 - ], - "HUAYLLABAMBA, URUBAMBA, CUSCO": [ - -72.0498099368372, - -13.3418925063627 - ], - "HUAYLLACAYAN, BOLOGNESI, ANCASH": [ - -77.4107731421805, - -10.2469428966017 - ], - "HUAYLLAHUARA, HUANCAVELICA, HUANCAVELICA": [ - -75.1829733200987, - -12.4014650243609 - ], - "HUAYLLAN, POMABAMBA, ANCASH": [ - -77.4662792071935, - -8.8897169279704 - ], - "HUAYLLAPAMPA, RECUAY, ANCASH": [ - -77.5146890175342, - -10.0577318235392 - ], - "HUAYLLATI, GRAU, APURIMAC": [ - -72.4958241969493, - -13.966490689905 - ], - "HUAYLLAY GRANDE, ANGARAES, HUANCAVELICA": [ - -74.6710837925551, - -12.9235699986632 - ], - "HUAYLLAY, PASCO, PASCO": [ - -76.4254456806182, - -10.9519752711627 - ], - "HUAYNACOTAS, LA UNION, AREQUIPA": [ - -72.7614813242684, - -14.8749573667108 - ], - "HUAYO, PATAZ, LA LIBERTAD": [ - -77.5922271223796, - -8.03494125135816 - ], - "HUAYOPATA, LA CONVENCION, CUSCO": [ - -72.4732857140615, - -13.0509532556662 - ], - "HUAYRAPATA, MOHO, PUNO": [ - -69.2956349349011, - -15.2760923321641 - ], - "HUAYTARA, HUAYTARA, HUANCAVELICA": [ - -75.3927503965879, - -13.6535444021996 - ], - "HUAYUCACHI, HUANCAYO, JUNIN": [ - -75.2220664868662, - -12.1344099817026 - ], - "HUA\u00d1EC, YAUYOS, LIMA": [ - -76.0794986416602, - -12.2748029125315 - ], - "HUEPETUHE, MANU, MADRE DE DIOS": [ - -70.6520780572816, - -13.0031498435792 - ], - "HUERTAS, JAUJA, JUNIN": [ - -75.4667399799649, - -11.7643840397455 - ], - "HUICUNGO, MARISCAL CACERES, SAN MARTIN": [ - -77.321560391347, - -7.25927236581214 - ], - "HUIMBAYOC, SAN MARTIN, SAN MARTIN": [ - -75.7136103360231, - -6.63864689763569 - ], - "HUMAY, PISCO, ICA": [ - -75.8179854018786, - -13.7440848561721 - ], - "IBERIA, TAHUAMANU, MADRE DE DIOS": [ - -69.6792726283442, - -11.4350937356332 - ], - "ICA, ICA, ICA": [ - -75.9066566806043, - -14.2138566933713 - ], - "ICHOCAN, SAN MARCOS, CAJAMARCA": [ - -78.0597916038431, - -7.40608245325243 - ], - "ICHUPAMPA, CAYLLOMA, AREQUIPA": [ - -71.7053082862247, - -15.5861918378982 - ], - "ICHU\u00d1A, GENERAL SANCHEZ CERRO, MOQUEGUA": [ - -70.4947181808719, - -16.1882306933747 - ], - "IGNACIO ESCUDERO, SULLANA, PIURA": [ - -80.8856469185089, - -4.82673372940049 - ], - "IGUAIN, HUANTA, AYACUCHO": [ - -74.2182525054861, - -12.9830864573838 - ], - "IHUARI, HUARAL, LIMA": [ - -76.9608767824114, - -11.18728337476 - ], - "IHUAYLLO, AYMARAES, APURIMAC": [ - -73.2440329948131, - -14.0979376254434 - ], - "ILABAYA, JORGE BASADRE, TACNA": [ - -70.5709881980353, - -17.3837836483756 - ], - "ILAVE, EL COLLAO, PUNO": [ - -69.6780853867734, - -16.2402047183414 - ], - "ILLIMO, LAMBAYEQUE, LAMBAYEQUE": [ - -79.853367188439, - -6.46959393045695 - ], - "ILO, ILO, MOQUEGUA": [ - -71.2169409950908, - -17.7141595452719 - ], - "IMAZA, BAGUA, AMAZONAS": [ - -78.389593547252, - -4.99133149275942 - ], - "IMPERIAL, CA\u00d1ETE, LIMA": [ - -76.3696001528183, - -13.0330912355124 - ], - "INAHUAYA, UCAYALI, LORETO": [ - -75.2998309831715, - -7.04088987085972 - ], - "INAMBARI, TAMBOPATA, MADRE DE DIOS": [ - -69.9388448509389, - -12.9767443307914 - ], - "INCAHUASI, FERRE\u00d1AFE, LAMBAYEQUE": [ - -79.387147202891, - -6.23124427947483 - ], - "INCHUPALLA, HUANCANE, PUNO": [ - -69.6446090721801, - -15.0008608312155 - ], - "INCLAN, TACNA, TACNA": [ - -70.423564773334, - -17.681164605854 - ], - "INDEPENDENCIA, HUARAZ, ANCASH": [ - -77.4847157717894, - -9.47135891805609 - ], - "INDEPENDENCIA, LIMA, LIMA": [ - -77.0460445307492, - -11.9874731951672 - ], - "INDEPENDENCIA, PISCO, ICA": [ - -76.0129977710165, - -13.6468604050745 - ], - "INDEPENDENCIA, VILCAS HUAMAN, AYACUCHO": [ - -73.8584709256131, - -13.8756567588359 - ], - "INDIANA, MAYNAS, LORETO": [ - -72.856333386362, - -3.82915910635811 - ], - "INGENIO, HUANCAYO, JUNIN": [ - -75.2229562735624, - -11.8537364410937 - ], - "INGUILPATA, LUYA, AMAZONAS": [ - -78.0285735052228, - -6.24809797893011 - ], - "INKAWASI, LA CONVENCION, CUSCO": [ - -73.2087281724974, - -13.3020219005665 - ], - "IPARIA, CORONEL PORTILLO, UCAYALI": [ - -74.1372239911992, - -9.44298790977894 - ], - "IQUITOS, MAYNAS, LORETO": [ - -73.4328382975117, - -3.78230213607606 - ], - "IRAY, CONDESUYOS, AREQUIPA": [ - -72.6005764338971, - -15.9130183656615 - ], - "IRAZOLA, PADRE ABAD, UCAYALI": [ - -75.2799184192192, - -8.95051640945597 - ], - "ISLAY, ISLAY, AREQUIPA": [ - -72.1022333632458, - -16.8763347033734 - ], - "ITE, JORGE BASADRE, TACNA": [ - -70.9329951430549, - -17.8035161835349 - ], - "ITUATA, CARABAYA, PUNO": [ - -70.1160944087771, - -13.8296416455405 - ], - "IZCUCHACA, HUANCAVELICA, HUANCAVELICA": [ - -75.0135552018404, - -12.496344739806 - ], - "I\u00d1APARI, TAHUAMANU, MADRE DE DIOS": [ - -70.6499129821014, - -10.9651997351768 - ], - "JACAS CHICO, YAROWILCA, HUANUCO": [ - -76.5090871905068, - -9.87516802203861 - ], - "JACAS GRANDE, HUAMALIES, HUANUCO": [ - -76.6684104010932, - -9.51519574659661 - ], - "JACOBO HUNTER, AREQUIPA, AREQUIPA": [ - -71.5626841454198, - -16.4587137721784 - ], - "JAEN, JAEN, CAJAMARCA": [ - -78.8525180636178, - -5.77021239267015 - ], - "JAMALCA, UTCUBAMBA, AMAZONAS": [ - -78.2349570882293, - -5.95246999893778 - ], - "JANGAS, HUARAZ, ANCASH": [ - -77.6038411725108, - -9.44133063239278 - ], - "JANJAILLO, JAUJA, JUNIN": [ - -75.6187190286755, - -11.7656305305951 - ], - "JAQUI, CARAVELI, AREQUIPA": [ - -74.3981647648613, - -15.4491016657413 - ], - "JAUJA, JAUJA, JUNIN": [ - -75.491137788588, - -11.7740855820948 - ], - "JAYANCA, LAMBAYEQUE, LAMBAYEQUE": [ - -79.8082831139313, - -6.33418220439097 - ], - "JAZAN, BONGARA, AMAZONAS": [ - -78.0234319489171, - -5.94537414182961 - ], - "JEBEROS, ALTO AMAZONAS, LORETO": [ - -76.2049797640072, - -5.29686019897673 - ], - "JENARO HERRERA, REQUENA, LORETO": [ - -73.698347747299, - -4.99617085001332 - ], - "JEPELACIO, MOYOBAMBA, SAN MARTIN": [ - -76.9218020698841, - -6.17353785050755 - ], - "JEQUETEPEQUE, PACASMAYO, LA LIBERTAD": [ - -79.5469849352348, - -7.35015297792695 - ], - "JESUS MARIA, LIMA, LIMA": [ - -77.0482083603501, - -12.0781064169476 - ], - "JESUS NAZARENO, HUAMANGA, AYACUCHO": [ - -74.2085018099994, - -13.1218251824794 - ], - "JESUS, CAJAMARCA, CAJAMARCA": [ - -78.3666471586572, - -7.29830954384266 - ], - "JESUS, LAURICOCHA, HUANUCO": [ - -76.7555788361306, - -10.2185320339679 - ], - "JILILI, AYABACA, PIURA": [ - -79.8315489938896, - -4.53182247946501 - ], - "JIRCAN, HUAMALIES, HUANUCO": [ - -76.6440229105396, - -9.21653962191627 - ], - "JIVIA, LAURICOCHA, HUANUCO": [ - -76.6563209128212, - -10.0354742221484 - ], - "JORGE CHAVEZ, CELENDIN, CAJAMARCA": [ - -78.0696072914303, - -6.93955550598393 - ], - "JOSE CRESPO Y CASTILLO, LEONCIO PRADO, HUANUCO": [ - -76.1776726799713, - -8.93266319053618 - ], - "JOSE DOMINGO CHOQUEHUANCA, AZANGARO, PUNO": [ - -70.322729222368, - -15.0299953272217 - ], - "JOSE GALVEZ, CELENDIN, CAJAMARCA": [ - -78.1587758226002, - -6.91989426128341 - ], - "JOSE LEONARDO ORTIZ, CHICLAYO, LAMBAYEQUE": [ - -79.8423564331693, - -6.73989814921078 - ], - "JOSE LUIS BUSTAMANTE Y RIVERO, AREQUIPA, AREQUIPA": [ - -71.5234725656764, - -16.4314924546874 - ], - "JOSE MANUEL QUIROZ, SAN MARCOS, CAJAMARCA": [ - -78.0209706961173, - -7.35601686496337 - ], - "JOSE MARIA ARGUEDAS, ANDAHUAYLAS, APURIMAC": [ - -73.3239501635779, - -13.8094270842897 - ], - "JOSE MARIA QUIMPER, CAMANA, AREQUIPA": [ - -72.736621044444, - -16.5966737506357 - ], - "JOSE SABOGAL, SAN MARCOS, CAJAMARCA": [ - -77.9681824314284, - -7.22678675970454 - ], - "JUAN ESPINOZA MEDRANO, ANTABAMBA, APURIMAC": [ - -72.9083883019291, - -14.5586108366479 - ], - "JUAN GUERRA, SAN MARTIN, SAN MARTIN": [ - -76.3506779945106, - -6.62125805960373 - ], - "JUANJUI, MARISCAL CACERES, SAN MARTIN": [ - -76.768004482267, - -7.24481666418179 - ], - "JULCAMARCA, ANGARAES, HUANCAVELICA": [ - -74.4309536397764, - -13.0125173346266 - ], - "JULCAN, JAUJA, JUNIN": [ - -75.4288855034775, - -11.7542554712741 - ], - "JULCAN, JULCAN, LA LIBERTAD": [ - -78.4619616901307, - -8.07476734876475 - ], - "JULI, CHUCUITO, PUNO": [ - -69.5029260540657, - -16.3287178075064 - ], - "JULIACA, SAN ROMAN, PUNO": [ - -70.2155289073877, - -15.4598740376323 - ], - "JUMBILLA, BONGARA, AMAZONAS": [ - -77.8256593500305, - -5.95173996980351 - ], - "JUNIN, JUNIN, JUNIN": [ - -76.0119235566731, - -11.1888143823653 - ], - "JUSTO APU SAHUARAURA, AYMARAES, APURIMAC": [ - -73.1978175496884, - -14.1304389716043 - ], - "KAQUIABAMBA, ANDAHUAYLAS, APURIMAC": [ - -73.2794064467273, - -13.5115460436943 - ], - "KELLUYO, CHUCUITO, PUNO": [ - -69.2480151804017, - -16.7216019782086 - ], - "KIMBIRI, LA CONVENCION, CUSCO": [ - -73.6382269631562, - -12.614879219602 - ], - "KISHUARA, ANDAHUAYLAS, APURIMAC": [ - -73.1624793659387, - -13.6652521599257 - ], - "KOS\u00d1IPATA, PAUCARTAMBO, CUSCO": [ - -71.4635168167, - -13.0450542891712 - ], - "KUNTURKANKI, CANAS, CUSCO": [ - -71.2911717987154, - -14.5523439691577 - ], - "LA ARENA, PIURA, PIURA": [ - -80.7625787241597, - -5.30898220281659 - ], - "LA BANDA DE SHILCAYO, SAN MARTIN, SAN MARTIN": [ - -76.2720677181716, - -6.47746214084566 - ], - "LA BREA, TALARA, PIURA": [ - -81.108182849526, - -4.70385164375641 - ], - "LA CAPILLA, GENERAL SANCHEZ CERRO, MOQUEGUA": [ - -71.2940095258597, - -16.826032684064 - ], - "LA COIPA, SAN IGNACIO, CAJAMARCA": [ - -78.9733676055675, - -5.38984119845824 - ], - "LA CRUZ, TUMBES, TUMBES": [ - -80.5663876190569, - -3.67176707916272 - ], - "LA CUESTA, OTUZCO, LA LIBERTAD": [ - -78.6849850742976, - -7.90847527747319 - ], - "LA ESPERANZA, SANTA CRUZ, CAJAMARCA": [ - -78.859004737008, - -6.62072427434217 - ], - "LA ESPERANZA, TRUJILLO, LA LIBERTAD": [ - -79.055943790646, - -8.06341068513155 - ], - "LA FLORIDA, SAN MIGUEL, CAJAMARCA": [ - -79.1488349006001, - -6.86887896491472 - ], - "LA HUACA, PAITA, PIURA": [ - -80.9131600643639, - -5.06546309730484 - ], - "LA JALCA, CHACHAPOYAS, AMAZONAS": [ - -77.7844000042263, - -6.50359608708566 - ], - "LA JOYA, AREQUIPA, AREQUIPA": [ - -71.7957995388359, - -16.5884395606166 - ], - "LA LIBERTAD DE PALLAN, CELENDIN, CAJAMARCA": [ - -78.2860999340752, - -6.70880058859925 - ], - "LA LIBERTAD, HUARAZ, ANCASH": [ - -77.7178843835536, - -9.63677240437598 - ], - "LA MATANZA, MORROPON, PIURA": [ - -80.0828694993064, - -5.36770207299451 - ], - "LA MERCED, AIJA, ANCASH": [ - -77.6154231162455, - -9.703052525146 - ], - "LA MERCED, CHURCAMPA, HUANCAVELICA": [ - -74.3297852898877, - -12.7948943855713 - ], - "LA MOLINA, LIMA, LIMA": [ - -76.925728617994, - -12.0880856621116 - ], - "LA MORADA, MARA\u00d1ON, HUANUCO": [ - -76.3630945294797, - -8.88043406847719 - ], - "LA OROYA, YAULI, JUNIN": [ - -75.8566873496264, - -11.6052702740277 - ], - "LA PAMPA, CORONGO, ANCASH": [ - -77.8931061459428, - -8.67813902877634 - ], - "LA PECA, BAGUA, AMAZONAS": [ - -78.4454109538139, - -5.59197662393783 - ], - "LA PERLA, CALLAO, CALLAO": [ - -77.1160979212734, - -12.0702772897404 - ], - "LA PRIMAVERA, BOLOGNESI, ANCASH": [ - -77.1062856218687, - -10.3018683198042 - ], - "LA PUNTA, CALLAO, CALLAO": [ - -77.1627829273893, - -12.0716951093548 - ], - "LA RAMADA, CUTERVO, CAJAMARCA": [ - -78.5542604253341, - -6.21657299145676 - ], - "LA TINGUI\u00d1A, ICA, ICA": [ - -75.6734734403919, - -14.0107840080034 - ], - "LA UNION, DOS DE MAYO, HUANUCO": [ - -76.7946953058615, - -9.90789154732888 - ], - "LA UNION, PIURA, PIURA": [ - -80.867992118201, - -5.33287509221326 - ], - "LA UNION, TARMA, JUNIN": [ - -75.822642562988, - -11.3609955276538 - ], - "LA VICTORIA, CHICLAYO, LAMBAYEQUE": [ - -79.8610892804087, - -6.82376578078751 - ], - "LA VICTORIA, LIMA, LIMA": [ - -77.0173856344259, - -12.0723328386541 - ], - "LA YARADA LOS PALOS, TACNA, TACNA": [ - -70.4390395299144, - -18.2004256887017 - ], - "LABERINTO, TAMBOPATA, MADRE DE DIOS": [ - -69.9233606092856, - -12.5133285839869 - ], - "LACABAMBA, PALLASCA, ANCASH": [ - -77.905532601593, - -8.26579876882025 - ], - "LACHAQUI, CANTA, LIMA": [ - -76.6115962243171, - -11.5556352845022 - ], - "LAGUNAS, ALTO AMAZONAS, LORETO": [ - -75.976056368147, - -4.62833596891916 - ], - "LAGUNAS, AYABACA, PIURA": [ - -79.8533697392801, - -4.78001989953733 - ], - "LAGUNAS, CHICLAYO, LAMBAYEQUE": [ - -79.6713012371191, - -7.01442433950705 - ], - "LAHUAYTAMBO, HUAROCHIRI, LIMA": [ - -76.3918800530631, - -12.0932825713539 - ], - "LAJAS, CHOTA, CAJAMARCA": [ - -78.7274775478255, - -6.57432233616091 - ], - "LALAQUIZ, HUANCABAMBA, PIURA": [ - -79.6648826157421, - -5.17202309066159 - ], - "LAMAS, LAMAS, SAN MARTIN": [ - -76.5260971797975, - -6.3989817375489 - ], - "LAMAY, CALCA, CUSCO": [ - -71.8810882392495, - -13.3220609252004 - ], - "LAMBAYEQUE, LAMBAYEQUE, LAMBAYEQUE": [ - -79.9328371532025, - -6.67387047238273 - ], - "LAMBRAMA, ABANCAY, APURIMAC": [ - -72.7881336912718, - -13.8040203914473 - ], - "LAMPA, LAMPA, PUNO": [ - -70.4109320389638, - -15.3559573978949 - ], - "LAMPA, PAUCAR DEL SARA SARA, AYACUCHO": [ - -73.4496747992374, - -15.148468363676 - ], - "LAMPIAN, HUARAL, LIMA": [ - -76.8638324497699, - -11.2473324768315 - ], - "LAMUD, LUYA, AMAZONAS": [ - -77.9435613296459, - -6.1198896666587 - ], - "LANCONES, SULLANA, PIURA": [ - -80.5027425247715, - -4.41997317153312 - ], - "LANGA, HUAROCHIRI, LIMA": [ - -76.3756797172465, - -12.1592795115646 - ], - "LANGUI, CANAS, CUSCO": [ - -71.2974019506019, - -14.385340105416 - ], - "LARAMARCA, HUAYTARA, HUANCAVELICA": [ - -75.057273830608, - -13.9060115255224 - ], - "LARAMATE, LUCANAS, AYACUCHO": [ - -74.7662296052573, - -14.2499743850711 - ], - "LARAOS, YAUYOS, LIMA": [ - -75.6761897027286, - -12.3844899863409 - ], - "LAREDO, TRUJILLO, LA LIBERTAD": [ - -78.8550903460996, - -8.10526455954691 - ], - "LARES, CALCA, CUSCO": [ - -72.0260323683824, - -13.0860066680094 - ], - "LARI, CAYLLOMA, AREQUIPA": [ - -71.7604455185155, - -15.4799474401474 - ], - "LARIA, HUANCAVELICA, HUANCAVELICA": [ - -75.0802488943444, - -12.5532459302612 - ], - "LAS AMAZONAS, MAYNAS, LORETO": [ - -72.5289426328037, - -3.56822578515376 - ], - "LAS LOMAS, PIURA, PIURA": [ - -80.2277415397906, - -4.69210978690848 - ], - "LAS PIEDRAS, TAMBOPATA, MADRE DE DIOS": [ - -69.5393094906946, - -12.0036897677824 - ], - "LAS PIRIAS, JAEN, CAJAMARCA": [ - -78.8495902441663, - -5.63634227071634 - ], - "LAYO, CANAS, CUSCO": [ - -71.0919648095727, - -14.5287982155691 - ], - "LEIMEBAMBA, CHACHAPOYAS, AMAZONAS": [ - -77.7987079697163, - -6.80890011455197 - ], - "LEONCIO PRADO, HUAURA, LIMA": [ - -76.9185554534536, - -11.0508061429578 - ], - "LEONCIO PRADO, LUCANAS, AYACUCHO": [ - -74.6157225089164, - -14.6714813369307 - ], - "LEONOR ORDO\u00d1EZ, JAUJA, JUNIN": [ - -75.4313872965561, - -11.869133066496 - ], - "LEVANTO, CHACHAPOYAS, AMAZONAS": [ - -77.8645483870601, - -6.31429772476705 - ], - "LIMA, LIMA, LIMA": [ - -77.0488741340857, - -12.0510318836147 - ], - "LIMABAMBA, RODRIGUEZ DE MENDOZA, AMAZONAS": [ - -77.5760311618453, - -6.55307936580646 - ], - "LIMATAMBO, ANTA, CUSCO": [ - -72.4455262488306, - -13.4751053914709 - ], - "LIMBANI, SANDIA, PUNO": [ - -69.6074422813108, - -13.7784486430568 - ], - "LINCE, LIMA, LIMA": [ - -77.0356666564943, - -12.0857913986497 - ], - "LINCHA, YAUYOS, LIMA": [ - -75.6306915373648, - -12.8109440533627 - ], - "LIRCAY, ANGARAES, HUANCAVELICA": [ - -74.737559446903, - -13.1037194284544 - ], - "LIVITACA, CHUMBIVILCAS, CUSCO": [ - -71.6463323052371, - -14.3338730704294 - ], - "LLACANORA, CAJAMARCA, CAJAMARCA": [ - -78.4118458061995, - -7.18959858420461 - ], - "LLACLLIN, RECUAY, ANCASH": [ - -77.587486894671, - -10.1080377067317 - ], - "LLALLI, MELGAR, PUNO": [ - -70.9270740274521, - -14.9874569853546 - ], - "LLAMA, CHOTA, CAJAMARCA": [ - -79.1729048225211, - -6.53902353012976 - ], - "LLAMA, MARISCAL LUZURIAGA, ANCASH": [ - -77.2901408234513, - -8.9095707973677 - ], - "LLAMELLIN, ANTONIO RAYMONDI, ANCASH": [ - -77.0070169280858, - -9.08180668129321 - ], - "LLAPA, SAN MIGUEL, CAJAMARCA": [ - -78.7487035420641, - -6.89137174280869 - ], - "LLAPO, PALLASCA, ANCASH": [ - -78.0302889782042, - -8.51561813690839 - ], - "LLATA, HUAMALIES, HUANUCO": [ - -76.9032699406576, - -9.61397569038553 - ], - "LLAUTA, LUCANAS, AYACUCHO": [ - -74.9405469550763, - -14.2497891482695 - ], - "LLAYLLA, SATIPO, JUNIN": [ - -74.6489923829124, - -11.4629467242807 - ], - "LLIPA, OCROS, ANCASH": [ - -77.2144446948773, - -10.3791130733093 - ], - "LLIPATA, PALPA, ICA": [ - -75.158727488823, - -14.5946604949035 - ], - "LLOCHEGUA, HUANTA, AYACUCHO": [ - -74.0825499098418, - -12.4444380869969 - ], - "LLOCLLAPAMPA, JAUJA, JUNIN": [ - -75.6250488440914, - -11.8348413677208 - ], - "LLOQUE, GENERAL SANCHEZ CERRO, MOQUEGUA": [ - -70.6272476094311, - -16.3035765065428 - ], - "LLUMPA, MARISCAL LUZURIAGA, ANCASH": [ - -77.4563731140651, - -8.9674808141338 - ], - "LLUSCO, CHUMBIVILCAS, CUSCO": [ - -72.2364911611929, - -14.4623483067247 - ], - "LLUTA, CAYLLOMA, AREQUIPA": [ - -72.0184453267416, - -15.9676227044227 - ], - "LOBITOS, TALARA, PIURA": [ - -81.202351039794, - -4.40297227453444 - ], - "LOCROJA, CHURCAMPA, HUANCAVELICA": [ - -74.4547189626373, - -12.7173526101159 - ], - "LOCUMBA, JORGE BASADRE, TACNA": [ - -70.733067474097, - -17.6042299646114 - ], - "LOMAS, CARAVELI, AREQUIPA": [ - -74.9351411350289, - -15.3867630628007 - ], - "LONGAR, RODRIGUEZ DE MENDOZA, AMAZONAS": [ - -77.5660859638343, - -6.35105486539665 - ], - "LONGOTEA, BOLIVAR, LA LIBERTAD": [ - -77.9101180314099, - -7.05648445765294 - ], - "LONGUITA, LUYA, AMAZONAS": [ - -78.0048091161632, - -6.4073053388807 - ], - "LONYA CHICO, LUYA, AMAZONAS": [ - -78.0123758221556, - -6.20744075147243 - ], - "LONYA GRANDE, UTCUBAMBA, AMAZONAS": [ - -78.4106805111003, - -6.06348043759088 - ], - "LOS AQUIJES, ICA, ICA": [ - -75.6406125071867, - -14.0740320789036 - ], - "LOS BA\u00d1OS DEL INCA, CAJAMARCA, CAJAMARCA": [ - -78.4559728769625, - -7.09012347120905 - ], - "LOS CHANKAS, CHINCHEROS, APURIMAC": [ - -73.791393935005, - -13.3901527858419 - ], - "LOS MOROCHUCOS, CANGALLO, AYACUCHO": [ - -74.2256616236383, - -13.4942264103531 - ], - "LOS OLIVOS, LIMA, LIMA": [ - -77.0743669727161, - -11.9724226106155 - ], - "LOS ORGANOS, TALARA, PIURA": [ - -81.0641530359217, - -4.19478694576117 - ], - "LUCANAS, LUCANAS, AYACUCHO": [ - -74.3044062802277, - -14.4874501410986 - ], - "LUCMA, GRAN CHIMU, LA LIBERTAD": [ - -78.5765827939074, - -7.62997999934353 - ], - "LUCMA, MARISCAL LUZURIAGA, ANCASH": [ - -77.4451777805996, - -8.92515194743095 - ], - "LUCRE, AYMARAES, APURIMAC": [ - -73.2454538805782, - -13.915877108975 - ], - "LUCRE, QUISPICANCHI, CUSCO": [ - -71.7678315587286, - -13.6449913167289 - ], - "LUIS CARRANZA, LA MAR, AYACUCHO": [ - -73.8910056339433, - -13.2393787836886 - ], - "LUNAHUANA, CA\u00d1ETE, LIMA": [ - -76.1173833705106, - -13.0193291357444 - ], - "LURICOCHA, HUANTA, AYACUCHO": [ - -74.2744318416666, - -12.8608119883767 - ], - "LURIGANCHO, LIMA, LIMA": [ - -76.8013300576448, - -11.9584802725514 - ], - "LURIN, LIMA, LIMA": [ - -76.8011121547371, - -12.234259392255 - ], - "LUYA VIEJO, LUYA, AMAZONAS": [ - -78.1168099407179, - -6.11249523253568 - ], - "LUYA, LUYA, AMAZONAS": [ - -77.9811869260673, - -6.17185353575652 - ], - "LUYANDO, LEONCIO PRADO, HUANUCO": [ - -75.9529309377491, - -9.24011651069842 - ], - "MACA, CAYLLOMA, AREQUIPA": [ - -71.7972769813728, - -15.7313018058623 - ], - "MACARI, MELGAR, PUNO": [ - -70.9321835411255, - -14.7114187141402 - ], - "MACATE, SANTA, ANCASH": [ - -78.1219901439513, - -8.77654672781173 - ], - "MACHAGUAY, CASTILLA, AREQUIPA": [ - -72.4717592399525, - -15.6011304726549 - ], - "MACHE, OTUZCO, LA LIBERTAD": [ - -78.5338050260255, - -8.03421863768865 - ], - "MACHUPICCHU, URUBAMBA, CUSCO": [ - -72.5001588097209, - -13.2014714949172 - ], - "MACUSANI, CARABAYA, PUNO": [ - -70.4701527733859, - -14.0561766489685 - ], - "MADEAN, YAUYOS, LIMA": [ - -75.6983349944271, - -12.9611396500619 - ], - "MADRE DE DIOS, MANU, MADRE DE DIOS": [ - -70.6753725176675, - -12.6295434968971 - ], - "MADRIGAL, CAYLLOMA, AREQUIPA": [ - -71.8574428013235, - -15.5413404031596 - ], - "MAGDALENA DE CAO, ASCOPE, LA LIBERTAD": [ - -79.2999228059357, - -7.85515630157276 - ], - "MAGDALENA DEL MAR, LIMA, LIMA": [ - -77.0666944126318, - -12.0938386851282 - ], - "MAGDALENA, CAJAMARCA, CAJAMARCA": [ - -78.6223839280353, - -7.2247288445027 - ], - "MAGDALENA, CHACHAPOYAS, AMAZONAS": [ - -77.8238175383048, - -6.4205641655633 - ], - "MAJES, CAYLLOMA, AREQUIPA": [ - -72.2963652349951, - -16.3527849465361 - ], - "MALA, CA\u00d1ETE, LIMA": [ - -76.60163695937, - -12.6535003939062 - ], - "MALVAS, HUARMEY, ANCASH": [ - -77.6646918404758, - -9.92102566994703 - ], - "MAMARA, GRAU, APURIMAC": [ - -72.5667952682269, - -14.2120167370395 - ], - "MANANTAY, CORONEL PORTILLO, UCAYALI": [ - -74.5091608243491, - -8.5384458126438 - ], - "MANAS, CAJATAMBO, LIMA": [ - -77.2208089442683, - -10.6123676943159 - ], - "MANCORA, TALARA, PIURA": [ - -81.0086063079116, - -4.14830830599587 - ], - "MANCOS, YUNGAY, ANCASH": [ - -77.6501215982453, - -9.19230107533111 - ], - "MANGAS, BOLOGNESI, ANCASH": [ - -77.1047470191598, - -10.3609305787082 - ], - "MANSERICHE, DATEM DEL MARA\u00d1ON, LORETO": [ - -77.5185118691006, - -4.72759642242815 - ], - "MANTA, HUANCAVELICA, HUANCAVELICA": [ - -75.1604993668731, - -12.6087651047527 - ], - "MANU, MANU, MADRE DE DIOS": [ - -71.5183644808934, - -12.3620055356009 - ], - "MANUEL ANTONIO MESONES MURO, FERRE\u00d1AFE, LAMBAYEQUE": [ - -79.6828299457227, - -6.63533132109602 - ], - "MANZANARES, CONCEPCION, JUNIN": [ - -75.3644782797056, - -12.001889687624 - ], - "MAQUIA, REQUENA, LORETO": [ - -74.7295110771846, - -6.38533269471229 - ], - "MARA, COTABAMBAS, APURIMAC": [ - -72.1153708916017, - -14.0451411169736 - ], - "MARANGANI, CANCHIS, CUSCO": [ - -71.095631180604, - -14.3736330076097 - ], - "MARANURA, LA CONVENCION, CUSCO": [ - -72.6438218594084, - -12.9375608766095 - ], - "MARAS, URUBAMBA, CUSCO": [ - -72.1621854276445, - -13.3370025800929 - ], - "MARCA, RECUAY, ANCASH": [ - -77.45434150449, - -10.0742217699243 - ], - "MARCABAL, SANCHEZ CARRION, LA LIBERTAD": [ - -77.9416836665766, - -7.68491390053329 - ], - "MARCABAMBA, PAUCAR DEL SARA SARA, AYACUCHO": [ - -73.3791590061352, - -15.0917256483914 - ], - "MARCAPATA, QUISPICANCHI, CUSCO": [ - -70.9126788646332, - -13.6397991741552 - ], - "MARCAPOMACOCHA, YAULI, JUNIN": [ - -76.2576995512796, - -11.4048868363362 - ], - "MARCARA, CARHUAZ, ANCASH": [ - -77.4955272685212, - -9.30371162157544 - ], - "MARCAS, ACOBAMBA, HUANCAVELICA": [ - -74.3977838859997, - -12.8744263279039 - ], - "MARCAVELICA, SULLANA, PIURA": [ - -80.7849327027262, - -4.53705115451013 - ], - "MARCO, JAUJA, JUNIN": [ - -75.5677471578519, - -11.7604504514945 - ], - "MARCONA, NASCA, ICA": [ - -75.0693586349441, - -15.1424393719802 - ], - "MARCONA, NAZCA, ICA": [ - -75.0693586349441, - -15.1424393719802 - ], - "MARGOS, HUANUCO, HUANUCO": [ - -76.5331933277573, - -10.0632402868169 - ], - "MARIA PARADO DE BELLIDO, CANGALLO, AYACUCHO": [ - -74.2756632812755, - -13.5680638825207 - ], - "MARIA, LUYA, AMAZONAS": [ - -77.960795954565, - -6.49656553530174 - ], - "MARIANO DAMASO BERAUN, LEONCIO PRADO, HUANUCO": [ - -76.030566095586, - -9.39464896799868 - ], - "MARIANO MELGAR, AREQUIPA, AREQUIPA": [ - -71.4628766565431, - -16.37538374539 - ], - "MARIANO NICOLAS VALCARCEL, CAMANA, AREQUIPA": [ - -73.1361177546738, - -16.0782633814461 - ], - "MARIAS, DOS DE MAYO, HUANUCO": [ - -76.423514800007, - -9.54691876877704 - ], - "MARIATANA, HUAROCHIRI, LIMA": [ - -76.3653202992643, - -12.2616369340088 - ], - "MARISCAL BENAVIDES, RODRIGUEZ DE MENDOZA, AMAZONAS": [ - -77.4851147349923, - -6.29166387847377 - ], - "MARISCAL CACERES, CAMANA, AREQUIPA": [ - -72.832257925505, - -16.4556298968933 - ], - "MARISCAL CACERES, HUANCAVELICA, HUANCAVELICA": [ - -74.9353033718456, - -12.54792399243 - ], - "MARISCAL CASTILLA, CHACHAPOYAS, AMAZONAS": [ - -77.7699953790984, - -6.5789069483119 - ], - "MARISCAL CASTILLA, CONCEPCION, JUNIN": [ - -75.1053399317625, - -11.589055005281 - ], - "MARMOT, GRAN CHIMU, LA LIBERTAD": [ - -78.7015060837186, - -7.66253048401297 - ], - "MASIN, HUARI, ANCASH": [ - -77.0925368772189, - -9.3316198024705 - ], - "MASISEA, CORONEL PORTILLO, UCAYALI": [ - -73.6865428195806, - -8.95591229332935 - ], - "MASMA CHICCHE, JAUJA, JUNIN": [ - -75.3646618493748, - -11.7749641460405 - ], - "MASMA, JAUJA, JUNIN": [ - -75.4220187218252, - -11.7808253473452 - ], - "MATACOTO, YUNGAY, ANCASH": [ - -77.758965332339, - -9.17748956877461 - ], - "MATAHUASI, CONCEPCION, JUNIN": [ - -75.3574342501952, - -11.8818467748275 - ], - "MATALAQUE, GENERAL SANCHEZ CERRO, MOQUEGUA": [ - -70.8365565626555, - -16.5286758501109 - ], - "MATAPALO, ZARUMILLA, TUMBES": [ - -80.2285395937643, - -3.76762627331086 - ], - "MATARA, CAJAMARCA, CAJAMARCA": [ - -78.2594834710128, - -7.27201195503162 - ], - "MATO, HUAYLAS, ANCASH": [ - -77.8909653979526, - -8.95802809991649 - ], - "MATUCANA, HUAROCHIRI, LIMA": [ - -76.3794307877257, - -11.8161477184492 - ], - "MAZAMARI - PANGOA, SATIPO, JUNIN": [ - -74.3194531297738, - -11.6797432310785 - ], - "MAZAN, MAYNAS, LORETO": [ - -73.7521533440522, - -2.99371921087006 - ], - "MA\u00d1AZO, PUNO, PUNO": [ - -70.4086169830351, - -15.880794802837 - ], - "MEGANTONI, LA CONVENCION, CUSCO": [ - -72.8589183967616, - -11.7511320510681 - ], - "MEJIA, ISLAY, AREQUIPA": [ - -71.8785870452114, - -17.0356112362994 - ], - "MI PERU, CALLAO, CALLAO": [ - -77.1205556937766, - -11.8543394624239 - ], - "MICAELA BASTIDAS, GRAU, APURIMAC": [ - -72.5747000617473, - -14.1399311323565 - ], - "MIGUEL CHECA, SULLANA, PIURA": [ - -80.7884236176804, - -5.04853448525903 - ], - "MIGUEL IGLESIAS, CELENDIN, CAJAMARCA": [ - -78.2654004859709, - -6.65100562729042 - ], - "MILPUC, RODRIGUEZ DE MENDOZA, AMAZONAS": [ - -77.4136453037908, - -6.49865838513237 - ], - "MIRACOSTA, CHOTA, CAJAMARCA": [ - -79.3026174317502, - -6.35776101705834 - ], - "MIRAFLORES, AREQUIPA, AREQUIPA": [ - -71.4712787187925, - -16.3564685917444 - ], - "MIRAFLORES, HUAMALIES, HUANUCO": [ - -76.8707383274177, - -9.4496496189076 - ], - "MIRAFLORES, LIMA, LIMA": [ - -77.0289336383982, - -12.1209111982252 - ], - "MIRAFLORES, YAUYOS, LIMA": [ - -75.8892158709524, - -12.2346418576048 - ], - "MIRGAS, ANTONIO RAYMONDI, ANCASH": [ - -77.1129241118025, - -9.11603716529133 - ], - "MITO, CONCEPCION, JUNIN": [ - -75.351750042795, - -11.9288009816498 - ], - "MOCHE, TRUJILLO, LA LIBERTAD": [ - -79.0006411963477, - -8.15976077177586 - ], - "MOCHUMI, LAMBAYEQUE, LAMBAYEQUE": [ - -79.8875148358986, - -6.56281896525308 - ], - "MOHO, MOHO, PUNO": [ - -69.4476079430832, - -15.3508016908865 - ], - "MOLINO, PACHITEA, HUANUCO": [ - -76.058077278956, - -9.99639138101532 - ], - "MOLINOPAMPA, CHACHAPOYAS, AMAZONAS": [ - -77.607260356591, - -6.21243633182935 - ], - "MOLINOS, JAUJA, JUNIN": [ - -75.3392730186435, - -11.5942167442062 - ], - "MOLLEBAMBA, SANTIAGO DE CHUCO, LA LIBERTAD": [ - -77.9808115702686, - -8.12796622871925 - ], - "MOLLEBAYA, AREQUIPA, AREQUIPA": [ - -71.4738447549084, - -16.5040793950594 - ], - "MOLLENDO, ISLAY, AREQUIPA": [ - -71.8788517189548, - -16.8573765358429 - ], - "MOLLEPAMPA, CASTROVIRREYNA, HUANCAVELICA": [ - -75.4319935857278, - -13.2918879569219 - ], - "MOLLEPATA, ANTA, CUSCO": [ - -72.6231609659824, - -13.4635813818295 - ], - "MOLLEPATA, SANTIAGO DE CHUCO, LA LIBERTAD": [ - -77.9420407530216, - -8.1426211436483 - ], - "MONOBAMBA, JAUJA, JUNIN": [ - -75.2310699362786, - -11.4085686910941 - ], - "MONSEFU, CHICLAYO, LAMBAYEQUE": [ - -79.8574813037368, - -6.86572814479676 - ], - "MONTERO, AYABACA, PIURA": [ - -79.8462376103299, - -4.63797029844247 - ], - "MONTEVIDEO, CHACHAPOYAS, AMAZONAS": [ - -77.7184439761781, - -6.62809252872614 - ], - "MONZON, HUAMALIES, HUANUCO": [ - -76.3879356457359, - -9.33124435512163 - ], - "MOQUEGUA, MARISCAL NIETO, MOQUEGUA": [ - -71.0612369473049, - -17.229229464928 - ], - "MORALES, SAN MARTIN, SAN MARTIN": [ - -76.4170101107032, - -6.50806366399031 - ], - "MORCOLLA, SUCRE, AYACUCHO": [ - -73.8344595596877, - -14.1547590009075 - ], - "MORO, SANTA, ANCASH": [ - -78.1239714427425, - -9.16329111557091 - ], - "MOROCOCHA, YAULI, JUNIN": [ - -76.1233240375509, - -11.5445406818499 - ], - "MORONA, DATEM DEL MARA\u00d1ON, LORETO": [ - -77.3734689038413, - -3.67912239789789 - ], - "MORROPE, LAMBAYEQUE, LAMBAYEQUE": [ - -80.1790002336146, - -6.50615032492815 - ], - "MORROPON, MORROPON, PIURA": [ - -79.9983927972534, - -5.15272126896969 - ], - "MOSOC LLACTA, ACOMAYO, CUSCO": [ - -71.4789274422065, - -14.1006132805202 - ], - "MOTUPE, LAMBAYEQUE, LAMBAYEQUE": [ - -79.7078752984, - -6.16904660087393 - ], - "MOYA, HUANCAVELICA, HUANCAVELICA": [ - -75.1317711106081, - -12.4637718099766 - ], - "MOYOBAMBA, MOYOBAMBA, SAN MARTIN": [ - -77.1700049518847, - -5.76828168612012 - ], - "MUQUI, JAUJA, JUNIN": [ - -75.4376555160519, - -11.8384185231543 - ], - "MUQUIYAUYO, JAUJA, JUNIN": [ - -75.459321378402, - -11.8349628865 - ], - "MUSGA, MARISCAL LUZURIAGA, ANCASH": [ - -77.324563442404, - -8.893033111113 - ], - "MU\u00d1ANI, AZANGARO, PUNO": [ - -69.9802696611565, - -14.6857660542848 - ], - "NAMBALLE, SAN IGNACIO, CAJAMARCA": [ - -79.1809966283362, - -5.1072716148615 - ], - "NAMORA, CAJAMARCA, CAJAMARCA": [ - -78.2840758466042, - -7.1843640726435 - ], - "NANCHOC, SAN MIGUEL, CAJAMARCA": [ - -79.2477746491352, - -7.00851771029651 - ], - "NAPO, MAYNAS, LORETO": [ - -74.4071146194054, - -2.0991287032543 - ], - "NASCA, NASCA, ICA": [ - -75.0368861739888, - -14.8570345970964 - ], - "NASCA, NAZCA, ICA": [ - -75.0368861739888, - -14.8570345970964 - ], - "NAUTA, LORETO, LORETO": [ - -74.1142036946037, - -4.44271760847669 - ], - "NAVAN, OYON, LIMA": [ - -77.0466440360596, - -10.8571666541307 - ], - "NEPE\u00d1A, SANTA, ANCASH": [ - -78.3031918891688, - -9.14149272066427 - ], - "NESHUYA, PADRE ABAD, UCAYALI": [ - -75.0490310821598, - -8.6412985191896 - ], - "NICASIO, LAMPA, PUNO": [ - -70.2912182200641, - -15.2183563777241 - ], - "NICOLAS DE PIEROLA, CAMANA, AREQUIPA": [ - -72.6341387590988, - -16.4794450699468 - ], - "NIEPOS, SAN MIGUEL, CAJAMARCA": [ - -79.1314313207037, - -6.92671538431621 - ], - "NIEVA, CONDORCANQUI, AMAZONAS": [ - -77.9303731737118, - -4.84542434451876 - ], - "NINABAMBA, SANTA CRUZ, CAJAMARCA": [ - -78.7685546386023, - -6.69582552939792 - ], - "NINACACA, PASCO, PASCO": [ - -76.0601268104086, - -10.7920154862774 - ], - "NUEVA ARICA, CHICLAYO, LAMBAYEQUE": [ - -79.3708096063888, - -6.93129657692418 - ], - "NUEVA CAJAMARCA, RIOJA, SAN MARTIN": [ - -77.3722452475481, - -5.94435712498387 - ], - "NUEVA REQUENA, CORONEL PORTILLO, UCAYALI": [ - -75.0147707419283, - -8.1631317491471 - ], - "NUEVE DE JULIO, CONCEPCION, JUNIN": [ - -75.3146269015526, - -11.8898993177684 - ], - "NUEVO CHIMBOTE, SANTA, ANCASH": [ - -78.4359394381781, - -9.10006882852927 - ], - "NUEVO IMPERIAL, CA\u00d1ETE, LIMA": [ - -76.2585641231118, - -12.9604831095699 - ], - "NUEVO OCCORO, HUANCAVELICA, HUANCAVELICA": [ - -75.1392430844766, - -12.7077471447045 - ], - "NUEVO PROGRESO, TOCACHE, SAN MARTIN": [ - -76.2123475282516, - -8.52645739885126 - ], - "NU\u00d1OA, MELGAR, PUNO": [ - -70.67058666781, - -14.3567967235274 - ], - "OBAS, YAROWILCA, HUANUCO": [ - -76.6813198984948, - -9.82692866552509 - ], - "OCALLI, LUYA, AMAZONAS": [ - -78.2168581724036, - -6.22180639206086 - ], - "OCA\u00d1A, LUCANAS, AYACUCHO": [ - -74.8471655927826, - -14.4274632171979 - ], - "OCOBAMBA, CHINCHEROS, APURIMAC": [ - -73.5196001842792, - -13.5061222178318 - ], - "OCOBAMBA, LA CONVENCION, CUSCO": [ - -72.3620442848012, - -12.9163212701555 - ], - "OCONGATE, QUISPICANCHI, CUSCO": [ - -71.2689613314672, - -13.6876748462455 - ], - "OCORURO, ESPINAR, CUSCO": [ - -71.1389932894661, - -15.0878963173073 - ], - "OCOYO, HUAYTARA, HUANCAVELICA": [ - -75.0348083416751, - -14.0232957542565 - ], - "OCO\u00d1A, CAMANA, AREQUIPA": [ - -73.0109137123391, - -16.2779884237833 - ], - "OCROS, HUAMANGA, AYACUCHO": [ - -73.9003222394574, - -13.3926162865113 - ], - "OCROS, OCROS, ANCASH": [ - -77.3644218204572, - -10.3806100608472 - ], - "OCUCAJE, ICA, ICA": [ - -75.7807516396898, - -14.4841072007106 - ], - "OCUMAL, LUYA, AMAZONAS": [ - -78.1639926923002, - -6.34579119999819 - ], - "OCUVIRI, LAMPA, PUNO": [ - -70.8501052123344, - -15.1829174687627 - ], - "OLLACHEA, CARABAYA, PUNO": [ - -70.541262187186, - -13.741614347843 - ], - "OLLANTAYTAMBO, URUBAMBA, CUSCO": [ - -72.3164184652829, - -13.236472733276 - ], - "OLLARAYA, YUNGUYO, PUNO": [ - -68.9969556218396, - -16.2359269682706 - ], - "OLLEROS, CHACHAPOYAS, AMAZONAS": [ - -77.6709836177225, - -6.00840896849516 - ], - "OLLEROS, HUARAZ, ANCASH": [ - -77.3716447914624, - -9.62185241513224 - ], - "OLMOS, LAMBAYEQUE, LAMBAYEQUE": [ - -80.0715656823154, - -6.04759915881834 - ], - "OMACHA, PARURO, CUSCO": [ - -71.7863335259502, - -14.1397224975453 - ], - "OMAS, YAUYOS, LIMA": [ - -76.2508044513491, - -12.4763074426962 - ], - "OMATE, GENERAL SANCHEZ CERRO, MOQUEGUA": [ - -70.9629954730671, - -16.646647362942 - ], - "OMIA, RODRIGUEZ DE MENDOZA, AMAZONAS": [ - -77.3544311012303, - -6.4054073187948 - ], - "ONDORES, JUNIN, JUNIN": [ - -76.1819947478505, - -11.0914166101179 - ], - "ONGON, PATAZ, LA LIBERTAD": [ - -77.0924642894727, - -8.20580726946083 - ], - "ONGOY, CHINCHEROS, APURIMAC": [ - -73.6507037943445, - -13.4154510941468 - ], - "ORCOPAMPA, CASTILLA, AREQUIPA": [ - -72.2484958498085, - -15.1160985210165 - ], - "ORCOTUNA, CONCEPCION, JUNIN": [ - -75.3282266244481, - -11.975331649057 - ], - "ORONCCOY, LA MAR, AYACUCHO": [ - -73.3926096273292, - -13.3463273281416 - ], - "OROPESA, ANTABAMBA, APURIMAC": [ - -72.5231260882137, - -14.4359922753781 - ], - "OROPESA, QUISPICANCHI, CUSCO": [ - -71.7886508943504, - -13.5740904074178 - ], - "ORURILLO, MELGAR, PUNO": [ - -70.4876367276092, - -14.6862781583442 - ], - "OTOCA, LUCANAS, AYACUCHO": [ - -74.6602107448942, - -14.4921394942678 - ], - "OTUZCO, OTUZCO, LA LIBERTAD": [ - -78.5821299007268, - -7.84875694758682 - ], - "OXAMARCA, CELENDIN, CAJAMARCA": [ - -78.0613676757753, - -7.05934965999254 - ], - "OXAPAMPA, OXAPAMPA, PASCO": [ - -75.3708217108996, - -10.6504189091517 - ], - "OYOLO, PAUCAR DEL SARA SARA, AYACUCHO": [ - -73.1185961298016, - -15.0230523709151 - ], - "OYON, OYON, LIMA": [ - -76.7577223064341, - -10.6693981980259 - ], - "OYOTUN, CHICLAYO, LAMBAYEQUE": [ - -79.2768504543659, - -6.779639608979 - ], - "PACA, JAUJA, JUNIN": [ - -75.5284508367873, - -11.6831698144522 - ], - "PACAIPAMPA, AYABACA, PIURA": [ - -79.6488724282081, - -4.94646608413924 - ], - "PACANGA, CHEPEN, LA LIBERTAD": [ - -79.4476437868397, - -7.07970126312491 - ], - "PACAPAUSA, PARINACOCHAS, AYACUCHO": [ - -73.363023666496, - -14.9519785259769 - ], - "PACARAN, CA\u00d1ETE, LIMA": [ - -76.0704284873973, - -12.8979022279345 - ], - "PACARAOS, HUARAL, LIMA": [ - -76.6648438337268, - -11.1271420003332 - ], - "PACASMAYO, PACASMAYO, LA LIBERTAD": [ - -79.5478191938779, - -7.39990629230715 - ], - "PACAYCASA, HUAMANGA, AYACUCHO": [ - -74.2317768012717, - -13.0534338700137 - ], - "PACCARITAMBO, PARURO, CUSCO": [ - -71.9371298485789, - -13.7686709222089 - ], - "PACCHA, CHOTA, CAJAMARCA": [ - -78.3979527741554, - -6.53393769530493 - ], - "PACCHA, JAUJA, JUNIN": [ - -75.5334264756767, - -11.8800496766382 - ], - "PACCHA, YAULI, JUNIN": [ - -75.9922734740459, - -11.440121610018 - ], - "PACCHO, HUAURA, LIMA": [ - -76.9718246749537, - -10.9658600303089 - ], - "PACHACAMAC, LIMA, LIMA": [ - -76.8096200682664, - -12.1599906113138 - ], - "PACHACONAS, ANTABAMBA, APURIMAC": [ - -72.9791217981658, - -14.2190057991846 - ], - "PACHACUTEC, ICA, ICA": [ - -75.6516621411057, - -14.1604104767927 - ], - "PACHAMARCA, CHURCAMPA, HUANCAVELICA": [ - -74.4604840382805, - -12.5053404690195 - ], - "PACHANGARA, OYON, LIMA": [ - -76.7975538573393, - -10.8378643661732 - ], - "PACHAS, DOS DE MAYO, HUANUCO": [ - -76.8307409374626, - -9.69197499153229 - ], - "PACHIA, TACNA, TACNA": [ - -70.0235939608744, - -17.7848033834727 - ], - "PACHIZA, MARISCAL CACERES, SAN MARTIN": [ - -77.043321340248, - -6.96921281995337 - ], - "PACLLON, BOLOGNESI, ANCASH": [ - -77.0034119227313, - -10.2389242228134 - ], - "PACOBAMBA, ANDAHUAYLAS, APURIMAC": [ - -73.1296940687419, - -13.5360383367076 - ], - "PACOCHA, ILO, MOQUEGUA": [ - -71.3594382479038, - -17.4394611752012 - ], - "PACORA, LAMBAYEQUE, LAMBAYEQUE": [ - -79.879923389532, - -6.43408333720884 - ], - "PACUCHA, ANDAHUAYLAS, APURIMAC": [ - -73.3090528481339, - -13.5983271171654 - ], - "PADRE ABAD, PADRE ABAD, UCAYALI": [ - -75.6259546064887, - -8.89861017135788 - ], - "PADRE MARQUEZ, UCAYALI, LORETO": [ - -74.9143173100919, - -7.87940345423282 - ], - "PAICO, SUCRE, AYACUCHO": [ - -73.6665905684395, - -14.012591349106 - ], - "PAIJAN, ASCOPE, LA LIBERTAD": [ - -79.3021210835922, - -7.72870676253064 - ], - "PAIMAS, AYABACA, PIURA": [ - -80.0048896019458, - -4.63701155074858 - ], - "PAITA, PAITA, PIURA": [ - -81.0554208193501, - -5.16720016685149 - ], - "PAJARILLO, MARISCAL CACERES, SAN MARTIN": [ - -76.6356068923382, - -7.31517989390713 - ], - "PALCA, HUANCAVELICA, HUANCAVELICA": [ - -74.9791371498617, - -12.6695814166853 - ], - "PALCA, LAMPA, PUNO": [ - -70.6093904646853, - -15.2993186406191 - ], - "PALCA, TACNA, TACNA": [ - -69.7640323637427, - -17.6569417741457 - ], - "PALCA, TARMA, JUNIN": [ - -75.505163611394, - -11.3171573415664 - ], - "PALCAMAYO, TARMA, JUNIN": [ - -75.7778261440614, - -11.2701925934185 - ], - "PALCAZU, OXAPAMPA, PASCO": [ - -75.2761401162079, - -10.2343613805951 - ], - "PALLANCHACRA, PASCO, PASCO": [ - -76.2514612473444, - -10.4221567481681 - ], - "PALLASCA, PALLASCA, ANCASH": [ - -78.0048637386526, - -8.26343889504962 - ], - "PALLPATA, ESPINAR, CUSCO": [ - -71.0911325449141, - -14.9073549300055 - ], - "PALPA, PALPA, ICA": [ - -75.1315751412953, - -14.4897349513109 - ], - "PAMPA HERMOSA, SATIPO, JUNIN": [ - -74.8418596714676, - -11.4137619367243 - ], - "PAMPA HERMOSA, UCAYALI, LORETO": [ - -75.769709714124, - -7.30260249320946 - ], - "PAMPACHIRI, ANDAHUAYLAS, APURIMAC": [ - -73.4785255922603, - -14.2960427315243 - ], - "PAMPACOLCA, CASTILLA, AREQUIPA": [ - -72.6190588315354, - -15.6707754786091 - ], - "PAMPAMARCA, CANAS, CUSCO": [ - -71.4465582440009, - -14.1418042247955 - ], - "PAMPAMARCA, LA UNION, AREQUIPA": [ - -72.930220533491, - -14.9895723562505 - ], - "PAMPAMARCA, YAROWILCA, HUANUCO": [ - -76.7077539949642, - -9.76588508897891 - ], - "PAMPAROMAS, HUAYLAS, ANCASH": [ - -77.9570270837913, - -9.14324183981775 - ], - "PAMPAS CHICO, RECUAY, ANCASH": [ - -77.3732343692553, - -10.094083609591 - ], - "PAMPAS DE HOSPITAL, TUMBES, TUMBES": [ - -80.356357643768, - -3.85174896007502 - ], - "PAMPAS GRANDE, HUARAZ, ANCASH": [ - -77.9103139557044, - -9.64574337333204 - ], - "PAMPAS, PALLASCA, ANCASH": [ - -77.7988390835486, - -8.13850969719521 - ], - "PAMPAS, TAYACAJA, HUANCAVELICA": [ - -74.8517010124255, - -12.4513402392156 - ], - "PANAO, PACHITEA, HUANUCO": [ - -75.8967352690716, - -10.1483680387214 - ], - "PANCAN, JAUJA, JUNIN": [ - -75.4990280205814, - -11.7475124947148 - ], - "PAPAPLAYA, SAN MARTIN, SAN MARTIN": [ - -75.6382217463478, - -6.2429518628271 - ], - "PAPAYAL, ZARUMILLA, TUMBES": [ - -80.2887581439179, - -3.5720648046655 - ], - "PARACAS, PISCO, ICA": [ - -76.1578071404387, - -14.0469258448643 - ], - "PARAMONGA, BARRANCA, LIMA": [ - -77.7421653584229, - -10.4864470366984 - ], - "PARANDAY, OTUZCO, LA LIBERTAD": [ - -78.6989050434023, - -7.88841225069145 - ], - "PARARCA, PAUCAR DEL SARA SARA, AYACUCHO": [ - -73.4523132130041, - -15.2057223398156 - ], - "PARARIN, RECUAY, ANCASH": [ - -77.6538171122822, - -10.119214747952 - ], - "PARAS, CANGALLO, AYACUCHO": [ - -74.7195768806379, - -13.4607686764291 - ], - "PARATIA, LAMPA, PUNO": [ - -70.7047557834836, - -15.4675470709591 - ], - "PARCO, JAUJA, JUNIN": [ - -75.5406010092633, - -11.8206162791704 - ], - "PARCONA, ICA, ICA": [ - -75.7004484505553, - -14.0568669771549 - ], - "PARCOY, PATAZ, LA LIBERTAD": [ - -77.5098479004498, - -7.99324039134359 - ], - "PARDO MIGUEL, RIOJA, SAN MARTIN": [ - -77.6341464590917, - -5.74870970826647 - ], - "PARIACOTO, HUARAZ, ANCASH": [ - -77.7946172029061, - -9.48122879874022 - ], - "PARIAHUANCA, CARHUAZ, ANCASH": [ - -77.5741964031055, - -9.3560186615653 - ], - "PARIAHUANCA, HUANCAYO, JUNIN": [ - -74.8769760533143, - -11.9521795896219 - ], - "PARINARI, LORETO, LORETO": [ - -74.8635630462879, - -5.03894572341682 - ], - "PARI\u00d1AS, TALARA, PIURA": [ - -81.0435295834974, - -4.49884875198225 - ], - "PAROBAMBA, POMABAMBA, ANCASH": [ - -77.3953133828396, - -8.61275308687886 - ], - "PARURO, PARURO, CUSCO": [ - -71.8557031789722, - -13.7266732919829 - ], - "PASTAZA, DATEM DEL MARA\u00d1ON, LORETO": [ - -76.6377392595385, - -4.27660777656263 - ], - "PATAMBUCO, SANDIA, PUNO": [ - -69.6312350982406, - -14.3101068921457 - ], - "PATAPO, CHICLAYO, LAMBAYEQUE": [ - -79.5857536872436, - -6.70893093190475 - ], - "PATAYPAMPA, GRAU, APURIMAC": [ - -72.757738748824, - -14.2260595993917 - ], - "PATAZ, PATAZ, LA LIBERTAD": [ - -77.589546138206, - -7.73245137978085 - ], - "PATIVILCA, BARRANCA, LIMA": [ - -77.6859595022531, - -10.6233592093104 - ], - "PAUCAR, DANIEL ALCIDES CARRION, PASCO": [ - -76.4172799425044, - -10.3408711375571 - ], - "PAUCARA, ACOBAMBA, HUANCAVELICA": [ - -74.7273884965225, - -12.7230617034021 - ], - "PAUCARBAMBA, CHURCAMPA, HUANCAVELICA": [ - -74.5261869657804, - -12.5691526967523 - ], - "PAUCARCOLLA, PUNO, PUNO": [ - -70.0671457660859, - -15.726288394989 - ], - "PAUCARPATA, AREQUIPA, AREQUIPA": [ - -71.4779991022798, - -16.4200700684694 - ], - "PAUCARTAMBO, PASCO, PASCO": [ - -75.7733564362593, - -10.7588948077933 - ], - "PAUCARTAMBO, PAUCARTAMBO, CUSCO": [ - -71.4640607254327, - -13.3013731710033 - ], - "PAUCAS, HUARI, ANCASH": [ - -76.8839604237208, - -9.1510910565269 - ], - "PAUSA, PAUCAR DEL SARA SARA, AYACUCHO": [ - -73.3579317669224, - -15.3207078604774 - ], - "PAZOS, TAYACAJA, HUANCAVELICA": [ - -75.0262852248734, - -12.2216526835938 - ], - "PEBAS, MARISCAL RAMON CASTILLA, LORETO": [ - -71.9646746485712, - -3.43271194596031 - ], - "PEDRO GALVEZ, SAN MARCOS, CAJAMARCA": [ - -78.1712498974717, - -7.3291583053747 - ], - "PEDRO VILCA APAZA, SAN ANTONIO DE PUTINA, PUNO": [ - -69.9142503268698, - -15.018386549156 - ], - "PERENE, CHANCHAMAYO, JUNIN": [ - -75.0759840260204, - -10.9401998408849 - ], - "PHARA, SANDIA, PUNO": [ - -69.585045678749, - -14.0678730679613 - ], - "PIAS, PATAZ, LA LIBERTAD": [ - -77.4874497753968, - -7.89367858826597 - ], - "PICHACANI, PUNO, PUNO": [ - -70.1584593210181, - -16.2398956288924 - ], - "PICHANAQUI, CHANCHAMAYO, JUNIN": [ - -74.8687644509924, - -11.025028863992 - ], - "PICHARI, LA CONVENCION, CUSCO": [ - -73.8103496694461, - -12.3681391773592 - ], - "PICHIGUA, ESPINAR, CUSCO": [ - -71.3437551043875, - -14.6793410444862 - ], - "PICHIRHUA, ABANCAY, APURIMAC": [ - -73.0317318117992, - -13.7847877178602 - ], - "PICHOS, TAYACAJA, HUANCAVELICA": [ - -74.9333640353104, - -12.1814389110528 - ], - "PICOTA, PICOTA, SAN MARTIN": [ - -76.3315754017197, - -6.96450203776762 - ], - "PICSI, CHICLAYO, LAMBAYEQUE": [ - -79.7725787094762, - -6.71639329009776 - ], - "PILCHACA, HUANCAVELICA, HUANCAVELICA": [ - -75.0889916316301, - -12.4136140520906 - ], - "PILCOMAYO, HUANCAYO, JUNIN": [ - -75.2542301519201, - -12.0474749744505 - ], - "PILCUYO, EL COLLAO, PUNO": [ - -69.508623109136, - -16.0958294470911 - ], - "PILLCO MARCA, HUANUCO, HUANUCO": [ - -76.2812487825766, - -10.0403786217308 - ], - "PILLPINTO, PARURO, CUSCO": [ - -71.7691386398261, - -13.9748416608336 - ], - "PILLUANA, PICOTA, SAN MARTIN": [ - -76.2689700501988, - -6.78342256100002 - ], - "PILPICHACA, HUAYTARA, HUANCAVELICA": [ - -74.9462112426934, - -13.4095487011544 - ], - "PIMENTEL, CHICLAYO, LAMBAYEQUE": [ - -79.9034477036712, - -6.79933111437028 - ], - "PIMPINGOS, CUTERVO, CAJAMARCA": [ - -78.7682740186417, - -6.07091210096749 - ], - "PINRA, HUACAYBAMBA, HUANUCO": [ - -77.0007724909543, - -8.91437358150474 - ], - "PINTO RECODO, LAMAS, SAN MARTIN": [ - -76.7129854869081, - -6.15779866921574 - ], - "PION, CHOTA, CAJAMARCA": [ - -78.4787661061695, - -6.18346707771034 - ], - "PIRA, HUARAZ, ANCASH": [ - -77.6939773692028, - -9.52096305124683 - ], - "PISAC, CALCA, CUSCO": [ - -71.8083458641192, - -13.3891385222195 - ], - "PISACOMA, CHUCUITO, PUNO": [ - -69.4476951294387, - -16.9312611332635 - ], - "PISCO, PISCO, ICA": [ - -76.190037819193, - -13.7021784845035 - ], - "PISCOBAMBA, MARISCAL LUZURIAGA, ANCASH": [ - -77.3532340553559, - -8.86212116009016 - ], - "PISCOYACU, HUALLAGA, SAN MARTIN": [ - -76.834184166379, - -7.01413362174884 - ], - "PISUQUIA, LUYA, AMAZONAS": [ - -78.0862589745845, - -6.47473052273269 - ], - "PITIPO, FERRE\u00d1AFE, LAMBAYEQUE": [ - -79.6347838427313, - -6.4862446137273 - ], - "PITUMARCA, CANCHIS, CUSCO": [ - -71.1581667044718, - -13.8887915444732 - ], - "PIURA, PIURA, PIURA": [ - -80.6585271316619, - -5.08199180568756 - ], - "PLATERIA, PUNO, PUNO": [ - -69.8604442019397, - -15.9814905779302 - ], - "POCOHUANCA, AYMARAES, APURIMAC": [ - -73.0876777330495, - -14.2240114681324 - ], - "POCOLLAY, TACNA, TACNA": [ - -70.0740241587771, - -18.0077492346691 - ], - "POCSI, AREQUIPA, AREQUIPA": [ - -71.3321750108357, - -16.4988868931829 - ], - "POLOBAYA, AREQUIPA, AREQUIPA": [ - -71.3574228753564, - -16.6419871585026 - ], - "POLVORA, TOCACHE, SAN MARTIN": [ - -76.798964077461, - -8.0156336782281 - ], - "POMABAMBA, POMABAMBA, ANCASH": [ - -77.5065263109566, - -8.79036933172516 - ], - "POMACANCHA, JAUJA, JUNIN": [ - -75.6891758906002, - -11.6328906106352 - ], - "POMACANCHI, ACOMAYO, CUSCO": [ - -71.6238979679658, - -14.0536371359069 - ], - "POMACOCHA, ACOBAMBA, HUANCAVELICA": [ - -74.520015371488, - -12.8615713464133 - ], - "POMACOCHA, ANDAHUAYLAS, APURIMAC": [ - -73.4920988533968, - -14.0962803494803 - ], - "POMAHUACA, JAEN, CAJAMARCA": [ - -79.1951178681958, - -5.87539688212403 - ], - "POMALCA, CHICLAYO, LAMBAYEQUE": [ - -79.7590206450002, - -6.78177487784878 - ], - "POMATA, CHUCUITO, PUNO": [ - -69.2882222098296, - -16.3566600390196 - ], - "PONTO, HUARI, ANCASH": [ - -76.9848719752412, - -9.34738118580618 - ], - "POROTO, TRUJILLO, LA LIBERTAD": [ - -78.7540110521668, - -8.03527287293158 - ], - "POROY, CUSCO, CUSCO": [ - -72.0422993622185, - -13.5019171390806 - ], - "POSIC, RIOJA, SAN MARTIN": [ - -77.1721678995265, - -5.98282040579629 - ], - "POTONI, AZANGARO, PUNO": [ - -70.0921737719215, - -14.4164190728675 - ], - "POZUZO, OXAPAMPA, PASCO": [ - -75.5862737962268, - -10.1327283418767 - ], - "PROGRESO, GRAU, APURIMAC": [ - -72.4470150321754, - -14.0986839044884 - ], - "PROVIDENCIA, LUYA, AMAZONAS": [ - -78.2918470876264, - -6.30756494959082 - ], - "PUCACACA, PICOTA, SAN MARTIN": [ - -76.3630476366498, - -6.84023200154123 - ], - "PUCACOLPA, HUANTA, AYACUCHO": [ - -74.3829865494872, - -12.3394997357963 - ], - "PUCALA, CHICLAYO, LAMBAYEQUE": [ - -79.5137212156405, - -6.79463043190599 - ], - "PUCARA, HUANCAYO, JUNIN": [ - -75.1005148131942, - -12.1801997634541 - ], - "PUCARA, JAEN, CAJAMARCA": [ - -79.1236611015041, - -6.04002001500439 - ], - "PUCARA, LAMPA, PUNO": [ - -70.4505278253229, - -15.0794683295889 - ], - "PUCAYACU, LEONCIO PRADO, HUANUCO": [ - -76.0645662003544, - -8.56479857897196 - ], - "PUCUSANA, LIMA, LIMA": [ - -76.7756251714908, - -12.4658382705685 - ], - "PUCYURA, ANTA, CUSCO": [ - -72.0936319933256, - -13.4846822110606 - ], - "PUEBLO LIBRE, HUAYLAS, ANCASH": [ - -77.8187251031009, - -9.14870455197108 - ], - "PUEBLO LIBRE, LIMA, LIMA": [ - -77.0657431790067, - -12.07508405756 - ], - "PUEBLO NUEVO, CHEPEN, LA LIBERTAD": [ - -79.5863727119727, - -7.19223698303161 - ], - "PUEBLO NUEVO, CHINCHA, ICA": [ - -76.0888844611066, - -13.2584493386944 - ], - "PUEBLO NUEVO, FERRE\u00d1AFE, LAMBAYEQUE": [ - -79.824432706978, - -6.62983026646256 - ], - "PUEBLO NUEVO, ICA, ICA": [ - -75.6758091564898, - -14.1245132259924 - ], - "PUEBLO NUEVO, LEONCIO PRADO, HUANUCO": [ - -76.0013685060327, - -9.08219785099789 - ], - "PUENTE PIEDRA, LIMA, LIMA": [ - -77.0866514105377, - -11.8721278036553 - ], - "PUERTO BERMUDEZ, OXAPAMPA, PASCO": [ - -74.6367359177403, - -10.4140233819886 - ], - "PUERTO INCA, PUERTO INCA, HUANUCO": [ - -74.9668485206468, - -9.28893369585593 - ], - "PUINAHUA, REQUENA, LORETO": [ - -74.8864168088715, - -5.64475543852456 - ], - "PULAN, SANTA CRUZ, CAJAMARCA": [ - -78.9212127830426, - -6.74627687912506 - ], - "PULLO, PARINACOCHAS, AYACUCHO": [ - -73.98449274425, - -15.3331746994185 - ], - "PUNCHANA, MAYNAS, LORETO": [ - -73.4544452989397, - -3.53867544051728 - ], - "PUNCHAO, HUAMALIES, HUANUCO": [ - -76.8359043267763, - -9.44141266107263 - ], - "PUNO, PUNO, PUNO": [ - -70.063677025949, - -15.9050032049924 - ], - "PUNTA DE BOMBON, ISLAY, AREQUIPA": [ - -71.5507240668041, - -17.1600354074123 - ], - "PUNTA HERMOSA, LIMA, LIMA": [ - -76.7437898089112, - -12.269272112482 - ], - "PUNTA NEGRA, LIMA, LIMA": [ - -76.7094504639387, - -12.3036413229941 - ], - "PUQUINA, GENERAL SANCHEZ CERRO, MOQUEGUA": [ - -71.1572683792161, - -16.6282949868892 - ], - "PUQUIO, LUCANAS, AYACUCHO": [ - -74.016281977462, - -14.6763018880718 - ], - "PURUS, PURUS, UCAYALI": [ - -71.5823156313121, - -10.3734946801367 - ], - "PUSI, HUANCANE, PUNO": [ - -69.9896661408454, - -15.4409192993609 - ], - "PUTINA, SAN ANTONIO DE PUTINA, PUNO": [ - -69.8344863236701, - -14.7091661303509 - ], - "PUTINZA, YAUYOS, LIMA": [ - -75.9227687928709, - -12.6665109363051 - ], - "PUTUMAYO, PUTUMAYO, LORETO": [ - -72.7839065834812, - -2.46877140991324 - ], - "PUYCA, LA UNION, AREQUIPA": [ - -72.5471840107685, - -14.9389606511837 - ], - "PUYUSCA, PARINACOCHAS, AYACUCHO": [ - -73.5976263644899, - -15.2820812954191 - ], - "PU\u00d1OS, HUAMALIES, HUANUCO": [ - -76.8968717172946, - -9.50306610898908 - ], - "QUECHUALLA, LA UNION, AREQUIPA": [ - -73.0704268348698, - -15.2898099847784 - ], - "QUEHUE, CANAS, CUSCO": [ - -71.489506024586, - -14.3656907940811 - ], - "QUELLOUNO, LA CONVENCION, CUSCO": [ - -72.4450699920914, - -12.5071221019803 - ], - "QUEQUE\u00d1A, AREQUIPA, AREQUIPA": [ - -71.4432123317633, - -16.5441759230592 - ], - "QUERCO, HUAYTARA, HUANCAVELICA": [ - -74.8827240008861, - -13.882865437197 - ], - "QUERECOTILLO, SULLANA, PIURA": [ - -80.6042677139141, - -4.72609208454544 - ], - "QUEROBAMBA, SUCRE, AYACUCHO": [ - -73.8048278438998, - -13.9948167244197 - ], - "QUEROCOTILLO, CUTERVO, CAJAMARCA": [ - -79.09164310362, - -6.19681501348958 - ], - "QUEROCOTO, CHOTA, CAJAMARCA": [ - -79.092933457814, - -6.35217480822091 - ], - "QUEROPALCA, LAURICOCHA, HUANUCO": [ - -76.8658581595843, - -10.1875138850734 - ], - "QUIACA, SANDIA, PUNO": [ - -69.3561899547599, - -14.467273537314 - ], - "QUICACHA, CARAVELI, AREQUIPA": [ - -73.7303800493425, - -15.5673607491934 - ], - "QUICHES, SIHUAS, ANCASH": [ - -77.5097555312464, - -8.39597585929514 - ], - "QUICHUAS, TAYACAJA, HUANCAVELICA": [ - -74.7274045500083, - -12.4677947846034 - ], - "QUICHUAY, HUANCAYO, JUNIN": [ - -75.248667675123, - -11.8456037380016 - ], - "QUILAHUANI, CANDARAVE, TACNA": [ - -70.2567520804931, - -17.3328717960138 - ], - "QUILCA, CAMANA, AREQUIPA": [ - -72.3518949423952, - -16.7007142365461 - ], - "QUILCAPUNCU, SAN ANTONIO DE PUTINA, PUNO": [ - -69.6393111714715, - -14.8469682200116 - ], - "QUILCAS, HUANCAYO, JUNIN": [ - -75.1661565084046, - -11.8822453870854 - ], - "QUILLO, YUNGAY, ANCASH": [ - -77.9490314807011, - -9.31686588300189 - ], - "QUILMANA, CA\u00d1ETE, LIMA": [ - -76.3452769043684, - -12.869568745968 - ], - "QUINCHES, YAUYOS, LIMA": [ - -76.0917398429024, - -12.3115469713658 - ], - "QUINISTAQUILLAS, GENERAL SANCHEZ CERRO, MOQUEGUA": [ - -70.8798235297165, - -16.7042107920899 - ], - "QUINJALCA, CHACHAPOYAS, AMAZONAS": [ - -77.685503984317, - -6.10813800371406 - ], - "QUINOCAY, YAUYOS, LIMA": [ - -76.2843173931518, - -12.3506381633071 - ], - "QUINUA, HUAMANGA, AYACUCHO": [ - -74.1345422193468, - -13.0614055839569 - ], - "QUINUABAMBA, POMABAMBA, ANCASH": [ - -77.3436941039468, - -8.70232612136309 - ], - "QUIQUIJANA, QUISPICANCHI, CUSCO": [ - -71.5331691727794, - -13.8056124883287 - ], - "QUIRUVILCA, SANTIAGO DE CHUCO, LA LIBERTAD": [ - -78.2511136199463, - -8.01474149366173 - ], - "QUISHUAR, TAYACAJA, HUANCAVELICA": [ - -74.7672173638797, - -12.2497668134813 - ], - "QUISQUI (KICHKI), HUANUCO, HUANUCO": [ - -76.4208027182527, - -9.86924689411465 - ], - "QUITO-ARMA, HUAYTARA, HUANCAVELICA": [ - -75.4060124031395, - -13.5386390273278 - ], - "QUIVILLA, DOS DE MAYO, HUANUCO": [ - -76.687271308623, - -9.57602370128878 - ], - "QUI\u00d1OTA, CHUMBIVILCAS, CUSCO": [ - -72.2052388745054, - -14.3772305425685 - ], - "RAGASH, SIHUAS, ANCASH": [ - -77.696031185026, - -8.45479692591295 - ], - "RAHUAPAMPA, HUARI, ANCASH": [ - -77.0627115759208, - -9.35563179434505 - ], - "RAIMONDI, ATALAYA, UCAYALI": [ - -73.4365950840762, - -10.5861738860233 - ], - "RAMON CASTILLA, MARISCAL RAMON CASTILLA, LORETO": [ - -70.8361348303932, - -3.67749669371321 - ], - "RANRACANCHA, CHINCHEROS, APURIMAC": [ - -73.5963018008872, - -13.5476379529812 - ], - "RANRAHIRCA, YUNGAY, ANCASH": [ - -77.6966869516465, - -9.16011397832934 - ], - "RAPAYAN, HUARI, ANCASH": [ - -76.776014765392, - -9.27214112976368 - ], - "RAZURI, ASCOPE, LA LIBERTAD": [ - -79.3715126118922, - -7.68689062997937 - ], - "RECTA, BONGARA, AMAZONAS": [ - -77.775358670737, - -5.93922123435411 - ], - "RECUAY, RECUAY, ANCASH": [ - -77.447425578561, - -9.70646540836033 - ], - "REQUE, CHICLAYO, LAMBAYEQUE": [ - -79.7941930819499, - -6.86348163994451 - ], - "REQUENA, REQUENA, LORETO": [ - -73.8823435082809, - -5.32824080387914 - ], - "RICARDO PALMA, HUAROCHIRI, LIMA": [ - -76.6229549960254, - -11.9377558474032 - ], - "RICRAN, JAUJA, JUNIN": [ - -75.4575208044187, - -11.5600317723153 - ], - "RIMAC, LIMA, LIMA": [ - -77.0326772610911, - -12.0235838177382 - ], - "RINCONADA LLICUAR, SECHURA, PIURA": [ - -80.7743550178165, - -5.48207978233202 - ], - "RIO GRANDE, CONDESUYOS, AREQUIPA": [ - -73.1265474157563, - -15.8808777060053 - ], - "RIO GRANDE, PALPA, ICA": [ - -75.147570565322, - -14.3457037513205 - ], - "RIO NEGRO, SATIPO, JUNIN": [ - -74.6909676556607, - -11.103172005835 - ], - "RIO SANTIAGO, CONDORCANQUI, AMAZONAS": [ - -77.8881145418222, - -3.8134497314307 - ], - "RIO TAMBO, SATIPO, JUNIN": [ - -73.8144351132148, - -11.5310047112373 - ], - "RIOJA, RIOJA, SAN MARTIN": [ - -77.2098953061679, - -6.0786884250297 - ], - "RIPAN, DOS DE MAYO, HUANUCO": [ - -76.8436913575414, - -9.81053293539821 - ], - "ROBLE, TAYACAJA, HUANCAVELICA": [ - -74.4578623689465, - -12.2360288930304 - ], - "ROCCHACC, CHINCHEROS, APURIMAC": [ - -73.617226846261, - -13.4555662585194 - ], - "RONDOCAN, ACOMAYO, CUSCO": [ - -71.7654035755654, - -13.7876322223758 - ], - "RONDOS, LAURICOCHA, HUANUCO": [ - -76.7204353785546, - -9.96848729212744 - ], - "ROSA PANDURO, PUTUMAYO, LORETO": [ - -73.8657207070731, - -1.55841373418676 - ], - "ROSARIO, ACOBAMBA, HUANCAVELICA": [ - -74.5999404048129, - -12.7423265904731 - ], - "ROSASPATA, HUANCANE, PUNO": [ - -69.487429327592, - -15.2095106723763 - ], - "RUMISAPA, LAMAS, SAN MARTIN": [ - -76.4725723592101, - -6.44375616616409 - ], - "RUPA-RUPA, LEONCIO PRADO, HUANUCO": [ - -76.1041061421126, - -9.19118487308078 - ], - "SABAINO, ANTABAMBA, APURIMAC": [ - -72.9801581086528, - -14.3229723896077 - ], - "SABANDIA, AREQUIPA, AREQUIPA": [ - -71.4602063149999, - -16.4482665970118 - ], - "SACANCHE, HUALLAGA, SAN MARTIN": [ - -76.7628091557476, - -7.08954700314048 - ], - "SACHACA, AREQUIPA, AREQUIPA": [ - -71.5762452016594, - -16.4211693167109 - ], - "SACSAMARCA, HUANCA SANCOS, AYACUCHO": [ - -74.2225628311509, - -13.9839748421296 - ], - "SAISA, LUCANAS, AYACUCHO": [ - -74.3744851086421, - -14.9558838891848 - ], - "SALAMANCA, CONDESUYOS, AREQUIPA": [ - -72.6974434700739, - -15.4061671402895 - ], - "SALAS, ICA, ICA": [ - -75.875777704139, - -13.9217606869883 - ], - "SALAS, LAMBAYEQUE, LAMBAYEQUE": [ - -79.5379482346434, - -6.15088718450674 - ], - "SALAVERRY, TRUJILLO, LA LIBERTAD": [ - -78.8989141795414, - -8.25392014263905 - ], - "SALCABAMBA, TAYACAJA, HUANCAVELICA": [ - -74.7832321984786, - -12.1949168321819 - ], - "SALCAHUASI, TAYACAJA, HUANCAVELICA": [ - -74.7514426975928, - -12.1065086684299 - ], - "SALITRAL, MORROPON, PIURA": [ - -79.8277046840937, - -5.43705456139758 - ], - "SALITRAL, SULLANA, PIURA": [ - -80.6832537495019, - -4.83830060989439 - ], - "SALLIQUE, JAEN, CAJAMARCA": [ - -79.3120772248498, - -5.62557760376588 - ], - "SALPO, OTUZCO, LA LIBERTAD": [ - -78.6362747076278, - -8.03289550960087 - ], - "SAMA, TACNA, TACNA": [ - -70.6676920127319, - -17.9569866749461 - ], - "SAMAN, AZANGARO, PUNO": [ - -70.0168514081479, - -15.2698484352032 - ], - "SAMANCO, SANTA, ANCASH": [ - -78.442452894877, - -9.27947031461358 - ], - "SAMEGUA, MARISCAL NIETO, MOQUEGUA": [ - -70.8526004521463, - -17.1566784684127 - ], - "SAMUEL PASTOR, CAMANA, AREQUIPA": [ - -72.6524473304868, - -16.6013386971611 - ], - "SAMUGARI, LA MAR, AYACUCHO": [ - -73.7207445897747, - -12.8602497771964 - ], - "SAN AGUSTIN, HUANCAYO, JUNIN": [ - -75.2344784796031, - -11.9890090903602 - ], - "SAN ANDRES DE CUTERVO, CUTERVO, CAJAMARCA": [ - -78.7423287544127, - -6.22407305704891 - ], - "SAN ANDRES DE TUPICOCHA, HUAROCHIRI, LIMA": [ - -76.4580384183596, - -11.9880606911325 - ], - "SAN ANDRES, PISCO, ICA": [ - -76.1068457732641, - -13.8042052153596 - ], - "SAN ANTON, AZANGARO, PUNO": [ - -70.25669660063, - -14.5226212027112 - ], - "SAN ANTONIO DE ANTAPARCO, ANGARAES, HUANCAVELICA": [ - -74.4306676479562, - -13.0655211860594 - ], - "SAN ANTONIO DE CACHI, ANDAHUAYLAS, APURIMAC": [ - -73.6575829429929, - -13.789481181588 - ], - "SAN ANTONIO DE CHUCA, CAYLLOMA, AREQUIPA": [ - -71.097492334096, - -15.8309291705688 - ], - "SAN ANTONIO DE CUSICANCHA, HUAYTARA, HUANCAVELICA": [ - -75.2376815464031, - -13.465417715031 - ], - "SAN ANTONIO, CA\u00d1ETE, LIMA": [ - -76.6741515380091, - -12.6132206636229 - ], - "SAN ANTONIO, GRAU, APURIMAC": [ - -72.6062420978175, - -14.1756499580749 - ], - "SAN ANTONIO, HUAROCHIRI, LIMA": [ - -76.7735595246577, - -11.8166490942047 - ], - "SAN ANTONIO, PUNO, PUNO": [ - -70.3023606995469, - -16.0802761459315 - ], - "SAN ANTONIO, SAN MARTIN, SAN MARTIN": [ - -76.3820896623653, - -6.39934333866806 - ], - "SAN BARTOLO, LIMA, LIMA": [ - -76.7241409241258, - -12.3693753155603 - ], - "SAN BARTOLOME, HUAROCHIRI, LIMA": [ - -76.5013128348331, - -11.9140934822067 - ], - "SAN BENITO, CONTUMAZA, CAJAMARCA": [ - -78.9623270693415, - -7.50280601502796 - ], - "SAN BERNARDINO, SAN PABLO, CAJAMARCA": [ - -78.7856571104043, - -7.1749820867193 - ], - "SAN BORJA, LIMA, LIMA": [ - -76.9952085585793, - -12.0975463369304 - ], - "SAN BUENAVENTURA, CANTA, LIMA": [ - -76.662937430525, - -11.4405027109143 - ], - "SAN BUENAVENTURA, MARA\u00d1ON, HUANUCO": [ - -77.1480332158705, - -8.76878663976682 - ], - "SAN CARLOS, BONGARA, AMAZONAS": [ - -77.8790593251738, - -5.99638875600878 - ], - "SAN CLEMENTE, PISCO, ICA": [ - -76.1429752728888, - -13.6420735538562 - ], - "SAN CRISTOBAL DE RAJAN, OCROS, ANCASH": [ - -77.2284332397196, - -10.4156640622405 - ], - "SAN CRISTOBAL, LUCANAS, AYACUCHO": [ - -74.2543576514999, - -14.7917829603646 - ], - "SAN CRISTOBAL, LUYA, AMAZONAS": [ - -77.9634096332117, - -6.08415657280564 - ], - "SAN CRISTOBAL, MARISCAL NIETO, MOQUEGUA": [ - -70.6446511662424, - -16.6634082132264 - ], - "SAN CRISTOBAL, PICOTA, SAN MARTIN": [ - -76.4288522807438, - -6.97850919802748 - ], - "SAN DAMIAN, HUAROCHIRI, LIMA": [ - -76.3329898563199, - -11.9644708451544 - ], - "SAN FELIPE, JAEN, CAJAMARCA": [ - -79.3097836943858, - -5.78623773823567 - ], - "SAN FERNANDO, RIOJA, SAN MARTIN": [ - -77.2748920044514, - -5.8589677680972 - ], - "SAN FRANCISCO DE ASIS DE YARUSYACAN, PASCO, PASCO": [ - -76.2283152055011, - -10.5527120079462 - ], - "SAN FRANCISCO DE ASIS, LAURICOCHA, HUANUCO": [ - -76.6275098300769, - -9.97837678707369 - ], - "SAN FRANCISCO DE CAYRAN, HUANUCO, HUANUCO": [ - -76.3305360058951, - -9.99675569336045 - ], - "SAN FRANCISCO DE DAGUAS, CHACHAPOYAS, AMAZONAS": [ - -77.7335754821233, - -6.23223588584653 - ], - "SAN FRANCISCO DE RAVACAYCO, PARINACOCHAS, AYACUCHO": [ - -73.3631793870598, - -15.0058301841237 - ], - "SAN FRANCISCO DE SANGAYAICO, HUAYTARA, HUANCAVELICA": [ - -75.2807751278377, - -13.7819471988893 - ], - "SAN FRANCISCO DEL YESO, LUYA, AMAZONAS": [ - -77.8595239828286, - -6.65901613904206 - ], - "SAN FRANCISCO, AMBO, HUANUCO": [ - -76.2873320554491, - -10.332388592522 - ], - "SAN GABAN, CARABAYA, PUNO": [ - -70.3948706265551, - -13.5240516448606 - ], - "SAN GREGORIO, SAN MIGUEL, CAJAMARCA": [ - -79.1609782658254, - -7.1179806015135 - ], - "SAN HILARION, PICOTA, SAN MARTIN": [ - -76.4868374884952, - -6.93945431574083 - ], - "SAN IGNACIO, SAN IGNACIO, CAJAMARCA": [ - -79.0077562860754, - -5.14042273783426 - ], - "SAN ISIDRO DE MAINO, CHACHAPOYAS, AMAZONAS": [ - -77.8225670100118, - -6.35442044863673 - ], - "SAN ISIDRO, HUAYTARA, HUANCAVELICA": [ - -75.2344349337339, - -13.9735590011231 - ], - "SAN ISIDRO, LIMA, LIMA": [ - -77.0366720490895, - -12.0989805902058 - ], - "SAN JACINTO, TUMBES, TUMBES": [ - -80.5109119782331, - -3.90593898320759 - ], - "SAN JAVIER DE ALPABAMBA, PAUCAR DEL SARA SARA, AYACUCHO": [ - -73.2943882771966, - -15.0482095950398 - ], - "SAN JERONIMO DE TUNAN, HUANCAYO, JUNIN": [ - -75.286373974373, - -11.9374098091063 - ], - "SAN JERONIMO, ANDAHUAYLAS, APURIMAC": [ - -73.2740639980816, - -13.7166502762213 - ], - "SAN JERONIMO, CUSCO, CUSCO": [ - -71.8674242440679, - -13.5574108920957 - ], - "SAN JERONIMO, LUYA, AMAZONAS": [ - -78.0457784552411, - -6.0046095304917 - ], - "SAN JOAQUIN, YAUYOS, LIMA": [ - -76.1056526783517, - -12.2459325095648 - ], - "SAN JOSE DE LOS MOLINOS, ICA, ICA": [ - -75.6124401200747, - -13.8820828293681 - ], - "SAN JOSE DE LOURDES, SAN IGNACIO, CAJAMARCA": [ - -78.8318255560063, - -4.91601550530389 - ], - "SAN JOSE DE QUERO, CONCEPCION, JUNIN": [ - -75.5726813907555, - -12.0762558920991 - ], - "SAN JOSE DE SISA, EL DORADO, SAN MARTIN": [ - -76.7202140225953, - -6.61161719004875 - ], - "SAN JOSE DE TICLLAS, HUAMANGA, AYACUCHO": [ - -74.3263336744314, - -13.1250293249797 - ], - "SAN JOSE DE USHUA, PAUCAR DEL SARA SARA, AYACUCHO": [ - -73.1961326963495, - -15.2235444987734 - ], - "SAN JOSE DEL ALTO, JAEN, CAJAMARCA": [ - -79.0550401330461, - -5.51732759161108 - ], - "SAN JOSE, AZANGARO, PUNO": [ - -70.1786558205591, - -14.6911534097221 - ], - "SAN JOSE, LAMBAYEQUE, LAMBAYEQUE": [ - -79.9366144066539, - -6.76608145820992 - ], - "SAN JOSE, PACASMAYO, LA LIBERTAD": [ - -79.3856477170933, - -7.3698176203163 - ], - "SAN JUAN BAUTISTA, HUAMANGA, AYACUCHO": [ - -74.2114806332079, - -13.1953033481368 - ], - "SAN JUAN BAUTISTA, ICA, ICA": [ - -75.7332082260108, - -13.9735686848054 - ], - "SAN JUAN BAUTISTA, MAYNAS, LORETO": [ - -73.6658988068188, - -4.14906484281448 - ], - "SAN JUAN DE BIGOTE, MORROPON, PIURA": [ - -79.7412425918066, - -5.29589195529798 - ], - "SAN JUAN DE CHAC\u00d1A, AYMARAES, APURIMAC": [ - -73.1938206899924, - -13.8849874096108 - ], - "SAN JUAN DE CUTERVO, CUTERVO, CAJAMARCA": [ - -78.6007349753127, - -6.17218221039734 - ], - "SAN JUAN DE IRIS, HUAROCHIRI, LIMA": [ - -76.4690906845532, - -11.7189685959768 - ], - "SAN JUAN DE ISCOS, CHUPACA, JUNIN": [ - -75.3015957133579, - -12.1193467840652 - ], - "SAN JUAN DE JARPA, CHUPACA, JUNIN": [ - -75.4510172540694, - -12.1234933138434 - ], - "SAN JUAN DE LA VIRGEN, TUMBES, TUMBES": [ - -80.3629190256385, - -3.65859092752873 - ], - "SAN JUAN DE LICUPIS, CHOTA, CAJAMARCA": [ - -79.2455186013577, - -6.48432037859074 - ], - "SAN JUAN DE LOPECANCHA, LUYA, AMAZONAS": [ - -77.8917564807879, - -6.48274300813563 - ], - "SAN JUAN DE LURIGANCHO, LIMA, LIMA": [ - -76.971494911047, - -11.9459661263456 - ], - "SAN JUAN DE MIRAFLORES, LIMA, LIMA": [ - -76.9665080585833, - -12.1578595724367 - ], - "SAN JUAN DE RONTOY, ANTONIO RAYMONDI, ANCASH": [ - -77.0417406344016, - -9.21843068015379 - ], - "SAN JUAN DE SALINAS, AZANGARO, PUNO": [ - -70.1261890441943, - -15.0007970825951 - ], - "SAN JUAN DE SIGUAS, AREQUIPA, AREQUIPA": [ - -72.1633255745486, - -16.4051247239757 - ], - "SAN JUAN DE TANTARANCHE, HUAROCHIRI, LIMA": [ - -76.1569924505589, - -11.9929092195719 - ], - "SAN JUAN DE TARUCANI, AREQUIPA, AREQUIPA": [ - -71.0980403357042, - -16.1982117204238 - ], - "SAN JUAN DE YANAC, CHINCHA, ICA": [ - -75.8143205227703, - -13.2247139097545 - ], - "SAN JUAN DEL ORO, SANDIA, PUNO": [ - -69.1004561656379, - -14.1939658232185 - ], - "SAN JUAN, CAJAMARCA, CAJAMARCA": [ - -78.481978552961, - -7.27390964349545 - ], - "SAN JUAN, CASTROVIRREYNA, HUANCAVELICA": [ - -75.6882412557888, - -13.271951841109 - ], - "SAN JUAN, LUCANAS, AYACUCHO": [ - -74.1864030197339, - -14.6539921138375 - ], - "SAN JUAN, SIHUAS, ANCASH": [ - -77.6204766729451, - -8.67163701355884 - ], - "SAN LORENZO DE QUINTI, HUAROCHIRI, LIMA": [ - -76.118854946041, - -12.108944582644 - ], - "SAN LORENZO, JAUJA, JUNIN": [ - -75.3785273373828, - -11.8386703857553 - ], - "SAN LUIS DE LUCMA, CUTERVO, CAJAMARCA": [ - -78.5821695298254, - -6.26868141043627 - ], - "SAN LUIS DE SHUARO, CHANCHAMAYO, JUNIN": [ - -75.2727658197265, - -10.8432798753174 - ], - "SAN LUIS, CARLOS FERMIN FITZCARRALD, ANCASH": [ - -77.2909616834533, - -9.09716330854625 - ], - "SAN LUIS, CA\u00d1ETE, LIMA": [ - -76.423719010956, - -13.0519962171195 - ], - "SAN LUIS, LIMA, LIMA": [ - -76.9972394465877, - -12.0740865463895 - ], - "SAN LUIS, SAN PABLO, CAJAMARCA": [ - -78.8730853909849, - -7.15904768400335 - ], - "SAN MARCOS DE ROCCHAC, TAYACAJA, HUANCAVELICA": [ - -74.9488760546086, - -12.0792381064899 - ], - "SAN MARCOS, HUARI, ANCASH": [ - -77.0918967208327, - -9.62815173014206 - ], - "SAN MARTIN DE PORRES, LIMA, LIMA": [ - -77.0884101405144, - -11.9928307795161 - ], - "SAN MARTIN, EL DORADO, SAN MARTIN": [ - -76.8373409478316, - -6.42328605806938 - ], - "SAN MATEO DE OTAO, HUAROCHIRI, LIMA": [ - -76.5304317235911, - -11.8405938260111 - ], - "SAN MATEO, HUAROCHIRI, LIMA": [ - -76.2189827902887, - -11.8197847420302 - ], - "SAN MIGUEL DE ACO, CARHUAZ, ANCASH": [ - -77.4330013742812, - -9.34392916684078 - ], - "SAN MIGUEL DE ACOS, HUARAL, LIMA": [ - -76.7675033707361, - -11.2929704614503 - ], - "SAN MIGUEL DE CAURI, LAURICOCHA, HUANUCO": [ - -76.637588634882, - -10.2989322219711 - ], - "SAN MIGUEL DE CHACCRAMPA, ANDAHUAYLAS, APURIMAC": [ - -73.6030130668558, - -13.9621479884335 - ], - "SAN MIGUEL DE CORPANQUI, BOLOGNESI, ANCASH": [ - -77.2098539551582, - -10.2915292407187 - ], - "SAN MIGUEL DE EL FAIQUE, HUANCABAMBA, PIURA": [ - -79.6049706200152, - -5.42460088291056 - ], - "SAN MIGUEL DE MAYOCC, CHURCAMPA, HUANCAVELICA": [ - -74.4100094392632, - -12.7878913633086 - ], - "SAN MIGUEL, LA MAR, AYACUCHO": [ - -73.9426501881268, - -13.036064879738 - ], - "SAN MIGUEL, LIMA, LIMA": [ - -77.090067121944, - -12.0764449143481 - ], - "SAN MIGUEL, SAN MIGUEL, CAJAMARCA": [ - -78.922376922569, - -7.07750525133226 - ], - "SAN MIGUEL, SAN ROMAN, PUNO": [ - -70.1264189296883, - -15.406228390998 - ], - "SAN NICOLAS, CARLOS FERMIN FITZCARRALD, ANCASH": [ - -77.1695739586755, - -9.01120778372953 - ], - "SAN NICOLAS, RODRIGUEZ DE MENDOZA, AMAZONAS": [ - -77.4389576810386, - -6.37280617986033 - ], - "SAN PABLO DE PILLAO, HUANUCO, HUANUCO": [ - -75.9384495292795, - -9.70775509298174 - ], - "SAN PABLO, BELLAVISTA, SAN MARTIN": [ - -76.5865168934654, - -6.8388760292123 - ], - "SAN PABLO, CANCHIS, CUSCO": [ - -71.0876050335629, - -14.1517621411319 - ], - "SAN PABLO, MARISCAL RAMON CASTILLA, LORETO": [ - -71.3389666805262, - -3.86675835039228 - ], - "SAN PABLO, SAN PABLO, CAJAMARCA": [ - -78.7857840738469, - -7.08601207696343 - ], - "SAN PEDRO DE CACHORA, ABANCAY, APURIMAC": [ - -72.8140025746261, - -13.488845692748 - ], - "SAN PEDRO DE CAJAS, TARMA, JUNIN": [ - -75.7857736554659, - -11.1233987632674 - ], - "SAN PEDRO DE CASTA, HUAROCHIRI, LIMA": [ - -76.5552089019347, - -11.7651019640751 - ], - "SAN PEDRO DE CHANA, HUARI, ANCASH": [ - -76.9823463906965, - -9.46652854524538 - ], - "SAN PEDRO DE CHAULAN, HUANUCO, HUANUCO": [ - -76.421822436845, - -10.0785253879983 - ], - "SAN PEDRO DE CHUNAN, JAUJA, JUNIN": [ - -75.4893098639577, - -11.7189240482454 - ], - "SAN PEDRO DE CORIS, CHURCAMPA, HUANCAVELICA": [ - -74.4002345755677, - -12.607344140201 - ], - "SAN PEDRO DE HUACARPANA, CHINCHA, ICA": [ - -75.7283694925266, - -13.0786172083211 - ], - "SAN PEDRO DE HUANCAYRE, HUAROCHIRI, LIMA": [ - -76.1966380538495, - -12.0867091489762 - ], - "SAN PEDRO DE LARAOS, HUAROCHIRI, LIMA": [ - -76.531702341938, - -11.585180558967 - ], - "SAN PEDRO DE LARCAY, SUCRE, AYACUCHO": [ - -73.5895827125156, - -14.2835030063534 - ], - "SAN PEDRO DE LLOC, PACASMAYO, LA LIBERTAD": [ - -79.4048784902566, - -7.48357163346638 - ], - "SAN PEDRO DE PALCO, LUCANAS, AYACUCHO": [ - -74.4942603965913, - -14.2913076215843 - ], - "SAN PEDRO DE PILAS, YAUYOS, LIMA": [ - -76.1860933422428, - -12.4929821499458 - ], - "SAN PEDRO DE PILLAO, DANIEL ALCIDES CARRION, PASCO": [ - -76.5359209014085, - -10.4161978846639 - ], - "SAN PEDRO DE PUTINA PUNCO, SANDIA, PUNO": [ - -69.1479903603893, - -13.5486352138693 - ], - "SAN PEDRO, CANCHIS, CUSCO": [ - -71.332823022131, - -14.1660527256835 - ], - "SAN PEDRO, LUCANAS, AYACUCHO": [ - -74.2079400915162, - -14.9711193059556 - ], - "SAN PEDRO, OCROS, ANCASH": [ - -77.5688710913098, - -10.4747236513029 - ], - "SAN RAFAEL, AMBO, HUANUCO": [ - -76.1263364122094, - -10.3289356198156 - ], - "SAN RAFAEL, BELLAVISTA, SAN MARTIN": [ - -76.4956790438478, - -7.02643974824393 - ], - "SAN RAMON, CHANCHAMAYO, JUNIN": [ - -75.4050973514709, - -11.1568076542558 - ], - "SAN ROQUE DE CUMBAZA, LAMAS, SAN MARTIN": [ - -76.5385782872339, - -6.20373368685898 - ], - "SAN SALVADOR DE QUIJE, SUCRE, AYACUCHO": [ - -73.7177638629186, - -13.9832708913203 - ], - "SAN SALVADOR, CALCA, CUSCO": [ - -71.77420296771, - -13.4882146159994 - ], - "SAN SEBASTIAN, CUSCO, CUSCO": [ - -71.9257463834217, - -13.5332536720993 - ], - "SAN SILVESTRE DE COCHAN, SAN MIGUEL, CAJAMARCA": [ - -78.7253004700606, - -6.93144299784859 - ], - "SAN VICENTE DE CA\u00d1ETE, CA\u00d1ETE, LIMA": [ - -76.257405403417, - -13.1719778231755 - ], - "SANAGORAN, SANCHEZ CARRION, LA LIBERTAD": [ - -78.1756391870192, - -7.79264730359339 - ], - "SANCOS, HUANCA SANCOS, AYACUCHO": [ - -74.5597344914936, - -14.0010172593943 - ], - "SANCOS, LUCANAS, AYACUCHO": [ - -74.1584138442854, - -15.1470873965277 - ], - "SANDIA, SANDIA, PUNO": [ - -69.4369604582816, - -14.2919312773358 - ], - "SANGALLAYA, HUAROCHIRI, LIMA": [ - -76.2627067801574, - -12.2191486232448 - ], - "SANGARARA, ACOMAYO, CUSCO": [ - -71.5707661020036, - -13.9539366562614 - ], - "SANTA ANA DE HUAYCAHUACHO, LUCANAS, AYACUCHO": [ - -73.9256090477274, - -14.2208735510005 - ], - "SANTA ANA DE TUSI, DANIEL ALCIDES CARRION, PASCO": [ - -76.3232546725997, - -10.478831344669 - ], - "SANTA ANA, CASTROVIRREYNA, HUANCAVELICA": [ - -75.1311804436012, - -13.088163230521 - ], - "SANTA ANA, LA CONVENCION, CUSCO": [ - -72.7433729673663, - -12.8768105615456 - ], - "SANTA ANITA, LIMA, LIMA": [ - -76.9631402249756, - -12.043207022412 - ], - "SANTA BARBARA DE CARHUACAYAN, YAULI, JUNIN": [ - -76.3648509380846, - -11.1980488840802 - ], - "SANTA CATALINA DE MOSSA, MORROPON, PIURA": [ - -79.875617278745, - -5.12578318956712 - ], - "SANTA CATALINA, LUYA, AMAZONAS": [ - -78.0935130847955, - -6.05696957422783 - ], - "SANTA CRUZ DE ANDAMARCA, HUARAL, LIMA": [ - -76.5655222433029, - -11.1470191666982 - ], - "SANTA CRUZ DE CHUCA, SANTIAGO DE CHUCO, LA LIBERTAD": [ - -78.0970048952632, - -8.18744415053658 - ], - "SANTA CRUZ DE COCACHACRA, HUAROCHIRI, LIMA": [ - -76.5606421546695, - -11.925905136191 - ], - "SANTA CRUZ DE FLORES, CA\u00d1ETE, LIMA": [ - -76.6461847047249, - -12.5499366540093 - ], - "SANTA CRUZ DE TOLED, CONTUMAZA, CAJAMARCA": [ - -78.8633984122542, - -7.32766232600047 - ], - "SANTA CRUZ, ALTO AMAZONAS, LORETO": [ - -75.7490051696339, - -5.65827722335356 - ], - "SANTA CRUZ, CUTERVO, CAJAMARCA": [ - -78.8414310210027, - -6.10636334912511 - ], - "SANTA CRUZ, HUAYLAS, ANCASH": [ - -77.722585189264, - -8.90866663872505 - ], - "SANTA CRUZ, PALPA, ICA": [ - -75.2576988684759, - -14.4711961938598 - ], - "SANTA CRUZ, SANTA CRUZ, CAJAMARCA": [ - -78.9415396209312, - -6.62735535750624 - ], - "SANTA EULALIA, HUAROCHIRI, LIMA": [ - -76.6490091322108, - -11.858278826564 - ], - "SANTA ISABEL DE SIGUAS, AREQUIPA, AREQUIPA": [ - -72.063225693566, - -16.2676896601896 - ], - "SANTA LEONOR, HUAURA, LIMA": [ - -76.6712218148464, - -10.9627544229786 - ], - "SANTA LUCIA, LAMPA, PUNO": [ - -70.7846582552924, - -15.6014409284179 - ], - "SANTA LUCIA, LUCANAS, AYACUCHO": [ - -74.5458042399976, - -14.9327953993886 - ], - "SANTA MARIA DE CHICMO, ANDAHUAYLAS, APURIMAC": [ - -73.5462698679236, - -13.6611571173255 - ], - "SANTA MARIA DEL MAR, LIMA, LIMA": [ - -76.7673969965789, - -12.4085768010731 - ], - "SANTA MARIA DEL VALLE, HUANUCO, HUANUCO": [ - -76.3126576520019, - -9.79339114014052 - ], - "SANTA MARIA, HUAURA, LIMA": [ - -77.4732457904186, - -11.1161474061114 - ], - "SANTA RITA DE SIGUAS, AREQUIPA, AREQUIPA": [ - -72.1441125300091, - -16.522923449129 - ], - "SANTA ROSA DE ALTO YANAJANCA, MARA\u00d1ON, HUANUCO": [ - -76.5083123785993, - -8.78929766710261 - ], - "SANTA ROSA DE OCOPA, CONCEPCION, JUNIN": [ - -75.3068467707559, - -11.8699305599136 - ], - "SANTA ROSA DE QUIVES, CANTA, LIMA": [ - -76.8431484015992, - -11.6710383466169 - ], - "SANTA ROSA DE SACCO, YAULI, JUNIN": [ - -75.9864540523318, - -11.5576036161536 - ], - "SANTA ROSA, CHICLAYO, LAMBAYEQUE": [ - -79.9042597687995, - -6.88074640183522 - ], - "SANTA ROSA, EL COLLAO, PUNO": [ - -69.8551974315592, - -16.8357921380636 - ], - "SANTA ROSA, EL DORADO, SAN MARTIN": [ - -76.5992627595185, - -6.70538910996057 - ], - "SANTA ROSA, GRAU, APURIMAC": [ - -72.6604438296572, - -14.1259575077905 - ], - "SANTA ROSA, JAEN, CAJAMARCA": [ - -78.6008835328494, - -5.42771007581264 - ], - "SANTA ROSA, LA MAR, AYACUCHO": [ - -73.7893425163542, - -12.7645980204369 - ], - "SANTA ROSA, LIMA, LIMA": [ - -77.1632527535596, - -11.8050066914338 - ], - "SANTA ROSA, MELGAR, PUNO": [ - -70.8120190357395, - -14.5743397530001 - ], - "SANTA ROSA, PALLASCA, ANCASH": [ - -78.1384437060385, - -8.56845677496509 - ], - "SANTA ROSA, RODRIGUEZ DE MENDOZA, AMAZONAS": [ - -77.4584164469958, - -6.45523418101939 - ], - "SANTA TERESA, LA CONVENCION, CUSCO": [ - -72.7329816106818, - -13.2443822649214 - ], - "SANTA, SANTA, ANCASH": [ - -78.6092269698969, - -8.99217023338699 - ], - "SANTIAGO DE ANCHUCAYA, HUAROCHIRI, LIMA": [ - -76.1996048307944, - -12.0319181467674 - ], - "SANTIAGO DE CAO, ASCOPE, LA LIBERTAD": [ - -79.2177399798607, - -7.92475332351324 - ], - "SANTIAGO DE CHALLAS, PATAZ, LA LIBERTAD": [ - -77.3714771420769, - -8.4270637761987 - ], - "SANTIAGO DE CHILCAS, OCROS, ANCASH": [ - -77.3586934374385, - -10.440170422806 - ], - "SANTIAGO DE CHOCORVOS, HUAYTARA, HUANCAVELICA": [ - -75.214941271035, - -13.8133866397921 - ], - "SANTIAGO DE CHUCO, SANTIAGO DE CHUCO, LA LIBERTAD": [ - -78.2446120676059, - -8.34914124186636 - ], - "SANTIAGO DE LUCANAMARCA, HUANCA SANCOS, AYACUCHO": [ - -74.5329245336248, - -13.8262855941978 - ], - "SANTIAGO DE PAUCARAY, SUCRE, AYACUCHO": [ - -73.653380750004, - -14.0874772121103 - ], - "SANTIAGO DE PISCHA, HUAMANGA, AYACUCHO": [ - -74.364178490527, - -13.0747162719584 - ], - "SANTIAGO DE PUPUJA, AZANGARO, PUNO": [ - -70.2503519942043, - -15.0834053329088 - ], - "SANTIAGO DE QUIRAHUARA, HUAYTARA, HUANCAVELICA": [ - -74.8922766829085, - -14.0553969778959 - ], - "SANTIAGO DE SURCO, LIMA, LIMA": [ - -76.9843080557576, - -12.1269920818655 - ], - "SANTIAGO DE TUCUMA, TAYACAJA, HUANCAVELICA": [ - -74.8869587146369, - -12.3175664447101 - ], - "SANTIAGO DE TUNA, HUAROCHIRI, LIMA": [ - -76.5284599958612, - -11.9780619319105 - ], - "SANTIAGO, CUSCO, CUSCO": [ - -71.9785437397185, - -13.5730453793247 - ], - "SANTIAGO, ICA, ICA": [ - -75.5152730453598, - -14.5107474974163 - ], - "SANTILLANA, HUANTA, AYACUCHO": [ - -74.2420038181568, - -12.6712124005525 - ], - "SANTO DOMINGO DE ACOBAMBA, HUANCAYO, JUNIN": [ - -74.6936122851464, - -11.8547704559814 - ], - "SANTO DOMINGO DE ANDA, LEONCIO PRADO, HUANUCO": [ - -75.9829686404326, - -8.98489681755872 - ], - "SANTO DOMINGO DE CAPILLAS, HUAYTARA, HUANCAVELICA": [ - -75.1838168345108, - -13.6712296276168 - ], - "SANTO DOMINGO DE LA CAPILLA, CUTERVO, CAJAMARCA": [ - -78.8427210977712, - -6.25796193311939 - ], - "SANTO DOMINGO DE LOS OLLEROS, HUAROCHIRI, LIMA": [ - -76.5362039042379, - -12.2613201156656 - ], - "SANTO DOMINGO, MORROPON, PIURA": [ - -79.9106809725363, - -5.05314753513048 - ], - "SANTO TOMAS DE PATA, ANGARAES, HUANCAVELICA": [ - -74.4710080627072, - -13.1435419718366 - ], - "SANTO TOMAS, CHUMBIVILCAS, CUSCO": [ - -72.2087069763828, - -14.6507971840841 - ], - "SANTO TOMAS, CUTERVO, CAJAMARCA": [ - -78.6776466170304, - -6.11859833179335 - ], - "SANTO TOMAS, LUYA, AMAZONAS": [ - -77.892476846641, - -6.56905877272358 - ], - "SANTO TORIBIO, HUAYLAS, ANCASH": [ - -77.9524947529469, - -8.84639817298939 - ], - "SAPALLANGA, HUANCAYO, JUNIN": [ - -75.1397435960938, - -12.1138593849333 - ], - "SAPILLICA, AYABACA, PIURA": [ - -79.9892052080543, - -4.78362182734737 - ], - "SAPOSOA, HUALLAGA, SAN MARTIN": [ - -76.8737513595706, - -6.88883320602482 - ], - "SAQUENA, REQUENA, LORETO": [ - -73.4051006485917, - -4.79793879045805 - ], - "SARA SARA, PAUCAR DEL SARA SARA, AYACUCHO": [ - -73.4594916166079, - -15.2600286561126 - ], - "SARAYACU, UCAYALI, LORETO": [ - -75.1859079536789, - -6.39059793004937 - ], - "SARHUA, VICTOR FAJARDO, AYACUCHO": [ - -74.4098401728754, - -13.6902848026043 - ], - "SARIN, SANCHEZ CARRION, LA LIBERTAD": [ - -77.8800927470761, - -7.93982713977153 - ], - "SARTIMBAMBA, SANCHEZ CARRION, LA LIBERTAD": [ - -77.766147893736, - -7.61268111579634 - ], - "SATIPO, SATIPO, JUNIN": [ - -74.6118560251711, - -11.1796000494081 - ], - "SAUCE, SAN MARTIN, SAN MARTIN": [ - -76.2046188507205, - -6.70275954744533 - ], - "SAUCEPAMPA, SANTA CRUZ, CAJAMARCA": [ - -78.908100362906, - -6.68260455781141 - ], - "SAURAMA, VILCAS HUAMAN, AYACUCHO": [ - -73.7503468746451, - -13.70102191379 - ], - "SAUSA, JAUJA, JUNIN": [ - -75.4832910995988, - -11.7926532567957 - ], - "SAYAN, HUAURA, LIMA": [ - -77.2338038262745, - -11.1458636207759 - ], - "SAYAPULLO, GRAN CHIMU, LA LIBERTAD": [ - -78.431724611322, - -7.56789981926818 - ], - "SAYLA, LA UNION, AREQUIPA": [ - -73.245333106905, - -15.3249818755353 - ], - "SAYLLA, CUSCO, CUSCO": [ - -71.8317557542491, - -13.5530044401981 - ], - "SA\u00d1A, CHICLAYO, LAMBAYEQUE": [ - -79.6379959916964, - -6.88714205012368 - ], - "SA\u00d1AYCA, AYMARAES, APURIMAC": [ - -73.3582653609304, - -14.3325664320636 - ], - "SA\u00d1O, HUANCAYO, JUNIN": [ - -75.246884368985, - -11.9506179429833 - ], - "SECCLLA, ANGARAES, HUANCAVELICA": [ - -74.5415169218742, - -13.0808402669539 - ], - "SECHURA, SECHURA, PIURA": [ - -80.660478156597, - -5.91946744795109 - ], - "SEPAHUA, ATALAYA, UCAYALI": [ - -72.8138397934727, - -11.0837036360311 - ], - "SEXI, SANTA CRUZ, CAJAMARCA": [ - -79.0361795350928, - -6.58548514320499 - ], - "SHAMBOYACU, PICOTA, SAN MARTIN": [ - -76.0945592858447, - -7.05176863085458 - ], - "SHANAO, LAMAS, SAN MARTIN": [ - -76.5778777975212, - -6.40809472212607 - ], - "SHAPAJA, SAN MARTIN, SAN MARTIN": [ - -76.2132319413315, - -6.58841789104949 - ], - "SHATOJA, EL DORADO, SAN MARTIN": [ - -76.699114983726, - -6.52380403659094 - ], - "SHILLA, CARHUAZ, ANCASH": [ - -77.5647181714931, - -9.15442255633512 - ], - "SHIPASBAMBA, BONGARA, AMAZONAS": [ - -78.0520892810855, - -5.88374693567417 - ], - "SHUNQUI, DOS DE MAYO, HUANUCO": [ - -76.8097734343628, - -9.75051626253545 - ], - "SHUNTE, TOCACHE, SAN MARTIN": [ - -76.8767030773677, - -8.42326215461851 - ], - "SHUPLUY, YUNGAY, ANCASH": [ - -77.78949860413, - -9.3444450246016 - ], - "SIBAYO, CAYLLOMA, AREQUIPA": [ - -71.5459568721043, - -15.3617497850169 - ], - "SICAYA, HUANCAYO, JUNIN": [ - -75.2875122037368, - -12.0190115141739 - ], - "SICCHEZ, AYABACA, PIURA": [ - -79.7770490716534, - -4.57239365567064 - ], - "SICSIBAMBA, SIHUAS, ANCASH": [ - -77.5292835482862, - -8.63053239154383 - ], - "SICUANI, CANCHIS, CUSCO": [ - -71.1036085677679, - -14.2510172254898 - ], - "SIHUAS, SIHUAS, ANCASH": [ - -77.6154349046471, - -8.54029100313136 - ], - "SILLAPATA, DOS DE MAYO, HUANUCO": [ - -76.7668628797064, - -9.79382585994769 - ], - "SIMBAL, TRUJILLO, LA LIBERTAD": [ - -78.8270851155447, - -7.91836902028192 - ], - "SIMON BOLIVAR, PASCO, PASCO": [ - -76.4167994437143, - -10.7265230431232 - ], - "SINA, SAN ANTONIO DE PUTINA, PUNO": [ - -69.2400295231013, - -14.5114493481895 - ], - "SINCOS, JAUJA, JUNIN": [ - -75.513112072342, - -11.9420648846642 - ], - "SINGA, HUAMALIES, HUANUCO": [ - -76.8353045288966, - -9.36260289188809 - ], - "SINSICAP, OTUZCO, LA LIBERTAD": [ - -78.7791842062966, - -7.75449796661443 - ], - "SITABAMBA, SANTIAGO DE CHUCO, LA LIBERTAD": [ - -77.8004474035836, - -8.026282388646 - ], - "SITACOCHA, CAJABAMBA, CAJAMARCA": [ - -77.9062974063386, - -7.47437870435429 - ], - "SITAJARA, TARATA, TACNA": [ - -70.153388988796, - -17.3945685640572 - ], - "SIVIA, HUANTA, AYACUCHO": [ - -73.9964483179422, - -12.6038228663422 - ], - "SOCABAYA, AREQUIPA, AREQUIPA": [ - -71.5346798143882, - -16.4736421724009 - ], - "SOCOS, HUAMANGA, AYACUCHO": [ - -74.2844271131462, - -13.2614568039096 - ], - "SOCOTA, CUTERVO, CAJAMARCA": [ - -78.6968579355206, - -6.28747259125881 - ], - "SOLOCO, CHACHAPOYAS, AMAZONAS": [ - -77.7463548911186, - -6.30911012562556 - ], - "SONCHE, CHACHAPOYAS, AMAZONAS": [ - -77.7964052392717, - -6.1759745319798 - ], - "SONDOR, HUANCABAMBA, PIURA": [ - -79.3624581447595, - -5.40349430397246 - ], - "SONDORILLO, HUANCABAMBA, PIURA": [ - -79.4600615886836, - -5.39788217898114 - ], - "SOPLIN, REQUENA, LORETO": [ - -73.7507104045758, - -6.32702643749807 - ], - "SORAS, SUCRE, AYACUCHO": [ - -73.6909928594108, - -14.2095609367198 - ], - "SORAYA, AYMARAES, APURIMAC": [ - -73.2840070513857, - -14.1707510843618 - ], - "SORITOR, MOYOBAMBA, SAN MARTIN": [ - -77.0541425163936, - -6.27274272660693 - ], - "SOROCHUCO, CELENDIN, CAJAMARCA": [ - -78.2971565767239, - -6.93421987933296 - ], - "SUBTANJALLA, ICA, ICA": [ - -75.8932386557159, - -14.0481568908235 - ], - "SUCCHA, AIJA, ANCASH": [ - -77.635759258308, - -9.83799954638798 - ], - "SUCRE, CELENDIN, CAJAMARCA": [ - -78.1713102712086, - -7.01874681429502 - ], - "SUITUCANCHA, YAULI, JUNIN": [ - -75.9781833363861, - -11.8333174192974 - ], - "SULLANA, SULLANA, PIURA": [ - -80.5466774765944, - -4.82576697050103 - ], - "SUMBILCA, HUARAL, LIMA": [ - -76.8554252555057, - -11.3943983992834 - ], - "SUNAMPE, CHINCHA, ICA": [ - -76.1628427530459, - -13.4268898540702 - ], - "SUPE PUERTO, BARRANCA, LIMA": [ - -77.7256801900956, - -10.7852466109974 - ], - "SUPE, BARRANCA, LIMA": [ - -77.5623061389748, - -10.8096115352055 - ], - "SURCO, HUAROCHIRI, LIMA": [ - -76.4453586608229, - -11.8771124046428 - ], - "SURCUBAMBA, TAYACAJA, HUANCAVELICA": [ - -74.6523869886951, - -12.1507595111134 - ], - "SURQUILLO, LIMA, LIMA": [ - -77.0129857546458, - -12.1134363133491 - ], - "SUSAPAYA, TARATA, TACNA": [ - -70.0466818766733, - -17.2245659717635 - ], - "SUYCKUTAMBO, ESPINAR, CUSCO": [ - -71.6582268202033, - -15.0011511230454 - ], - "SUYO, AYABACA, PIURA": [ - -80.0627248732016, - -4.46136676413212 - ], - "TABACONAS, SAN IGNACIO, CAJAMARCA": [ - -79.2154078046256, - -5.32438082697804 - ], - "TABALOSOS, LAMAS, SAN MARTIN": [ - -76.6552455703616, - -6.38864068828329 - ], - "TACABAMBA, CHOTA, CAJAMARCA": [ - -78.5561113484299, - -6.39870169157903 - ], - "TACNA, TACNA, TACNA": [ - -70.1690823072449, - -18.1130108207229 - ], - "TAHUAMANU, TAHUAMANU, MADRE DE DIOS": [ - -69.5319942302218, - -11.6796310458601 - ], - "TAHUANIA, ATALAYA, UCAYALI": [ - -73.8269401957792, - -9.97143690710676 - ], - "TALAVERA, ANDAHUAYLAS, APURIMAC": [ - -73.4530287998334, - -13.6275029769814 - ], - "TAMARINDO, PAITA, PIURA": [ - -80.9626274875138, - -4.83748437072928 - ], - "TAMBILLO, HUAMANGA, AYACUCHO": [ - -74.142179082367, - -13.1902249606025 - ], - "TAMBO DE MORA, CHINCHA, ICA": [ - -76.1827449482579, - -13.4618344603745 - ], - "TAMBO GRANDE, PIURA, PIURA": [ - -80.3309466398931, - -4.91944862471373 - ], - "TAMBO, HUAYTARA, HUANCAVELICA": [ - -75.1762620449432, - -13.5897165917679 - ], - "TAMBO, LA MAR, AYACUCHO": [ - -74.0230995805116, - -12.9122955076975 - ], - "TAMBOBAMBA, COTABAMBAS, APURIMAC": [ - -72.2129157814478, - -13.9170707947247 - ], - "TAMBOPATA, TAMBOPATA, MADRE DE DIOS": [ - -70.2845913088923, - -12.048580147467 - ], - "TAMBURCO, ABANCAY, APURIMAC": [ - -72.8719628125642, - -13.5781378303833 - ], - "TANTA, YAUYOS, LIMA": [ - -75.9913298919651, - -12.1320399119511 - ], - "TANTAMAYO, HUAMALIES, HUANUCO": [ - -76.6699491052987, - -9.37563012006746 - ], - "TANTARA, CASTROVIRREYNA, HUANCAVELICA": [ - -75.6213616136604, - -13.1265595866579 - ], - "TANTARICA, CONTUMAZA, CAJAMARCA": [ - -78.94985171992, - -7.27531053149447 - ], - "TAPACOCHA, RECUAY, ANCASH": [ - -77.5398859940765, - -10.0027529957447 - ], - "TAPAIRIHUA, AYMARAES, APURIMAC": [ - -73.1179366657483, - -14.1056201741407 - ], - "TAPAY, CAYLLOMA, AREQUIPA": [ - -71.9359994605369, - -15.4268314194912 - ], - "TAPICHE, REQUENA, LORETO": [ - -73.9935424074722, - -5.99203134605317 - ], - "TAPO, TARMA, JUNIN": [ - -75.5284173275649, - -11.429562573919 - ], - "TAPUC, DANIEL ALCIDES CARRION, PASCO": [ - -76.468245683831, - -10.4189600882946 - ], - "TARACO, HUANCANE, PUNO": [ - -69.9275345937596, - -15.3080956068296 - ], - "TARAPOTO, SAN MARTIN, SAN MARTIN": [ - -76.369666199388, - -6.49414473393611 - ], - "TARATA, TARATA, TACNA": [ - -69.7513556008735, - -17.3770327602578 - ], - "TARAY, CALCA, CUSCO": [ - -71.8838297112024, - -13.460219194307 - ], - "TARICA, HUARAZ, ANCASH": [ - -77.4820297785549, - -9.3926076103842 - ], - "TARMA, TARMA, JUNIN": [ - -75.7587693065744, - -11.4555567728438 - ], - "TARUCACHI, TARATA, TACNA": [ - -69.9580480608334, - -17.5018815605731 - ], - "TATE, ICA, ICA": [ - -75.7032582431302, - -14.1515535821781 - ], - "TAUCA, PALLASCA, ANCASH": [ - -78.0555678996006, - -8.44606943029654 - ], - "TAURIA, LA UNION, AREQUIPA": [ - -73.1726466219202, - -15.4042085198669 - ], - "TAURIJA, PATAZ, LA LIBERTAD": [ - -77.4331651434306, - -8.27946094605945 - ], - "TAURIPAMPA, YAUYOS, LIMA": [ - -76.1814440214017, - -12.6831748285537 - ], - "TAYABAMBA, PATAZ, LA LIBERTAD": [ - -77.2563544700654, - -8.31424349358439 - ], - "TENIENTE CESAR LOPEZ ROJAS, ALTO AMAZONAS, LORETO": [ - -75.8220446502314, - -5.98771172818678 - ], - "TENIENTE MANUEL CLAVERO, PUTUMAYO, LORETO": [ - -74.7313005554548, - -0.655651640923995 - ], - "TIABAYA, AREQUIPA, AREQUIPA": [ - -71.5990135276426, - -16.4634522843422 - ], - "TIBILLO, PALPA, ICA": [ - -75.1609354013162, - -14.150392188356 - ], - "TICACO, TARATA, TACNA": [ - -69.9635986161318, - -17.3347475061109 - ], - "TICAPAMPA, RECUAY, ANCASH": [ - -77.3922855726758, - -9.73783481891967 - ], - "TICLACAYAN, PASCO, PASCO": [ - -76.0337928509288, - -10.553652394841 - ], - "TICLLOS, BOLOGNESI, ANCASH": [ - -77.2080327621823, - -10.2324771856193 - ], - "TICRAPO, CASTROVIRREYNA, HUANCAVELICA": [ - -75.4097327091524, - -13.4180486580402 - ], - "TIGRE, LORETO, LORETO": [ - -75.2648518295243, - -2.94373100205301 - ], - "TILALI, MOHO, PUNO": [ - -69.3420774301434, - -15.4916784264747 - ], - "TINCO, CARHUAZ, ANCASH": [ - -77.6617920247196, - -9.25893871165432 - ], - "TINGO DE PONASA, PICOTA, SAN MARTIN": [ - -76.2121161571412, - -6.97034231205456 - ], - "TINGO DE SAPOSOA, HUALLAGA, SAN MARTIN": [ - -76.6565104096767, - -7.06414697697723 - ], - "TINGO, LUYA, AMAZONAS": [ - -77.9435261872091, - -6.3868643680651 - ], - "TINICACHI, YUNGUYO, PUNO": [ - -68.9715154789768, - -16.1979688308661 - ], - "TINTA, CANCHIS, CUSCO": [ - -71.3922979940975, - -14.1587409539734 - ], - "TINTAY PUNCU, TAYACAJA, HUANCAVELICA": [ - -74.5039803033196, - -12.1771370379746 - ], - "TINTAY, AYMARAES, APURIMAC": [ - -73.1344804901465, - -13.9034979026609 - ], - "TINYAHUARCO, PASCO, PASCO": [ - -76.2483905606471, - -10.7605473621798 - ], - "TIPAN, CASTILLA, AREQUIPA": [ - -72.499683565637, - -15.7507676222888 - ], - "TIQUILLACA, PUNO, PUNO": [ - -70.2714315504892, - -15.9236809589671 - ], - "TIRAPATA, AZANGARO, PUNO": [ - -70.383779684878, - -14.9223736051868 - ], - "TISCO, CAYLLOMA, AREQUIPA": [ - -71.3922653712899, - -15.2126997908454 - ], - "TOCACHE, TOCACHE, SAN MARTIN": [ - -76.5462312439842, - -8.27741495375467 - ], - "TOCMOCHE, CHOTA, CAJAMARCA": [ - -79.3759344878676, - -6.45681884076692 - ], - "TOMAS, YAUYOS, LIMA": [ - -75.706829163421, - -12.1639274802064 - ], - "TOMAY KICHWA, AMBO, HUANUCO": [ - -76.1791477957037, - -10.0648745572447 - ], - "TOMEPAMPA, LA UNION, AREQUIPA": [ - -72.7853028354329, - -15.2132679932744 - ], - "TONGOD, SAN MIGUEL, CAJAMARCA": [ - -78.8335391952975, - -6.78813739590565 - ], - "TORATA, MARISCAL NIETO, MOQUEGUA": [ - -70.7383213205242, - -16.998119052281 - ], - "TORAYA, AYMARAES, APURIMAC": [ - -73.3137272598551, - -14.0246552041556 - ], - "TORIBIO CASANOVA, CUTERVO, CAJAMARCA": [ - -78.6925137120132, - -5.98795017964297 - ], - "TORO, LA UNION, AREQUIPA": [ - -73.016123267709, - -15.404762256408 - ], - "TORRES CAUSANA, MAYNAS, LORETO": [ - -74.8927304899753, - -1.38914738227837 - ], - "TOTORA, RODRIGUEZ DE MENDOZA, AMAZONAS": [ - -77.4671567823796, - -6.49135074131675 - ], - "TOTOS, CANGALLO, AYACUCHO": [ - -74.5011848322704, - -13.5561667415952 - ], - "TOURNAVISTA, PUERTO INCA, HUANUCO": [ - -74.8663849513758, - -9.00131862751394 - ], - "TRES DE DICIEMBRE, CHUPACA, JUNIN": [ - -75.2458510741704, - -12.1140162946782 - ], - "TRES UNIDOS, PICOTA, SAN MARTIN": [ - -76.1286175267262, - -6.81743258624548 - ], - "TRITA, LUYA, AMAZONAS": [ - -77.9811384132191, - -6.15647231807174 - ], - "TROMPETEROS, LORETO, LORETO": [ - -75.8368781499906, - -3.1963235020799 - ], - "TRUJILLO, TRUJILLO, LA LIBERTAD": [ - -79.0238582661895, - -8.11258545945694 - ], - "TUCUME, LAMBAYEQUE, LAMBAYEQUE": [ - -79.8762752922609, - -6.50330856446158 - ], - "TUMAN, CHICLAYO, LAMBAYEQUE": [ - -79.6944488015406, - -6.77372970290645 - ], - "TUMAY HUARACA, ANDAHUAYLAS, APURIMAC": [ - -73.458199457016, - -13.9692351526379 - ], - "TUMBADEN, SAN PABLO, CAJAMARCA": [ - -78.6761624821227, - -6.98750836823469 - ], - "TUMBES, TUMBES, TUMBES": [ - -80.4161725038087, - -3.55366029025469 - ], - "TUNAN MARCA, JAUJA, JUNIN": [ - -75.5947370265973, - -11.7068214745141 - ], - "TUPAC AMARU INCA, PISCO, ICA": [ - -76.1106814999178, - -13.7258689435317 - ], - "TUPAC AMARU, CANAS, CUSCO": [ - -71.52705111458, - -14.1510123508016 - ], - "TUPE, YAUYOS, LIMA": [ - -75.7360980235161, - -12.6902904090891 - ], - "TURPAY, GRAU, APURIMAC": [ - -72.6370455171977, - -14.2320036481741 - ], - "TURPO, ANDAHUAYLAS, APURIMAC": [ - -73.4722065233019, - -13.7905951429556 - ], - "TUTI, CAYLLOMA, AREQUIPA": [ - -71.5976134169964, - -15.4830670636133 - ], - "UBINAS, GENERAL SANCHEZ CERRO, MOQUEGUA": [ - -70.8051529523494, - -16.217538730193 - ], - "UCHIZA, TOCACHE, SAN MARTIN": [ - -76.3976749211277, - -8.35834291761204 - ], - "UCHUMARCA, BOLIVAR, LA LIBERTAD": [ - -77.8058860479108, - -7.0261006498535 - ], - "UCHUMAYO, AREQUIPA, AREQUIPA": [ - -71.6905393119515, - -16.4609304782698 - ], - "UCHURACCAY, HUANTA, AYACUCHO": [ - -74.0931831531408, - -12.7845381367919 - ], - "UCO, HUARI, ANCASH": [ - -76.931129342349, - -9.19119598356834 - ], - "UCUNCHA, BOLIVAR, LA LIBERTAD": [ - -77.8505971561047, - -7.15323363212601 - ], - "ULCUMAYO, JUNIN, JUNIN": [ - -75.6839602830458, - -10.9044616702576 - ], - "UMACHIRI, MELGAR, PUNO": [ - -70.7489887636246, - -14.8785753320409 - ], - "UMARI, PACHITEA, HUANUCO": [ - -76.0279012039615, - -9.86814788450046 - ], - "UNICACHI, YUNGUYO, PUNO": [ - -68.9722701644852, - -16.2209101575602 - ], - "UNION AGUA BLANCA, SAN MIGUEL, CAJAMARCA": [ - -79.0541974684075, - -7.11890827166239 - ], - "UPAHUACHO, PARINACOCHAS, AYACUCHO": [ - -73.5294357133783, - -14.883480301839 - ], - "URACA, CASTILLA, AREQUIPA": [ - -72.5255726729483, - -16.2615912033458 - ], - "URANMARCA, CHINCHEROS, APURIMAC": [ - -73.6525014676157, - -13.6684590523307 - ], - "URARINAS, LORETO, LORETO": [ - -75.4846662457839, - -4.27492211748107 - ], - "URCOS, QUISPICANCHI, CUSCO": [ - -71.5991388625788, - -13.6878743371413 - ], - "URPAY, PATAZ, LA LIBERTAD": [ - -77.3755473093386, - -8.32817787742743 - ], - "URUBAMBA, URUBAMBA, CUSCO": [ - -72.1312678099346, - -13.244943572452 - ], - "USICAYOS, CARABAYA, PUNO": [ - -69.9383077987735, - -14.1407751889484 - ], - "USQUIL, OTUZCO, LA LIBERTAD": [ - -78.3616459467192, - -7.80063514503382 - ], - "UTCO, CELENDIN, CAJAMARCA": [ - -78.0579921249718, - -6.88139097501182 - ], - "UTICYACU, SANTA CRUZ, CAJAMARCA": [ - -78.7904757312466, - -6.61481245200984 - ], - "U\u00d1ON, CASTILLA, AREQUIPA": [ - -72.3831461821974, - -15.7570885836212 - ], - "VALERA, BONGARA, AMAZONAS": [ - -77.8691715878754, - -6.08063376261261 - ], - "VARGAS GUERRA, UCAYALI, LORETO": [ - -75.094312585077, - -6.93192992248469 - ], - "VEGUETA, HUAURA, LIMA": [ - -77.6041168002861, - -10.9501914271908 - ], - "VEINTISEIS DE OCTUBRE, PIURA, PIURA": [ - -80.6965430501692, - -5.16138409202853 - ], - "VEINTISIETE DE NOVIEMBRE, HUARAL, LIMA": [ - -76.7728174815748, - -11.1488558910909 - ], - "VELILLE, CHUMBIVILCAS, CUSCO": [ - -71.8491636322822, - -14.5490043830035 - ], - "VENTANILLA, CALLAO, CALLAO": [ - -77.1308636650625, - -11.8791245763359 - ], - "VICCO, PASCO, PASCO": [ - -76.2332293533725, - -10.8639688056741 - ], - "VICE, SECHURA, PIURA": [ - -80.8745447941595, - -5.43861615934226 - ], - "VICHAYAL, PAITA, PIURA": [ - -81.1073112086454, - -4.83842715498063 - ], - "VICTOR LARCO HERRERA, TRUJILLO, LA LIBERTAD": [ - -79.0456604798836, - -8.13949725084517 - ], - "VILAVILA, LAMPA, PUNO": [ - -70.6503483111407, - -15.1749601890921 - ], - "VILCA, HUANCAVELICA, HUANCAVELICA": [ - -75.2688746357086, - -12.5330229191105 - ], - "VILCABAMBA, DANIEL ALCIDES CARRION, PASCO": [ - -76.4479921748985, - -10.5357745699185 - ], - "VILCABAMBA, GRAU, APURIMAC": [ - -72.6362347683255, - -14.0786464182476 - ], - "VILCABAMBA, LA CONVENCION, CUSCO": [ - -73.0511526147575, - -13.0533738291172 - ], - "VILCANCHOS, VICTOR FAJARDO, AYACUCHO": [ - -74.6431838518056, - -13.6523813285896 - ], - "VILCAS HUAMAN, VILCAS HUAMAN, AYACUCHO": [ - -73.8963212206714, - -13.6557014742741 - ], - "VILLA EL SALVADOR, LIMA, LIMA": [ - -76.9452748094365, - -12.2192786910069 - ], - "VILLA KINTIARINA, LA CONVENCION, CUSCO": [ - -73.477929607533, - -12.9093950770101 - ], - "VILLA MARIA DEL TRIUNFO, LIMA, LIMA": [ - -76.9189867663915, - -12.1703915692313 - ], - "VILLA RICA, OXAPAMPA, PASCO": [ - -75.175920802982, - -10.6341125687566 - ], - "VILLA VIRGEN, LA CONVENCION, CUSCO": [ - -73.3396447957436, - -13.0544415502435 - ], - "VILQUE CHICO, HUANCANE, PUNO": [ - -69.6095011012721, - -15.1380055654182 - ], - "VILQUE, PUNO, PUNO": [ - -70.2631556849944, - -15.7802168427446 - ], - "VINCHOS, HUAMANGA, AYACUCHO": [ - -74.4564662089925, - -13.3062829397109 - ], - "VIQUES, HUANCAYO, JUNIN": [ - -75.2276761352205, - -12.1605324170701 - ], - "VIRACO, CASTILLA, AREQUIPA": [ - -72.5669024882285, - -15.6163736294531 - ], - "VIRU, VIRU, LA LIBERTAD": [ - -78.7352552374797, - -8.35330372117308 - ], - "VIRUNDO, GRAU, APURIMAC": [ - -72.6773355300552, - -14.2910556945174 - ], - "VISCHONGO, VILCAS HUAMAN, AYACUCHO": [ - -74.0136910344875, - -13.5537106550313 - ], - "VISTA ALEGRE, NASCA, ICA": [ - -74.8280058437458, - -14.9284661610987 - ], - "VISTA ALEGRE, NAZCA, ICA": [ - -74.8280058437458, - -14.9284661610987 - ], - "VISTA ALEGRE, RODRIGUEZ DE MENDOZA, AMAZONAS": [ - -77.3342252097032, - -6.2071994051163 - ], - "VITIS, YAUYOS, LIMA": [ - -75.8575404641785, - -12.1694446525108 - ], - "VITOC, CHANCHAMAYO, JUNIN": [ - -75.2366032135301, - -11.2650180688799 - ], - "VITOR, AREQUIPA, AREQUIPA": [ - -71.987800961218, - -16.4893108836053 - ], - "VIZCATAN DEL ENE, SATIPO, JUNIN": [ - -74.1865651800141, - -12.2023524381335 - ], - "VI\u00d1AC, YAUYOS, LIMA": [ - -75.7704274270773, - -12.8875592327759 - ], - "WANCHAQ, CUSCO, CUSCO": [ - -71.9512043507476, - -13.5312818423902 - ], - "YACUS, HUANUCO, HUANUCO": [ - -76.5112464745966, - -9.9460546357947 - ], - "YAGUAS, PUTUMAYO, LORETO": [ - -71.0132099536446, - -2.80433133881498 - ], - "YAMANGO, MORROPON, PIURA": [ - -79.7695355223883, - -5.15651296173274 - ], - "YAMBRASBAMBA, BONGARA, AMAZONAS": [ - -77.8605491002651, - -5.52432940961063 - ], - "YAMON, UTCUBAMBA, AMAZONAS": [ - -78.5241065920283, - -6.0120091229609 - ], - "YANAC, CORONGO, ANCASH": [ - -77.8471521262357, - -8.62509164366676 - ], - "YANACA, AYMARAES, APURIMAC": [ - -73.1598035209095, - -14.2313253913771 - ], - "YANACANCHA, CHUPACA, JUNIN": [ - -75.4738048357885, - -12.2536896242596 - ], - "YANACANCHA, PASCO, PASCO": [ - -76.1942788045612, - -10.6434321049398 - ], - "YANAHUANCA, DANIEL ALCIDES CARRION, PASCO": [ - -76.5724465409092, - -10.5629051756944 - ], - "YANAHUARA, AREQUIPA, AREQUIPA": [ - -71.5504057075325, - -16.3947446702014 - ], - "YANAHUAYA, SANDIA, PUNO": [ - -69.1270554743212, - -14.3311418461305 - ], - "YANAMA, YUNGAY, ANCASH": [ - -77.4980547568647, - -9.02411597615933 - ], - "YANAOCA, CANAS, CUSCO": [ - -71.4420440725093, - -14.2737796067242 - ], - "YANAQUIHUA, CONDESUYOS, AREQUIPA": [ - -73.0291167590275, - -15.7019766666613 - ], - "YANAS, DOS DE MAYO, HUANUCO": [ - -76.7315350758526, - -9.7146599775843 - ], - "YANATILE, CALCA, CUSCO": [ - -72.1050860349734, - -12.795697131692 - ], - "YANQUE, CAYLLOMA, AREQUIPA": [ - -71.4553206953741, - -15.7900988382437 - ], - "YANTALO, MOYOBAMBA, SAN MARTIN": [ - -77.0663736029116, - -5.96378246679547 - ], - "YAQUERANA, REQUENA, LORETO": [ - -73.3444364661579, - -5.75171282584907 - ], - "YARABAMBA, AREQUIPA, AREQUIPA": [ - -71.5498751682359, - -16.6135208735939 - ], - "YARINACOCHA, CORONEL PORTILLO, UCAYALI": [ - -74.6566989463484, - -8.24849719008287 - ], - "YARUMAYO, HUANUCO, HUANUCO": [ - -76.4401674467641, - -9.95583057475085 - ], - "YAUCA DEL ROSARIO, ICA, ICA": [ - -75.4341670349311, - -14.1006726151326 - ], - "YAUCA, CARAVELI, AREQUIPA": [ - -74.4287684994597, - -15.6335217507479 - ], - "YAULI, HUANCAVELICA, HUANCAVELICA": [ - -74.8290157598146, - -12.8171787406422 - ], - "YAULI, JAUJA, JUNIN": [ - -75.4713470478995, - -11.6788490158586 - ], - "YAULI, YAULI, JUNIN": [ - -76.0981386410109, - -11.7096217376318 - ], - "YAURISQUE, PARURO, CUSCO": [ - -71.9125913308376, - -13.6509183364595 - ], - "YAUTAN, CASMA, ANCASH": [ - -78.0203052648499, - -9.50589847612807 - ], - "YAUYA, CARLOS FERMIN FITZCARRALD, ANCASH": [ - -77.2564348937017, - -9.00766565069422 - ], - "YAUYOS, JAUJA, JUNIN": [ - -75.5142763850386, - -11.7958382820028 - ], - "YAUYOS, YAUYOS, LIMA": [ - -75.9551069865516, - -12.4725743145463 - ], - "YAUYUCAN, SANTA CRUZ, CAJAMARCA": [ - -78.8493112845247, - -6.68287505433639 - ], - "YAVARI, MARISCAL RAMON CASTILLA, LORETO": [ - -72.0331142993698, - -4.47746309330621 - ], - "YONAN, CONTUMAZA, CAJAMARCA": [ - -79.1691391062752, - -7.27762182862079 - ], - "YORONGOS, RIOJA, SAN MARTIN": [ - -77.161718583265, - -6.17529921512651 - ], - "YUCAY, URUBAMBA, CUSCO": [ - -72.0732270737177, - -13.2942402087115 - ], - "YUNGA, GENERAL SANCHEZ CERRO, MOQUEGUA": [ - -70.6600162926972, - -16.2276082342951 - ], - "YUNGAR, CARHUAZ, ANCASH": [ - -77.6309279606652, - -9.40408339503545 - ], - "YUNGAY, YUNGAY, ANCASH": [ - -77.6664013711902, - -9.09348638359855 - ], - "YUNGUYO, YUNGUYO, PUNO": [ - -69.0901932213325, - -16.2828061677694 - ], - "YUPAN, CORONGO, ANCASH": [ - -77.9700953318261, - -8.6414906524169 - ], - "YURA, AREQUIPA, AREQUIPA": [ - -71.6063382805897, - -16.1309440272686 - ], - "YURACMARCA, HUAYLAS, ANCASH": [ - -77.7411666964647, - -8.76193314137339 - ], - "YURACYACU, RIOJA, SAN MARTIN": [ - -77.2327670859691, - -5.93538675705549 - ], - "YURIMAGUAS, ALTO AMAZONAS, LORETO": [ - -76.1615819593371, - -5.84587992921817 - ], - "YURUA, ATALAYA, UCAYALI": [ - -72.6985747401782, - -9.82975945165413 - ], - "YUYAPICHIS, PUERTO INCA, HUANUCO": [ - -74.9984928570259, - -9.64735320500752 - ], - "ZAPATERO, LAMAS, SAN MARTIN": [ - -76.5306397287311, - -6.55014788298995 - ], - "ZARUMILLA, ZARUMILLA, TUMBES": [ - -80.3013900855648, - -3.46440141060353 - ], - "ZEPITA, CHUCUITO, PUNO": [ - -69.1778473569732, - -16.4945394703273 - ], - "ZORRITOS, CONTRALMIRANTE VILLAR, TUMBES": [ - -80.7043381462799, - -3.81644515410758 - ], - "ZURITE, ANTA, CUSCO": [ - -72.2466196785754, - -13.465722637907 - ], - "ZU\u00d1IGA, CA\u00d1ETE, LIMA": [ - -76.0140631026387, - -12.8298663421598 - ], - "\u00d1AHUIMPUQUIO, TAYACAJA, HUANCAVELICA": [ - -75.091105375023, - -12.3291868694971 - ] - } -} \ No newline at end of file diff --git a/ingestion/functions/parsing/peru/input_event.json b/ingestion/functions/parsing/peru/input_event.json deleted file mode 100644 index 4fcb48787..000000000 --- a/ingestion/functions/parsing/peru/input_event.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "test/peru/peru_positivos_covid_Feb21_head_tail5k.csv", - "sourceUrl": "https://cloud.minsa.gob.pe/s/Y8w3wHsEdYQSZRp/download", - "sourceId": "60006af8d22cdc005c3f637c" -} - diff --git a/ingestion/functions/parsing/peru/peru.py b/ingestion/functions/parsing/peru/peru.py deleted file mode 100644 index a82b06d25..000000000 --- a/ingestion/functions/parsing/peru/peru.py +++ /dev/null @@ -1,152 +0,0 @@ -import os -import sys -from datetime import datetime -import csv -import json -import common.ingestion_logging as logging - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - -logger = logging.getLogger(__name__) - -# To geocode cases for Peru, we load dictionaries to map place names to coordinates. These are from ESRI Peru lookup table -# Case locations are provided as District, Province, Department. For a subset of cases, only Department is specified. -# place_coords_dict maps place names in the format District, Province, Department to coordinates, based on string matching from the lookup table. -# place_capital_coords_dict does the same except for capitals of provinces, which are recorded differently. -# If only the department is specified, department_coords_dict is used to -# give the centroid of that department - -with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "geocoding_dictionaries.json")) as json_file: - geocoding_dictionaries = json.load(json_file) - - -place_coords_dict = geocoding_dictionaries['place_coords_dict'] -place_capital_coords_dict = geocoding_dictionaries['place_capital_coords_dict'] -department_coords_dict = geocoding_dictionaries['department_coords_dict'] - - -def convert_date(raw_date: str): - """ - Convert raw date field into a value interpretable by the dataserver. - The date is listed in YYYYmmdd format, but the data server API will - assume that ambiguous cases (e.g. "05/06/2020") are in mm/dd/YYYY format. - """ - date = datetime.strptime(raw_date, "%Y%m%d") - return date.strftime("%m/%d/%YZ") - - -def convert_gender(raw_gender): - if raw_gender == "MASCULINO": - return "Male" - if raw_gender == "FEMENINO": - return "Female" - return None - - -def get_location(row, first_dict_places, capital_dict_places): - location = {} - place_list = [row['DISTRITO'], row['PROVINCIA'], row['DEPARTAMENTO']] - if place_list[2] == 'LIMA REGION': - place_list[2] = 'LIMA' - place_name = ", ".join(place_list) - try: - if place_list[0] != 'EN INVESTIGACIÓN': - location["administrativeAreaLevel3"] = place_list[0] - location["administrativeAreaLevel2"] = place_list[1] - location["administrativeAreaLevel1"] = place_list[2] - location["country"] = "Peru" - location['geoResolution'] = "Admin3" - location["name"] = place_name + ', Peru' - if place_name in first_dict_places: - coords = place_coords_dict[place_name] - elif place_name in capital_dict_places: - coords = place_capital_coords_dict[place_name] - else: - location["administrativeAreaLevel1"] = place_list[2] - location["country"] = "Peru" - location["name"] = place_list[2] + ', Peru' - location['geoResolution'] = "Admin1" - coords = department_coords_dict[place_list[2]] - - geometry = {'latitude': coords[1], - 'longitude': coords[0]} - - location["geometry"] = geometry - - return location - except Exception as e: - logger.error(place_name) - return None - - -def convert_demographics(age: str, sex: str): - demo = {} - if age: - if float(age) < 120: - demo["ageRange"] = { - "start": float(age), - "end": float(age) - } - if sex: - demo["gender"] = convert_gender(sex) - return demo or None - - -def parse_cases(raw_data_file, source_id, source_url): - """ - Parses G.h-format case data from raw API data. - Creates a dict to map type of confirming diagnostic test from Spanish abbreviation to English. - Assuming PR = prueba rapida (rapid serological test) and PCR = PCR test - """ - first_dict_places = place_coords_dict.keys() - capital_dict_places = place_capital_coords_dict.keys() - conf_methods = { - 'PR': 'Serological test', - 'PCR': 'PCR test' - } - with open(raw_data_file, "r", encoding='utf-8') as f: - reader = csv.DictReader(f, delimiter=';') - for entry in reader: - if entry["UUID"] and entry['FECHA_RESULTADO']: - location = get_location( - entry, first_dict_places, capital_dict_places) - if location: - case = { - "caseReference": { - "sourceId": source_id, - "sourceUrl": source_url}, - "location": location, - "events": [ - { - "name": "confirmed", - "value": conf_methods.get( - entry['METODODX']), - "dateRange": { - "start": convert_date( - entry["FECHA_RESULTADO"]), - "end": convert_date( - entry["FECHA_RESULTADO"])}}], - "demographics": convert_demographics( - entry["EDAD"], - entry["SEXO"]), - } - yield case - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/peru/peru_test.py b/ingestion/functions/parsing/peru/peru_test.py deleted file mode 100644 index 94574f25b..000000000 --- a/ingestion/functions/parsing/peru/peru_test.py +++ /dev/null @@ -1,198 +0,0 @@ -import os -import unittest -from peru import peru - -_SOURCE_ID = "placeholder_ID" -_SOURCE_URL = "placeholder_URL" - - -class PeruTest(unittest.TestCase): - def setUp(self): - self.maxDiff = 5000 - - def test_parse(self): - ''' - Includes a row where province and district are unspecified, where it should return just - the department and country - ''' - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = peru.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), - [{'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'administrativeAreaLevel3': 'FERREÑAFE', - 'administrativeAreaLevel2': 'FERREÑAFE', - 'administrativeAreaLevel1': 'LAMBAYEQUE', - 'country': 'Peru', - 'geoResolution': 'Admin3', - 'name': 'FERREÑAFE, FERREÑAFE, LAMBAYEQUE, Peru', - 'geometry': {'latitude': -6.62052434308725, - 'longitude': -79.7911185840526}}, - 'events': [{'name': 'confirmed', - 'value': 'Serological test', - 'dateRange': {'start': '03/29/2020Z', 'end': '03/29/2020Z'}}], - 'demographics': {'ageRange': {'start': 35.0, 'end': 35.0}, - 'gender': 'Female'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'administrativeAreaLevel3': 'CHORRILLOS', - 'administrativeAreaLevel2': 'LIMA', - 'administrativeAreaLevel1': 'LIMA', - 'country': 'Peru', - 'geoResolution': 'Admin3', - 'name': 'CHORRILLOS, LIMA, LIMA, Peru', - 'geometry': {'latitude': -12.1926451966803, - 'longitude': -77.0058884465196}}, - 'events': [{'name': 'confirmed', - 'value': 'Serological test', - 'dateRange': {'start': '03/30/2020Z', 'end': '03/30/2020Z'}}], - 'demographics': {'ageRange': {'start': 36.0, 'end': 36.0}, - 'gender': 'Male'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'administrativeAreaLevel3': 'LIMA', - 'administrativeAreaLevel2': 'LIMA', - 'administrativeAreaLevel1': 'LIMA', - 'country': 'Peru', - 'geoResolution': 'Admin3', - 'name': 'LIMA, LIMA, LIMA, Peru', - 'geometry': {'latitude': -12.0510318836147, - 'longitude': -77.0488741340857}}, - 'events': [{'name': 'confirmed', - 'value': 'Serological test', - 'dateRange': {'start': '03/30/2020Z', 'end': '03/30/2020Z'}}], - 'demographics': {'ageRange': {'start': 1.0, 'end': 1.0}, - 'gender': 'Female'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'administrativeAreaLevel3': 'LIMA', - 'administrativeAreaLevel2': 'LIMA', - 'administrativeAreaLevel1': 'LIMA', - 'country': 'Peru', - 'geoResolution': 'Admin3', - 'name': 'LIMA, LIMA, LIMA, Peru', - 'geometry': {'latitude': -12.0510318836147, - 'longitude': -77.0488741340857}}, - 'events': [{'name': 'confirmed', - 'value': 'Serological test', - 'dateRange': {'start': '03/30/2020Z', 'end': '03/30/2020Z'}}], - 'demographics': {'ageRange': {'start': 65.0, 'end': 65.0}, - 'gender': 'Female'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'administrativeAreaLevel3': 'LIMA', - 'administrativeAreaLevel2': 'LIMA', - 'administrativeAreaLevel1': 'LIMA', - 'country': 'Peru', - 'geoResolution': 'Admin3', - 'name': 'LIMA, LIMA, LIMA, Peru', - 'geometry': {'latitude': -12.0510318836147, - 'longitude': -77.0488741340857}}, - 'events': [{'name': 'confirmed', - 'value': 'Serological test', - 'dateRange': {'start': '03/30/2020Z', 'end': '03/30/2020Z'}}], - 'demographics': {'ageRange': {'start': 32.0, 'end': 32.0}, - 'gender': 'Female'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'administrativeAreaLevel3': 'LIMA', - 'administrativeAreaLevel2': 'LIMA', - 'administrativeAreaLevel1': 'LIMA', - 'country': 'Peru', - 'geoResolution': 'Admin3', - 'name': 'LIMA, LIMA, LIMA, Peru', - 'geometry': {'latitude': -12.0510318836147, - 'longitude': -77.0488741340857}}, - 'events': [{'name': 'confirmed', - 'value': 'Serological test', - 'dateRange': {'start': '03/30/2020Z', 'end': '03/30/2020Z'}}], - 'demographics': {'ageRange': {'start': 44.0, 'end': 44.0}, - 'gender': 'Male'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'administrativeAreaLevel3': 'LIMA', - 'administrativeAreaLevel2': 'LIMA', - 'administrativeAreaLevel1': 'LIMA', - 'country': 'Peru', - 'geoResolution': 'Admin3', - 'name': 'LIMA, LIMA, LIMA, Peru', - 'geometry': {'latitude': -12.0510318836147, - 'longitude': -77.0488741340857}}, - 'events': [{'name': 'confirmed', - 'value': 'Serological test', - 'dateRange': {'start': '03/30/2020Z', 'end': '03/30/2020Z'}}], - 'demographics': {'ageRange': {'start': 29.0, 'end': 29.0}, - 'gender': 'Female'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'administrativeAreaLevel3': 'LIMA', - 'administrativeAreaLevel2': 'LIMA', - 'administrativeAreaLevel1': 'LIMA', - 'country': 'Peru', - 'geoResolution': 'Admin3', - 'name': 'LIMA, LIMA, LIMA, Peru', - 'geometry': {'latitude': -12.0510318836147, - 'longitude': -77.0488741340857}}, - 'events': [{'name': 'confirmed', - 'value': 'Serological test', - 'dateRange': {'start': '03/30/2020Z', 'end': '03/30/2020Z'}}], - 'demographics': {'ageRange': {'start': 44.0, 'end': 44.0}, - 'gender': 'Female'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'administrativeAreaLevel1': 'LIMA', - 'country': 'Peru', - 'name': 'LIMA, Peru', - 'geoResolution': 'Admin1', - 'geometry': {'latitude': -11.7855675478949, - 'longitude': -76.6271728665078}}, - 'events': [{'name': 'confirmed', - 'value': 'Serological test', - 'dateRange': {'start': '03/30/2020Z', 'end': '03/30/2020Z'}}], - 'demographics': {'ageRange': {'start': 41.0, 'end': 41.0}, - 'gender': 'Male'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'administrativeAreaLevel3': 'EL AGUSTINO', - 'administrativeAreaLevel2': 'LIMA', - 'administrativeAreaLevel1': 'LIMA', - 'country': 'Peru', - 'geoResolution': 'Admin3', - 'name': 'EL AGUSTINO, LIMA, LIMA, Peru', - 'geometry': {'latitude': -12.0400969138003, - 'longitude': -76.9874046804472}}, - 'events': [{'name': 'confirmed', - 'value': 'Serological test', - 'dateRange': {'start': '03/30/2020Z', 'end': '03/30/2020Z'}}], - 'demographics': {'ageRange': {'start': 40.0, 'end': 40.0}, - 'gender': 'Male'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'administrativeAreaLevel3': 'LIMA', - 'administrativeAreaLevel2': 'LIMA', - 'administrativeAreaLevel1': 'LIMA', - 'country': 'Peru', - 'geoResolution': 'Admin3', - 'name': 'LIMA, LIMA, LIMA, Peru', - 'geometry': {'latitude': -12.0510318836147, - 'longitude': -77.0488741340857}}, - 'events': [{'name': 'confirmed', - 'value': 'PCR test', - 'dateRange': {'start': '01/05/2021Z', 'end': '01/05/2021Z'}}], - 'demographics': {'gender': 'Male'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'administrativeAreaLevel3': 'LIMA', - 'administrativeAreaLevel2': 'LIMA', - 'administrativeAreaLevel1': 'LIMA', - 'country': 'Peru', - 'geoResolution': 'Admin3', - 'name': 'LIMA, LIMA, LIMA, Peru', - 'geometry': {'latitude': -12.0510318836147, - 'longitude': -77.0488741340857}}, - 'events': [{'name': 'confirmed', - 'value': 'PCR test', - 'dateRange': {'start': '01/19/2021Z', 'end': '01/19/2021Z'}}], - 'demographics': {'gender': 'Male'}}]) diff --git a/ingestion/functions/parsing/peru/sample_data.csv b/ingestion/functions/parsing/peru/sample_data.csv deleted file mode 100644 index dd475922a..000000000 --- a/ingestion/functions/parsing/peru/sample_data.csv +++ /dev/null @@ -1,13 +0,0 @@ -;FECHA_CORTE;UUID;DEPARTAMENTO;PROVINCIA;DISTRITO;METODODX;EDAD;SEXO;FECHA_RESULTADO -0;20210128;7320cabdc1aaca6c59014cae76a134e6;LAMBAYEQUE;FERREÑAFE;FERREÑAFE;PR;35.0;FEMENINO;20200329 -1;20210128;cecdbf10074dbc011ae05b3cbd320a6f;LIMA;LIMA;CHORRILLOS;PR;36.0;MASCULINO;20200330 -2;20210128;71ecb6bccb248b0bb2ac72ed51b5e979;LIMA;LIMA;LIMA;PR;1.0;FEMENINO;20200330 -3;20210128;566af4276cbe9359abe93f9aa86396c3;LIMA;LIMA;LIMA;PR;65.0;FEMENINO;20200330 -4;20210128;027561e9d126e7c283d79c02cede562d;LIMA;LIMA;LIMA;PR;32.0;FEMENINO;20200330 -5;20210128;f016889b9ba5bd95cf15d60205cbd82e;LIMA;LIMA;LIMA;PR;44.0;MASCULINO;20200330 -6;20210128;971f8e1295583756d81fe42f3318488c;LIMA;LIMA;LIMA;PR;29.0;FEMENINO;20200330 -7;20210128;bc45b71b005a96f32eeb97060616a999;LIMA;LIMA;LIMA;PR;44.0;FEMENINO;20200330 -8;20210128;0e2a1928ddd07d99978758e86b034131;LIMA REGION;EN INVESTIGACIÓN;EN INVESTIGACIÓN;PR;41.0;MASCULINO;20200330 -9;20210128;1caabc6f4c64b5910bd8254fa0f949ce;LIMA;LIMA;EL AGUSTINO;PR;40.0;MASCULINO;20200330 -1024101;20210128;028942f0d49b634ff00563c766ea5129;LIMA;LIMA;LIMA;PCR;121.0;MASCULINO;20210105 -1106347;20210128;ca700e98a91c6f267e0cb69d9a32ef91;LIMA;LIMA;LIMA;PCR;121.0;MASCULINO;20210119 diff --git a/ingestion/functions/parsing/republic_of_korea/__init__.py b/ingestion/functions/parsing/republic_of_korea/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/republic_of_korea/input_event.json b/ingestion/functions/parsing/republic_of_korea/input_event.json deleted file mode 100644 index 0ec963101..000000000 --- a/ingestion/functions/parsing/republic_of_korea/input_event.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "test/republic_of_korea/rok_feb21.csv", - "sourceUrl": "https://raw.githubusercontent.com/ThisIsIsaac/Data-Science-for-COVID-19/master/Covid19_Dataset/patients.csv", - "sourceId": "6032763bc73880004393e502" -} - diff --git a/ingestion/functions/parsing/republic_of_korea/republic_of_korea.py b/ingestion/functions/parsing/republic_of_korea/republic_of_korea.py deleted file mode 100644 index 0c3ffe7a4..000000000 --- a/ingestion/functions/parsing/republic_of_korea/republic_of_korea.py +++ /dev/null @@ -1,194 +0,0 @@ -import json -import os -import sys -import datetime -import csv - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - -def convert_date(raw_date: str, dataserver=True): - """ - Convert raw date field into a value interpretable by the dataserver. - The date is listed in mddyy format, - """ - date = datetime.datetime.strptime(raw_date, "%m/%d/%y") - if not dataserver: - return date.strftime("%m/%d/%Y") - return date.strftime("%m/%d/%YZ") - - -def convert_gender(raw_gender): - if raw_gender == "male": - return "Male" - if raw_gender == "female": - return "Female" - return None - - -def filter_province(province): - if province == 'filtered at airport': - return None - elif province == 'capital area': - return 'Seoul' - else: - return province - - -def convert_location(entry): - query_terms = [ - term for term in [ - entry.get("group", ""), - filter_province(entry.get("province", "")), - "South Korea"] if term] - - return {"query": ", ".join(query_terms)} - - -def convert_demographics(entry): - ''' Calculating age by subtracting birth year field from confirmed date''' - demo = {} - date = datetime.datetime.strptime(entry["confirmed_date"], "%m/%d/%y") - if entry['birth_year']: - demo["ageRange"] = { - "start": float(date.year - float(entry['birth_year']) - 1), - "end": float(date.year - float(entry['birth_year'])) - } - if entry['sex']: - demo["gender"] = convert_gender(entry['sex']) - return demo or None - - -def make_notes(entry): - notes = [] - if entry['infection_order']: - notes.append( - f"Case infection order is {float(entry['infection_order'])}") - if entry['infected_by']: - notes.append( - f"Case was infected by case ID {int(float(entry['infected_by']))}") - if entry['contact_number']: - notes.append( - f"Case contact number was {float(entry['contact_number'])}") - if entry['infection_reason']: - notes.append( - f"Infection reason is given as {entry['infection_reason']}") - if entry['exposure_start'] and entry['exposure_start']: - notes.append( - f"Exposure was between {convert_date(entry['exposure_start'],dataserver=False)} and {convert_date(entry['exposure_end'],dataserver=False)}") - - return notes - - -def parse_cases(raw_data_file, source_id, source_url): - """ - Parses G.h-format case data from: https://raw.githubusercontent.com/ThisIsIsaac/Data-Science-for-COVID-19/master/Covid19_Dataset/patients.csv. - - Contains following columns: ID, dates of confirmation/release/death/exposure, birth year, sex, province, - and in a subset of cases the infection number, contact number, and group of outbreak (eg a particular Church) - - Province field is not always a place name, sometimes just a note, eg 'filtered at airport' - - We are only provided patient's birth_year, so we calculate the age by using the year of the confirmed date - as the reference point. This gives patients age by end of this year, so we provide a 1 year - range for a patient's current age. - - A subset of cases contain information on which case IDs infected others, contact number and infection number. - These are included, but seem inconsistent so should not be fully relied upon. - - - """ - - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f, delimiter=',') - notes = [] - for entry in reader: - if entry["confirmed_date"]: - case = { - "caseReference": { - "sourceId": source_id, - "sourceEntryId": entry["global_id"], - "sourceUrl": source_url - }, - "location": convert_location(entry), - "events": [ - { - "name": "confirmed", - "dateRange": - { - "start": convert_date(entry["confirmed_date"]), - "end": convert_date(entry["confirmed_date"]) - } - } - ], - "demographics": convert_demographics(entry), - } - - if entry['state'] == 'deceased': - case["events"].append({ - "name": "outcome", - "value": "Death", - "dateRange": { - "start": convert_date(entry['deceased_date']), - "end": convert_date(entry['deceased_date']), - } - }) - - elif entry['state'] == 'released': - case["events"].append({ - "name": "outcome", - "value": "Recovered", - "dateRange": { - "start": convert_date(entry['released_date']), - "end": convert_date(entry['released_date']), - } - }) - - if entry['country'] != 'Korea': - case["travelHistory"] = { - "traveledPrior30Days": True, - "travel": [ - { - "location": { - "query": entry['country'] - } - }] - } - elif entry['province'] == 'filtered at airport': - case["travelHistory"] = { - "traveledPrior30Days": True} - - # If infected_by field is populated, add as linked case ID. If place of transmission is - # available in 'group', also include the last word of that - # place (church/hospital) - if entry['infected_by']: - case["transmission"] = { - "linkedCaseIDs": [int(float(entry['infected_by']))] - } - if entry["group"]: - case["transmission"]["places"] = [ - entry['group'].split(' ')[-1]] - - notes = make_notes(entry) - if notes: - case["notes"] = ", ".join(notes) - - yield case - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/republic_of_korea/republic_of_korea_test.py b/ingestion/functions/parsing/republic_of_korea/republic_of_korea_test.py deleted file mode 100644 index 7590ff9ee..000000000 --- a/ingestion/functions/parsing/republic_of_korea/republic_of_korea_test.py +++ /dev/null @@ -1,142 +0,0 @@ -import os -import unittest -from pprint import pprint -from republic_of_korea import republic_of_korea - -_SOURCE_ID = "placeholder_ID" -_SOURCE_URL = "placeholder_URL" - - -class RepublicOfKoreaTest(unittest.TestCase): - def setUp(self): - self.maxDiff = 15000 - - def test_parse(self): - ''' - ''' - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = republic_of_korea.parse_cases( - sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), - [{'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '1', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'query': 'South Korea'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '01/20/2020Z', 'end': '01/20/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '02/06/2020Z', 'end': '02/06/2020Z'}}], - 'demographics': {'ageRange': {'start': 35.0, 'end': 36.0}, - 'gender': 'Female'}, - 'travelHistory': {'traveledPrior30Days': True, - 'travel': [{'location': {'query': 'China'}}]}, - 'notes': 'Case infection order is 1.0, Case contact number was 45.0, Infection reason is given as visit to Wuhan, Exposure was between 01/19/2020 and 01/19/2020'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '2', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'query': 'South Korea'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '01/24/2020Z', 'end': '01/24/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '02/05/2020Z', 'end': '02/05/2020Z'}}], - 'demographics': {'ageRange': {'start': 55.0, 'end': 56.0}, 'gender': 'Male'}, - 'travelHistory': {'traveledPrior30Days': True}, - 'notes': 'Case infection order is 1.0, Case contact number was 75.0, Infection reason is given as visit to Wuhan, Exposure was between 01/22/2020 and 01/22/2020'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '3', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'query': 'Seoul, South Korea'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '01/26/2020Z', 'end': '01/26/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '02/12/2020Z', 'end': '02/12/2020Z'}}], - 'demographics': {'ageRange': {'start': 53.0, 'end': 54.0}, 'gender': 'Male'}, - 'notes': 'Case infection order is 1.0, Case contact number was 16.0, Infection reason is given as visit to Wuhan, Exposure was between 01/20/2020 and 01/20/2020'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '4', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'query': 'Seoul, South Korea'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '01/27/2020Z', 'end': '01/27/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '02/09/2020Z', 'end': '02/09/2020Z'}}], - 'demographics': {'ageRange': {'start': 55.0, 'end': 56.0}, 'gender': 'Male'}, - 'notes': 'Case infection order is 1.0, Case contact number was 95.0, Infection reason is given as visit to Wuhan, Exposure was between 01/20/2020 and 01/20/2020'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '5', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'query': 'Seoul, South Korea'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '01/30/2020Z', 'end': '01/30/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '03/02/2020Z', 'end': '03/02/2020Z'}}], - 'demographics': {'ageRange': {'start': 32.0, 'end': 33.0}, 'gender': 'Male'}, - 'notes': 'Case infection order is 1.0, Case contact number was 31.0, Infection reason is given as visit to Wuhan, Exposure was between 01/24/2020 and 01/24/2020'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '6', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'query': 'Seoul, South Korea'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '01/30/2020Z', 'end': '01/30/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '02/19/2020Z', 'end': '02/19/2020Z'}}], - 'demographics': {'ageRange': {'start': 55.0, 'end': 56.0}, 'gender': 'Male'}, - 'transmission': {'linkedCaseIDs': [3]}, - 'notes': 'Case infection order is 2.0, Case was infected by case ID 3, Case contact number was 17.0, Infection reason is given as contact with patient, Exposure was between 01/26/2020 and 01/26/2020'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '7', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'query': 'Seoul, South Korea'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '01/30/2020Z', 'end': '01/30/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '02/15/2020Z', 'end': '02/15/2020Z'}}], - 'demographics': {'ageRange': {'start': 28.0, 'end': 29.0}, 'gender': 'Male'}, - 'notes': 'Case infection order is 1.0, Case contact number was 9.0, Infection reason is given as visit to Wuhan, Exposure was between 01/23/2020 and 01/23/2020'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '8', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'query': 'Jeollabuk-do, South Korea'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '01/31/2020Z', 'end': '01/31/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '02/12/2020Z', 'end': '02/12/2020Z'}}], - 'demographics': {'ageRange': {'start': 62.0, 'end': 63.0}, - 'gender': 'Female'}, - 'notes': 'Case infection order is 1.0, Case contact number was 113.0, Infection reason is given as visit to Wuhan, Exposure was between 01/23/2020 and 01/23/2020'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '9', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'query': 'Seoul, South Korea'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '01/31/2020Z', 'end': '01/31/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '02/24/2020Z', 'end': '02/24/2020Z'}}], - 'demographics': {'ageRange': {'start': 27.0, 'end': 28.0}, - 'gender': 'Female'}, - 'transmission': {'linkedCaseIDs': [5]}, - 'notes': 'Case infection order is 2.0, Case was infected by case ID 5, Case contact number was 2.0, Infection reason is given as contact with patient, Exposure was between 01/30/2020 and 01/30/2020'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceEntryId': '10', - 'sourceUrl': 'placeholder_URL'}, - 'location': {'query': 'Seoul, South Korea'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '01/31/2020Z', 'end': '01/31/2020Z'}}, - {'name': 'outcome', - 'value': 'Recovered', - 'dateRange': {'start': '02/19/2020Z', 'end': '02/19/2020Z'}}], - 'demographics': {'ageRange': {'start': 53.0, 'end': 54.0}, - 'gender': 'Female'}, - 'transmission': {'linkedCaseIDs': [6]}, - 'notes': 'Case infection order is 3.0, Case was infected by case ID 6, Case contact number was 43.0, Infection reason is given as contact with patient, Exposure was between 01/30/2020 and 01/30/2020'}]) diff --git a/ingestion/functions/parsing/republic_of_korea/sample_data.csv b/ingestion/functions/parsing/republic_of_korea/sample_data.csv deleted file mode 100644 index 95c39dfbf..000000000 --- a/ingestion/functions/parsing/republic_of_korea/sample_data.csv +++ /dev/null @@ -1,11 +0,0 @@ -global_id,local_id,sex,birth_year,country,province,disease,group,exposure_start,exposure_end,infection_reason,infection_order,infected_by,contact_number,confirmed_date,released_date,deceased_date,state -1,,female,1984.0,China,filtered at airport,,,1/19/20,1/19/20,visit to Wuhan,1.0,,45.0,1/20/20,2/6/20,,released -2,,male,1964.0,Korea,filtered at airport,,,1/22/20,1/22/20,visit to Wuhan,1.0,,75.0,1/24/20,2/5/20,,released -3,,male,1966.0,Korea,capital area,,,1/20/20,1/20/20,visit to Wuhan,1.0,,16.0,1/26/20,2/12/20,,released -4,,male,1964.0,Korea,capital area,,,1/20/20,1/20/20,visit to Wuhan,1.0,,95.0,1/27/20,2/9/20,,released -5,,male,1987.0,Korea,capital area,,,1/24/20,1/24/20,visit to Wuhan,1.0,,31.0,1/30/20,3/2/20,,released -6,,male,1964.0,Korea,capital area,,,1/26/20,1/26/20,contact with patient,2.0,3.0,17.0,1/30/20,2/19/20,,released -7,,male,1991.0,Korea,capital area,,,1/23/20,1/23/20,visit to Wuhan,1.0,,9.0,1/30/20,2/15/20,,released -8,,female,1957.0,Korea,Jeollabuk-do,,,1/23/20,1/23/20,visit to Wuhan,1.0,,113.0,1/31/20,2/12/20,,released -9,,female,1992.0,Korea,capital area,,,1/30/20,1/30/20,contact with patient,2.0,5.0,2.0,1/31/20,2/24/20,,released -10,,female,1966.0,Korea,capital area,,,1/30/20,1/30/20,contact with patient,3.0,6.0,43.0,1/31/20,2/19/20,,released diff --git a/ingestion/functions/parsing/riograndedosul/__init__.py b/ingestion/functions/parsing/riograndedosul/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/riograndedosul/input_event.json b/ingestion/functions/parsing/riograndedosul/input_event.json deleted file mode 100644 index 7ea3b4a89..000000000 --- a/ingestion/functions/parsing/riograndedosul/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "rgdsbrazil-test-id/content.csv", - "sourceUrl": "https://ti.saude.rs.gov.br/covid19/download", - "sourceId": "abc123" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/riograndedosul/riograndedosul.py b/ingestion/functions/parsing/riograndedosul/riograndedosul.py deleted file mode 100644 index cfccc52df..000000000 --- a/ingestion/functions/parsing/riograndedosul/riograndedosul.py +++ /dev/null @@ -1,286 +0,0 @@ -import json -import os -import sys -from datetime import date, datetime -import csv - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - - -_AGE_INDEX = 5 -_GENDER_INDEX = 4 -_ETHNICITY = 21 -_COUNTY = 1 -_DATE_CONFIRMED = 7 -_DATE_SYMPTOMS = 8 -_HOSPITALIZED = 11 -_DATE_DEATH = 19 -_FEVER = 12 -_COUGH = 13 -_SORETHROAT = 14 -_SHORTBREATH = 15 -_OTHER = 16 -_COMORBIDITIES = 17 -_INDIGENOUS = 22 -_HEALTHCARE_WORKER = 23 -_NEIGHBORHOOD = 24 - -_COMORBIDITIES_MAP = { - "Doenças renais crônicas em estágio avançado (graus 3, 4 ou 5)": "chronic kidney disease", - "Asm": "asthma", - "Doença Cardiovascular Crônica": "cardiovascular system disease", - "Doenças cardíacas crônicas": "heart disease", - "Doença Renal Crônic": "kidney disease", - "Doença Hepática Crônic": "liver disease", - "Doença Neurológica Crônic": "nervous system disease", - "Pneumatopatia Crônica": "lung disease", - "Doenças respiratórias crônicas descompensadas": "respiratory system disease", - "Diabetes": "diabetes mellitus", - "Síndrome de Down": "Down syndrome", - "Obesidad": "obesity", - "Puérpera": "recently gave birth", - "Gestante": "pregnancy", -} - - -def convert_date(raw_date): - """ - Convert raw date field into a value interpretable by the dataserver. - """ - date = datetime.strptime(raw_date, "%d/%m/%Y") - return date.strftime("%m/%d/%YZ") - - -def convert_gender(raw_gender: str): - if raw_gender == "Masculino": - return "Male" - if raw_gender == "Feminino": - return "Female" - - -def convert_events(date_confirmed, date_symptoms, hospitalized, date_death): - """Hospitalization date not listed, so confirmation date is used""" - events = [ - { - "name": "confirmed", - "dateRange": { - "start": convert_date(date_confirmed), - "end": convert_date(date_confirmed), - }, - } - ] - if date_symptoms: - events.append( - { - "name": "onsetSymptoms", - "dateRange": { - "start": convert_date(date_symptoms), - "end": convert_date(date_symptoms), - }, - } - ) - if hospitalized != "NAO": - events.append( - { - "name": "hospitalAdmission", - "dateRange": { - "start": convert_date(date_confirmed), - "end": convert_date(date_confirmed), - }, - "value": "Yes", - } - ) - if date_death: - events.append( - { - "name": "outcome", - "dateRange": { - "start": convert_date(date_death), - "end": convert_date(date_death), - }, - "value": "Death", - } - ) - return events - - -def convert_symptoms( - fever: str, cough: str, sorethroat: str, shortbreath: str, other: str -): - symptoms = [] - if fever == "SIM": - symptoms.append("Fever") - if cough == "SIM": - symptoms.append("Cough") - if sorethroat == "SIM": - symptoms.append("Sore Throat") - if shortbreath == "SIM": - symptoms.append("Shortness of Breath") - if other == "SIM": - symptoms.append("Other") - return symptoms - - -def convert_preexisting_conditions(raw_commorbidities: str): - preexistingConditions = {} - if not raw_commorbidities: - return None - preexistingConditions["hasPreexistingConditions"] = True - commorbidities_list = [] - - for key in _COMORBIDITIES_MAP: - if key in raw_commorbidities: - commorbidities_list.append(_COMORBIDITIES_MAP[key]) - - preexistingConditions["values"] = commorbidities_list - return preexistingConditions - - -def convert_ethnicity(raw_ethnicity: str): - if raw_ethnicity == "Preta": - return "Black" - elif raw_ethnicity == "Parda": - return "Mixed" - elif raw_ethnicity == "Amarela": - return "Asian" - elif raw_ethnicity == "Branca": - return "White" - elif raw_ethnicity == "Indigena": - return "Indigenous" - - -def convert_demographics( - gender: str, age: str, ethnicity: str, health_professional: str -): - demo = {} - if gender: - demo["gender"] = convert_gender(gender) - if age: - if age == "80 e mais": - demo["ageRange"] = {"start": 80, "end": 120} - elif age == "<1": - demo["ageRange"] = {"start": 0, "end": 0} - else: - age_range = age.split(" a ") - demo["ageRange"] = { - "start": float(age_range[0]), - "end": float(age_range[1]), - } - if ethnicity != "NAO INFORMADO": - demo["ethnicity"] = convert_ethnicity(ethnicity.title()) - if health_professional == "SIM": - demo["occupation"] = "Healthcare worker" - return demo or None - - -def convert_notes( - raw_commorbidities: str, - raw_notes_neighbourhood: str, - raw_notes_indigenousEthnicity: str, -): - raw_notes = [] - if ( - "Portador de doenças cromossômicas ou estado de fragilidade imunológica" - in raw_commorbidities - ): - raw_notes.append("primary immunodeficiency disease or chromosomal disease") - if "Imunossupressão" in raw_commorbidities: - raw_notes.append("Patient with immunosupression") - if "Imunodeficiênci" in raw_commorbidities: - raw_notes.append("Patient with immunodeficiency") - if "Doença Hematológica Crônic" in raw_commorbidities: - raw_notes.append("Hematologic disease") - if "Outro" in raw_commorbidities: - raw_notes.append("Unspecified pre-existing condition") - if "Puérpera" in raw_commorbidities: - raw_notes.append("recently gave birth") - if "Gestante" in raw_commorbidities: - raw_notes.append("pregnant") - if raw_notes_neighbourhood: - raw_notes.append("Neighbourhood: " + raw_notes_neighbourhood.title()) - if raw_notes_indigenousEthnicity != "NAO ENCONTRADO": - raw_notes.append( - "Indigenous ethnicity: " + raw_notes_indigenousEthnicity.title() - ) - notes = (", ").join(raw_notes) - return notes or None - - -def parse_cases(raw_data_file: str, source_id: str, source_url: str): - """ - Parses G.h-format case data from raw API data. - """ - with open(raw_data_file, "r") as f: - reader = csv.reader(f, delimiter=";") - next(reader) # Skip the header. - for row in reader: - try: - case = { - "caseReference": {"sourceId": source_id, "sourceUrl": source_url}, - "location": { - "query": ", ".join( - [row[_COUNTY], "Rio Grande do Sul", "Brazil"] - ) - }, - "events": convert_events( - row[_DATE_CONFIRMED], - row[_DATE_SYMPTOMS], - row[_HOSPITALIZED], - row[_DATE_DEATH], - ), - "demographics": convert_demographics( - row[_GENDER_INDEX], - row[_AGE_INDEX], - row[_ETHNICITY], - row[_HEALTHCARE_WORKER], - ), - } - if "SIM" in ( - row[_FEVER], - row[_COUGH], - row[_SORETHROAT], - row[_SHORTBREATH], - row[_OTHER], - ): - case["symptoms"] = { - "status": "Symptomatic", - "values": convert_symptoms( - row[_FEVER], - row[_COUGH], - row[_SORETHROAT], - row[_SHORTBREATH], - row[_OTHER], - ), - } - if row[_COMORBIDITIES]: - case["preexistingConditions"] = convert_preexisting_conditions( - row[_COMORBIDITIES] - ) - notes = convert_notes( - row[_COMORBIDITIES], row[_NEIGHBORHOOD], row[_INDIGENOUS] - ) - if notes: - case["restrictedNotes"] = notes - yield case - except ValueError as ve: - raise ValueError("Unhandled data: {}".format(ve)) - - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/riograndedosul/riograndedosul_test.py b/ingestion/functions/parsing/riograndedosul/riograndedosul_test.py deleted file mode 100644 index 94ed3fc68..000000000 --- a/ingestion/functions/parsing/riograndedosul/riograndedosul_test.py +++ /dev/null @@ -1,64 +0,0 @@ -import csv -import json -import os -import tempfile -import unittest -from datetime import date - -import pytest - -from riograndedosul import riograndedosul - -_SOURCE_ID = "abc123" -_SOURCE_URL = "https://ti.saude.rs.gov.br/covid19/download" -_PARSED_CASE = ({ - "caseReference": { - "sourceId": "abc123", - "sourceUrl": "https://ti.saude.rs.gov.br/covid19/download", - }, - "location": {"query": "PORTO ALEGRE, Rio Grande do Sul, Brazil"}, - "events": [ - { - "name": "confirmed", - "dateRange": {"start": "06/18/2020Z", "end": "06/18/2020Z"}, - }, - { - "name": "onsetSymptoms", - "dateRange": {"start": "06/02/2020Z", "end": "06/02/2020Z"}, - }, - { - "name": "hospitalAdmission", - "dateRange": {"start": "06/18/2020Z", "end": "06/18/2020Z"}, - "value": "Yes", - }, - { - "name": "outcome", - "dateRange": {"start": "07/08/2020Z", "end": "07/08/2020Z"}, - "value": "Death", - }, - ], - "demographics": { - "gender": "Male", - "ageRange": {"start": 40.0, "end": 49.0}, - "ethnicity": "White", - }, - "symptoms": { - "status": "Symptomatic", - "values": ["Fever", "Cough", "Sore Throat", "Shortness of Breath", "Other"], - }, - "preexistingConditions": {"hasPreexistingConditions": True, "values": []}, - "restrictedNotes": "Patient with immunodeficiency, Unspecified pre-existing condition, Neighbourhood: Centro Historico", -}) - - -class RGDSTest(unittest.TestCase): - def test_parse(self): - # Default of 1500 is not enough to show diffs when there is one. - self.maxDiff = 5000 - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = next( - riograndedosul.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - ) - self.assertCountEqual([result], [_PARSED_CASE]) diff --git a/ingestion/functions/parsing/riograndedosul/sample_data.csv b/ingestion/functions/parsing/riograndedosul/sample_data.csv deleted file mode 100644 index fb6547415..000000000 --- a/ingestion/functions/parsing/riograndedosul/sample_data.csv +++ /dev/null @@ -1,2 +0,0 @@ -COD_IBGE;MUNICIPIO;COD_REGIAO_COVID;REGIAO_COVID;SEXO;FAIXAETARIA;CRITERIO;DATA_CONFIRMACAO;DATA_SINTOMAS;DATA_EVOLUCAO;EVOLUCAO;HOSPITALIZADO;FEBRE;TOSSE;GARGANTA;DISPNEIA;OUTROS;CONDICOES;GESTANTE;DATA_INCLUSAO_OBITO;DATA_EVOLUCAO_ESTIMADA;RACA_COR;ETNIA_INDIGENA;PROFISSIONAL_SAUDE;BAIRRO;HOSPITALIZACAO_SRAG;FONTE_INFORMACAO;PAIS_NASCIMENTO;PES_PRIV_LIBERDADE -431490;"PORTO ALEGRE";7;"PORTO ALEGRE - R10";Masculino;"40 a 49";RT-PCR;18/06/2020;02/06/2020;06/07/2020;OBITO;SIM;SIM;SIM;SIM;SIM;SIM;"Imunodeficiência, Outros";NAO;08/07/2020;16/06/2020;BRANCA;"NAO ENCONTRADO";"NAO INFORMADO";"CENTRO HISTORICO";SIM;"SIVEP HOSP";BRASIL;NAO diff --git a/ingestion/functions/parsing/saopaolo/__init__.py b/ingestion/functions/parsing/saopaolo/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/saopaolo/input_event.json b/ingestion/functions/parsing/saopaolo/input_event.json deleted file mode 100644 index 317e9ebfb..000000000 --- a/ingestion/functions/parsing/saopaolo/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "5f7337434ae4d50028bb34e0/2020/09/29/1353/content.csv", - "sourceUrl": "https://raw.githubusercontent.com/seade-R/dados-covid-sp/master/data/dados_covid_sp.csv", - "sourceId": "5f7337434ae4d50028bb34e0" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/saopaolo/sample_data.csv b/ingestion/functions/parsing/saopaolo/sample_data.csv deleted file mode 100644 index e4039f688..000000000 --- a/ingestion/functions/parsing/saopaolo/sample_data.csv +++ /dev/null @@ -1,2 +0,0 @@ -nome_munic;codigo_ibge;dia;mes;datahora;casos;casos_novos;casos_pc;casos_mm7d;obitos;obitos_novos;obitos_pc;obitos_mm7d;letalidade;nome_ra;cod_ra;nome_drs;cod_drs;pop;pop_60;area;map_leg;map_leg_s;latitude;longitude;semana_epidem -Itapevi;3522505;31;3;2020-03-31;6;5;2,524041e+00; 0,8571429;0;0;0,000000e+00; 0,0000000;0,0000000000;RM de São Paulo;10;Grande São Paulo;10;237714;23105;8266;<10;7.0;-23,5488;-46,9327;14 diff --git a/ingestion/functions/parsing/saopaolo/saopaolo.py b/ingestion/functions/parsing/saopaolo/saopaolo.py deleted file mode 100644 index e4946f73c..000000000 --- a/ingestion/functions/parsing/saopaolo/saopaolo.py +++ /dev/null @@ -1,73 +0,0 @@ -import json -import os -import sys -from datetime import datetime -import csv - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - - - -def convert_date(raw_date): - """ - Convert raw date field into a value interpretable by the dataserver. - """ - date = datetime.strptime(raw_date, "%Y-%m-%d") - return date.strftime("%m/%d/%YZ") - - -def parse_cases(raw_data_file: str, source_id: str, source_url: str): - """ - Parses G.h-format case data from raw API data. - - Some caveats: - 1. There are no patient ID/case ID in the raw API so we aren't able - to dedupe. - 2. We can't link confirmed cases and confirmed deaths because of (1) - so we're only importing confirmed cases and ignoring deaths. - """ - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f, delimiter=";") - for row in reader: - num_confirmed_cases = int(row["casos_novos"]) - if (not num_confirmed_cases) or (row["nome_munic"] == "Ignorado"): - continue - try: - when = convert_date(row["datahora"]) - case = { - "caseReference": {"sourceId": source_id, "sourceUrl": source_url}, - "location": {"query": f"{row['nome_munic']}, São Paulo, Brazil"}, - "events": [ - { - "name": "confirmed", - "dateRange": { - "start": when, - "end": when, - }, - }, - ], - } - for _ in range(num_confirmed_cases): - yield case - except ValueError as ve: - raise ValueError("Unhandled data: {}".format(ve)) - - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/saopaolo/saopaolo_test.py b/ingestion/functions/parsing/saopaolo/saopaolo_test.py deleted file mode 100644 index 087220acd..000000000 --- a/ingestion/functions/parsing/saopaolo/saopaolo_test.py +++ /dev/null @@ -1,76 +0,0 @@ -import csv -import json -import os -import tempfile -import unittest -from datetime import date - -import pytest - -from saopaolo import saopaolo - -_SOURCE_ID = "abc123" -_SOURCE_URL = "http://sao.paolo" -_PARSED_CASES = [ - { - "caseReference": {"sourceId": "abc123", "sourceUrl": "http://sao.paolo"}, - "location": {"query": "Itapevi, São Paulo, Brazil"}, - "events": [ - { - "name": "confirmed", - "dateRange": {"start": "03/31/2020Z", "end": "03/31/2020Z"}, - } - ], - }, - { - "caseReference": {"sourceId": "abc123", "sourceUrl": "http://sao.paolo"}, - "location": {"query": "Itapevi, São Paulo, Brazil"}, - "events": [ - { - "name": "confirmed", - "dateRange": {"start": "03/31/2020Z", "end": "03/31/2020Z"}, - } - ], - }, - { - "caseReference": {"sourceId": "abc123", "sourceUrl": "http://sao.paolo"}, - "location": {"query": "Itapevi, São Paulo, Brazil"}, - "events": [ - { - "name": "confirmed", - "dateRange": {"start": "03/31/2020Z", "end": "03/31/2020Z"}, - } - ], - }, - { - "caseReference": {"sourceId": "abc123", "sourceUrl": "http://sao.paolo"}, - "location": {"query": "Itapevi, São Paulo, Brazil"}, - "events": [ - { - "name": "confirmed", - "dateRange": {"start": "03/31/2020Z", "end": "03/31/2020Z"}, - } - ], - }, - { - "caseReference": {"sourceId": "abc123", "sourceUrl": "http://sao.paolo"}, - "location": {"query": "Itapevi, São Paulo, Brazil"}, - "events": [ - { - "name": "confirmed", - "dateRange": {"start": "03/31/2020Z", "end": "03/31/2020Z"}, - } - ], - }, -] - - -class SaoPaoloTest(unittest.TestCase): - def test_parse(self): - # Default of 1500 is not enough to show diffs when there is one. - self.maxDiff = 5000 - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = saopaolo.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), _PARSED_CASES) diff --git a/ingestion/functions/parsing/scotland/__init__.py b/ingestion/functions/parsing/scotland/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/scotland/input_event.json b/ingestion/functions/parsing/scotland/input_event.json deleted file mode 100644 index 4655738a1..000000000 --- a/ingestion/functions/parsing/scotland/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "test/scotland/scotland_covid_trend_agesex_20210115.csv", - "sourceUrl": "https://www.opendata.nhs.scot/dataset/b318bddf-a4dc-4262-971f-0ba329e09b87/resource/9393bd66-5012-4f01-9bc5-e7a10accacf4/download/trend_agesex_$FULLYEAR$FULLMONTH$FULLDAY.csv", - "sourceId": "6002b302b13c8100365ac7d9" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/scotland/sample_data.csv b/ingestion/functions/parsing/scotland/sample_data.csv deleted file mode 100644 index a5aa5940e..000000000 --- a/ingestion/functions/parsing/scotland/sample_data.csv +++ /dev/null @@ -1,21 +0,0 @@ -,Date,Country,Sex,SexQF,AgeGroup,AgeGroupQF,DailyPositive,CumulativePositive,CrudeRatePositive,DailyDeaths,CumulativeDeaths,CrudeRateDeaths,CumulativeNegative,CrudeRateNegative -40,20200229,S92000003,Total,d,15 to 19,,0,0,0.0,0,0,0.0,19,6.738592272607981 -41,20200229,S92000003,Total,d,20 to 24,,0,0,0.0,0,0,0.0,70,20.146435807699397 -42,20200229,S92000003,Total,d,25 to 44,,0,0,0.0,0,0,0.0,276,19.3864878988981 -43,20200229,S92000003,Total,d,45 to 64,,0,1,0.0666504928137439,0,0,0.0,301,20.0617983369369 -44,20200229,S92000003,Total,d,65 to 74,,0,0,0.0,0,0,0.0,74,12.796126577900699 -45,20200229,S92000003,Total,d,75 to 84,,0,0,0.0,0,0,0.0,14,4.13274372856139 -46,20200229,S92000003,Total,d,85plus,,0,0,0.0,0,0,0.0,3,2.3605876289471 -47,20200229,S92000003,Total,d,Total,d,0,1,0.0183039554847803,0,0,0.0,863,15.7963135833654 -48,20200301,S92000003,Female,,15 to 19,,0,0,0.0,0,0,0.0,11,7.983394539358129 -49,20200301,S92000003,Female,,20 to 24,,0,0,0.0,0,0,0.0,48,28.006301417819 -50,20200301,S92000003,Female,,25 to 44,,0,0,0.0,0,0,0.0,134,18.598763598610898 -51,20200301,S92000003,Female,,45 to 64,,0,0,0.0,0,0,0.0,153,19.767824957848 -52,20200301,S92000003,Female,,65 to 74,,1,1,0.331673858461498,0,0,0.0,37,12.2719327630754 -53,20200301,S92000003,Female,,75 to 84,,0,0,0.0,0,0,0.0,8,4.18795544015412 -54,20200301,S92000003,Female,,85plus,,1,0,0.0,0,0,0.0,4,4.86653527021437 -55,20200301,S92000003,Female,,Total,d,1,1,0.0357104978507637,0,0,0.0,447,15.962592539291402 -56,20200301,S92000003,Male,,15 to 19,,0,0,0.0,0,0,0.0,11,7.62977554587576 -57,20200301,S92000003,Male,,20 to 24,,0,0,0.0,0,0,0.0,30,17.0390648961185 -58,20200301,S92000003,Male,,25 to 44,,0,0,0.0,0,0,0.0,158,22.468906162453 -59,20200301,S92000003,Male,,45 to 64,,1,2,0.27533835642274895,0,0,0.0,162,22.302406870242702 diff --git a/ingestion/functions/parsing/scotland/scotland.py b/ingestion/functions/parsing/scotland/scotland.py deleted file mode 100644 index cd0f75ea4..000000000 --- a/ingestion/functions/parsing/scotland/scotland.py +++ /dev/null @@ -1,123 +0,0 @@ -import json -import os -import sys -from datetime import datetime -import csv - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - - - -def convert_date(raw_date: str, dataserver=True): - """ - Convert raw date field into a value interpretable by the dataserver. - The date is listed in mddyy format, - """ - date = datetime.strptime(raw_date, "%Y%m%d") - if not dataserver: - return date.strftime("%m/%d/%Y") - return date.strftime("%m/%d/%YZ") - - -def convert_demographics(entry): - ''' - If age is 85plus then give age range 85-120. Otherwise extract lower bound and upper bound of age - No need for convert_gender function, as string is provided in correct format - ''' - demo = {} - if entry['AgeGroup'] == '85plus': - demo["ageRange"] = { - "start": 85, - "end": 120 - } - else: - lb, ub = entry['AgeGroup'].split(' to ') - demo["ageRange"] = { - "start": int(lb), - "end": int(ub) - } - demo["gender"] = entry['Sex'] - return demo - - -def parse_cases(raw_data_file, source_id, source_url): - """ - Parses G.h-format case data from: https://raw.githubusercontent.com/ThisIsIsaac/Data-Science-for-COVID-19/master/Covid19_Dataset/patients.csv. - - Scotland has datasets all presented in aggregated form. This parser currently uses the Age + Sex - Daily positives: for each date, they provide the total number of Males or Females infected, - within a particular age group. We want individual cases, so we want to do the following transformation: - - Age: 15-19 | Sex: Female | TotalPositives: 5 --> 5 individual cases with Sex=Female and Age Range. - - This aggregation massively limits data we can use, so until we can find a way to complement with other datasets, - we have no location data, no UUIDs, and no other fields of interest. - - We'll loop through each date, only selecting rows referring specifically to Males or Females and a particular age group - (some rows show total across all ages/sexes) - - If age is 85plus then give age range 85-120, otherwise extract lower bound and upper bound of age - No need for convert_gender function, as string is provided in correct format - - The data actually contains two different groups of age range: 0-14, 15-19, 20-24, 25-44, 45-64, 65-74, 75-84 and 85+, - and 0-59 and 60+. If we ingest all of these then we double count cases. Therefore, only use the more specific age ranges. - """ - - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f, delimiter=',') - cases = [] - notes = [] - for entry in reader: - ageGroup = entry['AgeGroup'] - relevantAgeGroup = ageGroup not in ['Total', '60+', '0 to 59'] - if int(entry['DailyPositive'] - ) > 0 and entry['Sex'] != 'Total' and relevantAgeGroup: - case = { - "caseReference": { - "sourceId": source_id, - "sourceUrl": source_url - }, - "events": [ - { - "name": "confirmed", - "dateRange": - { - "start": convert_date(entry["Date"]), - "end": convert_date(entry["Date"]) - } - } - ], - "demographics": convert_demographics(entry), - "location": { - "name": "Scotland", - "administrativeAreaLevel1": "Scotland", - "country": "United Kingdom", - "geoResolution": "Admin1", - "geometry": { - "latitude": 56.7863, - "longitude": -4.1140 - } - } - } - for _ in range(int(entry['DailyPositive'])): - yield case - - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/scotland/scotland_test.py b/ingestion/functions/parsing/scotland/scotland_test.py deleted file mode 100644 index 2b9ce7154..000000000 --- a/ingestion/functions/parsing/scotland/scotland_test.py +++ /dev/null @@ -1,54 +0,0 @@ -import os -import unittest -from pprint import pprint -from scotland import scotland - -_SOURCE_ID = "placeholder_ID" -_SOURCE_URL = "placeholder_URL" -_LOCATION = { - "name": "Scotland", - "administrativeAreaLevel1": "Scotland", - "country": "United Kingdom", - "geoResolution": "Admin1", - "geometry": {"latitude": 56.7863, "longitude": -4.1140}, -} - - -def _c(confirmed_date, gender, age_start, age_end): - return { - "caseReference": { - "sourceId": "placeholder_ID", - "sourceUrl": "placeholder_URL", - }, - "events": [ - { - "name": "confirmed", - "dateRange": {"start": confirmed_date, "end": confirmed_date}, - } - ], - "demographics": { - "ageRange": {"start": age_start, "end": age_end}, - "gender": gender, - }, - "location": _LOCATION, - } - - -_PARSED_CASES = [ - _c("03/01/2020Z", "Female", 65, 74), - _c("03/01/2020Z", "Female", 85, 120), - _c("03/01/2020Z", "Male", 45, 64), -] - - -class ScotlandTest(unittest.TestCase): - def setUp(self): - # Default of 1500 is not enough to show diffs when there is one. - self.maxDiff = 10000 - - def test_parse(self): - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = list(scotland.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL)) - self.assertCountEqual(result, _PARSED_CASES) diff --git a/ingestion/functions/parsing/south_africa/__init__.py b/ingestion/functions/parsing/south_africa/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/south_africa/input_event.json b/ingestion/functions/parsing/south_africa/input_event.json deleted file mode 100644 index 8783cd518..000000000 --- a/ingestion/functions/parsing/south_africa/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "5fd62b19c44be30056c7280b/2020/12/13/1531/content.csv", - "sourceUrl": "https://raw.githubusercontent.com/dsfsi/covid19africa/master/data/line_lists/line-list-south-africa.csv", - "sourceId": "5fd62b19c44be30056c7280b" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/south_africa/sample_data.csv b/ingestion/functions/parsing/south_africa/sample_data.csv deleted file mode 100644 index bdfdc912b..000000000 --- a/ingestion/functions/parsing/south_africa/sample_data.csv +++ /dev/null @@ -1,5 +0,0 @@ -case_id,origin_case_id,date,age,gender,city,province/state,country,current_status,source,symptoms,date_onset_symptoms,date_admission_hospital,date_confirmation,underlyng_conditions,travel_history_dates,travel_history_location,death_date,notes_for_discussion -13,,2020-03-11,36.0,male,,WC,South Africa,,github.com/dsfsi/covid19za,,,,,,,Travelled to Germany; Austria; Switzerland and Dubai,, -25,,2020-03-14,76.0,male,,GP,South Africa,,github.com/dsfsi/covid19za,,,,,,,Travelled to USA and UK,, -117,,2020-03-19,41.0,female,,GP,South Africa,,github.com/dsfsi/covid19za,,,,,,,Travelled to the Democratic Republic of Congo,, -366,,2020-03-23,,not specified,,UNK,South Africa,,,,,,,,,,, diff --git a/ingestion/functions/parsing/south_africa/south_africa.py b/ingestion/functions/parsing/south_africa/south_africa.py deleted file mode 100644 index 257a31bd0..000000000 --- a/ingestion/functions/parsing/south_africa/south_africa.py +++ /dev/null @@ -1,165 +0,0 @@ -import json -import os -import sys -from datetime import datetime -import csv -import pycountry - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - - -_UUID = "case_id" -_AGE = "age" -_GENDER = "gender" -_PROVINCE = "province/state" -_COUNTRY = "country" -_DATE_CONFIRMED = "date" -_SOURCE = "source" -_TRAVEL = "travel_history_location" - -_PROVINCE_MAP = { - "KZN": "KwaZulu-Natal", - "GP": "Gauteng", - "WC": "Western Cape", - "MP": "Mpumalanga", - "LP": "Limpopo", - "FS": "Free State", - "EC": "Eastern Cape", - "NC": "Northern Cape", - "NW": "North West" -} - - -def convert_date(raw_date): - """ - Convert raw date field into a value interpretable by the dataserver. - """ - try: - date = datetime.strptime(raw_date, "%Y-%m-%d") - return date.strftime("%m/%d/%YZ") - except: - return None - - -def convert_gender(raw_gender: str): - if raw_gender == "male": - return "Male" - if raw_gender == "female": - return "Female" - - -def convert_events(date_confirmed): - events = [ - { - "name": "confirmed", - "dateRange": { - "start": convert_date(date_confirmed), - "end": convert_date(date_confirmed) - } - } - ] - return events - - -def convert_location(province: str): - if province: - # UNK is not a recognized South African province, probably means 'unknown' - if province != "UNK": - return ", ".join([_PROVINCE_MAP[province], "South Africa"]) - else: - return "South Africa" - else: - return "South Africa" - - -def convert_demographics(gender: str, age: str): - demo = {} - if gender: - demo["gender"] = convert_gender(gender) - if age: - demo["ageRange"] = {"start": float(age), "end": float(age)} - return demo - - -def convert_additional_sources(additional_source_url: str): - if additional_source_url: - return [{"sourceUrl": additional_source_url}] - - -def convert_travel(travel_history: str): - # United States entered as US, USA and Unites States of America - # United Kingdom entered as UK and United Kingdom - travel = [] - # UK is not an entry in the pycountry dict so has to be dealt with separately - if "UK" in travel_history: - travel_history = travel_history.replace("UK", "United Kingdom") - for country in list(pycountry.countries): - if country.name in travel_history or country.alpha_3 in travel_history: - # Otherwise this returns Republic of the Congo which is the wrong country - if country.name == "Congo": - travel.append({"location": {"query": "Congo, The Democratic Republic of the"}}) - else: - travel.append({"location": {"query": country.name}}) - if "Dubai" in travel_history: - travel.append({"location": {"query": "Dubai, United Arab Emirates"}}) - if travel: - return {"traveledPrior30Days": True, - "travel": travel} - - -def parse_cases(raw_data_file: str, source_id: str, source_url: str): - """ - Parses G.h-format case data from raw API data. - - Please note that this data was last updated in May 2020. - - This parser only deals with the columns where there was any data at the time of writing. - Several columns with potentially useful information (e.g. date_onset_symptoms) are unpopulated for all cases. - Would be worth keeping an eye on the data to see whether (a) it starts getting updated again and (b) whether this will lead to any new information provided at which point the parser will need to be expanded to deal with this. - """ - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f, delimiter=",") - for row in reader: - if row[_COUNTRY] == "South Africa": - try: - case = { - "caseReference": { - "sourceId": source_id, - "sourceEntryId": row[_UUID], - "sourceUrl": source_url, - "additionalSources": convert_additional_sources(row[_SOURCE]) - }, - "location": { - "query": convert_location(row[_PROVINCE]) - }, - "demographics": convert_demographics( - row[_GENDER], row[_AGE] - ), - "events": convert_events( - row[_DATE_CONFIRMED] - ), - "travelHistory": convert_travel(row[_TRAVEL]) - } - yield case - except ValueError as ve: - raise ValueError(f"error converting case: {ve}") - - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) \ No newline at end of file diff --git a/ingestion/functions/parsing/south_africa/south_africa_test.py b/ingestion/functions/parsing/south_africa/south_africa_test.py deleted file mode 100644 index e9902199a..000000000 --- a/ingestion/functions/parsing/south_africa/south_africa_test.py +++ /dev/null @@ -1,160 +0,0 @@ -import os -import unittest - -from south_africa import south_africa - -_SOURCE_ID = "abc123" -_SOURCE_URL = "foo.bar" - - -class SouthAfricaTest(unittest.TestCase): - def setUp(self): - # Default of 1500 is not enough to show diffs when there is one. - self.maxDiff = 10000 - - def test_parse(self): - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = south_africa.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), [ - { - "caseReference": { - "sourceId": _SOURCE_ID, - "sourceEntryId": "13", - "sourceUrl": _SOURCE_URL, - "additionalSources": [{ - "sourceUrl": "github.com/dsfsi/covid19za" - }] - }, - "location": { - "query": "Western Cape, South Africa" - }, - "demographics": { - "gender": "Male", - "ageRange": { - "start": 36.0, - "end": 36.0 - } - }, - "events": [{ - "name": "confirmed", - "dateRange": { - "start": "03/11/2020Z", - "end": "03/11/2020Z" - } - }], - "travelHistory": { - "traveledPrior30Days": True, - "travel": [ - {"location": { - "query": "Austria" - }}, - {"location": { - "query": "Switzerland" - }}, - {"location": { - "query": "Germany" - }}, - {"location": { - "query": "Dubai, United Arab Emirates" - }} - ], - } - }, - { - "caseReference": { - "sourceId": _SOURCE_ID, - "sourceEntryId": "25", - "sourceUrl": _SOURCE_URL, - "additionalSources": [{ - "sourceUrl": "github.com/dsfsi/covid19za" - }] - }, - "location": { - "query": "Gauteng, South Africa" - }, - "demographics": { - "gender": "Male", - "ageRange": { - "start": 76.0, - "end": 76.0 - } - }, - "events": [{ - "name": "confirmed", - "dateRange": { - "start": "03/14/2020Z", - "end": "03/14/2020Z" - } - }], - "travelHistory": { - "traveledPrior30Days": True, - "travel": [ - {"location": { - "query": "United Kingdom" - }}, - {"location": { - "query": "United States" - }} - ], - } - }, - { - "caseReference": { - "sourceId": _SOURCE_ID, - "sourceEntryId": "117", - "sourceUrl": _SOURCE_URL, - "additionalSources": [{ - "sourceUrl": "github.com/dsfsi/covid19za" - }] - }, - "location": { - "query": "Gauteng, South Africa" - }, - "demographics": { - "gender": "Female", - "ageRange": { - "start": 41.0, - "end": 41.0 - } - }, - "events": [{ - "name": "confirmed", - "dateRange": { - "start": "03/19/2020Z", - "end": "03/19/2020Z" - } - }], - "travelHistory": { - "traveledPrior30Days": True, - "travel": [ - {"location": { - "query": "Congo, The Democratic Republic of the" - }} - ], - } - }, - { - "caseReference": { - "sourceId": _SOURCE_ID, - "sourceEntryId": "366", - "sourceUrl": _SOURCE_URL, - "additionalSources": None - }, - "location": { - "query": "South Africa" - }, - "demographics": { - "gender": None - }, - "events": [{ - "name": "confirmed", - "dateRange": { - "start": "03/23/2020Z", - "end": "03/23/2020Z" - } - }], - "travelHistory": None - } - ]) diff --git a/ingestion/functions/parsing/taiwan/__init__.py b/ingestion/functions/parsing/taiwan/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/taiwan/geocodes.json b/ingestion/functions/parsing/taiwan/geocodes.json deleted file mode 100644 index 09b8b1e13..000000000 --- a/ingestion/functions/parsing/taiwan/geocodes.json +++ /dev/null @@ -1,232 +0,0 @@ -{ - "南投縣": { - "administrativeAreaLevel1": "Nantou County", - "country": "Taiwan", - "geoResolution": "Admin1", - "geometry": { - "latitude": 23.84053335, - "longitude": 120.93291098389277 - }, - "name": "Nantou County" - }, - "台中市": { - "administrativeAreaLevel1": "Taichung", - "country": "Taiwan", - "geoResolution": "Admin1", - "geometry": { - "latitude": 24.163162, - "longitude": 120.6478282 - }, - "name": "Taichung" - }, - "台北市": { - "administrativeAreaLevel1": "Taipei", - "country": "Taiwan", - "geoResolution": "Admin1", - "geometry": { - "latitude": 25.0375198, - "longitude": 121.5636796 - }, - "name": "Taipei" - }, - "台南市": { - "administrativeAreaLevel1": "Tainan", - "country": "Taiwan", - "geoResolution": "Admin1", - "geometry": { - "latitude": 22.9912348, - "longitude": 120.184982 - }, - "name": "Tainan" - }, - "台東縣": { - "administrativeAreaLevel1": "Taitung County", - "country": "Taiwan", - "geoResolution": "Admin1", - "geometry": { - "latitude": 22.7553667, - "longitude": 121.1506 - }, - "name": "Taitung County" - }, - "嘉義市": { - "administrativeAreaLevel1": "Chiayi", - "country": "Taiwan", - "geoResolution": "Admin1", - "geometry": { - "latitude": 23.4811089, - "longitude": 120.4535412 - }, - "name": "Chiayi" - }, - "嘉義縣": { - "administrativeAreaLevel1": "Chiayi County", - "country": "Taiwan", - "geoResolution": "Admin1", - "geometry": { - "latitude": 23.4591664, - "longitude": 120.2930004 - }, - "name": "Chiayi County" - }, - "基隆市": { - "administrativeAreaLevel1": "Keelung", - "country": "Taiwan", - "geoResolution": "Admin1", - "geometry": { - "latitude": 25.1317232, - "longitude": 121.744652 - }, - "name": "Keelung" - }, - "宜蘭縣": { - "administrativeAreaLevel1": "Yilan County", - "country": "Taiwan", - "geoResolution": "Admin1", - "geometry": { - "latitude": 24.7302791, - "longitude": 121.7631149 - }, - "name": "Yilan County" - }, - "屏東縣": { - "administrativeAreaLevel1": "Pingtung County", - "country": "Taiwan", - "geoResolution": "Admin1", - "geometry": { - "latitude": 22.6828017, - "longitude": 120.487928 - }, - "name": "Pingtung County" - }, - "彰化縣": { - "administrativeAreaLevel1": "Changhua County", - "country": "Taiwan", - "geoResolution": "Admin1", - "geometry": { - "latitude": 24.0755667, - "longitude": 120.5444667 - }, - "name": "Changhua County" - }, - "新北市": { - "administrativeAreaLevel1": "New Taipei", - "country": "Taiwan", - "geoResolution": "Admin1", - "geometry": { - "latitude": 25.011997, - "longitude": 121.4656619 - }, - "name": "New Taipei" - }, - "新竹市": { - "administrativeAreaLevel1": "Hsinchu", - "country": "Taiwan", - "geoResolution": "Admin1", - "geometry": { - "latitude": 24.8066333, - "longitude": 120.9686833 - }, - "name": "Hsinchu" - }, - "新竹縣": { - "administrativeAreaLevel1": "Hsinchu County", - "country": "Taiwan", - "geoResolution": "Admin1", - "geometry": { - "latitude": 24.8267, - "longitude": 121.0128333 - }, - "name": "Hsinchu County" - }, - "桃園市": { - "administrativeAreaLevel1": "Taoyuan City", - "country": "Taiwan", - "geoResolution": "Admin1", - "geometry": { - "latitude": 24.9929995, - "longitude": 121.3010003 - }, - "name": "Taoyuan City" - }, - "澎湖縣": { - "administrativeAreaLevel1": "Penghu", - "country": "Taiwan", - "geoResolution": "Admin1", - "geometry": { - "latitude": 23.569694, - "longitude": 119.5664543 - }, - "name": "Penghu" - }, - "空值": { - "administrativeAreaLevel1": "CPC Corporation, Taiwan", - "country": "Taiwan", - "geoResolution": "Admin1", - "geometry": { - "latitude": 23.11435375, - "longitude": 121.38840342297793 - }, - "name": "CPC Corporation, Taiwan" - }, - "花蓮縣": { - "administrativeAreaLevel1": "Hualien County", - "country": "Taiwan", - "geoResolution": "Admin1", - "geometry": { - "latitude": 23.9913421, - "longitude": 121.6197276 - }, - "name": "Hualien County" - }, - "苗栗縣": { - "administrativeAreaLevel1": "Miaoli County", - "country": "Taiwan", - "geoResolution": "Admin1", - "geometry": { - "latitude": 24.5647667, - "longitude": 120.8205167 - }, - "name": "Miaoli County" - }, - "連江縣": { - "administrativeAreaLevel1": "Lienchiang County", - "country": "Taiwan", - "geoResolution": "Admin1", - "geometry": { - "latitude": 26.1491915, - "longitude": 119.9389047 - }, - "name": "Lienchiang County" - }, - "金門縣": { - "administrativeAreaLevel1": "Kinmen", - "country": "Taiwan", - "geoResolution": "Admin1", - "geometry": { - "latitude": 24.4480637, - "longitude": 118.3856331 - }, - "name": "Kinmen" - }, - "雲林縣": { - "administrativeAreaLevel1": "Yunlin County", - "country": "Taiwan", - "geoResolution": "Admin1", - "geometry": { - "latitude": 23.6990775, - "longitude": 120.5245511 - }, - "name": "Yunlin County" - }, - "高雄市": { - "administrativeAreaLevel1": "Kaohsiung", - "country": "Taiwan", - "geoResolution": "Admin1", - "geometry": { - "latitude": 22.6203348, - "longitude": 120.3120375 - }, - "name": "Kaohsiung" - } -} diff --git a/ingestion/functions/parsing/taiwan/get_geocodes.py b/ingestion/functions/parsing/taiwan/get_geocodes.py deleted file mode 100644 index 5a7c971b3..000000000 --- a/ingestion/functions/parsing/taiwan/get_geocodes.py +++ /dev/null @@ -1,73 +0,0 @@ -# Retrieve geocodes for Admin1 from OSM -import json -import time -from urllib.parse import urlencode - -import requests - -OSM = "https://nominatim.openstreetmap.org/search?" - -_LOCATIONS = [ - "空值", - "金門縣", - "新北市", - "基隆市", - "新竹市", - "花蓮縣", - "高雄市", - "南投縣", - "台中市", - "雲林縣", - "苗栗縣", - "桃園市", - "屏東縣", - "連江縣", - "嘉義縣", - "嘉義市", - "宜蘭縣", - "澎湖縣", - "台南市", - "新竹縣", - "台北市", - "彰化縣", - "台東縣", -] - - -def get_geocode(place): - query = urlencode( - { - "q": f"{place}, Taiwan", - "format": "geojson", - "countrycodes": "tw", - "limit": 1, - "namedetails": 1, - } - ) - r = requests.get(f"{OSM}{query}") - j = r.json() - try: - lon, lat = j["features"][0]["geometry"]["coordinates"] - except (ValueError, KeyError, IndexError): - return None - namedetails = j["features"][0]["properties"]["namedetails"] - # Try to fetch en version of name - name = namedetails.get("name:en", None) or namedetails.get("name") - time.sleep(3) - return { - "name": name, - "geoResolution": "Admin1", - "administrativeAreaLevel1": name, - "geometry": {"latitude": lat, "longitude": lon}, - "country": "Taiwan", - } - - -print( - json.dumps( - {s: get_geocode(s) for s in _LOCATIONS}, - indent=2, - sort_keys=True, - ensure_ascii=False, - ) -) diff --git a/ingestion/functions/parsing/taiwan/input_event.json b/ingestion/functions/parsing/taiwan/input_event.json deleted file mode 100644 index 0983aa9ad..000000000 --- a/ingestion/functions/parsing/taiwan/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "60303a9779f30f002aac0cdd/2021/02/22/1756/content.csv", - "sourceUrl": "https://data.cdc.gov.tw/en/download?resourceid=3c1e263d-16ec-4d70-b56c-21c9e2171fc7&dataurl=https://od.cdc.gov.tw/eic/Day_Confirmation_Age_County_Gender_19CoV.csv", - "sourceId": "60303a9779f30f002aac0cdd" -} diff --git a/ingestion/functions/parsing/taiwan/sample_data.csv b/ingestion/functions/parsing/taiwan/sample_data.csv deleted file mode 100644 index 8a5c3d276..000000000 --- a/ingestion/functions/parsing/taiwan/sample_data.csv +++ /dev/null @@ -1,4 +0,0 @@ -確定病名,個案研判日,縣市,性別,是否為境外移入,年齡層,確定病例數 -嚴重特殊傳染性肺炎,2020/01/22,空值,女,是,55-59,2 -嚴重特殊傳染性肺炎,2020/01/24,彰化縣,男,否,55,1 -嚴重特殊傳染性肺炎,2020/01/24,彰化縣,男,否,70+,1 \ No newline at end of file diff --git a/ingestion/functions/parsing/taiwan/taiwan.py b/ingestion/functions/parsing/taiwan/taiwan.py deleted file mode 100644 index 28f898307..000000000 --- a/ingestion/functions/parsing/taiwan/taiwan.py +++ /dev/null @@ -1,145 +0,0 @@ -import os -import sys -import csv -import json -from datetime import datetime -from pathlib import Path -import common.ingestion_logging as logging - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error - -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - -logger = logging.getLogger(__name__) - -TAIWAN_LOCATION = { - "country": "Taiwan", - # Go to wikipedia to debate please, thank you. - "geoResolution": "Country", - "name": "Taiwan", - "geometry": { - "longitude": float("120.930229378541"), - "latitude": float("23.7779779950014") - } -} - -# Geocode data © OpenStreetMap contributors https://www.openstreetmap.org/copyright -with (Path(__file__).parent / 'geocodes.json').open() as geof: - _GEOCODES = json.load(geof) - -def convert_date(raw_date): - """ - Convert raw date field into a value interpretable by the dataserver. - - Date filtering API expects mm/dd/YYYYZ format. - """ - date = datetime.strptime(raw_date, "%Y/%m/%d") - return date.strftime("%m/%d/%YZ") - - -def convert_gender(raw_gender: str): - if raw_gender == "男": - return "Male" - elif raw_gender == "女": - return "Female" - elif raw_gender == "第三性": - return "Non-binary/Third gender" - elif raw_gender == "性別不詳": - return None - else: - raise ValueError(f'Unhandled gender: {raw_gender}') - - -def convert_demographics(gender: str, age: str): - demo = {} - if gender: - demo["gender"] = convert_gender(gender) - if age: - # Brackets are like "35-39" or "over 85". - if '-' in age: - start, _, end = age.partition("-") - demo["ageRange"] = { - "start": int(start), - "end": int(end), - } - elif age.isdigit(): - demo["ageRange"] = { - "start": int(age), - "end": int(age), - } - elif age == "70+": - demo["ageRange"] = { - "start": 70, - "end": 120, - } - else: - raise ValueError(f'Unhandled age: {age}') - return demo or None - - -def convert_immigration(immigration_status: str): - return ({"traveledPrior30Days": True} if immigration_status == "是" - else None) - - -def convert_location(location): - if location == '空值': # means 'empty value', not a city - return TAIWAN_LOCATION - try: - return _GEOCODES[location] - except KeyError: - logger.error(f"Location not found: {location}") - return None - - -def parse_cases(raw_data_file: str, source_id: str, source_url: str): - """Parses G.h-format case data from raw API data. - Remarks: No per-case ID is available so we can't dedupe cases. - """ - with open(raw_data_file, "r") as f: - reader = csv.DictReader(f) - for row in reader: - case = { - "caseReference": { - "sourceId": source_id, - "sourceUrl": source_url, - }, - "location": convert_location(row['縣市']), - "events": [ - { - "name": "confirmed", - "dateRange": - { - "start": convert_date(row['個案研判日']), - "end": convert_date(row['個案研判日']), - }, - }, - ], - "demographics": convert_demographics( - # Sex. - row['性別'], - # Age range. - row['年齡層']), - "travelHistory": convert_immigration(row["是否為境外移入"]), - } - # Number of cases that this row represents. - for _ in range(int(row["確定病例數"])): - yield case - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/taiwan/taiwan_test.py b/ingestion/functions/parsing/taiwan/taiwan_test.py deleted file mode 100644 index e16400ec5..000000000 --- a/ingestion/functions/parsing/taiwan/taiwan_test.py +++ /dev/null @@ -1,106 +0,0 @@ -import os -import unittest - -from taiwan import taiwan - -_SOURCE_ID = "abc123" -_SOURCE_URL = "some-source-url" - -_Changhua = { - "administrativeAreaLevel1": "Changhua County", - "country": "Taiwan", - "geoResolution": "Admin1", - "geometry": { - "latitude": 24.0755667, - "longitude": 120.5444667 - }, - "name": "Changhua County" -} - - -_PARSED_CASES = [ - { - "caseReference": { - "sourceId": _SOURCE_ID, - "sourceUrl": _SOURCE_URL, - }, - 'location': taiwan.TAIWAN_LOCATION, - 'events': [ - { - 'name': 'confirmed', - 'dateRange': {'start': '01/22/2020Z', 'end': '01/22/2020Z'}, - }, - ], - 'demographics': { - 'gender': 'Female', - 'ageRange': {'start': 55, 'end': 59}, - }, - "travelHistory": { - "traveledPrior30Days": True - }, - }, { - "caseReference": { - "sourceId": _SOURCE_ID, - "sourceUrl": _SOURCE_URL, - }, - 'location': taiwan.TAIWAN_LOCATION, - 'events': [ - { - 'name': 'confirmed', - 'dateRange': {'start': '01/22/2020Z', 'end': '01/22/2020Z'}, - }, - ], - 'demographics': { - 'gender': 'Female', - 'ageRange': {'start': 55, 'end': 59}, - }, - "travelHistory": { - "traveledPrior30Days": True - }, - }, { - "caseReference": { - "sourceId": _SOURCE_ID, - "sourceUrl": _SOURCE_URL, - }, - 'location': _Changhua, - 'events': [ - { - 'name': 'confirmed', - 'dateRange': {'start': '01/24/2020Z', 'end': '01/24/2020Z'}, - }, - ], - 'demographics': { - 'gender': 'Male', - 'ageRange': {'start': 55, 'end': 55}, - }, - "travelHistory": None - }, { - "caseReference": { - "sourceId": _SOURCE_ID, - "sourceUrl": _SOURCE_URL, - }, - 'location': _Changhua, - 'events': [ - { - 'name': 'confirmed', - 'dateRange': {'start': '01/24/2020Z', 'end': '01/24/2020Z'}, - }, - ], - 'demographics': { - 'gender': 'Male', - 'ageRange': {'start': 70, 'end': 120}, - }, - "travelHistory": None - }, -] - - -class TaiwanTest(unittest.TestCase): - def test_parse(self): - # Default of 1500 is not enough to show diffs when there is one. - self.maxDiff = 5000 - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = taiwan.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), _PARSED_CASES) diff --git a/ingestion/functions/parsing/thailand/__init__.py b/ingestion/functions/parsing/thailand/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/thailand/input_event.json b/ingestion/functions/parsing/thailand/input_event.json deleted file mode 100644 index 2475fcb9f..000000000 --- a/ingestion/functions/parsing/thailand/input_event.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "sourceUrl": "https://covid19.th-stat.com/api/open/cases", - "s3Key": "5feb4be70af5b9003c10f916/2020/12/29/1536/content.json", - "sourceId": "5feb4be70af5b9003c10f916" -} \ No newline at end of file diff --git a/ingestion/functions/parsing/thailand/nationalities.json b/ingestion/functions/parsing/thailand/nationalities.json deleted file mode 100644 index 63cc49ff0..000000000 --- a/ingestion/functions/parsing/thailand/nationalities.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "nationalities": { - "Thailand":"Thai", - "Burmese":"Burmese", - "Burma": "Burmese", - "India":"Indian", - "UnitedStatesofAmerica":"American", - "France":"French", - "UnitedKingdom":"British", - "China":"Chinese", - "Russia":"Russian", - "Swiss":"Swiss", - "Japan":"Japanese", - "Germany":"German", - "Pakistan":"Pakistani", - "Sweden":"Swedish", - "Italy":"Italian", - "Kuwait":"Kuwaiti", - "Philippines":"Filipino", - "Canada":"Canadian", - "Belgium":"Belgian", - "Ethiopia":"Ethiopian", - "Bangladesh":"Bangladeshi", - "Netherlands":"Dutch", - "Sudan":"Sudanese", - "Denmark":"Danish", - "Brazil":"Brazilian", - "Korea,South":"South Korean", - "Vietnam":"Vietnamese", - "Singapore":"Singaporean", - "Indonesia":"Indonesian", - "Cambodia":"Cambodian", - "Laos":"Lao", - "Australia":"Australian", - "Malaysia":"Malaysian", - "Egypt":"Egyptian", - "Iran":"Iranian", - "Hungary":"Hungarian", - "Israel":"Israeli", - "Albania":"Albanian", - "British":"British", - "Spain":"Spanish", - "Ukraine":"Ukrainian", - "American":"American", - "Mexico":"Mexican", - "Kazakhstani":"Kazakh", - "Uzbekistan":"Uzbek", - "Finland":"Finnish", - "Serbia":"Serbian", - "Qatar":"Qatari", - "Taiwan":"Taiwanese", - "Yemen":"Yemeni", - "Portugal":"Portuguese", - "NewZealand":"New Zealander", - "Liberia":"Liberian", - "Palestine":"Palestinian", - "Mali":"Malian", - "Tunisia":"Tunisian" - } -} \ No newline at end of file diff --git a/ingestion/functions/parsing/thailand/sample_data.json b/ingestion/functions/parsing/thailand/sample_data.json deleted file mode 100644 index 3d9e3b4c5..000000000 --- a/ingestion/functions/parsing/thailand/sample_data.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "Data": [ - { - "ConfirmDate": "2563-09-07 00:00:00", - "No": "3445", - "Age": 27, - "Gender": "\u0e0a\u0e32\u0e22", - "GenderEn": "Male", - "Nation": "Thailand", - "NationEn": null, - "Province": "\u0e01\u0e23\u0e38\u0e07\u0e40\u0e17\u0e1e\u0e21\u0e2b\u0e32\u0e19\u0e04\u0e23", - "ProvinceId": 1, - "District": "\u0e23\u0e32\u0e0a\u0e40\u0e17\u0e27\u0e35", - "ProvinceEn": "Bangkok", - "Detail": null, - "StatQuarantine": 1 - }, - { - "ConfirmDate": "2020-05-08 00:00:00", - "No": "2999", - "Age": 30, - "Gender": "\u0e2b\u0e0d\u0e34\u0e07", - "GenderEn": "Female", - "Nation": "Burma", - "NationEn": "Burmese", - "Province": "\u0e2a\u0e07\u0e02\u0e25\u0e32", - "ProvinceId": 58, - "District": "\u0e2a\u0e30\u0e40\u0e14\u0e32", - "ProvinceEn": "Songkhla", - "Detail": null, - "StatQuarantine": 0 - }, - { - "ConfirmDate": "2020-07-13 00:00:00", - "No": "3219", - "Age": 43, - "Gender": "\u0e0a\u0e32\u0e22", - "GenderEn": "Male", - "Nation": "India-Thailand", - "NationEn": null, - "Province": "\u0e44\u0e21\u0e48\u0e1e\u0e1a\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25", - "ProvinceId": 78, - "District": "\u0e40\u0e21\u0e37\u0e2d\u0e07", - "ProvinceEn": "Unknown", - "Detail": null, - "StatQuarantine": 1 - } - ] -} \ No newline at end of file diff --git a/ingestion/functions/parsing/thailand/thailand.py b/ingestion/functions/parsing/thailand/thailand.py deleted file mode 100644 index 7d21ef4c4..000000000 --- a/ingestion/functions/parsing/thailand/thailand.py +++ /dev/null @@ -1,131 +0,0 @@ -import json -import os -import sys -from datetime import datetime - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir,os.pardir, 'common')) - import parsing_lib - -with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "nationalities.json")) as json_file: - nationalities = json.load(json_file) - -_NATIONALITIES_MAP = nationalities["nationalities"] - - -def convert_date(raw_date): - """ - Convert raw date field into a value interpretable by the dataserver. - - The date is listed in YYYY-mm-dd HH:MM:SS format, but the date filtering API - expects mm/dd/YYYYZ format. - """ - date = datetime.strptime(raw_date, "%Y-%m-%d %H:%M:%S") - # Some cases are reported using the Buddhist calendar which is 543 years ahead of the Gregorian - year = date.year - if year > 2540: - corrected_year = year - 543 - return date.strftime(f"%m/%d/{corrected_year}Z") - else: - return date.strftime("%m/%d/%YZ") - - -def convert_gender(raw_gender): - if raw_gender == "Male" or raw_gender == "ชาย": - return "Male" - if raw_gender == "Female" or raw_gender == "หญิง": - return "Female" - else: - return None - - -def convert_location(entry): - query_terms = [ - # District doesn't have English translations. - entry['District'], - # Province sometimes has English translations or not or 'Unknown' - (entry['ProvinceEn'] - if entry['ProvinceEn'] != 'Unknown' else '') or entry['Province'], - 'Thailand', - ] - return {"query": ", ".join([term for term in query_terms if term])} - - -def notes(entry): - if entry['StatQuarantine'] == 1: - return 'Case was in quarantine' - else: - return 'Case was not in quarantine' - - -def convert_nationality(entry): - nationalities = [] - for key in _NATIONALITIES_MAP: - if key in entry: - nationalities.append(_NATIONALITIES_MAP[key]) - if nationalities: - return nationalities - else: - return None - - -def demographics(entry): - demo = {} - age = entry['Age'] - # Some negative age entries - if age and float(age) >= 0.0: - demo["ageRange"] = { - "start": float(age), - "end": float(age), - } - gender = entry['GenderEn'] or entry['Gender'] - if gender: - demo['gender'] = convert_gender(gender) - nationalities = entry['Nation'] - if nationalities: - demo['nationalities'] = convert_nationality(nationalities) - return demo or None - - -def parse_cases(raw_data_file, source_id, source_url): - """Parses G.h-format case data from raw API data.""" - with open(raw_data_file, "r") as f: - for entry in json.load(f)['Data']: - yield { - "caseReference": { - "sourceId": source_id, - "sourceEntryId": entry["No"], - "sourceUrl": source_url - }, - "location": convert_location(entry), - "events": [ - { - "name": "confirmed", - "dateRange": - { - "start": convert_date(entry["ConfirmDate"]), - "end": convert_date(entry["ConfirmDate"]), - } - } - ], - "demographics": demographics(entry), - "notes": notes(entry), - } - - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/thailand/thailand_test.py b/ingestion/functions/parsing/thailand/thailand_test.py deleted file mode 100644 index 0acb46d31..000000000 --- a/ingestion/functions/parsing/thailand/thailand_test.py +++ /dev/null @@ -1,100 +0,0 @@ -import os -import unittest - -from thailand import thailand - - -_SOURCE_ID = "abc123" -_SOURCE_URL = "https://foo.bar" -_PARSED_CASES = [ - { - "caseReference": { - "sourceId": _SOURCE_ID, - 'sourceEntryId': '3445', - "sourceUrl": _SOURCE_URL - }, - "location": {'query': 'ราชเทวี, Bangkok, Thailand'}, - "events": [ - { - "name": "confirmed", - "dateRange": - { - "start": "09/07/2020Z", - "end": "09/07/2020Z" - } - } - ], - "demographics": { - "ageRange": { - "start": 27.0, - "end": 27.0 - }, - "gender": "Male", - "nationalities": [ - "Thai" - ] - }, - "notes": 'Case was in quarantine', - }, - { - "caseReference": { - "sourceId": _SOURCE_ID, - 'sourceEntryId': '2999', - "sourceUrl": _SOURCE_URL - }, - "location": {'query': 'สะเดา, Songkhla, Thailand'}, - "events": [ - { - "name": "confirmed", - "dateRange": - { - "start": "05/08/2020Z", - "end": "05/08/2020Z" - } - } - ], - "demographics": { - "ageRange": { - "start": 30.0, - "end": 30.0 - }, - "gender": "Female", - "nationalities":[ - "Burmese" - ] - }, - "notes": 'Case was not in quarantine', - }, - { - 'caseReference': { - 'sourceId': 'abc123', - 'sourceEntryId': '3219', - 'sourceUrl': 'https://foo.bar' - }, - 'location': {'query': 'เมือง, ไม่พบข้อมูล, Thailand'}, - 'events': [ - {'name': 'confirmed', 'dateRange': { - 'start': '07/13/2020Z', 'end': '07/13/2020Z'}} - ], - 'demographics': { - 'ageRange': {'start': 43.0, 'end': 43.0}, - 'gender': 'Male', - "nationalities": [ - "Thai", - "Indian" - ] - }, - 'notes': 'Case was in quarantine' - }, -] - - -class ThailandTest(unittest.TestCase): - def test_parse(self): - # Default of 1500 is not enough to show diffs when there is one. - self.maxDiff = 5000 - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.json") - - result = thailand.parse_cases(sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), _PARSED_CASES) diff --git a/ingestion/functions/parsing/variants/__init__.py b/ingestion/functions/parsing/variants/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/parsing/variants/input_event.json b/ingestion/functions/parsing/variants/input_event.json deleted file mode 100644 index 4b25b394f..000000000 --- a/ingestion/functions/parsing/variants/input_event.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "env": "local", - "s3Bucket": "gdh-sources", - "s3Key": "test/variants/B.1.351_Manual_Cases_Feb23.csv", - "sourceUrl": "https://raw.githubusercontent.com/fojackson8/covid19_mapping/main/globalhealth_voc.csv", - "sourceId": "60360c20cac8a600566de9f3" -} - diff --git a/ingestion/functions/parsing/variants/sample_data.csv b/ingestion/functions/parsing/variants/sample_data.csv deleted file mode 100644 index e663877fe..000000000 --- a/ingestion/functions/parsing/variants/sample_data.csv +++ /dev/null @@ -1,11 +0,0 @@ -,X_id,caseReference.sourceUrl,demographics.ageRange.start,demographics.ageRange.end,demographics.ethnicity,demographics.gender,demographics.nationalities,demographics.occupation,events.confirmed.date.start,events.confirmed.date.end,events.confirmed.value,caseReference.additionalSources,caseReference.sourceEntryId,caseReference.sourceId,caseReference.uploadIds,caseReference.verificationStatus,events.firstClinicalConsultation.date.end,events.firstClinicalConsultation.date.start,events.firstClinicalConsultation.value,events.hospitalAdmission.date.end,events.hospitalAdmission.date.start,events.hospitalAdmission.value,events.icuAdmission.date.end,events.icuAdmission.date.start,events.icuAdmission.value,events.onsetSymptoms.date.end,events.onsetSymptoms.date.start,events.onsetSymptoms.value,events.outcome.date.end,events.outcome.date.start,events.outcome.value,events.selfIsolation.date.end,events.selfIsolation.date.start,events.selfIsolation.value,location.administrativeAreaLevel1,location.administrativeAreaLevel2,location.administrativeAreaLevel3,location.country,location.geoResolution,location.geometry.latitude,location.geometry.longitude,location.name,location.place,location.query,notes,pathogens,preexistingConditions.hasPreexistingConditions,preexistingConditions.values,revisionMetadata.creationMetadata.curator,revisionMetadata.creationMetadata.date,revisionMetadata.creationMetadata.notes,revisionMetadata.editMetadata.curator,revisionMetadata.editMetadata.date,revisionMetadata.editMetadata.notes,revisionMetadata.revisionNumber,symptoms.status,symptoms.values,transmission.linkedCaseIds,transmission.places,transmission.routes,travelHistory.travel.dateRange.end,travelHistory.travel.dateRange.start,travelHistory.travel.location.name,travelHistory.travel.methods,travelHistory.travel.purpose,travelHistory.traveledPrior30Days,variantOfConcern,genomeSequences.sample.collection.date,genomeSequences.repository.url,genomeSequences.sequence.accession,genomeSequences.sequence.name,genomeSequences.sequence.length,number.of.cases -0,,https://www.wtoc.com/2021/01/28/health-department-nations-first-cases-south-african-covid-variant-found-sc/,18.0,120.0,,,,,28/12/2020,28/12/2020,Yes,,,,,,,,,,,,,,,,,,,,,,,,South Carolina,,,USA,,,,"South Carolina, United States",,"South Carolina, United States",Lowcountry region,,,,,,,,,,,,,,,,,,,,,No,B.1.351,,,,,,1 -1,,https://www.wtoc.com/2021/01/28/health-department-nations-first-cases-south-african-covid-variant-found-sc/,18.0,120.0,,,,,28/12/2020,28/12/2020,Yes,,,,,,,,,,,,,,,,,,,,,,,,South Carolina,,,USA,,,,"South Carolina, United States",,"South Carolina, United States",Pee Dee region,,,,,,,,,,,,,,,,,,,,,No,B.1.351,,,,,,1 -2,,https://www.theguardian.com/world/2021/jan/27/encouraging-signs-new-zealand-hopes-for-covid-all-clear-after-no-new-cases-reported,56.0,56.0,,Female,New Zealander,,24/01/2021,27/01/2021,Yes,https://www.theguardian.com/world/2021/jan/24/new-zealand-records-first-covid-community-case-intwo-months,,,,,,,,,,,,,,,,,,,,,,,,Auckland,Auckland,New Zealand,,,,,,"Auckland, Auckland, New Zealand",,,,,,,,,,,,Symptomatic,body ache,,,,30/12/2020,30/12/2020,"London, United Kingdom",Flight,,Yes,B.1.351,,,,,,1 -3,,https://www.theguardian.com/world/2021/jan/27/encouraging-signs-new-zealand-hopes-for-covid-all-clear-after-no-new-cases-reported,,,,,,,27/01/2021,27/01/2021,Yes,,,,,,,,,,,,,,,,,,,,,,,,,Auckland,Auckland,New Zealand,,,,,,"Auckland, Auckland, New Zealand",,,,,,,,,,,,Asymptomatic,,,,,,,,,,,B.1.351,,,,,,1 -4,,https://www.theguardian.com/world/2021/jan/27/encouraging-signs-new-zealand-hopes-for-covid-all-clear-after-no-new-cases-reported,,,,,,,27/01/2021,27/01/2021,Yes,,,,,,,,,,,,,,,,,,,,,,,,,Auckland,Auckland,New Zealand,,,,,,"Auckland, Auckland, New Zealand",,,,,,,,,,,,Asymptomatic,,,,,,,,,,,B.1.351,,,,,,1 -5,,https://twitter.com/danieljbridges/status/1344227535870164992,,,,,,,23/12/2020,23/12/2020,Yes,,,,,,,,,,,,,,,,,,,,,,,,,,,Zambia,,,,,,Zambia,,,,,,,,,,,,,,,,,,,,,,,B.1.351,,,,,,22 -6,,https://www.sabcnews.com/sabcnews/botswana-government-adjusts-national-lockdown-regulations/,,,,,,,01/01/2021,07/01/2021,Yes,,,,,,,,,,,,,,,,,,,,,,,,,,,Botswana,,,,,,Botswana,,,,,,,,,,,,,,,,,,,,,,,B.1.351,,,,,,1 -7,,https://www.france24.com/en/france/20201231-france-detects-first-case-of-south-african-strain-of-covid-19,,,,,,,31/12/2020,31/12/2020,Yes,,,,,,,,,,,,,,,,,,,,,,,,,,Haut-Rhin,France,,,,,,"Haut-Rhin, France",,,,,,,,,,,,,,,,,,,South Africa,Flight,,Yes,B.1.351,,,,,,1 -8,,http://outbreaknewstoday.com/sweden-reports-1st-south-african-covid-19-virus-variant-49394/,,,,,,,03/01/2021,03/01/2021,Yes,,,,,,,,,,,,,,,,,,,,,,,,,,,Sweden,,,,,,Sweden,,,,,,,,,,,,,,,,,,,South Africa,,,Yes,B.1.351,,,,,,1 -9,,https://www.vg.no/nyheter/innenriks/i/rgzer8/mer-smittsom-virusmutasjon-fra-soer-afrika-paavist-i-norge,,,,,,,04/01/2021,04/01/2021,Yes,,,,,,,,,,,,,,,,,,,,,,,,,,,Norway,,,,,,Norway,,,,,,,,,,,,,,,,,01/12/2020,31/12/2020,South Africa,Flight,,Yes,B.1.351,,,,,,1 diff --git a/ingestion/functions/parsing/variants/variants.py b/ingestion/functions/parsing/variants/variants.py deleted file mode 100644 index c66d082c2..000000000 --- a/ingestion/functions/parsing/variants/variants.py +++ /dev/null @@ -1,174 +0,0 @@ -import os -import sys -from datetime import datetime -import csv -import json -import copy - -# Layer code, like parsing_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import parsing_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.dirname(os.path.abspath(__file__))), - 'common/python')) - import parsing_lib - -def convert_date(raw_date: str): - """ - Convert raw date field into a value interpretable by the dataserver. - """ - date = datetime.strptime(raw_date, "%d/%m/%Y") - return date.strftime("%m/%d/%YZ") - -def convert_location(entry): - return {"query": entry['location.query']} - -def convert_demographics(entry): - demo = {} - if entry['demographics.ageRange.start']: - demo["ageRange"] = { - "start": float(entry['demographics.ageRange.start']), - "end": float(entry['demographics.ageRange.end']) - } - if entry['demographics.nationalities']: - demo["nationalities"] = [entry['demographics.nationalities']] - for field in ['gender', 'ethnicity', 'occupation']: - if entry[f'demographics.{field}']: - demo[field] = entry[f'demographics.{field}'] - return demo or None - -def get_all_events(entry): - events = [] - for field in [ - 'onsetSymptoms', - 'hospitalAdmission', - 'icuAdmission', - 'firstClinicalConsultation', - 'outcome', - 'selfIsolation']: - if entry[f'events.{field}.value']: - event = {"name": field, - "value": entry[f'events.{field}.value']} - - if entry[f'events.{field}.date.start']: - event["dateRange"] = { - "start": convert_date( - entry[f'events.{field}.date.start'])} - if entry[f'events.{field}.date.end']: - event["dateRange"]['end'] = convert_date( - entry[f'events.{field}.date.end']) - events.append(event) - return [e for e in events if e] - - -def get_preexisting_conditions(entry): - preexistingConditions = {} - preexistingConditions["hasPreexistingConditions"] = True - preexistingConditions["values"] = [entry['preexistingConditions.values']] - return preexistingConditions - - -def get_travel_history(entry): - travel_history = {} - if entry['travelHistory.traveledPrior30Days'].lower() == 'yes': - travel_history['traveledPrior30Days'] = True - travel = {} - if entry['travelHistory.travel.methods']: - travel['methods'] = [entry['travelHistory.travel.methods']] - if entry['travelHistory.travel.purpose']: - travel['purpose'] = entry['travelHistory.travel.purpose'] - if entry['travelHistory.travel.location.name']: - travel['location'] = { - 'query': entry['travelHistory.travel.location.name']} - if entry['travelHistory.travel.dateRange.start']: - travel['dateRange'] = { - 'start': convert_date( - entry['travelHistory.travel.dateRange.start']), 'end': convert_date( - entry['travelHistory.travel.dateRange.end'])} - if travel: - travel_history['travel'] = [travel] - return travel_history - elif entry['travelHistory.traveledPrior30Days'].lower() == 'no': - travel_history['traveledPrior30Days'] = False - return travel_history - - - -def get_genome_data(entry): - genome_data = {} - genome_data['repositoryUrl'] = 'https://www.gisaid.org/' - genome_data['sequenceId'] = entry['genomeSequences.sequence.accession'] - if entry['genomeSequences.sample.collection.date']: - genome_data['sampleCollectionDate'] = convert_date( - entry['genomeSequences.sample.collection.date']) - - if entry['genomeSequences.sequence.name']: - genome_data['sequenceName'] = entry['genomeSequences.sequence.name'] - if entry['genomeSequences.sequence.length']: - genome_data['sequenceLength'] = int(entry['genomeSequences.sequence.length']) - - return [genome_data] - -def parse_cases(raw_data_file, source_id, source_url): - """ - Parses variant data from a number of sources, combining GISAID and manually added variants from the news - """ - case_count = 1 - with open(raw_data_file, "r", encoding='utf-8') as f: - reader = csv.DictReader(f, delimiter=',') - for entry in reader: - sourceurl = entry['caseReference.sourceUrl'] - if sourceurl != "http://www.xinhuanet.com/english/2021-01/28/c_139702375.htm": - case = { - "caseReference": { - "sourceId": source_id, - "sourceUrl": entry['caseReference.sourceUrl']}, - "events": get_all_events(entry) - } - if entry['caseReference.additionalSources']: - case['additionalSources'] = [ - entry['caseReference.additionalSources']] - - demographics = convert_demographics(entry) - if demographics: - case["demographics"] = demographics - - case['location'] = convert_location(entry) - case['events'].append( - { - "name": "confirmed", "dateRange": { - "start": convert_date( - entry["events.confirmed.date.start"]), "end": convert_date( - entry["events.confirmed.date.end"])}}) - - if entry['preexistingConditions.hasPreexistingConditions'] == 'TRUE': - case['preexistingConditions'] = get_preexisting_conditions( - entry) - if entry['transmission.places']: - case['transmission'] = { - 'places': [entry['transmission.places']]} - if entry['travelHistory.traveledPrior30Days']: - case['travelHistory'] = get_travel_history(entry) - if entry['genomeSequences.sequence.accession']: - case['genomeSequences'] = get_genome_data(entry) - if entry['notes']: - case['notes'] = entry['notes'] - - for _ in range(int(entry['number.of.cases'])): - unique_case = copy.deepcopy(case) - unique_case["caseReference"]["sourceEntryId"] = f"voc_{case_count}" - case_count += 1 - yield unique_case - - -def event_handler(event): - return parsing_lib.run(event, parse_cases) - -if __name__ == "__main__": - with open('input_event.json') as f: - event = json.load(f) - event_handler(event) diff --git a/ingestion/functions/parsing/variants/variants_test.py b/ingestion/functions/parsing/variants/variants_test.py deleted file mode 100644 index fdbf3142a..000000000 --- a/ingestion/functions/parsing/variants/variants_test.py +++ /dev/null @@ -1,228 +0,0 @@ -import os -import unittest -from variants import variants - -_SOURCE_ID = "placeholder_ID" -_SOURCE_URL = "placeholder_URL" - - -class VariantsTest(unittest.TestCase): - def setUp(self): - self.maxDiff = 5000 - - def test_parse(self): - current_dir = os.path.dirname(__file__) - sample_data_file = os.path.join(current_dir, "sample_data.csv") - - result = variants.parse_cases( - sample_data_file, _SOURCE_ID, _SOURCE_URL) - self.assertCountEqual(list(result), - [{'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://www.wtoc.com/2021/01/28/health-department-nations-first-cases-south-african-covid-variant-found-sc/', - 'sourceEntryId': 'voc_1'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '12/28/2020Z', 'end': '12/28/2020Z'}}], - 'demographics': {'ageRange': {'start': 18.0, 'end': 120.0}}, - 'location': {'query': 'South Carolina, United States'}, - 'travelHistory': {'traveledPrior30Days': False}, - 'notes': 'Lowcountry region'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://www.wtoc.com/2021/01/28/health-department-nations-first-cases-south-african-covid-variant-found-sc/', - 'sourceEntryId': 'voc_2'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '12/28/2020Z', 'end': '12/28/2020Z'}}], - 'demographics': {'ageRange': {'start': 18.0, 'end': 120.0}}, - 'location': {'query': 'South Carolina, United States'}, - 'travelHistory': {'traveledPrior30Days': False}, - 'notes': 'Pee Dee region'}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://www.theguardian.com/world/2021/jan/27/encouraging-signs-new-zealand-hopes-for-covid-all-clear-after-no-new-cases-reported', - 'sourceEntryId': 'voc_3'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '01/24/2021Z', 'end': '01/27/2021Z'}}], - 'additionalSources': ['https://www.theguardian.com/world/2021/jan/24/new-zealand-records-first-covid-community-case-intwo-months'], - 'demographics': {'ageRange': {'start': 56.0, 'end': 56.0}, - 'nationalities': ['New Zealander'], - 'gender': 'Female'}, - 'location': {'query': 'Auckland, Auckland, New Zealand'}, - 'travelHistory': {'traveledPrior30Days': True, - 'travel': [{'methods': ['Flight'], - 'location': {'query': 'London, United Kingdom'}, - 'dateRange': {'start': '12/30/2020Z', 'end': '12/30/2020Z'}}]}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://www.theguardian.com/world/2021/jan/27/encouraging-signs-new-zealand-hopes-for-covid-all-clear-after-no-new-cases-reported', - 'sourceEntryId': 'voc_4'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '01/27/2021Z', 'end': '01/27/2021Z'}}], - 'location': {'query': 'Auckland, Auckland, New Zealand'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://www.theguardian.com/world/2021/jan/27/encouraging-signs-new-zealand-hopes-for-covid-all-clear-after-no-new-cases-reported', - 'sourceEntryId': 'voc_5'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '01/27/2021Z', 'end': '01/27/2021Z'}}], - 'location': {'query': 'Auckland, Auckland, New Zealand'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://twitter.com/danieljbridges/status/1344227535870164992', - 'sourceEntryId': 'voc_6'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '12/23/2020Z', 'end': '12/23/2020Z'}}], - 'location': {'query': 'Zambia'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://twitter.com/danieljbridges/status/1344227535870164992', - 'sourceEntryId': 'voc_7'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '12/23/2020Z', 'end': '12/23/2020Z'}}], - 'location': {'query': 'Zambia'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://twitter.com/danieljbridges/status/1344227535870164992', - 'sourceEntryId': 'voc_8'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '12/23/2020Z', 'end': '12/23/2020Z'}}], - 'location': {'query': 'Zambia'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://twitter.com/danieljbridges/status/1344227535870164992', - 'sourceEntryId': 'voc_9'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '12/23/2020Z', 'end': '12/23/2020Z'}}], - 'location': {'query': 'Zambia'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://twitter.com/danieljbridges/status/1344227535870164992', - 'sourceEntryId': 'voc_10'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '12/23/2020Z', 'end': '12/23/2020Z'}}], - 'location': {'query': 'Zambia'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://twitter.com/danieljbridges/status/1344227535870164992', - 'sourceEntryId': 'voc_11'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '12/23/2020Z', 'end': '12/23/2020Z'}}], - 'location': {'query': 'Zambia'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://twitter.com/danieljbridges/status/1344227535870164992', - 'sourceEntryId': 'voc_12'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '12/23/2020Z', 'end': '12/23/2020Z'}}], - 'location': {'query': 'Zambia'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://twitter.com/danieljbridges/status/1344227535870164992', - 'sourceEntryId': 'voc_13'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '12/23/2020Z', 'end': '12/23/2020Z'}}], - 'location': {'query': 'Zambia'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://twitter.com/danieljbridges/status/1344227535870164992', - 'sourceEntryId': 'voc_14'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '12/23/2020Z', 'end': '12/23/2020Z'}}], - 'location': {'query': 'Zambia'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://twitter.com/danieljbridges/status/1344227535870164992', - 'sourceEntryId': 'voc_15'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '12/23/2020Z', 'end': '12/23/2020Z'}}], - 'location': {'query': 'Zambia'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://twitter.com/danieljbridges/status/1344227535870164992', - 'sourceEntryId': 'voc_16'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '12/23/2020Z', 'end': '12/23/2020Z'}}], - 'location': {'query': 'Zambia'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://twitter.com/danieljbridges/status/1344227535870164992', - 'sourceEntryId': 'voc_17'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '12/23/2020Z', 'end': '12/23/2020Z'}}], - 'location': {'query': 'Zambia'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://twitter.com/danieljbridges/status/1344227535870164992', - 'sourceEntryId': 'voc_18'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '12/23/2020Z', 'end': '12/23/2020Z'}}], - 'location': {'query': 'Zambia'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://twitter.com/danieljbridges/status/1344227535870164992', - 'sourceEntryId': 'voc_19'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '12/23/2020Z', 'end': '12/23/2020Z'}}], - 'location': {'query': 'Zambia'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://twitter.com/danieljbridges/status/1344227535870164992', - 'sourceEntryId': 'voc_20'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '12/23/2020Z', 'end': '12/23/2020Z'}}], - 'location': {'query': 'Zambia'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://twitter.com/danieljbridges/status/1344227535870164992', - 'sourceEntryId': 'voc_21'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '12/23/2020Z', 'end': '12/23/2020Z'}}], - 'location': {'query': 'Zambia'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://twitter.com/danieljbridges/status/1344227535870164992', - 'sourceEntryId': 'voc_22'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '12/23/2020Z', 'end': '12/23/2020Z'}}], - 'location': {'query': 'Zambia'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://twitter.com/danieljbridges/status/1344227535870164992', - 'sourceEntryId': 'voc_23'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '12/23/2020Z', 'end': '12/23/2020Z'}}], - 'location': {'query': 'Zambia'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://twitter.com/danieljbridges/status/1344227535870164992', - 'sourceEntryId': 'voc_24'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '12/23/2020Z', 'end': '12/23/2020Z'}}], - 'location': {'query': 'Zambia'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://twitter.com/danieljbridges/status/1344227535870164992', - 'sourceEntryId': 'voc_25'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '12/23/2020Z', 'end': '12/23/2020Z'}}], - 'location': {'query': 'Zambia'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://twitter.com/danieljbridges/status/1344227535870164992', - 'sourceEntryId': 'voc_26'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '12/23/2020Z', 'end': '12/23/2020Z'}}], - 'location': {'query': 'Zambia'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://twitter.com/danieljbridges/status/1344227535870164992', - 'sourceEntryId': 'voc_27'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '12/23/2020Z', 'end': '12/23/2020Z'}}], - 'location': {'query': 'Zambia'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://www.sabcnews.com/sabcnews/botswana-government-adjusts-national-lockdown-regulations/', - 'sourceEntryId': 'voc_28'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '01/01/2021Z', 'end': '01/07/2021Z'}}], - 'location': {'query': 'Botswana'}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://www.france24.com/en/france/20201231-france-detects-first-case-of-south-african-strain-of-covid-19', - 'sourceEntryId': 'voc_29'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '12/31/2020Z', 'end': '12/31/2020Z'}}], - 'location': {'query': 'Haut-Rhin, France'}, - 'travelHistory': {'traveledPrior30Days': True, - 'travel': [{'methods': ['Flight'], - 'location': {'query': 'South Africa'}}]}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'http://outbreaknewstoday.com/sweden-reports-1st-south-african-covid-19-virus-variant-49394/', - 'sourceEntryId': 'voc_30'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '01/03/2021Z', 'end': '01/03/2021Z'}}], - 'location': {'query': 'Sweden'}, - 'travelHistory': {'traveledPrior30Days': True, - 'travel': [{'location': {'query': 'South Africa'}}]}}, - {'caseReference': {'sourceId': 'placeholder_ID', - 'sourceUrl': 'https://www.vg.no/nyheter/innenriks/i/rgzer8/mer-smittsom-virusmutasjon-fra-soer-afrika-paavist-i-norge', - 'sourceEntryId': 'voc_31'}, - 'events': [{'name': 'confirmed', - 'dateRange': {'start': '01/04/2021Z', 'end': '01/04/2021Z'}}], - 'location': {'query': 'Norway'}, - 'travelHistory': {'traveledPrior30Days': True, - 'travel': [{'methods': ['Flight'], - 'location': {'query': 'South Africa'}, - 'dateRange': {'start': '12/31/2020Z', 'end': '12/01/2020Z'}}]}}]) diff --git a/ingestion/functions/poetry.lock b/ingestion/functions/poetry.lock deleted file mode 100644 index 200264da2..000000000 --- a/ingestion/functions/poetry.lock +++ /dev/null @@ -1,538 +0,0 @@ -[[package]] -name = "atomicwrites" -version = "1.4.0" -description = "Atomic file writes." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "attrs" -version = "21.2.0" -description = "Classes Without Boilerplate" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.extras] -dev = ["coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "sphinx", "sphinx-notfound-page", "zope.interface"] -docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "zope.interface"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six"] - -[[package]] -name = "beautifulsoup4" -version = "4.10.0" -description = "Screen-scraping library" -category = "main" -optional = false -python-versions = ">3.0.0" - -[package.dependencies] -soupsieve = ">1.2" - -[package.extras] -html5lib = ["html5lib"] -lxml = ["lxml"] - -[[package]] -name = "boto3" -version = "1.20.24" -description = "The AWS SDK for Python" -category = "main" -optional = false -python-versions = ">= 3.6" - -[package.dependencies] -botocore = ">=1.23.24,<1.24.0" -jmespath = ">=0.7.1,<1.0.0" -s3transfer = ">=0.5.0,<0.6.0" - -[package.extras] -crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] - -[[package]] -name = "botocore" -version = "1.23.24" -description = "Low-level, data-driven core of boto 3." -category = "main" -optional = false -python-versions = ">= 3.6" - -[package.dependencies] -jmespath = ">=0.7.1,<1.0.0" -python-dateutil = ">=2.1,<3.0.0" -urllib3 = ">=1.25.4,<1.27" - -[package.extras] -crt = ["awscrt (==0.12.5)"] - -[[package]] -name = "cachetools" -version = "4.2.4" -description = "Extensible memoizing collections and decorators" -category = "main" -optional = false -python-versions = "~=3.5" - -[[package]] -name = "certifi" -version = "2021.10.8" -description = "Python package for providing Mozilla's CA Bundle." -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "chardet" -version = "4.0.0" -description = "Universal encoding detector for Python 2 and 3" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "charset-normalizer" -version = "2.0.9" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" -optional = false -python-versions = ">=3.5.0" - -[package.extras] -unicode_backport = ["unicodedata2"] - -[[package]] -name = "colorama" -version = "0.4.4" -description = "Cross-platform colored terminal text." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "google" -version = "2.0.3" -description = "Python bindings to the Google search engine." -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -beautifulsoup4 = "*" - -[[package]] -name = "google-auth" -version = "1.35.0" -description = "Google Authentication Library" -category = "main" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" - -[package.dependencies] -cachetools = ">=2.0.0,<5.0" -pyasn1-modules = ">=0.2.1" -rsa = {version = ">=3.1.4,<5", markers = "python_version >= \"3.6\""} -setuptools = ">=40.3.0" -six = ">=1.9.0" - -[package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "requests (>=2.20.0,<3.0.0dev)"] -pyopenssl = ["pyopenssl (>=20.0.0)"] -reauth = ["pyu2f (>=0.1.5)"] - -[[package]] -name = "idna" -version = "3.3" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "iso3166" -version = "2.0.2" -description = "Self-contained ISO 3166-1 country definitions." -category = "main" -optional = false -python-versions = ">= 3.6" - -[[package]] -name = "jmespath" -version = "0.10.0" -description = "JSON Matching Expressions" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "monthdelta" -version = "0.9.1" -description = "date computations with months" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "packaging" -version = "21.3" -description = "Core utilities for Python packages" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" - -[[package]] -name = "pluggy" -version = "1.0.0" -description = "plugin and hook calling mechanisms for python" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "pyasn1" -version = "0.4.8" -description = "ASN.1 types and codecs" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pyasn1-modules" -version = "0.2.8" -description = "A collection of ASN.1-based protocols modules." -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -pyasn1 = ">=0.4.6,<0.5.0" - -[[package]] -name = "pycountry" -version = "20.7.3" -description = "ISO country, subdivision, language, currency and script definitions and their translations" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pyparsing" -version = "3.0.6" -description = "Python parsing module" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] - -[[package]] -name = "pytest" -version = "6.2.5" -description = "pytest: simple powerful testing with Python" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} -attrs = ">=19.2.0" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -py = ">=1.8.2" -toml = "*" - -[package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] - -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "requests" -version = "2.26.0" -description = "Python HTTP for Humans." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} -urllib3 = ">=1.21.1,<1.27" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] - -[[package]] -name = "requests-mock" -version = "1.8.0" -description = "Mock out responses from the requests package" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -requests = ">=2.3,<3" -six = "*" - -[package.extras] -fixture = ["fixtures"] -test = ["fixtures", "mock", "purl", "pytest", "sphinx", "testrepository (>=0.0.18)", "testtools"] - -[[package]] -name = "rsa" -version = "4.8" -description = "Pure-Python RSA implementation" -category = "main" -optional = false -python-versions = ">=3.6,<4" - -[package.dependencies] -pyasn1 = ">=0.1.3" - -[[package]] -name = "s3transfer" -version = "0.5.0" -description = "An Amazon S3 Transfer Manager" -category = "main" -optional = false -python-versions = ">= 3.6" - -[package.dependencies] -botocore = ">=1.12.36,<2.0a.0" - -[package.extras] -crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"] - -[[package]] -name = "setuptools" -version = "65.5.0" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mock", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "soupsieve" -version = "2.3.1" -description = "A modern CSS selector implementation for Beautiful Soup." -category = "main" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "urllib3" -version = "1.26.7" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" - -[package.extras] -brotli = ["brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] - -[metadata] -lock-version = "1.1" -python-versions = "^3.10" -content-hash = "bd3ebd70c4123e502dc844426dc2ca982035e70644ec6eb4e18f97be38ae3b48" - -[metadata.files] -atomicwrites = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -] -attrs = [ - {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, - {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, -] -beautifulsoup4 = [ - {file = "beautifulsoup4-4.10.0-py3-none-any.whl", hash = "sha256:9a315ce70049920ea4572a4055bc4bd700c940521d36fc858205ad4fcde149bf"}, - {file = "beautifulsoup4-4.10.0.tar.gz", hash = "sha256:c23ad23c521d818955a4151a67d81580319d4bf548d3d49f4223ae041ff98891"}, -] -boto3 = [ - {file = "boto3-1.20.24-py3-none-any.whl", hash = "sha256:8f08e8e94bf107c5e9866684e9aadf8d9f60abed0cfe5c1dba4e7328674a1986"}, - {file = "boto3-1.20.24.tar.gz", hash = "sha256:739705b28e6b2329ea3b481ba801d439c296aaf176f7850729147ba99bbf8a9a"}, -] -botocore = [ - {file = "botocore-1.23.24-py3-none-any.whl", hash = "sha256:e78d48c50c8c013fb9b362c6202fece2fe868edfd89b51968080180bdff41617"}, - {file = "botocore-1.23.24.tar.gz", hash = "sha256:43006b4f52d7bb655319d3da0f615cdbee7762853acc1ebcb1d49f962e6b4806"}, -] -cachetools = [ - {file = "cachetools-4.2.4-py3-none-any.whl", hash = "sha256:92971d3cb7d2a97efff7c7bb1657f21a8f5fb309a37530537c71b1774189f2d1"}, - {file = "cachetools-4.2.4.tar.gz", hash = "sha256:89ea6f1b638d5a73a4f9226be57ac5e4f399d22770b92355f92dcb0f7f001693"}, -] -certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, -] -chardet = [ - {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, - {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.0.9.tar.gz", hash = "sha256:b0b883e8e874edfdece9c28f314e3dd5badf067342e42fb162203335ae61aa2c"}, - {file = "charset_normalizer-2.0.9-py3-none-any.whl", hash = "sha256:1eecaa09422db5be9e29d7fc65664e6c33bd06f9ced7838578ba40d58bdf3721"}, -] -colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, -] -google = [ - {file = "google-2.0.3-py2.py3-none-any.whl", hash = "sha256:c03517e6f9eec7a03c07b864f9a64384fd4bc1efce9034d42e3f90addc9fe4ee"}, - {file = "google-2.0.3.tar.gz", hash = "sha256:ff7d997dbf33be666ed5deb8c5abf5d103c27ec199559b6d994923469e26bb48"}, -] -google-auth = [ - {file = "google-auth-1.35.0.tar.gz", hash = "sha256:b7033be9028c188ee30200b204ea00ed82ea1162e8ac1df4aa6ded19a191d88e"}, - {file = "google_auth-1.35.0-py2.py3-none-any.whl", hash = "sha256:997516b42ecb5b63e8d80f5632c1a61dddf41d2a4c2748057837e06e00014258"}, -] -idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -iso3166 = [ - {file = "iso3166-2.0.2-py3-none-any.whl", hash = "sha256:55e93c8a7587cae9479ad68c823390e33493d17d95b457271032594e5f1f7aae"}, - {file = "iso3166-2.0.2.tar.gz", hash = "sha256:04d02cfcfc18a6f8a9a4edb4d0a55e2e4fc575626c29d702f750de415e88d372"}, -] -jmespath = [ - {file = "jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f"}, - {file = "jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9"}, -] -monthdelta = [ - {file = "MonthDelta-0.9.1.tar.gz", hash = "sha256:81c09ec1d4d2861d7030c4a847db43550d1740e3d383707980854b9fcfd48c47"}, - {file = "MonthDelta-0.9.1.zip", hash = "sha256:3e3453c332a6e309a58f4ad54bfe9b475e76685bc265a25b0ae6e16b86044292"}, -] -packaging = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, -] -pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] -py = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] -pyasn1 = [ - {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, - {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, -] -pyasn1-modules = [ - {file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"}, - {file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"}, -] -pycountry = [ - {file = "pycountry-20.7.3.tar.gz", hash = "sha256:81084a53d3454344c0292deebc20fcd0a1488c136d4900312cbd465cf552cb42"}, -] -pyparsing = [ - {file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"}, - {file = "pyparsing-3.0.6.tar.gz", hash = "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"}, -] -pytest = [ - {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, - {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, -] -python-dateutil = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] -requests = [ - {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, - {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, -] -requests-mock = [ - {file = "requests-mock-1.8.0.tar.gz", hash = "sha256:e68f46844e4cee9d447150343c9ae875f99fa8037c6dcf5f15bf1fe9ab43d226"}, - {file = "requests_mock-1.8.0-py2.py3-none-any.whl", hash = "sha256:11215c6f4df72702aa357f205cf1e537cffd7392b3e787b58239bde5fb3db53b"}, -] -rsa = [ - {file = "rsa-4.8-py3-none-any.whl", hash = "sha256:95c5d300c4e879ee69708c428ba566c59478fd653cc3a22243eeb8ed846950bb"}, - {file = "rsa-4.8.tar.gz", hash = "sha256:5c6bd9dc7a543b7fe4304a631f8a8a3b674e2bbfc49c2ae96200cdbe55df6b17"}, -] -s3transfer = [ - {file = "s3transfer-0.5.0-py3-none-any.whl", hash = "sha256:9c1dc369814391a6bda20ebbf4b70a0f34630592c9aa520856bf384916af2803"}, - {file = "s3transfer-0.5.0.tar.gz", hash = "sha256:50ed823e1dc5868ad40c8dc92072f757aa0e653a192845c94a3b676f4a62da4c"}, -] -setuptools = [ - {file = "setuptools-65.5.0-py3-none-any.whl", hash = "sha256:f62ea9da9ed6289bfe868cd6845968a2c854d1427f8548d52cae02a42b4f0356"}, - {file = "setuptools-65.5.0.tar.gz", hash = "sha256:512e5536220e38146176efb833d4a62aa726b7bbff82cfbc8ba9eaa3996e0b17"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -soupsieve = [ - {file = "soupsieve-2.3.1-py3-none-any.whl", hash = "sha256:1a3cca2617c6b38c0343ed661b1fa5de5637f257d4fe22bd9f1338010a1efefb"}, - {file = "soupsieve-2.3.1.tar.gz", hash = "sha256:b8d49b1cd4f037c7082a9683dfa1801aa2597fb11c3a1155b7a5b94829b4f1f9"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -urllib3 = [ - {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, - {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, -] diff --git a/ingestion/functions/pyproject.toml b/ingestion/functions/pyproject.toml deleted file mode 100644 index 39552edf7..000000000 --- a/ingestion/functions/pyproject.toml +++ /dev/null @@ -1,21 +0,0 @@ -[tool.poetry] -name = "ingestion functions" -version = "0.1.0" -description = "Ingestion functions for Global.health" -authors = ["Global.health: a Data Science Initiative "] - -[tool.poetry.dependencies] -python = "^3.10" -boto3 = "1.20.24" -google = "2.0.3" -google-auth = "1.35.0" -requests-mock = "1.8.0" -pycountry = "20.7.3" -pytest = "^6.2.3" -chardet = "^4.0.0" -iso3166 = "^2.0.2" -MonthDelta = "^0.9.1" - -[build-system] -requires = ["poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" diff --git a/ingestion/functions/pytest.ini b/ingestion/functions/pytest.ini deleted file mode 100644 index 898285b4d..000000000 --- a/ingestion/functions/pytest.ini +++ /dev/null @@ -1,2 +0,0 @@ -[pytest] -filterwarnings = ignore::DeprecationWarning:(b|m)oto.*: \ No newline at end of file diff --git a/ingestion/functions/retrieval/__init__.py b/ingestion/functions/retrieval/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ingestion/functions/retrieval/retrieval.py b/ingestion/functions/retrieval/retrieval.py deleted file mode 100644 index ee0202210..000000000 --- a/ingestion/functions/retrieval/retrieval.py +++ /dev/null @@ -1,358 +0,0 @@ -import codecs -import re -import io -import mimetypes -import os -import sys -import tempfile -import operator -import subprocess -import importlib -import logging -from chardet import detect -from pathlib import Path - -import boto3 -import requests - -from datetime import datetime, timezone, timedelta - -logger = logging.getLogger(__name__) -logger.setLevel("INFO") - -TEMP_PATH = "/tmp" -ENV_FIELD = "env" -OUTPUT_BUCKET = "gdh-sources" -SOURCE_ID_FIELD = "sourceId" -PARSING_DATE_RANGE_FIELD = "parsingDateRange" -TIME_FILEPART_FORMAT = "/%Y/%m/%d/%H%M/" -DEFAULT_ENCODING = 'utf-8' -READ_CHUNK_BYTES = 2048 -HEADER_CHUNK_BYTES = 1024 * 1024 -CSV_CHUNK_BYTES = 2 * 1024 * 1024 - -s3_client = boto3.client("s3") - -if os.environ.get("DOCKERIZED"): - s3_client = boto3.client("s3", - endpoint_url=os.environ.get("AWS_ENDPOINT", "http://localhost:4566"), - aws_access_key_id=os.environ.get("AWS_ACCESS_KEY_ID", "test"), - aws_secret_access_key=os.environ.get("AWS_SECRET_ACCESS_KEY", "test"), - region_name=os.environ.get("AWS_REGION", "eu-central-1") - ) - -# Layer code, like common_lib, is added to the path by AWS. -# To test locally (e.g. via pytest), we have to modify sys.path. -# pylint: disable=import-error -try: - import common_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir, "common")) - import common_lib - - -def extract_event_fields(event): - logger.info(f"Extracting fields from event {event}") - if any( - field not in event - for field - in [ENV_FIELD, SOURCE_ID_FIELD]): - error_message = ( - f"Required fields {ENV_FIELD}; {SOURCE_ID_FIELD} not found in input event: {event}") - logger.error(error_message) - raise ValueError(error_message) - return event[ENV_FIELD], event[SOURCE_ID_FIELD], event.get( - PARSING_DATE_RANGE_FIELD), event.get( - "auth", {}) - - -def get_source_details(env, source_id, upload_id, api_headers, cookies): - """ - Retrieves the content URL and format associated with the provided source ID. - """ - try: - source_api_endpoint = f"{common_lib.get_source_api_url(env)}/sources/{source_id}" - logging.info(f"Requesting source configuration from {source_api_endpoint}") - r = requests.get(source_api_endpoint, - headers=api_headers, cookies=cookies) - if r and r.status_code == 200: - api_json = r.json() - logging.info(f"Received source API response: {api_json}") - return api_json["origin"]["url"], api_json["format"], api_json.get( - "automation", {}).get( - "parser", {}).get( - "awsLambdaArn", ""), api_json.get( - "dateFilter", {}), api_json.get( - "hasStableIdentifiers", False) - upload_error = ( - common_lib.UploadError.SOURCE_CONFIGURATION_NOT_FOUND - if r.status_code == 404 else common_lib.UploadError.INTERNAL_ERROR) - e = RuntimeError( - f"Error retrieving source details, status={r.status_code}, response={r.text}") - common_lib.complete_with_error( - e, env, upload_error, source_id, upload_id, - api_headers, cookies) - except ValueError as e: - common_lib.complete_with_error( - e, env, common_lib.UploadError.INTERNAL_ERROR, source_id, upload_id, - api_headers, cookies) - - -def raw_content(url: str, content: bytes, tempdir: str = TEMP_PATH) -> io.BytesIO: - # Detect the mimetype of a given URL. - logger.info(f"Guessing mimetype of {url}") - mimetype, _ = mimetypes.guess_type(url) - if mimetype == "application/zip": - logger.info("File seems to be a zip file, decompressing it now") - # Writing the zip file to temp dir. - with tempfile.NamedTemporaryFile(dir=tempdir, delete=False) as f: - f.write(content) - f.flush() - with tempfile.TemporaryDirectory(dir=tempdir) as xf: - # extract into temporary folder using unzip - try: - subprocess.run(["/usr/bin/unzip", "-d", xf, f.name], check=True) - largest_file = max( - ((f, f.stat().st_size) for f in Path(xf).iterdir() - if f.is_file()), - key=operator.itemgetter(1) - )[0] - return largest_file.open("rb") - except subprocess.CalledProcessError as e: - raise ValueError(f"Error in extracting zip file with exception:\n{e}") - Path(f.name).unlink(missing_ok=True) - elif not mimetype: - logger.warning("Could not determine mimetype") - return io.BytesIO(content) - - -def retrieve_content( - env, source_id, upload_id, url, source_format, api_headers, cookies, chunk_bytes=CSV_CHUNK_BYTES, tempdir=TEMP_PATH): - """ Retrieves and locally persists the content at the provided URL. """ - try: - if ( - source_format != "JSON" - and source_format != "CSV" - and source_format != "XLSX"): - e = ValueError(f"Unsupported source format: {source_format}") - common_lib.complete_with_error( - e, env, common_lib.UploadError.SOURCE_CONFIGURATION_ERROR, - source_id, upload_id, api_headers, cookies) - logger.info(f"Downloading {source_format} content from {url}") - if url.startswith("s3://"): - # strip the prefix - s3Location = url[5:] - # split at the first / - [s3Bucket, s3Key] = s3Location.split('/', 1) - # get it! - content = s3_client.get_object(Bucket=s3Bucket, Key=s3Key)['Body'].read() - else: - headers = {"user-agent": "GHDSI/1.0 (https://global.health)"} - r = requests.get(url, headers=headers) - r.raise_for_status() - content = r.content - logger.info("Download finished") - - key_filename_part = f"content.{source_format.lower()}" - s3_object_key = ( - f"{source_id}" - f"{datetime.now(timezone.utc).strftime(TIME_FILEPART_FORMAT)}" - f"{key_filename_part}" - ) - # Lambda limitations: 512MB ephemeral disk space. - # Memory range is from 128 to 3008 MB so we could switch to - # https://docs.python.org/3/library/io.html#io.StringIO for bigger - # sources. - # Make the encoding of retrieved content consistent (UTF-8) for all - # parsers as per https://github.com/globaldothealth/list/issues/867. - bytesio = raw_content(url, content, tempdir) - if source_format == "XLSX": - # do not convert XLSX into another encoding, leave for parsers - logger.warning("Skipping encoding detection for XLSX") - fd, outfile_name = tempfile.mkstemp(dir=tempdir) - with os.fdopen(fd, "wb") as outfile: - while content := bytesio.read(READ_CHUNK_BYTES): - outfile.write(content) - return [(outfile_name, s3_object_key)] - - logger.info("Detecting encoding of retrieved content") - # Read 2MB to be quite sure about the encoding. - detected_enc = detect(bytesio.read(2 << 20)) - bytesio.seek(0) - if detected_enc["encoding"]: - logger.info(f"Source encoding is presumably {detected_enc}") - else: - detected_enc["encoding"] = DEFAULT_ENCODING - logger.warning(f"Source encoding detection failed, setting to {DEFAULT_ENCODING}") - fd, outfile_name = tempfile.mkstemp(dir=tempdir) - with os.fdopen(fd, "w", encoding="utf-8") as outfile: - text_stream = codecs.getreader(detected_enc["encoding"])(bytesio) - # Write the output file as utf-8 in chunks because decoding the - # whole data in one shot becomes really slow with big files. - content = text_stream.read(READ_CHUNK_BYTES) - while content: - outfile.write(content) - content = text_stream.read(READ_CHUNK_BYTES) - return [(outfile_name, s3_object_key)] - except requests.exceptions.RequestException as e: - upload_error = ( - common_lib.UploadError.SOURCE_CONTENT_NOT_FOUND - if e.response.status_code == 404 else - common_lib.UploadError.SOURCE_CONTENT_DOWNLOAD_ERROR) - common_lib.complete_with_error( - e, env, upload_error, source_id, upload_id, - api_headers, cookies) - - -def upload_to_s3( - file_name, s3_object_key, env, source_id, upload_id, api_headers, - cookies, bucket=OUTPUT_BUCKET): - try: - s3_client.upload_file( - file_name, bucket, s3_object_key) - logger.info( - f"Uploaded source content to s3://{bucket}/{s3_object_key}") - os.unlink(file_name) - except Exception as e: - common_lib.complete_with_error( - e, env, common_lib.UploadError.INTERNAL_ERROR, source_id, upload_id, - api_headers, cookies) - - -def invoke_parser( - env, parser_module, source_id, upload_id, api_headers, cookies, s3_object_key, - source_url, date_filter, parsing_date_range): - auth = {"email": os.getenv("EPID_INGESTION_EMAIL", "")} if cookies else None - payload = { - "env": env, - "s3Bucket": OUTPUT_BUCKET, - "sourceId": source_id, - "s3Key": s3_object_key, - "sourceUrl": source_url, - "uploadId": upload_id, - "dateFilter": date_filter, - "dateRange": parsing_date_range, - "auth": auth - } - logger.info(f"Invoking parser ({parser_module})") - sys.path.append(str(Path(__file__).parent.parent)) # ingestion/functions - importlib.import_module(parser_module).event_handler(payload) - - -def get_today(): - """Return today's datetime, just here for easier mocking.""" - return datetime.today() - - -def format_source_url(url: str) -> str: - """ - Formats the given url with the date formatting params contained in it if any. - - $FULLYEAR is replaced with the 4 digits current year. - - $FULLMONTH is replaced with the 2 digits current month. - - $FULLDAY is replaced with the 2 digits current day of the month. - - $MONTH is replaced with the 1 or 2 digits current month. - - $DAY is replaced with the 1 or 2 digits current day of the month. - - A suffix of ::daysbefore=N can be used to offset the current date by N days - in the past before substitution - """ - urlmatch = re.match(r'(.*)::daysbefore=(.*)', url) - if urlmatch and len(urlmatch.groups()) == 2 and urlmatch.groups()[1].isdigit(): - today = get_today() - timedelta(days=int(urlmatch.groups()[1])) - else: - today = get_today() - mappings = { - "$FULLYEAR": str(today.year), - "$FULLMONTH": str(today.month).zfill(2), - "$MONTH": str(today.month), - "$FULLDAY": str(today.day).zfill(2), - "$DAY": str(today.day), - } - for key in mappings: - if key in url: - url = url.replace(key, mappings[key], -1) - return re.sub(r'(.*)::daysbefore=.*', r'\1', url) - - -def run_retrieval(tempdir=TEMP_PATH): - """Global ingestion retrieval function. - - Parameters - ---------- - event: dict, required - Input event JSON-as-dict specified by the CloudWatch Event Rule. - This must contain a `sourceId` field specifying the canonical epid - system source UUID. - For more information, see: - https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/EventTypes.html#schedule_event_type - - context: object, required - Lambda Context runtime methods and attributes. - For more information, see: - https://docs.aws.amazon.com/lambda/latest/dg/python-context-object.html - - tempdir: str, optional - Temporary folder to store retrieve content in - - Returns - ------ - JSON object containing the bucket and key at which the retrieved data was - uploaded to S3. For more information on return types, see: - https://docs.aws.amazon.com/lambda/latest/dg/python-handler.html - """ - - env = os.environ["EPID_INGESTION_ENV"] - source_id = os.environ["EPID_INGESTION_SOURCE_ID"] - parsing_date_range = os.getenv("EPID_INGESTION_PARSING_DATE_RANGE", {}) - if isinstance(parsing_date_range, str): # date range specified with comma - parsing_date_range = dict(zip(["start", "end"], parsing_date_range.split(","))) - local_email = os.getenv("EPID_INGESTION_EMAIL", "") - - auth_headers = None - cookies = None - if local_email and env in ["local", "locale2e"]: - cookies = common_lib.login(local_email) - else: - auth_headers = common_lib.obtain_api_credentials(s3_client) - upload_id = common_lib.create_upload_record( - env, source_id, auth_headers, cookies) - url, source_format, parser, date_filter, stable_identifiers = get_source_details( - env, source_id, upload_id, auth_headers, cookies) - - if not stable_identifiers: - logger.info(f"Source {source_id} does not have stable identifiers\n" - "Ingesting entire dataset and ignoring date filter and date ranges") - date_filter = {} - parsing_date_range = {} - url = format_source_url(url) - file_names_s3_object_keys = retrieve_content( - env, source_id, upload_id, url, source_format, auth_headers, cookies, tempdir=tempdir) - for file_name, s3_object_key in file_names_s3_object_keys: - upload_to_s3(file_name, s3_object_key, env, - source_id, upload_id, auth_headers, cookies) - if parser: - for _, s3_object_key in file_names_s3_object_keys: - parser_module = common_lib.get_parser_module(parser) - invoke_parser( - env, parser_module, - source_id, upload_id, auth_headers, cookies, - s3_object_key, url, date_filter, parsing_date_range) - - else: - common_lib.complete_with_error( - ValueError(f"No parser set for {source_id}"), - env, common_lib.UploadError.SOURCE_CONFIGURATION_ERROR, source_id, upload_id, - auth_headers, cookies) - - return { - "bucket": OUTPUT_BUCKET, - "key": s3_object_key, - "upload_id": upload_id, - } - - -if __name__ == "__main__": - run_retrieval(tempdir=(TEMP_PATH if len(sys.argv) == 1 else sys.argv[1])) diff --git a/ingestion/functions/retrieval/retrieval_test.py b/ingestion/functions/retrieval/retrieval_test.py deleted file mode 100644 index f603c6397..000000000 --- a/ingestion/functions/retrieval/retrieval_test.py +++ /dev/null @@ -1,450 +0,0 @@ -import boto3 -import datetime -import json -import os -import pytest -import tempfile -import sys -import zipfile - -from unittest.mock import MagicMock, patch - -SOURCES_BUCKET = "gdh-sources" - -try: - import common_lib -except ImportError: - sys.path.append( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - os.pardir, 'common')) - import common_lib - - -s3_client = boto3.client("s3", - endpoint_url=os.environ.get("AWS_ENDPOINT", "http://localstack:4566"), - aws_access_key_id=os.environ.get("AWS_ACCESS_KEY_ID", "test"), - aws_secret_access_key=os.environ.get("AWS_SECRET_ACCESS_KEY", "test"), - region_name=os.environ.get("AWS_REGION", "eu-central-1") -) - -_SOURCE_API_URL = "http://foo.bar" - -date_filter = {"numDaysBeforeToday": 2, "op": "EQ"} -origin_url = "http://bar.baz/" -upload_id = "012345678901234567890123" -example_source = { - "format": "JSON", - "origin": {"url": origin_url, "license": "MIT"}, - "automation": {"parser": {"awsLambdaArn": "example.example"}}, - "dateFilter": date_filter -} -example_source_stable_ids = { - **example_source, - "hasStableIdentifiers": True -} - - -def create_upload_url(source_id): - return f"{_SOURCE_API_URL}/sources/{source_id}/uploads" - - -@pytest.fixture() -def mock_source_api_url_fixture(): - """ - Supplies a predetermined endpoint for G.h HTTP requests. - - Because the retrieval library is imported locally, this fixture can't - be set to autouse. - """ - import common_lib # pylint: disable=import-error - with patch('common_lib.get_source_api_url') as mock: - mock.return_value = _SOURCE_API_URL - yield common_lib - - -@pytest.fixture() -def setup_e2e(mock_source_api_url_fixture, valid_event, requests_mock): - source_id = valid_event['sourceId'] - - # Mock the request to create the upload. - requests_mock.post( - create_upload_url(source_id), json={"_id": upload_id}, - status_code=201) - - # Mock the request to retrieve source content. - requests_mock.get(origin_url, json={"data": "yes"}) - - # Mock/stub retrieving credentials, invoking the parser, and S3. - common_lib = mock_source_api_url_fixture - common_lib.obtain_api_credentials = MagicMock( - name="obtain_api_credentials", return_value={}) - - # Set up mock request values used in multiple requests. - # TODO: Complete removal of URL env var. - os.environ["EPID_INGESTION_ENV"] = valid_event['env'] - os.environ["EPID_INGESTION_SOURCE_ID"] = valid_event['sourceId'] - os.environ["EPID_INGESTION_PARSING_DATE_RANGE"] = ( - valid_event['parsingDateRange']['start'] - + "," - + valid_event['parsingDateRange']['end'] - ) - os.environ["SOURCE_API_URL"] = _SOURCE_API_URL - yield requests_mock, common_lib - - -@pytest.fixture() -def valid_event(): - """Loads valid CloudWatch ScheduledEvent from file.""" - current_dir = os.path.dirname(__file__) - file_path = os.path.join(current_dir, "valid_scheduled_event.json") - with open(file_path) as event_file: - return json.load(event_file) - - -def test_format_url_leaves_unchanged_if_no_format_params(): - from retrieval import retrieval # Import locally to avoid superseding mock - url = "http://foo.bar" - assert retrieval.format_source_url(url) == url - - -@patch('retrieval.retrieval.get_today') -def test_format_url(mock_today): - from retrieval import retrieval # Import locally to avoid superseding mock - mock_today.return_value = datetime.datetime(2020, 6, 8) - url = "http://foo.bar/$FULLYEAR-$FULLMONTH-$FULLDAY/$MONTH/$DAY.json" - assert retrieval.format_source_url( - url) == "http://foo.bar/2020-06-08/6/8.json" - -@patch('retrieval.retrieval.get_today') -def test_format_url_daysbefore(mock_today): - from retrieval import retrieval # Import locally to avoid superseding mock - mock_today.return_value = datetime.datetime(2020, 6, 8) - url = "http://foo.bar/$FULLYEAR-$FULLMONTH-$FULLDAY/$MONTH/$DAY.json::daysbefore=3" - assert retrieval.format_source_url( - url) == "http://foo.bar/2020-06-05/6/5.json" - - -@pytest.mark.skipif(not os.environ.get("DOCKERIZED", False), - reason="Running integration tests outside of mock environment disabled") -@pytest.mark.parametrize("source", [example_source_stable_ids, example_source]) -def test_e2e(source, valid_event, mock_source_api_url_fixture, setup_e2e, tempdir="/tmp"): - from retrieval import retrieval - requests_mock, common_lib = setup_e2e - print(valid_event) - source_id = valid_event['sourceId'] - retrieval.invoke_parser = MagicMock(name="invoke_parser") - - # Mock the request to retrieval source details (e.g. format). - full_source_url = f"{_SOURCE_API_URL}/sources/{source_id}" - requests_mock.get(full_source_url, json=source) - has_stable_ids = source.get("hasStableIdentifiers", False) - - response = retrieval.run_retrieval(tempdir=tempdir) - - common_lib.obtain_api_credentials.assert_called_once() - retrieval.invoke_parser.assert_called_once_with( - valid_event["env"], - "parsing.example.example", - source_id, upload_id, {}, None, - response["key"], - origin_url, - date_filter if has_stable_ids else {}, - valid_event["parsingDateRange"] if has_stable_ids else {}) - assert requests_mock.request_history[0].url == create_upload_url(source_id) - assert requests_mock.request_history[1].url == full_source_url - assert requests_mock.request_history[2].url == origin_url - assert response["bucket"] == retrieval.OUTPUT_BUCKET - assert source_id in response["key"] - assert response["upload_id"] == upload_id - - -def test_extract_event_fields_returns_env_source_id_and_date_range(valid_event): - from retrieval import retrieval - env, source_id, date_range, _ = retrieval.extract_event_fields(valid_event) - assert env == valid_event["env"] - assert source_id == valid_event["sourceId"] - assert date_range == valid_event["parsingDateRange"] - - -def test_extract_event_fields_raises_error_if_event_lacks_env(): - from retrieval import retrieval # Import locally to avoid superseding mock - with pytest.raises(ValueError, match=retrieval.ENV_FIELD): - retrieval.extract_event_fields({"sourceId": "sourceId"}) - - -def test_extract_event_fields_raises_error_if_event_lacks_source_id(): - from retrieval import retrieval # Import locally to avoid superseding mock - with pytest.raises(ValueError, match=retrieval.SOURCE_ID_FIELD): - retrieval.extract_event_fields({"env": "env"}) - - -def test_get_source_details_returns_url_format_stable_identifiers( - requests_mock, mock_source_api_url_fixture): - from retrieval import retrieval # Import locally to avoid superseding mock - source_id = "id" - content_url = "http://bar.baz" - requests_mock.get(f"{_SOURCE_API_URL}/sources/{source_id}", - json={"format": "CSV", - "origin": {"url": content_url, "license": "MIT"}, - "hasStableIdentifiers": True - }) - result = retrieval.get_source_details( - "env", source_id, "upload_id", {}, {}) - assert result[0] == content_url - assert result[1] == "CSV" - assert result[2] == "" - assert result[3] == {} - assert result[4] is True - - -def test_get_source_details_returns_parser_arn_if_present( - requests_mock, mock_source_api_url_fixture): - from retrieval import retrieval # Import locally to avoid superseding mock - source_id = "id" - content_url = "http://bar.baz" - job_def_arn = "testArn" - requests_mock.get( - f"{_SOURCE_API_URL}/sources/{source_id}", - json={"origin": {"url": content_url, "license": "MIT"}, - "format": "JSON", - "automation": {"parser": {"awsLambdaArn": job_def_arn}}}) - result = retrieval.get_source_details( - "env", source_id, "upload_id", {}, {}) - assert result[2] == job_def_arn - - -def test_get_source_details_raises_error_if_source_not_found( - requests_mock, mock_source_api_url_fixture): - from retrieval import retrieval # Import locally to avoid superseding mock - # TODO: Complete removal of URL env var. - os.environ["SOURCE_API_URL"] = _SOURCE_API_URL - source_id = "id" - get_source_url = f"{_SOURCE_API_URL}/sources/{source_id}" - requests_mock.get(get_source_url, status_code=404) - upload_id = "upload_id" - update_upload_url = f"{_SOURCE_API_URL}/sources/{source_id}/uploads/{upload_id}" - requests_mock.put(update_upload_url, json={}) - - try: - retrieval.get_source_details("env", source_id, upload_id, {}, {}) - except Exception: - assert requests_mock.request_history[0].url == get_source_url - assert requests_mock.request_history[1].url == update_upload_url - assert requests_mock.request_history[-1].json( - ) == {"status": "ERROR", "summary": {"error": common_lib.UploadError.SOURCE_CONFIGURATION_NOT_FOUND.name}} - return - - # We got the wrong exception or no exception, fail the test. - assert not "Should have raised an exception." - - -def test_get_source_details_raises_error_if_other_errors_getting_source( - requests_mock, mock_source_api_url_fixture): - from retrieval import retrieval # Import locally to avoid superseding mock - # TODO: Complete removal of URL env var. - os.environ["SOURCE_API_URL"] = _SOURCE_API_URL - source_id = "sourceId" - get_source_url = f"{_SOURCE_API_URL}/sources/{source_id}" - requests_mock.get(get_source_url, status_code=500) - upload_id = "upload_id" - update_upload_url = f"{_SOURCE_API_URL}/sources/{source_id}/uploads/{upload_id}" - requests_mock.put(update_upload_url, json={}) - - try: - retrieval.get_source_details("env", source_id, upload_id, {}, {}) - except Exception: - assert requests_mock.request_history[0].url == get_source_url - assert requests_mock.request_history[1].url == update_upload_url - assert requests_mock.request_history[-1].json( - ) == {"status": "ERROR", "summary": {"error": common_lib.UploadError.INTERNAL_ERROR.name}} - return - - # We got the wrong exception or no exception, fail the test. - assert not "Should have raised an exception." - - -def test_retrieve_content_persists_downloaded_json_locally(requests_mock): - from retrieval import retrieval # Import locally to avoid superseding mock - source_id = "id" - content_url = "http://foo.bar/" - format = "JSON" - requests_mock.get(content_url, json={"data": "yes"}) - files_s3_keys = retrieval.retrieve_content( - "env", source_id, "upload_id", content_url, format, {}, {}, tempdir="/tmp") - assert requests_mock.request_history[0].url == content_url - assert "GHDSI" in requests_mock.request_history[0].headers["user-agent"] - with open(files_s3_keys[0][0], "r") as f: - assert json.load(f)["data"] == "yes" - - -@pytest.mark.skipif(not os.environ.get("DOCKERIZED", False), - reason="Running integration tests outside of mock environment disabled") -def test_retrieve_content_from_s3(): - from retrieval import retrieval # Import locally to avoid superseding mock - source_id = "id" - content_url = f"s3://{SOURCES_BUCKET}/bar" - format = "JSON" - s3_client.put_object(Bucket=SOURCES_BUCKET, Key='bar', Body=b'{"data": "yes"}') - files_s3_keys = retrieval.retrieve_content( - "env", source_id, "upload_id", content_url, format, {}, {}, tempdir="/tmp") - with open(files_s3_keys[0][0], "r") as f: - assert json.load(f)["data"] == "yes" - - -def test_retrieve_content_persists_downloaded_csv_locally(requests_mock): - from retrieval import retrieval # Import locally to avoid superseding mock - source_id = "id" - content_url = "http://foo.bar/" - format = "CSV" - requests_mock.get(content_url, content=b"foo,bar\nbaz,quux\n") - files_s3_keys = retrieval.retrieve_content( - "env", source_id, "upload_id", content_url, format, {}, {}, tempdir="/tmp") - assert requests_mock.request_history[0].url == content_url - assert "GHDSI" in requests_mock.request_history[0].headers["user-agent"] - with open(files_s3_keys[0][0], "r") as f: - assert f.read().strip() == "foo,bar\nbaz,quux" - -def test_retrieve_content_returns_local_and_s3_object_names(requests_mock): - from retrieval import retrieval # Import locally to avoid superseding mock - source_id = "id" - content_url = "http://foo.bar/" - requests_mock.get(content_url, json={"data": "yes"}) - results = retrieval.retrieve_content( - "env", source_id, "upload_id", content_url, "JSON", {}, {}, tempdir="/tmp") - assert all("/tmp/" in fn for fn, s3key in results) - assert all(source_id in s3key for fn, s3key in results) - - -def test_retrieve_content_raises_error_for_non_supported_format( - requests_mock, mock_source_api_url_fixture): - from retrieval import retrieval # Import locally to avoid superseding mock - content_url = "http://foo.bar/" - source_id = "source_id" - upload_id = "123456789012345678901234" - update_upload_url = f"{_SOURCE_API_URL}/sources/{source_id}/uploads/{upload_id}" - requests_mock.put(update_upload_url, json={}) - bad_format = "PDF" - - try: - retrieval.retrieve_content( - "env", source_id, upload_id, content_url, bad_format, {}, {}, tempdir="/tmp") - except ValueError: - assert requests_mock.request_history[0].url == update_upload_url - assert requests_mock.request_history[-1].json( - ) == {"status": "ERROR", "summary": {"error": common_lib.UploadError.SOURCE_CONFIGURATION_ERROR.name}} - return - - # We got the wrong exception or no exception, fail the test. - assert not "Should have raised an exception." - - -def test_retrieve_content_raises_error_for_source_content_not_found( - requests_mock, mock_source_api_url_fixture): - from retrieval import retrieval # Import locally to avoid superseding mock - content_url = "http://foo.bar/" - requests_mock.get(content_url, status_code=404) - source_id = "source_id" - upload_id = "123456789012345678901234" - update_upload_url = f"{_SOURCE_API_URL}/sources/{source_id}/uploads/{upload_id}" - requests_mock.put(update_upload_url, json={}) - - try: - retrieval.retrieve_content( - "env", source_id, upload_id, content_url, "JSON", {}, {}, tempdir="/tmp") - except Exception: - assert requests_mock.request_history[0].url == content_url - assert requests_mock.request_history[1].url == update_upload_url - assert requests_mock.request_history[-1].json( - ) == {"status": "ERROR", "summary": {"error": common_lib.UploadError.SOURCE_CONTENT_NOT_FOUND.name}} - return - - # We got the wrong exception or no exception, fail the test. - assert not "Should have raised an exception." - - -def test_retrieve_content_raises_error_if_other_errors_getting_source_content( - requests_mock, mock_source_api_url_fixture): - from retrieval import retrieval # Import locally to avoid superseding mock - content_url = "http://bar.baz/" - requests_mock.get(content_url, status_code=500) - source_id = "source_id" - upload_id = "123456789012345678901234" - update_upload_url = f"{_SOURCE_API_URL}/sources/{source_id}/uploads/{upload_id}" - requests_mock.put(update_upload_url, json={}) - - try: - retrieval.retrieve_content( - "env", source_id, upload_id, content_url, "JSON", {}, {}, tempdir="/tmp") - except Exception: - assert requests_mock.request_history[0].url == content_url - assert requests_mock.request_history[1].url == update_upload_url - assert requests_mock.request_history[-1].json( - ) == {"status": "ERROR", "summary": {"error": common_lib.UploadError.SOURCE_CONTENT_DOWNLOAD_ERROR.name}} - return - - # We got the wrong exception or no exception, fail the test. - assert not "Should have raised an exception." - - -@pytest.mark.skipif(not os.environ.get("DOCKERIZED", False), - reason="Running integration tests outside of mock environment disabled") -def test_upload_to_s3_writes_indicated_file_to_key(): - from retrieval import retrieval # Import locally to avoid superseding mock - local_file = "/tmp/data.txt" - expected_data = "This is data." - with open(local_file, "w") as f: - f.write(expected_data) - expected_s3_bucket = retrieval.OUTPUT_BUCKET - expected_s3_key = "objectkey" - retrieval.upload_to_s3(local_file, expected_s3_key, - "", "", "", {}, {}) # api creds - actual_object = s3_client.get_object( - Bucket=expected_s3_bucket, Key=expected_s3_key) - s3_data = actual_object['Body'].read().decode("utf-8") - assert s3_data == expected_data - - -@pytest.mark.skipif(not os.environ.get("DOCKERIZED", False), - reason="Running integration tests outside of mock environment disabled") -def test_upload_to_s3_raises_error_on_s3_error( - requests_mock, mock_source_api_url_fixture): - from retrieval import retrieval # Import locally to avoid superseding mock - upload_id = "123456789012345678901234" - source_id = "source_id" - update_upload_url = f"{_SOURCE_API_URL}/sources/{source_id}/uploads/{upload_id}" - requests_mock.put(update_upload_url, json={}) - - try: - retrieval.upload_to_s3("not a file name", "not an s3 key", - "env", source_id, upload_id, {}, {}) # api creds - except Exception: - assert requests_mock.request_history[0].url == update_upload_url - assert requests_mock.request_history[-1].json( - ) == {"status": "ERROR", "summary": {"error": common_lib.UploadError.INTERNAL_ERROR.name}} - return - - # We got the wrong exception or no exception, fail the test. - assert not "Should have raised an exception." - - -def test_raw_content_unzips(): - from retrieval import retrieval - # Creating a fake zip file with one file in it. - name = None - _, name = tempfile.mkstemp() - with zipfile.ZipFile(name, 'w') as zf: - zf.writestr('somefile', 'foo') - - url = 'http://mock/url.zip' - with open(name, "rb") as f: - wrappedBytes = retrieval.raw_content(url, f.read(), tempdir="/tmp") - # Content should be the content of the first file in the zip. - assert wrappedBytes.read() == b'foo' - - -def test_raw_content_ignores_unknown_mimetypes(): - from retrieval import retrieval - url = 'http://mock/url' - wrappedBytes = retrieval.raw_content(url, b'foo', tempdir="/tmp") - assert wrappedBytes.read() == b'foo' diff --git a/ingestion/functions/retrieval/valid_scheduled_event.json b/ingestion/functions/retrieval/valid_scheduled_event.json deleted file mode 100644 index 0ba5e4d9b..000000000 --- a/ingestion/functions/retrieval/valid_scheduled_event.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "env": "local", - "sourceId": "5f77335466b1ce0028f328b1", - "parsingDateRange": { - "start": "2020-09-01", - "end": "2020-09-21" - } -} diff --git a/ingestion/functions/run.sh b/ingestion/functions/run.sh deleted file mode 100755 index a6f703219..000000000 --- a/ingestion/functions/run.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -set -eou pipefail - -python3 ./retrieval/retrieval.py diff --git a/ingestion/functions/run_docker.sh b/ingestion/functions/run_docker.sh deleted file mode 100755 index 8f715e8f2..000000000 --- a/ingestion/functions/run_docker.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -# This won't do much on it's own at present. -# It needs the curator running at localhost:3001. - -set -eo pipefail - -function cleanup() { - docker-compose stop - docker-compose down -v --remove-orphans -} - -trap cleanup EXIT - -docker-compose -f docker-compose.yml up --build diff --git a/ingestion/functions/setup_s3_test.sh b/ingestion/functions/setup_s3_test.sh deleted file mode 100755 index 5c4fdcde6..000000000 --- a/ingestion/functions/setup_s3_test.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -set -eou pipefail - -echo "Waiting for S3 at ${AWS_ENDPOINT}/health, checking every 5s" -until $(curl --silent --fail ${AWS_ENDPOINT}/health | grep "\"s3\": \"running\"" > /dev/null); do - echo "Waiting 5s" - sleep 5 -done - -echo "S3 ready" -echo "Creating bucket ${BUCKET_NAME}" -aws --endpoint-url=${AWS_ENDPOINT} configure set default.s3.addressing_style path -aws --endpoint-url=${AWS_ENDPOINT} s3 mb s3://${BUCKET_NAME} -aws --endpoint-url=${AWS_ENDPOINT} s3api put-bucket-acl --bucket ${BUCKET_NAME} --acl public-read -echo "Done creating S3 bucket ${BUCKET_NAME}" diff --git a/ingestion/functions/test.sh b/ingestion/functions/test.sh deleted file mode 100755 index 3d647c202..000000000 --- a/ingestion/functions/test.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -set -eou pipefail - -if [ "$DOCKERIZED" == "True" ] ; then - ./setup_s3_test.sh -fi - -python3 -m pytest . -echo "Tests and code quality checks passed" diff --git a/ingestion/functions/test_clean_old_ingestion_source_files.py b/ingestion/functions/test_clean_old_ingestion_source_files.py deleted file mode 100644 index ceb78f9e8..000000000 --- a/ingestion/functions/test_clean_old_ingestion_source_files.py +++ /dev/null @@ -1,74 +0,0 @@ -import os -import pytest -import unittest -from datetime import datetime, timedelta - -import boto3 -from botocore.exceptions import ClientError - -import clean_old_ingestion_source_files -import aws_access.globaldothealth_configuration as gdoth - -localstack = 'http://localstack:4566' -rate_event_id = '5f7796ece78c6866f6f676e0' -file_content = "blah blah blah" # this is unimportant -file_time = '1130' # also unimportant -file_name = 'slartibartfast.json' # "my name is not important" - -def s3_object_key_helper(source_id, date, file_name): - return f"{source_id}/{date.year}/{date.month}/{date.day}/{file_time}/{file_name}" - - -class CleanupScriptTests(unittest.TestCase): - def setUp(self): - # create eventbridge rule for an ingestion source - self.eventbridge = boto3.client("events", gdoth.AWS_REGION, endpoint_url=localstack) - self.eventbridge.put_rule( - Name='Test ingestion rule', - ScheduleExpression='rate(7 days)', - State='ENABLED', - Description=f'Scheduled Batch ingestion rule for source: Taiwan with ID: ' - f'{rate_event_id} for environment: prod' - ) - # create s3 client, but assume ingestion data bucket already exists - # (because other tests assume that so if I create/delete here they fail) - self.s3 = boto3.resource("s3", endpoint_url=localstack) - # create various "source files" in the ingestion data bucket - # one from today (we will do this all relative to today's date rather than pin the date, - # if this causes a problem later please hunt me down) - now = datetime.now() - self.today_key = s3_object_key_helper(rate_event_id, now, file_name) - self.s3.Object(gdoth.INGESTION_SOURCES_BUCKET, self.today_key).put(Body=file_content) - # one from the day before the age-out date of the schedule rule - day_before = now + timedelta(days=-25) - self.day_before_key = s3_object_key_helper(rate_event_id, day_before, file_name) - self.s3.Object(gdoth.INGESTION_SOURCES_BUCKET, self.day_before_key).put(Body=file_content) - # one from the day of the age-out date - day_of = now + timedelta(days=-24) - self.day_of_key = s3_object_key_helper(rate_event_id, day_of, file_name) - self.s3.Object(gdoth.INGESTION_SOURCES_BUCKET, self.day_of_key).put(Body=file_content) - # one from the day after the age-out date - day_after = now + timedelta(days=-23) - self.day_after_key = s3_object_key_helper(rate_event_id, day_after, file_name) - self.s3.Object(gdoth.INGESTION_SOURCES_BUCKET, self.day_after_key).put(Body=file_content) - - def tearDown(self): - # destroy eventbridge rules - self.eventbridge.delete_rule(Name='Test ingestion rule') - # delete objects that test didn't delete - bucket = self.s3.Bucket(gdoth.INGESTION_SOURCES_BUCKET) - bucket.objects.all().delete() - - @pytest.mark.skipif(not os.environ.get("DOCKERIZED", False), - reason="Running integration tests outside of mock environment disabled") - def testCleanupScript(self): - clean_old_ingestion_source_files.main(localstack) - assert self.s3.Object(gdoth.INGESTION_SOURCES_BUCKET, self.today_key).delete_marker is not True - assert self.s3.Object(gdoth.INGESTION_SOURCES_BUCKET, self.day_after_key).delete_marker is not True - with self.assertRaises(ClientError): - assert self.s3.Object(gdoth.INGESTION_SOURCES_BUCKET, self.day_before_key).load() - with self.assertRaises(ClientError): - assert self.s3.Object(gdoth.INGESTION_SOURCES_BUCKET, self.day_of_key).load() - -if __name__ == '__main__': - unittest.main() \ No newline at end of file diff --git a/ingestion/functions/test_docker.sh b/ingestion/functions/test_docker.sh deleted file mode 100755 index 825cf4fdc..000000000 --- a/ingestion/functions/test_docker.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -set -eo pipefail - -function cleanup() { - docker-compose stop - docker-compose down -v --remove-orphans -} - -trap cleanup EXIT - -docker-compose -f docker-compose-test.yml up --build --exit-code-from test diff --git a/ingestion/functions/tox.ini b/ingestion/functions/tox.ini deleted file mode 100644 index 67c9ae736..000000000 --- a/ingestion/functions/tox.ini +++ /dev/null @@ -1,6 +0,0 @@ -[flake8] -max-line-length = 100 -ignore = \ - E128, # Continuation line under-indented for visual indent - E305, # Expected 2 blank lines after class or function definition, found 1 - E302, # Expected 2 blank lines, found 1 diff --git a/ingestion/monitoring/README.md b/ingestion/monitoring/README.md deleted file mode 100644 index 7e4f5d395..000000000 --- a/ingestion/monitoring/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Data monitoring - -Data monitoring scripts, currently there's a script to alert daily about -changes in data. - -The only configuration needed is setting `SLACK_WEBHOOK_METRICS_URL` to the -incoming webhooks URL ([docs](https://api.slack.com/messaging/webhooks)) after -creating a new app ([see current apps](https://api.slack.com/apps)) if required -in the workspace. - -If `SLACK_WEBHOOK_METRICS_URL` is not set, the script will run and print to CI, -but will not be able to notify. The script triggers a CI failure when the -number of cases has dropped, so that should always be visible. - diff --git a/ingestion/monitoring/completeness.py b/ingestion/monitoring/completeness.py deleted file mode 100644 index c9f951870..000000000 --- a/ingestion/monitoring/completeness.py +++ /dev/null @@ -1,121 +0,0 @@ -import os -import sys -import json -import time -import tempfile -import logging -import contextlib -from pathlib import Path - -import boto3 -import pandas as pd -import botocore - -MAX_TRIES = 10 - - -def data_files(bucket, prefix="csv", suffix=".csv.gz", endpoint_url=None): - try: - bucket = boto3.resource("s3", endpoint_url=endpoint_url).Bucket(bucket) - except Exception as e: - logging.error(f"Failed to access bucket={bucket} with exception {e}") - return [ - file - for file in bucket.objects.all() - if file.key.startswith(prefix) and file.key.endswith(suffix) - ] - - -def non_null(df): - counts = {"N": df.shape[0]} - counts.update( - {field: df.loc[pd.notnull(df[field])].shape[0] for field in df.columns} - ) - return pd.Series(counts) - - -def completeness_file(filename, chunksize=100000): - it = pd.read_csv( - filename, compression="gzip", iterator=True, dtype=str, chunksize=chunksize - ) - _chunks = [] - with contextlib.suppress(StopIteration): - while not (chunk := it.get_chunk()).empty: - _chunks.append(non_null(chunk)) - completeness = pd.DataFrame(_chunks).sum() - completeness = dict(100 * completeness / completeness.N) - del completeness["N"] # not needed, always 100 - return completeness - - -def completeness_s3(s3_object, endpoint_url=None): - """Returns completeness of various fields in country - - s3_object should refer to a file in csv.gz format - """ - bucket = boto3.resource("s3", endpoint_url=endpoint_url).Bucket( - s3_object.bucket_name - ) - with tempfile.NamedTemporaryFile() as tmp: - tries = 0 - success = False - logging.info(f"Downloading {s3_object.key} from {bucket}") - for tries in range(MAX_TRIES): - try: - bucket.download_file(s3_object.key, tmp.name) - success = True - break - except botocore.exceptions.EndpointConnectionError as e: - logging.info(f"Connection error while getting {s3_object}, retrying in {2**tries} seconds ...") - logging.info(e) - except Exception as e: - logging.error(f"Error while getting {s3_object}, aborting") - logging.error(e) - break - time.sleep(2**tries) - if success: - logging.info(f"Calculating completeness for {s3_object.key}") - return completeness_file(tmp.name) - else: - logging.error(f"Failed to download {s3_object}, {MAX_TRIES} attempts exceeded") - return None - - -def upload(data, bucket, endpoint_url=None): - logging.info(f"Uploading data to {bucket}") - s3 = boto3.client("s3", endpoint_url=endpoint_url) - try: - s3.put_object( - ACL="public-read", - Body=json.dumps(data, indent=2, sort_keys=True), - Bucket=bucket, - Key="metrics/completeness.json", - ) - except Exception as e: - logging.error(f"Failed to upload with exception:\n{e}") - - -def completeness_s3_many(objects, endpoint_url=None): - _completeness = { - Path(obj.key).stem.split(".")[0]: completeness_s3(obj, endpoint_url) - for obj in objects - } - return {k: v for k, v in _completeness.items() if v is not None} - - -def setup_logger(): - h = logging.StreamHandler(sys.stdout) - rootLogger = logging.getLogger() - rootLogger.addHandler(h) - rootLogger.setLevel(logging.INFO) - - -if __name__ == "__main__": - setup_logger() - endpoint_url = os.getenv("ENDPOINT_URL") - objects = data_files( - os.getenv("COUNTRY_EXPORT_BUCKET", "covid-19-country-export-eu"), - endpoint_url=endpoint_url, - ) - data = completeness_s3_many(objects, endpoint_url) - upload(data, os.getenv("METRICS_BUCKET", "covid-19-aggregates-eu"), endpoint_url) diff --git a/ingestion/monitoring/daily_metrics.py b/ingestion/monitoring/daily_metrics.py deleted file mode 100644 index 0854c64c9..000000000 --- a/ingestion/monitoring/daily_metrics.py +++ /dev/null @@ -1,122 +0,0 @@ -import datetime -import os -import sys -import json -import operator -import tempfile -from pathlib import Path -import logging - -import requests -import boto3 - - -BUCKET = "covid-19-aggregates-eu" -WEBHOOK_URL = os.environ.get("SLACK_WEBHOOK_METRICS_URL", None) - -logger = logging.getLogger(__name__) - - -def is_latest_file_current(latest_s3_date: str) -> bool: - today = datetime.date.today().isoformat() - return today == latest_s3_date - - -def to_isodate(date: str) -> str: - mm, dd, yyyy = date.split("-") - return f"{yyyy}-{mm}-{dd}" - - -def get_data(s3: object, bucket: str, key: str) -> dict: - data = None - with tempfile.NamedTemporaryFile() as fout: - s3.Object(bucket, key).download_file(fout.name) - with open(fout.name) as fp: - data = json.load(fp) - if next(iter(data)) != Path(key).stem: # next(iter(k)) gives first key of k - logger.error(f"Bucket key {key} does not match key in file {k0}, aborting.") - sys.exit(1) - return data - - -def format_difference(x: int, y: int) -> str: - if y == x: - return "= " - return ("▲ " if y > x else "▼ ") + str(abs(y - x)) - - -def compare_daily_counts(d1, d2) -> str: - last_day = next(iter(d1)) - d1 = d1[last_day] - today = next(iter(d2)) - d2 = d2[today] - lines = [] - total1 = sum(x["casecount"] for x in d1) - total2 = sum(x["casecount"] for x in d2) - if total2 == total1: - lines.append(f"No overall case count change from {last_day}") - elif total2 > total1: - lines.append(f"*New cases added*: {total2 - total1} since {last_day}\n") - else: - lines.append(f"*Cases dropped* ⚠️: {total2 - total1} since {last_day}\n") - - countries1 = {str(x["_id"]): x["casecount"] for x in d1 if x["casecount"]} - countries2 = {str(x["_id"]): x["casecount"] for x in d2 if x["casecount"]} - if c21 := sorted(set(countries2) - set(countries1)): - lines.append("*Countries added*: " + ", ".join(c21)) - for k in c21: - lines.append(f"- {k}: {countries2[k]} ") - if c12 := sorted(set(countries1) - set(countries2)): - lines.append("*Countries dropped*: " + ", ".join(c12)) - for k in c12: - lines.append(f"- {k}: {countries1[k]} ") - - common_countries = [] - for c in sorted(set(countries1) & set(countries2)): - if countries1[c] == countries2[c]: - continue - common_countries.append( - f"- {c}: {countries2[c]} ({format_difference(countries1[c], countries2[c])})" - ) - if common_countries: - lines.append("*Country data additions/deletions*:") - lines.extend(common_countries) - - return "\n".join(lines) - - -def send_slack_message(slack_message: str) -> None: - if WEBHOOK_URL: - response = requests.post(WEBHOOK_URL, json={"text": slack_message}) - if response.status_code != 200: - logger.error(f"Slack notification failed with {response.status_code}: {response.text}") - sys.exit(1) - - -if __name__ == "__main__": - s3 = boto3.resource("s3") - bucket = s3.Bucket(BUCKET) - latest_s3_day, second_latest_s3_day = sorted( - [ - (x.key, to_isodate(Path(x.key).stem)) - for x in bucket.objects.filter(Prefix="country") - if "latest" not in x.key - ], - key=operator.itemgetter(1), - reverse=True, - )[:2] - - slack_message = "" - - if is_latest_file_current(latest_s3_day[1]): - last_days_data = get_data(s3, BUCKET, second_latest_s3_day[0]) - todays_data = get_data(s3, BUCKET, latest_s3_day[0]) - slack_message = compare_daily_counts(last_days_data, todays_data) - else: - slack_message = f"No case count file in S3 for today. The latest file is dated {latest_s3_day[1]}" - - logger.info(slack_message) - send_slack_message(slack_message) - - if "⚠️" in slack_message: - sys.exit(1) # Trigger CI failure as an additional notification diff --git a/ingestion/monitoring/freshness.py b/ingestion/monitoring/freshness.py deleted file mode 100644 index bb2b8d7ca..000000000 --- a/ingestion/monitoring/freshness.py +++ /dev/null @@ -1,98 +0,0 @@ -import os -import sys -import json -import logging -import operator -from typing import Any -from collections import defaultdict - -import boto3 -import requests - -DEFAULT_INSTANCE = "https://data.covid-19.global.health" - - -def fetch_sources(api_key, instance): - logging.info(f"Fetching sources from {instance}") - content = {"nextPage": 1} - N = 0 - total = 0 - sources = [] - # The second condition is to catch the last page - # where nextPage is not defined, but N < total - while page := content.get("nextPage") or N < total: - res = requests.get( - f"{instance}/api/sources?limit=100&page={page}", - headers={ - "Content-Type": "application/json", - "X-API-Key": api_key, - }, - ) - if res.status_code != 200: - logging.error( - f"Failed to fetch sources, status={res.status_code}\n{res.content}" - ) - return None - else: - content = res.json() - total = content["total"] - N += len(content["sources"]) - sources.extend(content["sources"]) - return sources - - -def last_upload_created(uploads: list[dict[str, Any]]): - if not ( - accepted_uploads := [ - u for u in uploads if u["status"] == "SUCCESS" and u.get("accepted") - ] - ): - return None - return max(map(operator.itemgetter("created"), accepted_uploads)) - - -def freshness(sources): - logging.info("Getting freshness") - _freshness = defaultdict(list) - for source in sources: - for cc in source.get("countryCodes", []): - _freshness[cc].append( - { - "name": source["name"], - "url": source["origin"]["url"], - "last_upload": last_upload_created(source["uploads"]), - } - ) - return _freshness - - -def upload(data, bucket, s3_endpoint=None): - logging.info(f"Uploading data to {bucket}, with s3_endpoint={s3_endpoint}") - s3 = boto3.client("s3", endpoint_url=s3_endpoint) - try: - s3.put_object( - ACL="public-read", - Body=json.dumps(data, indent=2, sort_keys=True), - Bucket=bucket, - Key="metrics/freshness.json", - ) - except Exception as e: - logging.error(f"Failed to upload with exception:\n{e}") - - -def setup_logger(): - h = logging.StreamHandler(sys.stdout) - rootLogger = logging.getLogger() - rootLogger.addHandler(h) - rootLogger.setLevel(logging.INFO) - - -if __name__ == "__main__": - setup_logger() - if not (api_key := os.getenv("GDH_API_KEY")): - raise ValueError("Set GDH_API_KEY to your Global.health API key") - bucket = os.getenv("BUCKET", "covid-19-aggregates-eu") - s3_endpoint = os.getenv("S3_ENDPOINT") - instance = os.getenv("GDH_URL", DEFAULT_INSTANCE) - if sources := fetch_sources(api_key, instance): - upload(freshness(sources), bucket, s3_endpoint) diff --git a/ingestion/monitoring/poetry.lock b/ingestion/monitoring/poetry.lock deleted file mode 100644 index 5778e992f..000000000 --- a/ingestion/monitoring/poetry.lock +++ /dev/null @@ -1,181 +0,0 @@ -[[package]] -name = "boto3" -version = "1.21.8" -description = "The AWS SDK for Python" -category = "main" -optional = false -python-versions = ">= 3.6" - -[package.dependencies] -botocore = ">=1.24.8,<1.25.0" -jmespath = ">=0.7.1,<1.0.0" -s3transfer = ">=0.5.0,<0.6.0" - -[package.extras] -crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] - -[[package]] -name = "botocore" -version = "1.24.8" -description = "Low-level, data-driven core of boto 3." -category = "main" -optional = false -python-versions = ">= 3.6" - -[package.dependencies] -jmespath = ">=0.7.1,<1.0.0" -python-dateutil = ">=2.1,<3.0.0" -urllib3 = ">=1.25.4,<1.27" - -[package.extras] -crt = ["awscrt (==0.12.5)"] - -[[package]] -name = "certifi" -version = "2021.10.8" -description = "Python package for providing Mozilla's CA Bundle." -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "charset-normalizer" -version = "2.0.12" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" -optional = false -python-versions = ">=3.5.0" - -[package.extras] -unicode_backport = ["unicodedata2"] - -[[package]] -name = "idna" -version = "3.3" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "jmespath" -version = "0.10.0" -description = "JSON Matching Expressions" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "requests" -version = "2.27.1" -description = "Python HTTP for Humans." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} -urllib3 = ">=1.21.1,<1.27" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] - -[[package]] -name = "s3transfer" -version = "0.5.2" -description = "An Amazon S3 Transfer Manager" -category = "main" -optional = false -python-versions = ">= 3.6" - -[package.dependencies] -botocore = ">=1.12.36,<2.0a.0" - -[package.extras] -crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "urllib3" -version = "1.26.8" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" - -[package.extras] -brotli = ["brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] - -[metadata] -lock-version = "1.1" -python-versions = "^3.10" -content-hash = "7eea18b72af03b9cda3bf21e7bb08a4a1e4f30fe832f4b5702fe25727a428666" - -[metadata.files] -boto3 = [ - {file = "boto3-1.21.8-py3-none-any.whl", hash = "sha256:9b6903fe9cc92d2f6111db28675263f1ab45adbcf1483025c82a304ce7790b71"}, - {file = "boto3-1.21.8.tar.gz", hash = "sha256:f2ce641957c1782e382548ced4a447189e45851bbe58c1f6752ff2b661527de7"}, -] -botocore = [ - {file = "botocore-1.24.8-py3-none-any.whl", hash = "sha256:9fbc5c57b31850c51c87abc3e166ed4e0f343665bec4e1a0ff814fbc9704642c"}, - {file = "botocore-1.24.8.tar.gz", hash = "sha256:a5431d806dc75fb1844463d921759fcd8d387674443af8d7fd0867f296b02759"}, -] -certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, - {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, -] -idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, -] -jmespath = [ - {file = "jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f"}, - {file = "jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9"}, -] -python-dateutil = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] -requests = [ - {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, - {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, -] -s3transfer = [ - {file = "s3transfer-0.5.2-py3-none-any.whl", hash = "sha256:7a6f4c4d1fdb9a2b640244008e142cbc2cd3ae34b386584ef044dd0f27101971"}, - {file = "s3transfer-0.5.2.tar.gz", hash = "sha256:95c58c194ce657a5f4fb0b9e60a84968c808888aed628cd98ab8771fe1db98ed"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -urllib3 = [ - {file = "urllib3-1.26.8-py2.py3-none-any.whl", hash = "sha256:000ca7f471a233c2251c6c7023ee85305721bfdf18621ebff4fd17a8653427ed"}, - {file = "urllib3-1.26.8.tar.gz", hash = "sha256:0e7c33d9a63e7ddfcb86780aac87befc2fbddf46c58dbb487e0855f7ceec283c"}, -] diff --git a/ingestion/monitoring/pyproject.toml b/ingestion/monitoring/pyproject.toml deleted file mode 100644 index c36f1e416..000000000 --- a/ingestion/monitoring/pyproject.toml +++ /dev/null @@ -1,17 +0,0 @@ -[tool.poetry] -name = "monitoring" -version = "0.1.0" -description = "Monitoring functions for Global.health ingestion" -authors = ["Global.health "] -license = "MIT" - -[tool.poetry.dependencies] -python = "^3.10" -boto3 = "^1.21.8" -requests = "^2.27.1" - -[tool.poetry.dev-dependencies] - -[build-system] -requires = ["poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" diff --git a/ingestion/monitoring/requirements-completeness.txt b/ingestion/monitoring/requirements-completeness.txt deleted file mode 100644 index a56846944..000000000 --- a/ingestion/monitoring/requirements-completeness.txt +++ /dev/null @@ -1,2 +0,0 @@ -boto3==1.20.38 -pandas==1.4.* diff --git a/ingestion/monitoring/requirements.txt b/ingestion/monitoring/requirements.txt deleted file mode 100644 index 248c4c390..000000000 --- a/ingestion/monitoring/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -requests==2.25.1 -boto3==1.17.72 diff --git a/ingestion/monitoring/test_daily_metrics.py b/ingestion/monitoring/test_daily_metrics.py deleted file mode 100644 index 51c64b426..000000000 --- a/ingestion/monitoring/test_daily_metrics.py +++ /dev/null @@ -1,98 +0,0 @@ -from datetime import datetime, timedelta -from daily_metrics import compare_daily_counts, is_latest_file_current - -LAST_DAY = (datetime.now().date() - timedelta(days=1)).isoformat() -TODAY = datetime.now().date().isoformat() - -DATA = { - "lastday": { - LAST_DAY: [ - {"_id": "Bactria", "casecount": 1000}, - {"_id": "Gaul", "casecount": 900}, - ] - }, - "identical": { - TODAY: [ - {"_id": "Bactria", "casecount": 1000}, - {"_id": "Gaul", "casecount": 900}, - ] - }, - "more": { - TODAY: [ - {"_id": "Bactria", "casecount": 1200}, - {"_id": "Gaul", "casecount": 1300}, - ] - }, - "less": { - TODAY: [{"_id": "Bactria", "casecount": 800}, {"_id": "Gaul", "casecount": 700}] - }, - "countryadd": { - TODAY: [ - {"_id": "Bactria", "casecount": 1000}, - {"_id": "Gaul", "casecount": 900}, - {"_id": "Persia", "casecount": 500}, - ] - }, - "countrydel": {TODAY: [{"_id": "Bactria", "casecount": 1000}]}, -} - - -def test_identical(): - assert ( - compare_daily_counts(DATA["lastday"], DATA["identical"]) - == f"No overall case count change from {LAST_DAY}" - ) - - -def test_more(): - assert ( - compare_daily_counts(DATA["lastday"], DATA["more"]) - == f"*New cases added*: 600 since {LAST_DAY}\n\n*Country data additions/deletions*:\n- Bactria: 1200 (▲ 200)\n- Gaul: 1300 (▲ 400)" - ) - - -def test_less(): - assert ( - compare_daily_counts(DATA["lastday"], DATA["less"]) - == f"*Cases dropped* ⚠️: -400 since {LAST_DAY}\n\n*Country data additions/deletions*:\n- Bactria: 800 (▼ 200)\n- Gaul: 700 (▼ 200)" - ) - - -def test_countryadd(): - assert ( - compare_daily_counts(DATA["lastday"], DATA["countryadd"]) - == f"*New cases added*: 500 since {LAST_DAY}\n\n*Countries added*: Persia\n- Persia: 500 " - ) - - -def test_countrydel(): - assert ( - compare_daily_counts(DATA["lastday"], DATA["countrydel"]) - == f"*Cases dropped* ⚠️: -900 since {LAST_DAY}\n\n*Countries dropped*: Gaul\n- Gaul: 900 " - ) - - -def test_is_latest_file_current(): - assert is_latest_file_current(TODAY) - - -def test_is_latest_file_not_current(): - assert not is_latest_file_current(LAST_DAY) - - -def generate_testcases(): - for var in DATA: - if var == "lastday": - continue - print(f"def test_{var}():") - print( - f" assert compare(DATA['lastday'], DATA['{var}']) == f" - + eval(f"repr(compare(DATA['lastday'], DATA['{var}']))").replace( - LAST_DAY, "{LAST_DAY}" - ) - ) - print() - - -if __name__ == "__main__": - generate_testcases() diff --git a/ingestion/monitoring/test_freshness.py b/ingestion/monitoring/test_freshness.py deleted file mode 100644 index c093c66a4..000000000 --- a/ingestion/monitoring/test_freshness.py +++ /dev/null @@ -1,129 +0,0 @@ -import pytest - -import freshness - - -_LAST_UPLOAD = [ - {"created": "2021-11-01T00:00:00Z", "accepted": False, "status": "IN_PROGRESS"}, - {"created": "2021-10-30T00:00:00Z", "accepted": False, "status": "SUCCESS"}, - {"created": "2021-10-26T00:00:00Z", "accepted": False, "status": "ERROR"}, - {"created": "2021-10-24T00:00:00Z", "accepted": True, "status": "SUCCESS"}, - {"created": "2021-10-20T00:00:00Z", "accepted": False, "status": "ERROR"}, - {"created": "2021-10-10T00:00:00Z", "accepted": True, "status": "SUCCESS"}, -] - - -def test_last_upload_created(): - assert freshness.last_upload_created(_LAST_UPLOAD) == "2021-10-24T00:00:00Z" - - -_SOURCES = { - "sources": [ - { - "countryCodes": ["BR"], - "name": "Brazil State 1", - "origin": {"url": "https://state1.gov.br/data.csv"}, - "uploads": [ - { - "accepted": True, - "created": "2022-01-18T00:00:00Z", - "status": "SUCCESS", - }, - { - "accepted": False, - "created": "2022-01-15T00:00:00Z", - "status": "SUCCESS", - }, - { - "accepted": False, - "created": "2022-01-11T00:00:00Z", - "status": "IN_PROGRESS", - }, - ], - }, - { - "countryCodes": ["BR"], - "name": "Brazil State 2", - "origin": {"url": "https://state2.gov.br/data.csv"}, - "uploads": [ - { - "accepted": True, - "created": "2022-01-17T00:00:00Z", - "status": "SUCCESS", - }, - { - "accepted": False, - "created": "2022-01-15T00:00:00Z", - "status": "SUCCESS", - }, - { - "accepted": False, - "created": "2022-01-11T00:00:00Z", - "status": "IN_PROGRESS", - }, - ], - }, - { - "countryCodes": ["US"], - "name": "United States", - "origin": {"url": "https://cdc.gov/rows.csv"}, - "uploads": [ - { - "accepted": True, - "created": "2021-11-11T00:00:00Z", - "status": "SUCCESS", - }, - { - "accepted": False, - "created": "2021-09-01T00:00:00Z", - "status": "SUCCESS", - }, - { - "accepted": False, - "created": "2021-07-15T00:00:00Z", - "status": "IN_PROGRESS", - }, - ], - }, - { - "countryCodes": ["ZZ"], - "name": "Spreadsheets imported data", - "origin": {"url": "https://global.health"}, - "uploads": [], - }, - ], - "total": 4, -} - -_FRESHNESS = { - "BR": [ - { - "last_upload": "2022-01-18T00:00:00Z", - "name": "Brazil State 1", - "url": "https://state1.gov.br/data.csv", - }, - { - "last_upload": "2022-01-17T00:00:00Z", - "name": "Brazil State 2", - "url": "https://state2.gov.br/data.csv", - }, - ], - "US": [ - { - "last_upload": "2021-11-11T00:00:00Z", - "name": "United States", - "url": "https://cdc.gov/rows.csv", - } - ], - "ZZ": [ - { - "last_upload": None, - "name": "Spreadsheets imported data", - "url": "https://global.health", - } - ], -} - - -def test_freshness(): - assert freshness.freshness(_SOURCES["sources"]) == _FRESHNESS