Mais

Por que meu polígono GeoJSON é exibido apenas como uma linha?

Por que meu polígono GeoJSON é exibido apenas como uma linha?


Estou tentando converter um arquivo de forma simples desenhado em GIS para GeoJSON. No entanto, não está funcionando e não sei por quê.

O arquivo é convertido com QGIS (Salvar como), mas http://geojsonlint.com/ não plota a forma, nem meu aplicativo Mapbox - ele plota como uma linha.

Eu configurei o CRS para EPSG 3857.

Aqui está o GeoJSON, http://pastebin.com/93e0wWzA

Você precisa do Shapefile para descobrir isso?


Geojsonlint parece supor que GeoJSON está no sistema de coordenadas WGS84, que também é o único CRS oficialmente suportado na mais nova especificação GeoJSON (rascunho) https://tools.ietf.org/html/draft-butler-geojson-04

Converti seu GeoJSON em epsg: 4326 com ogr2ogr usando o comando

ogr2ogr -f geojson -s_srs epsg: 3857 -t_srs epsg: 4326 geojsontest2.json geojsontest.json

O novo arquivo GeoJSON é mostrado em geojsonlint.


Por que meu polígono GeoJSON é exibido apenas como uma linha? - Sistemas de Informação Geográfica

GeoJSON é um padrão comum para compartilhamento de dados geoespaciais na Internet. É leve e facilmente legível por humanos, tornando-o ideal para compartilhamento e colaboração. Com a camada de dados, você pode adicionar dados GeoJSON a um mapa do Google em apenas uma linha de código.

Cada mapa possui um objeto map.data, que atua como uma camada de dados para dados geoespaciais arbitrários, incluindo GeoJSON. Você pode carregar e exibir um arquivo GeoJSON chamando o método loadGeoJSON () do objeto de dados. O exemplo abaixo mostra como adicionar um mapa e carregar dados GeoJSON externos.

TypeScript

JavaScript

Experimente a amostra

Amostra de GeoJSON

A maioria dos exemplos nesta página usa um arquivo GeoJSON comum. Este arquivo define os seis caracteres no & # 8216Google & # 8217 como polígonos na Austrália. Sinta-se à vontade para copiar ou modificar este arquivo enquanto testa a camada de dados.

Observação: para carregar um arquivo json de outro domínio, esse domínio deve ter ativado o compartilhamento de recursos de origem cruzada.

O texto completo do arquivo pode ser visto abaixo, expandindo a pequena seta ao lado das palavras google.json.

Google.json


Removendo crsURN # 6

atualização (2014-01-08): As seções CRS originais foram devolvidas ao rascunho, mas uma forte recomendação para o uso do CRS84 padrão. O software, como o Leaftlet, que tem suporte principal apenas para CRS84, está totalmente de acordo com o rascunho.

Isso torna todas as posições GeoJSON latitude, longitude [, elevação em metros] em relação a um CRS elispoidal baseado no datum WGS84.

Sou a favor de restringir os sistemas de referência de coordenadas permitidos para objetos GeoJSON a 1: CRS84.

Acho que a segunda melhor alternativa seria restringir a 2: CRS84 ou EPGS: 3857. Mas isso significa que só seremos legais enquanto o Google Mercator for legal. E 2 é bastante arbitrário. Logo as pessoas vão querer 3.

Não gosto de "permitir qualquer CRS e deixar a ordem dos eixos seguir o CRS" porque acho que reduz a interoperabilidade ou impõe uma carga excessiva aos clientes da web (não conheço um bom serviço da web - ou realmente quero depender em um - que fornece informações de pedido de eixo para CRS URN arbitrário, e a tabela é grande demais para ser solicitada a todos os clientes).

Com todo o GeoJSON vindo em um CRS conhecido, os clientes que desejam consumir qualquer GeoJSON, mas trabalham ou renderizam em um CRS diferente, não devem ter dificuldade em encontrar o código para fazer as transformações de coordenadas. Esta é uma carga menor do que ser capaz de pesquisar a ordem do eixo para qualquer CRS URN.

(Observe que esta é uma segunda passagem em # 2.)

Sthagen comentou em 18 de maio de 2013

Contanto que removamos as partes "promessas que não cumprimos", aceito todas as propostas. Gostaria de receber conselhos dos membros da comunidade com base em seus conhecimentos sobre o que realmente está em uso hoje. Portanto, meu +1 deve ser redimensionado com o fator de estranho 0 (zero), temo -)

Sthagen comentou em 21 de maio de 2013

Por favor, cf. meu comentário sobre a discussão do patch # 10 para delegar mais 1 + 1 de mim.

Enlutado comentou em 23 de maio de 2013

Eu adoraria isso! Quanto mais simples, melhor.

Elemoine comentou em 27 de maio de 2013

Também gosto da simplicidade da abordagem. Mas acho que restringir os sistemas de coordenadas a WGS84 ou a WGS84 e EPSG: 3857 seria muito restritivo. Em particular, faria com que as pessoas que usam GeoJSON com outros sistemas de coordenadas violassem a especificação. E nós, da Camptocamp, usamos o GeoJSON para serviços da web personalizados específicos que transportam dados EPSG: 21781. (Nós nem mesmo definimos o "crs" atualmente, então podemos já violar a especificação, mas ele simplesmente funciona para nós.) Como proposto na lista de discussão, pode haver projeções conhecidas (WGS84 ou WGS84 e EPSG: 3857), e todas as outras projeções podem ser simplesmente ignoradas pelos analisadores GeoJSON. Acho que funcionaria muito bem para nós, mas a simplicidade é preservada.

Atlefren comentou em 27 de maio de 2013

No meu local de trabalho anterior, usamos GeoJSON para transportar dados do servidor para o cliente. Nossos mapas usavam zona WGS84 UTM 33N e, para evitar o uso de proj4.js, colocamos essas coordenadas em uma estrutura GeoJSON. Como @elemoine disse, também nunca definimos "crs".

A facilidade de uso é um valor chave do GeoJSON, e ter algumas (uma?) Projeção (ões) conhecida (s) e simplesmente ignorar o resto (sem erros de validação) me parece uma ótima idéia.

(São meus dois centavos pelo que valem de qualquer maneira.)

Tschaub comentou em 28 de maio de 2013

Acho que esses são exemplos de pessoas usando GeoJSON inválido em aplicativos com sucesso. Isso continuará a ser possível, desde que os analisadores não sejam mais rígidos (rejeitando coordenadas fora do intervalo de coordenadas geográficas válidas).

As mudanças propostas na especificação devem tornar mais fácil construir um analisador estrito - o motivo pelo qual o analisador OpenLayers é tolerante com seu uso é que é impossível lidar adequadamente com o membro crs atual. Mas também podemos manter o analisador tolerante e apenas passar as coordenadas diretamente para as geometrias.

A proposta de remover o crsURN encorajaria a interoperabilidade - as pessoas podem consumir dados que não tiveram participação na preparação ou podem hospedar dados para outros consumidores. Minha impressão é que as pessoas que usam GeoJSON em alt-projections não estão aproveitando este tipo de interoperabilidade.

Elemoine comentou em 28 de maio de 2013

(rejeitando coordenadas fora do intervalo de coordenadas geográficas válidas)

Ou tentando transformar os dados assumindo que são dados CRS84.

Mas também podemos manter o analisador tolerante e apenas passar as coordenadas diretamente para as geometrias.

Sim, mas outros analisadores podem ser mais restritos. Talvez haja muito pouca chance de que os analisadores rejeitem ou façam coisas ruins com nossos dados projetados.

Tschaub comentou em 13 de junho de 2013

Mais suporte para CRS84 apenas GeoJSON (na minha opinião):

Se seus pontos não estiverem aparecendo onde você esperava (por exemplo, no meio do oceano),
provavelmente você está usando uma projeção, que atualmente não é compatível.

Pramsey comentou em 13 de junho de 2013

Em um mundo de suporte de reprojeção de coordenadas do lado do cliente para raster e vetor (um mundo que realmente não existia quando o WMS estabeleceu o padrão "os clientes podem solicitar dados em um de um conjunto de projeções suportadas" padrão, nós o encontramos difícil de romper mentalmente), é perfeitamente razoável apoiar apenas um CRS bem estabelecido e esperar que o cliente faça o trabalho pesado de colocá-lo em qualquer projeção de exibição que desejar.

Nota importante: se você estiver em coordenadas esféricas (olá, CRS84), você precisa impor a orientação do anel para distinguir entre POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0)) que envolve um pouco do oceano e África e POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0)) que abrange o mundo inteiro exceto um pouco do oceano e da África (ou vice-versa, dependendo do seu padrão).

Tschaub comentou em 13 de junho de 2013

você precisa impor a orientação do anel

Acho que o que devemos fazer é dizer que a esquerda dos anéis externos está dentro e a esquerda dos anéis internos está fora, certo? Não acho que precisamos impor nada sobre a validade (um cliente pode querer transmitir uma geometria candidata a um servidor para uma verificação de validação).

Pramsey comentou 13 de junho de 2013

Sim ou vice-versa. Um pouco de pesquisa sobre as regras de orientação comum é necessária primeiro. O Shapefile usa exterior-sentido horário / interior-anti-horário, que é o reverso da regra que você articulou.

Sgillies comentou em 13 de junho de 2013

Esse segundo polígono em sua nota importante seria estritamente simples?
Não teríamos realmente que representá-lo como uma superfície global com um
buraco em forma de caixa?

Talvez um exemplo melhor seria hemisférios: faz um anel ao longo do equador
limitou o hemisfério norte ou sul?

Na quinta-feira, 13 de junho de 2013 às 14h25, Paul Ramsey [email protected]:

Em um mundo de suporte à reprojeção de coordenadas do lado do cliente para ambos
raster e vetor (um mundo que realmente não existia quando o WMS estabeleceu
os "clientes podem solicitar dados em um de um conjunto de projeções suportadas"
padrão que achamos difícil de quebrar mentalmente) é perfeitamente razoável
apoiar apenas um CRS bem estabelecido e esperar que o cliente faça o
trabalho pesado de colocá-lo em qualquer projeção de exibição que ele deseja.

Nota importante: se você estiver em coordenadas esféricas (olá, CRS84), você precisa
para impor a orientação do anel para distinguir entre POLYGON ((0 0, 0 1, 1 1,
1 0, 0 0)) que inclui um pouco do oceano e da África e POLYGON ((0 0, 1 0,
1 1, 0 1, 0 0)) que abrange o mundo inteiro exceto um pouco de oceano
e a África.


Responda a este e-mail diretamente ou visualize-o em GitHubhttps: //github.com//pull/6#issuecomment-19422624
.

Pramsey comentou em 13 de junho de 2013

A especificação de "recursos simples" torna-se diferente na esfera. Como você
representam "uma superfície global com um buraco", por exemplo? POLGON ((- 180 -90,
-180 90, 180 90, 180 -90, -180 -90), (0 0, 1 0, 1 1, 0 1, 0 0))? O primeiro
"anel" no exemplo consiste em uma linha do pólo norte ao sul
pólo e de volta ao longo da linha de dados. Nem mais nem menos "louco" do que o meu
anel orientado, OMI.

Eu não acho que você pode fugir da orientação do anel, uma vez que você está no
esfera, mas sim uma bissecção esférica deve tornar o problema mais óbvio
para o leitor leigo. Ou talvez a caixa, POLYGON ((90-45, 90 45, -90 45, -90
-45, 90 -45)). Cobre a África ou o Pacífico?

Da mesma forma para linhas, LINESTRING (100 0, -100 0) atravessa a África ou o
Pacífico? E sobre LINESTRING (100 0, 0 0, -100 0)?


Problemas ao criar um polígono lendo sua geometria

Precisa imprimir as coordenadas do polígono como uma string de texto de uma única linha em vez de várias linhas. Essa saída será usada como uma variável para gerar o polígono posteriormente no código. NOTA: A geometria no searchCursor é um polígono.

A saída atual é semelhante a esta:

Eu preciso ter a seguinte aparência:

Todas as sugestões serão apreciadas.

por JoshuaBixby

Afastando-se da questão específica, por que você deseja gerar uma geometria como texto para simplesmente regenerar a mesma geometria a partir do texto mais tarde? Você deseja descarregar / exportar para processamento por outro programa ou script?

Para despejar ou exportar geometrias, é melhor usar um dos formatos de troca de dados como JSON / GeoJSON, WKT / WKB. Você pode usar FromWKT / FromWKB ou AsShape para converter essas strings de volta em geometrias.

Ok, basicamente eu quero pegar as propriedades de geometria (X, Y) de um FC de entrada de polígono e copiá-lo em um esquema de polígono vazio do mesmo FC. Não quero usar a ferramenta de Gerenciamento de Cópias, nem Anexar porque ela não atende a todos os meus requisitos para a saída final. Em vez disso, estou tentando usar um cursor Insert para inserir as linhas. Depois de seguir a documentação da Esri sobre como usar o cursor de inserção, fui capaz de adicionar as linhas, mas o FC não tinha propriedades de geometria, ou seja, a tabela de atributos para o FC foi preenchida, mas nenhum recurso foi exibido porque as informações de geometria estavam ausentes. Depois de tentar de várias maneiras, descobri que passando as coordenadas conforme sugerido em meu primeiro post dentro de shapeArray = arcpy .Array ([pntArray]), consegui alcançar o resultado desejado. Codifiquei os valores para testá-lo e funcionou, mas não consigo formatar o texto da maneira que preciso. Talvez minha abordagem não seja a correta, então qualquer sugestão será bem-vinda.

BTW, eu não sou um programador per se, portanto, meu código não será o mais bonito, mas está fazendo o trabalho.


Temporalidade intermitente ou periódica

É muito cedo para chutar tipos multi-instantâneos e multi-intervalos fora do escopo? Eu não acho que seja. As coisas em nosso universo realmente não vêm e vão, elas apenas vão para longe e retornam.

Jyutzler comentou em 14 de abril de 2014

@sgillies Minha proposta tem Sequence (como Multipoint) e WhenCollection (como GeometryCollection), embora nenhum esteja no ISO19108 ou na Ontologia de tempo OWL. O que não está na minha proposta são intervalos regulares - que algo aconteça semanalmente ou diariamente ou a cada 17 minutos ou o que for. Acontece que não tenho um caso de uso para esse.

Kgeógrafo comentou em 14 de abril de 2014

@sgillies, all - Estou assistindo isso com grande interesse, mas completamente imerso em outro trabalho com um prazo final terei que esperar até a noite para realmente pensar.

btw, não nec. para me enviar uma cópia, conforme eu recebo esses em tempo real

@jyutzler Eu prefiro os datetimes de um intervalo a ser uma lista. eu também gosto
usando os tipos Since e until de @tschaub em vez de adicionar nulos. Amaria
para obter mais feedback das pessoas que assistem a este repositório.


Responda a este e-mail diretamente ou visualize-o no GitHub.

Sfsheath comentou em 15 de abril de 2014

Eu gostaria de ver "WhenCollections". O exemplo @jyutzler em https://github.com/jyutzler/slartime-spec/blob/master/0.0.2/README.md#3-example tem DatetimeCollection. Vejo isso como o caminho para a implementação de "Início mais cedo possível" e "Data de início mais recente possível" como um item de intervalo em uma coleção, com um intervalo correspondente para a data de término.

É uma longa maneira de dizer que se os intervalos forem muito simples (apenas determinados / bem conhecidos horários de início e término são possíveis), então eu terminaria tendo que despejar minha incerteza no item "propriedades"? E eu tenho muita incerteza.

Kgeógrafo comentou em 15 de abril de 2014

fwiw, em Topotime (https://github.com/ComputingPlace/Topotime) modelamos Períodos em PeriodCollections. Um período é qualquer coisa temporal (evento, período histórico, tempo de vida), o equivalente temporal dos recursos. Os pontos têm tSpans (o mesmo que “quando”: [<], <>]). Eles não têm uma "geometria": [] mas posso adivinhar.

Ambos os períodos e feições têm contexto espacial e temporal e são, em certo sentido, perspectivas.

@sgillies - Temos “when” s de várias partes (tSpans), que são listas de pares de objetos (ou triplos ou quádruplos). Nossos analisadores reconhecem essas estruturas sem muitos problemas. Também tratamos o tempo cíclico, como um início / fim e um valor de “cduração” (3d = 3 dias, etc.). Os casos de uso que consideramos incluem estações do ano, como “os verões da juventude dela” ou “na infância ele ajudou na colheita das uvas em Fiesole”. A propósito, esses dados são típicos de um projeto aqui.

@jyutzler Isso sobrecarrega o “quando” com propriedades, mas descobrimos que permitir qualquer combinação de chaves start / last-start, first-end / end para expressões de tempo era um requisito essencial. O s / ls, ee / e é um padrão bastante popular a propósito - apareceu em Simile Timeline e em outros lugares, e torna todos os tipos de cálculos de probabilidade interessantes possíveis.

Haverá mais latas de minhocas, temo. Acho que a questão é onde traçar os limites e quais casos de uso acomodar. Confesso estar mais interessado em lidar com os casos de uso históricos imprecisos, mas realmente quero que o Topotime seja compatível com qualquer GeoJSON-Time. Os dados para casos de uso serão úteis. Temos alguns no repositório Topotime e procurando mais. Trajetórias, mudança de fronteiras e períodos / eras históricos parecem alguns dos mais úteis.

Tschaub comentou em 15 de abril de 2014

há uma forte necessidade de algo para lidar com a incerteza

A incerteza no tempo é mais importante do que a incerteza na posição?

Espero que qualquer extensão esteja alinhada com o núcleo em termos de simplicidade.

Kgeógrafo comentou em 15 de abril de 2014

@tschaub Eu concordo que a incerteza espacial e temporal são de igual interesse para modelagem de características geográficas. Isso sugere duas etapas, talvez tarefas separadas: primeiro, adicionar "quando" a "onde" ("geometria") em um nível semelhante de simplicidade. Os intérpretes GeoJSON existentes simplesmente ignorariam "quando". A etapa seguinte seria desenvolver modelos estendidos alternativos de objetos incertos "quando" e "onde". Uma tarefa nada trivial, como se costuma dizer. Topotime é a primeira tentativa. Os intérpretes GeoJSON existentes não lidariam com isso de forma alguma. Talvez isso se torne GeoJSON-LD ou HistJSON, ou.

Parece haver algum consenso aqui, o primeiro seria listas de termos ISO8601 e pares de termos, digitados como "Instantâneo" ou "Intervalo". Um aparte - permitir um nulo para um intervalo parece mais ou menos equivalente a permitir um LineString com um ponto - o que um analisador pode fazer com isso, visual ou computacionalmente? Parece relevante para mim que Simile Timeline tinha objetos de tempo quádruplo algum tempo atrás. Eu prefiro isso como uma linha de base, embora torne as listas em objetos chave: valor.

O software de mapeamento renderiza pontos, linhas e polígonos com listas de pares de coordenadas e uma designação de tipo. Parece razoável que o software de linha do tempo geralmente deva lidar com listas (ou objetos) de termos ISO8601 com tipos semelhantes. A conversão de e para ISO8601 será dolorosa em alguns casos, como com WGS84 / UTM, etc.

Na segunda etapa (worm-can?), Parece-me que vários problemas são comuns a ambos. Existem alguns tipos de incerteza, incluindo escala e extensão. Em relação à escala, os dados podem estar em qualquer escala e desiguais em um conjunto de dados, um local de nascimento pode ser um país, província, região, cidade, endereço. E um único conjunto de dados pode ter uma combinação. A hora do nascimento pode ser um século, década, ano, dia, etc. A extensão difusa é um assunto para outro dia ou tópico.

Jyutzler comentou em 15 de abril de 2014

@kgeographer Embora meus clientes também tenham uma necessidade definitiva de suportar a incerteza, isso se complica rapidamente. Existem muitos graus de liberdade. Uma das coisas que gosto no OGC GeoPackage é que ele não especifica metadados em excesso. Existe uma tabela reservada para esse fim, mas cabe ao implementador se e como utilizá-la. Eu recomendo fazer algo semelhante aqui - digamos que uma geometria ou quando PODE ter um membro de incerteza que espelhe as coordenadas ou posições temporais. No entanto, deixe a implementação sem especificação.

Eu gosto da ideia de @sfsheath de usar um WhenCollection para capturar o início / início mais recente e o fim / fim mais antigo, mas proponho organizá-lo de maneira diferente. Talvez, por convenção, a primeira entrada possa ser o intervalo de início / fim ("melhor suposição") e a segunda seja ls / ee. Um aplicativo simples prestaria atenção apenas ao primeiro elemento do array, mas o seu entenderia os dois.

Não estou interessado em incluir elementos cíclicos nesta especificação. O trabalho da minha empresa também tem aplicação para essas coisas, mas estamos buscando o equivalente temporal ao perfil de recursos simples. Como alguém disse na semana passada, o GML ainda está lá e é tão bom quanto antes.

MapStory pode ser uma boa fonte de dados de amostra.

Sgillies comentou em 15 de abril de 2014

GeoJSON não faz distinção entre imprecisão e imprecisão em coordenadas espaciais, então quando um conjunto de dados contém coordenadas como [-105, 40], isso pode significar que as geometrias são deliberadamente ajustadas a uma grade de um grau ou o produtor pode significar que o recurso está em algum lugar próximo a esse ponto. Contamos com os editores dos dados para explicar fora da banda aos usuários o que está acontecendo. Se funciona o tempo todo ou não pode ser debatido, mas acho que uma especificação de tempo GeoJSON que fez o mesmo pode ter sucesso.

Por "fazer o mesmo", quero dizer que os produtores usem <"type": "Since", "datetimes": "1000"> para significar exatamente desde 1 de janeiro de 1000 CE (embora 1000-01-01 seja uma maneira muito melhor de expressar isso) ou desde aproximadamente 1000 CE. A semântica exata teria que ser transmitida em metadados ou acordos de serviço ou contextos JSON-LD.

O Formato de Data / Hora Estendido (EDTF) 1.0 da Biblioteca do Congresso é interessante para mim porque ele distingue entre imprecisão e imprecisão, mas não há muito suporte de software para ele. O tempo GeoJSON que estamos discutindo aqui não o excluiria, pelo menos.

@kgeographer Eu gostaria que os analisadores transformassem <"type": "Interval", "datetimes": ["2006", "2014"]> em uma barra de 8 anos em uma linha do tempo. Isso é informação suficiente, sim? Eu não entendo o que você quer dizer com tempo quádruplo.


The Skorasaurus & # 8211 The Blog of Will Skora

Como aprendi uma terceira maneira de vincular a arquivos GEOJSON externos em mapbox.js e leaflet.

Você tem um arquivo geojson e deseja carregá-lo em um folheto?

Basta apenas duas linhas.

var featLayer = L.mapbox.featureLayer (). addTo (mizzap)
featLayer.loadURL ('dtparking.geojson')

A primeira linha inicializa a camada de feição em seu mapa.
No meu exemplo, mizzap é a variável do objeto que criei para inicializar meu mapa. (Odeio que & # 8216map & # 8217 seja usado o tempo todo como uma variável), você não & # 8217t sabe a que & # 8217s ele está se referindo para). Mizzap pode se referir a um objeto direcionado por l.mapbox.map ou l.map :)

A segunda linha carrega meu arquivo geojson que está no mesmo diretório do meu arquivo html. Agora posso usá-lo mais tarde simplesmente como & # 8216featLayer & # 8217.
.

Eu o chamei vagamente de & # 8216a 3ª via & # 8217 porque Lyzi Diamond descreveu 2 outras maneiras ((1) e (2)) de carregar arquivos Geojson e espero que esta postagem complemente suas postagens ..

Por que usei essa forma para carregar meu geojson (e você também pode)?

Agora, como aprendi a usar essa terceira maneira foi porque eu queria carregar e estilizar polígonos em leaflet ou mapbox.js com base nas propriedades do arquivo geojson E não queria incluir propriedades de estilo no arquivo geojson.

Além disso, ainda estou aprendendo javascript e admito que fiquei um pouco frustrado (e surpreso) ao encontrar muitos exemplos online de como carregar geojson e estilizá-lo, mas nenhum deles se encaixa no meu caso de uso.

Eles estavam carregando o GEOJSON no próprio navegador e não em um arquivo externo.
https://www.mapbox.com/mapbox.js/example/v1.0.0/geojson-simplestyle/

OU, em alguns casos, os autores fizeram uma combinação dos dois.

Eu admito, eu não estava familiarizado com AJAX e não queria tocá-lo. Olhando para trás, eu provavelmente estava muito intimidado por isso e ao mesmo tempo eu estava lendo a documentação do mapbox.js e pensei: & # 8216wow, usar o Mapbox.js vai me poupar algum tempo e não ter que usar o plugin Leaflet-Ajax,
Eu tinha usado mapbox.js algumas vezes antes e sabia que inclui a funcionalidade de leaflet, também tem muitos outros métodos e classes que são projetados para adicionar mais funcionalidade e oferece integração mais fácil com blocos de mapa de mapbox.com

Eu disse a mim mesmo: & # 8221Eu poderia simplesmente carregar meu arquivo geojson usando loadurl (), e o mapbox terá um exemplo para me mostrar! & # 8221

Aprendo código lendo exemplos e modificando-os.

Abaixo, eu passo por vários commits onde aprendi a usar loadURL (), carregar e estilizar todos os polígonos em um arquivo geojson, e então apontar meus erros ao longo do caminho onde usei o código errado.
=======
Comprometa um:

Tentei usar a opção de estilo (de l.geojson) e uma opção para personalizar o estilo do arquivo geojson conforme mostrado no folheto & # 8217s página de exemplo geojson.
que tem o exemplo a seguir.
===
L.geoJson (afirma, <
estilo: função (recurso) <
switch (feature.properties.party) <
case & # 8216Republican & # 8217: return
case & # 8216Democrat & # 8217: return
>
>
>). addTo (mapa)

Eu adaptei neste commit (no github) e como html aqui
Infelizmente, isso não funcionou & # 8230
o console exibido:

& # 8220 Erro não detectado: objeto GeoJSON inválido. mapbox.js: 3
s.extend.geometryToLayer mapbox.js: 3
s.GeoJSON.s.FeatureGroup.extend.addData mapbox.js: 3
s.GeoJSON.s.FeatureGroup.extend.initialize mapbox.js: 3
e mapbox.js: 1
s.geoJson mapbox.js: 3
(função anônima) index.html: 36 & # 8243

Eu pensei .. & # 8221
talvez eu possa & # 8217t estilizar dentro de loadURL & # 8230 talvez tenha que usar l.geojson
e ligar novamente? & # 8221 & # 8221

=======
Então, eu ainda estava confuso e continuando a encontrar exemplos do que estava procurando, eventualmente perguntei a Bill Morris, um usuário de leaflet / mapbox.js / tilemill de longa data.

Usei 2 funções para definir o estilo dos polígonos, mas nenhum estilo estava acontecendo. Ainda perplexo.
Eu queria ter certeza de que minha 2ª função (para determinar qual cor está sendo usada no estilo com base na propriedade de estacionamento) estava sendo chamada / executada. então, usei primeiro o método show dentro da função getColor.

Não houve erro no console javascript ou nas informações para descobrir por que as funções estavam sendo chamadas, pensei.

Tentei novamente com a substituição de show por console.log e o mesmo resultado: os polígonos seriam exibidos, mas
Não consegui descobrir por que minha função getColor não estava chamando a propriedade em meu arquivo geojson.

Ao longo do dia, encontrei mais alguns exemplos (de maptime e mapbox & # 8217s store locator & # 8211 que eram semelhantes ao que eu estava procurando & # 8211 personalizando um recurso com base nas propriedades do recurso & # 8217s
(para referência, um recurso é um objeto geográfico que representa um ponto ou um polígono) & # 8211, mas também não era para personalizar polígonos, mas eles ofereceram algumas idéias de outras coisas que tentei, sem sucesso.

Eu me perguntei se devo primeiro usar o método loadurl e, em seguida, usar a opção / método de filtro para não carregar nenhum estilo e, em seguida, usar outra função para adicionar os dados novamente e estilizá-los? & # 8221

Então, & lta href = & quothttp: //twitter.com/geografa"Rafa Gutierrez do MapBox me ajudou e me deu um exemplo de aplicação de um estilo a todos os polígonos em um arquivo geojson (código).

Graças ao exemplo do Rafa & # 8217s e aos documentos de leitura pela décima quinta vez, lendo o
Finalmente descobri alguns conceitos REALMENTE IMPORTANTES e aprendi onde errei:

Eu estava usando o & # 8216style & # 8217 como um método em meus commits anteriores. Novamente, ISTO ESTÁ ERRADO!
Apenas olhando para o seu exemplo,

o estilo não é um método, mas uma OPÇÃO no folheto.

L.mapbox.featureLayer () é baseado e & # 8216extends & # 8217 no l.featureGroup. Você pode usar mais alguns métodos listados em L.mapbox.featureLayer (), bem como todos os métodos que estão em l.featureGroup com l.mapbox.featureLayer.

Não percebi imediatamente que poderia usar o método setStyle para estilizar meu polígono, já que meu objeto (que chamei de & # 8216featLayer & # 8217 em todos os meus exemplos) foi construído a partir de l.mapbox.featureLayer porque todos os exemplos que eu tinha encontrados online (na época) construíram seu objeto usando l.geojson e usaram a opção de estilo de l.geojson.

Mas, agora, como faço para estilizar com base nas propriedades do recurso no arquivo geojson, eu me perguntei!
A seguir, a parte 2 de como aprendi isso.


Por que meu polígono GeoJSON é exibido apenas como uma linha? - Sistemas de Informação Geográfica

Citação sugerida: Dixson, Nadia Milliken, Genevieve Mukunda, Keshav Murray, Reina Starry, Rachel. (2019). GeoJSON Data Curation Primer. Repositório GitHub da Rede de Curadoria de Dados.

Este trabalho foi criado como parte do Workshop “Specialized Data Curation” # 2 realizado na Johns Hopkins University em Baltimore, MD em 17-18 de abril de 2019. Esses workshops foram generosamente financiados pelo Institute of Museum and Library Services # RE- 85-18-0040-18.

GeoJSON é um formato de intercâmbio de dados geoespaciais para codificação de estruturas de dados geográficos vetoriais, como geometrias de ponto, linha e polígono, bem como seus atributos não espaciais. Como o nome indica, é baseado em JavaScript Object Notation (JSON) e continua o formato JSON leve, de texto simples e legível por máquina, tornando-o um tipo de arquivo versátil especialmente para mapeamento e aplicativos baseados na web. O formato GeoJSON define vários tipos de objetos JSON para representar a estrutura e o layout de recursos geográficos, suas propriedades e sua área. O GeoJSON suporta um único sistema de referência de coordenadas geográficas, o World Geodetic System 1984 (WGS84), em unidades de graus decimais normalmente até 7 casas decimais de precisão.

No GeoJSON, existem sete "tipos de geometria" com distinção entre maiúsculas e minúsculas, conforme definido na Especificação de implementação de recursos simples do OpenGIS para SQL: "Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon" e “GeometryCollection”. Essas geometrias simples consistem em um “tipo” e uma coleção de coordenadas listadas como longitude, latitude, elevação, sendo a elevação opcional. Os sete tipos de geometria acima, junto com os tipos sensíveis a maiúsculas e minúsculas “Feature” e “FeatureCollection”, constituem os nove “tipos GeoJSON”. Os tipos “Feature” e FeatureCollection ”são geometrias junto com suas propriedades descritivas.

Existem várias vantagens no GeoJSON que o tornam uma boa opção para codificar dados geográficos. GeoJSON é baseado em texto, editável em um editor de texto, usa palavras comuns em inglês, utiliza uma estrutura de dados muito simples e é fácil para humanos e máquinas lerem. Além disso, o GeoJSON é um único arquivo, ao contrário dos formatos de dados geoespaciais compactados. Por sua simplicidade e versatilidade, é um formato ideal tanto para consumir quanto para produzir dados geoespaciais. Algumas alternativas ao GeoJSON que podem ser encontradas incluem Shapefile, KML / KMZ, GML e CSV.

Os curadores também podem encontrar o formato de arquivo EsriJSON. Este é um padrão ESRI proprietário para codificação de dados espaciais em texto estruturado JSON. É definido como a opção de conversão padrão quando um conjunto de dados espacial é transformado de outro formato vetorial para JSON usando o software ArcMap e ArcGIS Pro. Embora o formato e a sintaxe sejam muito semelhantes aos do GeoJSON, existem algumas diferenças importantes, principalmente no membro “tipo”. Uma explicação de como identificar um arquivo EsriJSON é fornecida na seção “Recomendações para transformação de arquivo”. Se um arquivo EsriJSON for enviado para curadoria, considere pedir ao remetente o conjunto de dados em um formato diferente.

Cada objeto GeoJSON contém um membro denominado “tipo”, que deve ser um dos nove tipos GeoJSON mencionados anteriormente. Quase todos os objetos de geometria também contêm um membro denominado "coordenadas" listadas em ordem de longitude, latitude e (opcional) elevação. A elevação é expressa como a altura em metros acima ou abaixo do elipsóide de referência WGS84 usado para aproximar a Terra. Aqui estão os sete objetos de geometria simples que podem ser especificados no GeoJSON:

  • Apontar: Para o tipo "Ponto", o membro de coordenadas é uma única posição. Por exemplo, uma posição com longitude -122,918958, latitude 49,279778 e elevação 340 em WGS84 é especificada como:

  • LineString: Para o tipo "LineString", o membro de coordenadas é uma matriz de duas ou mais posições. Esta geometria consiste em segmentos de linha conectados:

  • Polígono: Para o tipo "Polígono", o membro de coordenadas deve ser uma matriz de uma ou mais matrizes de coordenadas de anel linear, onde cada matriz tem pelo menos quatro pontos e o primeiro e o último pontos devem ser iguais. Esses anéis lineares definem os limites do polígono. Para polígonos com mais de um desses anéis lineares, o primeiro deve ser o anel externo e os outros devem ser os anéis internos. O anel externo é o limite do polígono e os anéis internos (se houver) são os limites dos orifícios dentro do polígono. Aqui está um exemplo de um polígono de quatro lados com um orifício triangular dentro dele:

MultiPoint: Para o tipo "MultiPonto", o membro de coordenadas é uma matriz de posições. Esta geometria especifica uma coleção de pontos.

MultiLineString: For type "MultiLineString", the coordinates member is an array of LineString coordinate arrays. This geometry specifies a collection of LineStrings.

MultiPolygon: For type "MultiPolygon", the coordinates member is an array of Polygon coordinate arrays. This geometry specifies a collection of Polygons.

GeometryCollection: A GeoJSON object with type "GeometryCollection" is a heterogeneous collection of point, line, and polygon geometries grouped together. A GeometryCollection has a member with the name "geometries". The value of "geometries" is an array. Each element of this array is a GeoJSON Geometry object with its own coordinates. Here is an example of a GeometryCollection that contains a MultiPoint and a Polygon:

The last two types specified in GeoJSON describe ​Features​, which are a combination of simple geometry and their descriptive properties.

Característica: An object with type "Feature" has a member with the name "geometry". This “geometry” member must be exactly one of the seven geometry objects defined above, or a null value. A Feature object also contains a member named “properties”, whose value can be any JSON object (for example, “name”, “marker-size”, “marker-color”, etc.)

FeatureCollection: Feature Collection​: An object with type "FeatureCollection" has a member with the name "features". This “features” member is a JSON array of Feature objects, which were just described above.

Existing GeoJSON Documentation

RFC 7946 is the official documentation for GeoJSON and is maintained by the Internet Engineering Task Force (IETF). The current documentation, which was put forward by the GeoJSON Working Group in 2016 and replaced the original documentation 2008 (GJ2008), has undergone public review, is the consensus of the IETF community, and was approved for publication by the Internet Engineering Steering Group (IESG). The documentation provides specifications for GeoJSON, including syntax for GeoJSON objects.

The GeoJSON format is often a download option in geospatial data repositories, administrative open data portals, and when using certain APIs. While not an exhaustive list, examples of GeoJSON Datasets that are openly available include:


Analyzing and improving the results

The tools simplify lines and polygon outlines one at a time the longer a line or outline runs, the more pleasing the result will be. Keep this in mind when you collect or construct the source data. Wherever possible, position endpoints of lines on long, smooth sections of lines, rather than at severely angled sections.

Topology problems in the input feature class—features that overlap other features without an intersection point—are flagged in a field in the input feature class. This field is named SimPgnFlag in the case of Simplify Polygon and SimLinFlag in the case of Simplify Line . A value of 1 in these fields indicates that a topological error was present for that feature in the input feature class.

For reference, an ID field corresponding to the object ID of the input feature is also added to the output feature class. The field is called InPoly_FID in the case of the Simplify Polygon tool, or InLine_FID in the case of the Simplify Line tool. In addition, MinSimpTol and MaxSimpTol fields are added to the output to store the tolerance that was used.

A derived point output feature class is created of point features that represent either the endpoints of lines simplified to zero-length lines in the case of Simplify Line ), or polygons simplified to zero-area polygons or to a polygon smaller than the minimum area as defined by the Minimum Area parameter in the case of Simplify Polygon , or possibly both in the case of Simplify Shared Edges . A simplified polygon that has been reduced to empty geometry or to a polygon smaller than the minimum area as defined by the Minimum Area parameter.


The 180th Meridian

The 180th meridian is one of the shames of geospatial technology. The story goes that given the rules of

  • LineStrings and Polygons are represented as collections of positions
  • Positions should be within -180° and 180° longitude and -90° and 90° latitude

It is simply impossible to tell the difference between a line that goes from -179° around the world to 179°, or one that just hops over the 180th meridian. That’s one problem with Cartesian coordinates on a sphere.

A popular way to represent these lines is to break the second rule: a line that crosses the 180th meridian would be represented as 179° to 181° instead of 179° to -179°. By some definitions, this is invalid: 181° is out of the range of the EPSG:4326 datum. But most modern map technology tolerates this kind of data and helpfully draws the image you’d expect.

There’s a clear need for a cleverer and cleaner solution to the 180th meridian problem: both at zero and at the dateline, even the most sophisticated tools exhibit eccentricities and bugs. The most promising option in my opinion is delta-encoding, like in TopoJSON and Geobuf. Instead of representing coordinate pairs as in their full form, delta-encoded geodata will save a line as a series of directional steps: starting from -73, 38 , it would say to move by -3, -3 , instead of specifying that the next coordinate is -76, 35 . Perhaps this gives a clear way to differentiate meridian wrapping from world-sized jumps without breaking the rules of a datum. But that’s just a guess.


Понимание кода

В этой части руководства представлено объяснение наиболее важных компонентов приложения Polígonos, помогающее понять принципы создания подобного приложения.

Проверка манифеста Android

Обратите внимание на следующие элементы в файле AndroidManifest.xml своего приложения:

Добавьте элемент meta-data , чтобы указать версию сервисов Google Play, с которой было скомпилировано приложение.

Добавьте элемент meta-data с указанием своего ключа API. В примере, приведенном в этом руководстве, значение ключа API сопоставляется с определенной ранее переменной сборки ( MAPS_API_KEY ). Во время сборки приложения плагин Secrets Gradle Plugin для Android делает ключи в вашем файле local.properties доступными, используя переменные манифеста.

В файле build.gradle приведенная ниже строка осуществляет передачу ключа API в манифест Android.

Ниже приведен пример манифеста полностью:

Добавление карты

Отобразите карту, используя Maps SDK для Android.

Добавьте элемент <fragment> в файл макета для объекта activity, activity_maps.xml . Этот элемент указывает, что фрагмент SupportMapFragment должен выступать в роли контейнера для карты и предоставить доступ к объекту GoogleMap . В учебном проекте используется версия библиотеки поддержки Android для фрагмента карты. Это обеспечивает обратную совместимость с более ранними версиями фреймворка Android.

В методе onCreate() своего объекта activity установите файл макета как представление контента. Получите дескриптор для фрагмента карты путем вызова метода FragmentManager.findFragmentById() . Затем используйте метод getMapAsync() , чтобы зарегистрировать обратный вызов карты:

Kotlin

Реализуйте интерфейс OnMapReadyCallback и переопределите метод onMapReady() . API выполняет этот обратный вызов, когда объект GoogleMap доступен (это позволяет вам добавлять объекты на карту и настраивать их в своем приложении).

Kotlin

Чтобы начертить линию на карте, используйте ломаную линию

Ломаная линия (объект Polyline ) – это последовательность отрезков прямых, с помощью которых можно нарисовать любую фигуру. Как правило, ломаные линии используются для нанесения на карту маршрутов.

Создайте объект PolylineOptions и добавьте к нему точки. Каждая точка соответствует местоположению на карте, которое вы определяете с помощью объекта LatLng с указанием широты и долготы. Ниже приведен пример кода для ломаной линии с шестью точками.

Чтобы добавить ломаную линию на карту, вызовите метод GoogleMap.addPolyline() .

Kotlin

Задайте для параметра clickable значение true , если вы хотите, чтобы для ломаной линии обрабатывались события кликов. Дополнительная информация об обработке событий будет приведена далее в этом руководстве.

Сохранение произвольных данных с помощью ломаной линии

Вы можете сохранять объекты с произвольными данными с помощью ломаных линий и других геометрических фигур.

Чтобы сохранить объект данных с помощью ломаной линии, вызовите метод Polyline.setTag() . Код ниже определяет произвольный тег ( A ), который указывает тип ломаной линии.

Kotlin

Извлеките данные с помощью метода Polyline.getTag() , как показано в следующем разделе.

Собственный стиль ломаной линии

В объекте PolylineOptions вы можете задавать различные свойства стиля, например, цвет линии, ее толщину и начертание, тип соединения, вид начальной и конечной точек. Если какое-либо свойство не определено, API будет использовать вариант по умолчанию.

Приведенный ниже код задает круглый элемент для конца линии, а также другой круглый элемент для ее начала. Это зависит от типа линии, который представляет собой произвольное свойство в объекте данных для нее. В этом примере также заданы толщина линии, ее цвет и тип соединений.

Kotlin

Приведенный ниже код задает пользовательскую битовую карту для ломаной линии типа А, а также ориентировочную толщину линии, равную 10 пикселям. API масштабирует битовую карту с учетом ориентировочной толщины линии. Укажите толщину линии, которую вы использовали при создании битовой карты в исходном размере изображения. Совет: откройте битовую карту в графическом редакторе в масштабе 100 % и определите нужную толщину линии для этого изображения.

Обработка событий кликов для ломаной линии

Чтобы сделать ломаную линию кликабельной, вызовите метод Polyline.setClickable() . По умолчанию ломаные линии не интерактивны, а приложение не получает уведомления, если пользователь нажимает на линию.

Реализуйте интерфейс OnPolylineClickListener и вызовите метод GoogleMap.setOnPolylineClickListener() , чтобы добавить прослушиватель на карту:

Kotlin

Переопределите метод обратного вызова onPolylineClick() . Пример кода, где вид ломаной линии меняется со сплошного на пунктирный или обратно каждый раз, когда пользователь нажимает на нее:

Kotlin

Представление областей на карте с помощью многоугольников

Многоугольник ( Polygon ) – это фигура, состоящая из упорядоченной последовательности координат, как и ломаная линия ( Polyline ). Разница только в том, что многоугольник – закрытая фигура, которую можно заполнить заливкой.

Создайте объект PolygonOptions и добавьте в него точки. Каждая точка соответствует местоположению на карте, которое вы определяете с помощью объекта LatLng с указанием широты и долготы. Ниже приведен пример кода для многоугольника из четырех точек.

Чтобы сделать многоугольник кликабельным, вызовите метод Polygon.setClickable() . По умолчанию многоугольники не интерактивны, а приложение не получает уведомления, если пользователь нажимает на фигуру. События кликов для многоугольников обрабатываются так же, как и для ломаных линий. См. выше.

Чтобы добавить многоугольник на карту, вызовите GoogleMap.addPolygon() .

Чтобы сохранить объект данных для многоугольника, вызовите метод Polygon.setTag() . Приведенный ниже код определяет произвольный тип ( alpha ) для многоугольника.

Kotlin

Собственный стиль многоугольника

В объекте PolygonOptions вы можете задавать различные свойства стиля, например, цвет линии, ее толщину и начертание, тип соединения и цвет заливки. Если какое-либо свойство не определено, API будет использовать вариант по умолчанию.

Приведенный ниже код задает определенные цвета и начертание линий в зависимости от типа многоугольника – произвольного свойства в объекте данных для фигуры.

Kotlin

Подробнее о начертании, а также других вариантах персонализации фигур…


Assista o vídeo: GeoJSON and GitHub