Como Converter GeoJSON para JSON (Removendo a Geometria e Mantendo as Propriedades)
O Que o GeoJSON Realmente Contém (e Por Que é Mais do Que Você Precisa)
GeoJSON nada mais é do que JSON, mas com uma estrutura altamente específica e, muitas vezes, volumosa. Cada arquivo geralmente envolve seus dados em uma `FeatureCollection`, que contém um array de objetos `Feature`. Cada `Feature`, por sua vez, tem duas partes principais: `geometry` e `properties`. O bloco `geometry` é onde todos os dados espaciais residem — arrays de coordenadas, tipos de formas como Point ou Polygon, e anéis de coordenadas complexos que podem se estender por milhares de linhas. O bloco `properties` é o que geralmente importa para você: os dados de atributos reais, como nomes, IDs, contagens de população ou carimbos de data/hora associados a cada forma. Essa estrutura se torna um problema quando você precisa passar os dados para um sistema que não "fala o idioma de mapas". Imagine que você exportou um conjunto de dados com os limites de todos os 4.200 condados dos EUA de uma ferramenta de SIG (GIS). O arquivo GeoJSON resultante poderia facilmente ter 18 MB, com cada polígono de condado definido por milhares de pares de coordenadas. Se seu objetivo é apenas usar o nome do condado, o código FIPS e a população em um relatório ou API, você está carregando 95% de peso morto. Essa geometria é apenas ruído. Pior ainda, alguns parsers simplesmente rejeitarão o arquivo porque não reconhecem as chaves geoespaciais. Para esses usos não espaciais, remover a geometria não é perder dados; é apenas uma preparação inteligente dos dados.
A Diferença na Estrutura: GeoJSON vs. JSON Simples
Vamos ser específicos sobre a transformação. Aqui está um `Feature` GeoJSON mínimo com o qual você poderia começar: { "type": "Feature", "geometry": { "type": "Point", "coordinates": [-87.6298, 41.8781] }, "properties": { "city": "Chicago", "population": 2696555, "timezone": "America/Chicago" } } Após remover a geometria, seu alvo é o objeto JSON limpo e simples aninhado dentro da chave `properties`: { "city": "Chicago", "population": 2696555, "timezone": "America/Chicago" } Quando sua entrada é uma `FeatureCollection` (um arquivo com múltiplos features), o objetivo é produzir um único array JSON contendo apenas os objetos de propriedades de cada feature: [ { "city": "Chicago", "population": 2696555, "timezone": "America/Chicago" }, { "city": "Houston", "population": 2304580, "timezone": "America/Chicago" } ] Este é o formato que a maioria das APIs, importadores de planilhas e carregadores de banco de dados são projetados para entender. Qualquer pessoa que já depurou uma chamada de API com falha conhece a frustração de um parser engasgando com chaves de nível superior inesperadas como `geometry` ou `type`. O resultado final é um array JSON limpo, pronto para funcionar com quase qualquer ferramenta. Um detalhe crucial: e se um feature tiver um valor `null` para suas `properties`? Isso é um GeoJSON válido. Um bom conversor produzirá um objeto vazio `{}` para esse feature em vez de travar ou, pior, ignorá-lo silenciosamente. Conversores desleixados falham nesse teste o tempo todo.
Convertendo GeoJSON para JSON com o CocoConvert
Para uma solução rápida e sem código, o conversor de GeoJSON para JSON do CocoConvert em /convert/geojson-to-json foi projetado exatamente para essa tarefa. O processo é simples. Você envia seu arquivo `.geojson` ou `.json` (ele aceita ambas as extensões, já que GeoJSON frequentemente usa `.json`), seleciona suas opções e baixa o resultado simplificado. O conversor é implacável por padrão. Ele encontra o array `features`, pega o objeto `properties` de cada feature e os une em um array JSON limpo. A chave `geometry`, a chave `type` e o invólucro `FeatureCollection` ficam para trás. Se o seu arquivo contiver apenas um único `Feature` em vez de uma coleção, a saída será um único objeto JSON, não um array. O CocoConvert lida com arquivos de até 50 MB no plano gratuito, o que é mais do que suficiente para a maioria dos conjuntos de dados com menos de 10.000 features. Mas se você tiver um arquivo enorme, como uma rede rodoviária estadual (que pode facilmente ter 200 MB ou mais), você precisará usar uma ferramenta de linha de comando, que abordaremos a seguir. Por questões de privacidade, o conversor processa os arquivos no servidor, mas não armazena seus dados após a sua sessão, um detalhe importante se seus atributos incluírem informações sensíveis, como identificadores pessoais. Por padrão, o arquivo baixado terá a extensão `.json`. O painel de configurações oferece mais controle, permitindo que você especifique um nome de arquivo personalizado ou obtenha uma saída indentada e legível por humanos em vez de uma linha única minificada.
Alternativas de Linha de Comando para Arquivos Grandes ou Automação
Quando você está lidando com arquivos maiores que 50 MB ou precisa automatizar essa conversão em um script, a linha de comando é sua amiga. Você tem duas armas principais à sua escolha: `jq` e o módulo `json` embutido do Python. Para transformação pura de JSON, nada supera o `jq` em velocidade e simplicidade: jq '[.features[].properties]' input.geojson > output.json Este comando de uma linha faz exatamente o que a ferramenta web faz: ele itera sobre cada feature, extrai o objeto `properties` e envolve os resultados em um array JSON. `jq` é facilmente instalado em qualquer sistema operacional principal (como `brew install jq` no macOS ou `apt install jq` no Debian/Ubuntu) e pode processar arquivos de gigabytes sem pestanejar, pois transmite os dados em vez de carregá-los todos na memória. Se o `id` do seu feature for importante (no GeoJSON, ele fica ao lado de `properties`, não dentro), você pode mesclá-lo: jq '[.features[] | {id: .id} + .properties]' input.geojson > output.json Quando você precisa de mais lógica, Python é a resposta: import json with open('input.geojson') as f: gj = json.load(f) result = [feature['properties'] for feature in gj['features']] with open('output.json', 'w') as f: json.dump(result, f, indent=2) Este script curto lhe dá controle total para filtrar features, renomear chaves ou lidar com casos extremos bizarros antes de escrever a saída. O melhor de tudo é que o módulo `json` faz parte da biblioteca padrão do Python, então não há nada extra para instalar. Deixe-me ser direto com minha recomendação: use o CocoConvert quando você tiver um arquivo e quiser um resultado em 30 segundos sem tocar em código. Use `jq` ou Python quando estiver automatizando um pipeline de dados ou processando centenas de arquivos.
Lidando com Casos Extremos que Quebram Conversores Ingênuos
O GeoJSON do mundo real costuma ser mais bagunçado do que os exemplos limpos da especificação. Aqui estão as armadilhas comuns que podem quebrar um conversor ingênuo. **Geometria nula:** Você encontrará frequentemente features com `"geometry": null`. Eles são perfeitamente válidos, muitas vezes representando registros que simplesmente não possuem dados de localização. Um conversor robusto ainda deve extrair suas propriedades, não descartar o feature inteiro. Os métodos com `jq` e Python mostrados anteriormente lidam com isso corretamente. **Propriedades aninhadas:** O próprio objeto `properties` pode conter objetos JSON aninhados, como `"properties": {"address": {"street": "Main St"}}`. Remover a geometria não achata essas estruturas aninhadas; elas são preservadas como estão. Se você precisar de uma estrutura completamente plana (para um CSV, por exemplo), essa é uma transformação separada que você precisará realizar. **Chaves inconsistentes:** É comum que alguns features em uma coleção tenham uma chave `"name"` enquanto outros não. O array JSON resultante simplesmente terá objetos com formatos diferentes. Isso é um JSON válido, mas pode atrapalhar sistemas fortemente tipados. O CocoConvert extrai fielmente o que está lá; ele não tentará normalizar o esquema para você. **`GeometryCollection`:** Alguns arquivos usam o tipo `GeometryCollection`, que tem uma estrutura diferente da `FeatureCollection` padrão. Muitas ferramentas, incluindo o CocoConvert, esperam uma `FeatureCollection` e podem falhar se encontrarem uma `GeometryCollection` no nível superior. **Problemas de codificação (encoding):** Esta é uma dor de cabeça clássica com dados de SIG (GIS). A especificação do GeoJSON exige codificação UTF-8, ponto final. Mas arquivos exportados de softwares mais antigos às vezes podem conter caracteres Latin-1 ou Windows-1252. Isso causará erros de análise (parsing). Você deve corrigir a codificação na origem usando uma ferramenta como `iconv` antes de tentar a conversão.
Quando Você Deve Manter a Geometria (e Converter de Forma Diferente)
Embora remover a geometria seja ótimo para fluxos de trabalho que usam apenas os dados, às vezes é a decisão completamente errada. Há muitas ocasiões em que você precisa manter os dados espaciais, apenas em um formato diferente. Se você está fornecendo dados para uma biblioteca de mapas web como Leaflet ou MapboxGL, pare. Não converta nada. Ambas as bibliotecas consomem GeoJSON nativamente, então converter para JSON simples removeria justamente as coordenadas de que precisam para desenhar seu mapa. Às vezes, você precisa das coordenadas, mas em um formato diferente — como um array plano de objetos `{lat, lng, name}` para um gráfico personalizado. Isso é uma tarefa de remodelagem, não de remoção de geometria. `jq` é perfeito para isso: jq '[.features[] | {lat: .geometry.coordinates[1], lng: .geometry.coordinates[0], name: .properties.name}]' input.geojson > output.json Preste muita atenção à ordem das coordenadas aqui. GeoJSON é estritamente `[longitude, latitude]`, ou (x, y). Isso é o oposto do que muitas pessoas e sistemas esperam. Errar nisso é o erro mais comum ao manusear manualmente coordenadas GeoJSON, e tem o efeito hilário e frustrante de colocar seus dados no hemisfério errado. Se seu objetivo é converter GeoJSON para outro formato geoespacial como TopoJSON, Shapefile ou KML, você precisa de uma ferramenta diferente. O CocoConvert não faz essas conversões que preservam a geometria. Para isso, você deve usar uma ferramenta criada para esse fim, como a poderosa ferramenta de linha de comando `ogr2ogr` (do GDAL) ou a excelente ferramenta web Mapshaper. Elas são as ferramentas certas para esse trabalho. Nossa ferramenta de GeoJSON para JSON em /convert/geojson-to-json é focada em uma única tarefa: extrair propriedades. Ela faz essa única coisa, e a faz bem.
Validando Sua Saída Antes de Usá-la em Outros Sistemas
Antes de alimentar seu novo e brilhante arquivo JSON em um sistema downstream, tire dois minutos para validá-lo. Este passo simples pode poupar horas de depuração de falhas confusas mais tarde. Abra o arquivo rapidamente em um editor de texto. O nível superior é um array (começa com `[`)? Cada elemento é um objeto (começando com `{`)? Crucialmente, você vê alguma chave `geometry` ou `type`? Não deveria. Uma busca rápida pela string 'coordinates' não deve encontrar nenhuma correspondência. Em seguida, verifique a contagem de registros. Se o seu GeoJSON de entrada tinha 847 features, seu array JSON de saída deve ter exatamente 847 objetos. Se os números não baterem, o conversor descartou features, provavelmente devido a uma entrada malformada ou ao tratamento incorreto de nulos. Agora, verifique os dados por amostragem. Compare os valores das propriedades do primeiro, do último e de um registro aleatório do meio no seu novo JSON com o arquivo GeoJSON original. Se os nomes, IDs e números estiverem todos alinhados, você pode ter certeza de que a conversão foi limpa. Para pipelines automatizados, use JSONSchema. Ferramentas como `ajv` para Node.js ou `jsonschema` para Python permitem que você verifique programaticamente se cada objeto em seu array tem as chaves e os tipos de dados que você espera. Isso é essencial para qualquer processo que é executado regularmente sobre dados que mudam. E uma última coisa: se os dados estão indo para um banco de dados, execute uma consulta `COUNT` na tabela após a importação. A contagem de linhas corresponde ao que você esperava? Esta verificação de 30 segundos é a confirmação final de que toda a cadeia — conversão e importação — funcionou perfeitamente.