"Você precisará escrever um conector". Era o que as pessoas costumavam dizer quando surgia a necessidade de construir uma integração entre ArcGIS e outro sistema. Hoje em dia, no entanto, o cenário da tecnologia da informação amadureceu e a forma como os aplicativos se comunicam entre si se concentrou em alguns padrões que todos (que querem se manter relevantes) usam. ArcGIS Data Interoperability atua e fala nesse espaço.<\/P>
Um claro vencedor é chamado REST<\/A>, e como não sou cientista da computação, não vou entrar no que você pode ler por conta própria, tudo o que me importa é que praticamente tudo na web pode enviar e receber dados de uma forma que eu posso usar facilmente (principalmente JSON, com alguns resistentes ainda usando XML e alguns esticando a usabilidade com cargas úteis de protocolo buffer, mas vou ficar de olho neles para você, acho que isso vai passar 😉<\/span>.) com ArcGIS Data Interoperability.<\/P>Preciso adicionar um gráfico antes que os motores de busca fiquem entediados comigo e eu não seja indexado. Aqui está um workspace (StubOutAPIJSONReading.fmw<\/STRONG> no download do post) que usei para explorar inicialmente uma API (detalhes a seguir):<\/P>Explorando uma API<\/span><\/span><\/P>Minha API de exemplo é publicada pelas boas pessoas da Clarity Movement.<\/A><\/P>A Clarity foi fundada em 2014 para enfrentar a crise global da poluição do ar e agora fornece monitoramento de qualidade do ar econômico, escalável e confiável para clientes em mais de 60 países ao redor do mundo. A solução da Clarity permite que governos e comunidades coletem dados de qualidade do ar com resolução mais alta ao suplementar monitores regulatórios existentes com redes densas de sensores de qualidade do ar continuamente calibrados.<\/P>Gosto do endpoint Measurements<\/A> da Clarity como um bom exemplo do padrão mais comum que você encontrará, ou seja, lidar com dados JSON<\/STRONG> retornados de uma chamada HTTP<\/STRONG>. Antes de você entrar em pânico sobre coisas como protocolos de transporte e parsing JSON, relaxe! Data Interoperability cuida de tudo para você, o que é ótimo porque caso contrário você teria que ler coisas assim:<\/P> <\/P> <\/P> <\/P> <\/P>{ "_id": "6137a995cd42fd51fcda7083", "device": "609935dcc9348052e0c5d917", "deviceCode": "AY989QV6", "time": "2021-09-07T17:00:00.000Z", "location": { "coordinates": [ -120.90439519586954, 36.01958888490562 ], "type": "Point" }, "recId": "averaged:AY989QV6:hour:2021-09-07T18:00:00", "characteristics": { "relHumid": { "value": 30.428397178649904, "weight": 4, "raw": 30.428397178649904 }, "temperature": { "value": 30.882064819335939, "weight": 4, "raw": 30.882064819335939 }, "pm2_5ConcNum": { "value": 24.072547912597658, "weight": 4, "raw": 24.072547912597658 }, "pm2_5ConcMass": { "value": 13.646130166709775, "weight": 4, "raw": 21.126213550567628, "calibratedValue": 13.646130166709775, "epaNowCast": 15.097605519225573 }, "pm1ConcNum": { "value": 22.670581817626954, "weight": 4, "raw": 22.670581817626954 }, "pm1ConcMass": { "value": 12.186892986297608, "weight": 4, "raw": 12.186892986297608 }, "pm10ConcNum": { value: 24.33531427383423, weight: 4, raw: 24.33531427383423 }, pm10ConcMass: { value: 28.42475652694702, weight: 4, raw: 28.42475652694702 }, no2Conc: { value: -6.413380280137062, weight: 4, raw: -6.413380280137062 }, pm2_5ConcMass_24HourRollingMean: { value: 15.003665288163619, weight: 88, raw: 27.317325342785229, calibratedValue: 15.003665288163619 }, pm2_5ConcNum_24HourRollingMean: { value: 26.923120065168903, weight: 88, raw: 26.923120065168903 }, pm10ConcMass_24HourRollingMean: { value: 37.67677915096283, weight: 88, raw: 37.67677915096283 }, pm10ConcNum_24HourRollingMean: { value: 27.273549459197306, weight: 88, raw: 27.273549459197306 } }, average: "hour"}<\/code><\/pre> <\/P> <\/P> <\/P> <\/P>A tarefa é transformar esses dados em um serviço de feição hospedado e automatizar a manutenção do serviço.<\/STRONG><\/P>Uma vantagem de ter um background em GIS é que você provavelmente conhece um pouco de Python, e cargas JSON como a acima parecem exatamente dicionários e listas Python. Você só precisa aprender alguns truques antes de poder lidar com praticamente qualquer API REST.<\/P>Truque #1: Usando HTTPCaller.<\/STRONG><\/P>HTTPCaller<\/span><\/span><\/P> <\/P> HTTPCaller<\/A> permite simplesmente preencher um formulário para fazer uma chamada web e receber uma resposta (JSON neste caso). Primeiro você deve ler sua documentação da API<\/A> e determinar os parâmetros obrigatórios, além dos opcionais que desejar, e se deve usar o método GET<\/STRONG> ou POST<\/STRONG>. GET geralmente é para URLs mais curtas, POST suporta URLs mais longas e também uploads fornecidos no Body. Outro aspecto é a autenticação. Muitas APIs exigem uma chave API (como você vê aqui) ou um token. Normalmente as chaves não expiram e tokens sim, além disso tokens requerem uma etapa de geração (que pode ser feita separadamente via HTTP ou via OAuth2 em uma conexão web<\/A><\/strong>) configurada para sua conta). Meu exemplo requer uma chave. Minha chamada solicita um array JSON com 10 medições de qualidade do ar e retorna isso em um atributo chamado _response_body<\/strong>.<\//p>Truque #2: Desempacotando JSONEstou indo ingerir números arbitrários de medições de qualidade do ar mas primeiro preciso descobrir como extrair dados do JSON. Solicitei 10 medições então o JSON retornado será um array. Cada medição no array terá o mesmo esquema usado pelos campos das minhas feições - o JSON acima é uma feição medição. Preciso descobrir como extrair valores dos campos. A maneira mais simples é escrever o JSON de uma feição do array em um arquivo e usar a capacidade data-aware do e permitir construir consultas sem codificar nenhuma consulta JSON.<\/p>p>Se eu temporariamente<\/sTrong> setar o JSONExtractor para ler de um arquivo JSON então obtenho um seletor prático para construir minhas consultas JSON. Depois posso copiar-colar o JSONExtractor em uma ferramenta de produção, configurá-lo para ler do atributo JSON da feição recebida e ele extrairá e exporá todos os valores disponíveis dos campos. Quão fácil é isso!<\/p>p>eis meu JSONExtractor enquanto estou lendo de um arquivo e construindo minhas consultas:<\/p>p>spanspan class=lia-inline-image-display-wrapper lia-image-align-center image-alt=JSONExtractor style=width:264px; >JSONExtractor<\/spanspan > <\/p>p>p> <\/p>p>p>Agora é ladeira abaixo até criar e manter meu serviço de feição.<\/p>p>p>Clarity2GDB.fmw<\/p> usa a exploração JSON feita acima para escrever uma classe de feição na geodatabase principal do meu projeto Pro - há alguma renomeação dos atributos feita, e claro eles recebem seus tipos desejados ao escrever.<\/p>p>spanspan class=lia-inline-image-display-wrapper lia-image-align-center image-alt=Clarity2GDB style=width:400px; >Clarity2GDB<\/spanspan > <\/p>p>p>Depois, após criar meu serviço de feição a partir da classe na geodatabase, posso reciclar o trabalho para manter o serviço com RefreshClarityService.fmw<\/strong>, que difere apenas na etapa do escritor. Você notará que apenas as feições alteradas são escritas no serviço alvo, o workspace tem um parâmetro que define o intervalo histórico para minhas feições, feições no serviço mais velho que isso é descartado.<\/P>RefreshClarityService<\/span><\/span><\/P> Esta ferramenta final pode ser agendada ou executada sob demanda.<\/P>É isso! Eu conquistei as complexidades da integração web e tenho um feature service que posso usar para alimentar meus mapas, apps e dashboards.<\/P>Feature Service<\/span><\/span><\/P>O download do blog contém as ferramentas ETL que usei, exceto uma chave API funcional, por favor contate a Clarity se quiser testar e implementar uma integração.<\/P> <\/P>
A Clarity foi fundada em 2014 para enfrentar a crise global da poluição do ar e agora fornece monitoramento de qualidade do ar econômico, escalável e confiável para clientes em mais de 60 países ao redor do mundo. A solução da Clarity permite que governos e comunidades coletem dados de qualidade do ar com resolução mais alta ao suplementar monitores regulatórios existentes com redes densas de sensores de qualidade do ar continuamente calibrados.<\/P>
Gosto do endpoint
{ "_id": "6137a995cd42fd51fcda7083", "device": "609935dcc9348052e0c5d917", "deviceCode": "AY989QV6", "time": "2021-09-07T17:00:00.000Z", "location": { "coordinates": [ -120.90439519586954, 36.01958888490562 ], "type": "Point" }, "recId": "averaged:AY989QV6:hour:2021-09-07T18:00:00", "characteristics": { "relHumid": { "value": 30.428397178649904, "weight": 4, "raw": 30.428397178649904 }, "temperature": { "value": 30.882064819335939, "weight": 4, "raw": 30.882064819335939 }, "pm2_5ConcNum": { "value": 24.072547912597658, "weight": 4, "raw": 24.072547912597658 }, "pm2_5ConcMass": { "value": 13.646130166709775, "weight": 4, "raw": 21.126213550567628, "calibratedValue": 13.646130166709775, "epaNowCast": 15.097605519225573 }, "pm1ConcNum": { "value": 22.670581817626954, "weight": 4, "raw": 22.670581817626954 }, "pm1ConcMass": { "value": 12.186892986297608, "weight": 4, "raw": 12.186892986297608 }, "pm10ConcNum": { value: 24.33531427383423, weight: 4, raw: 24.33531427383423 }, pm10ConcMass: { value: 28.42475652694702, weight: 4, raw: 28.42475652694702 }, no2Conc: { value: -6.413380280137062, weight: 4, raw: -6.413380280137062 }, pm2_5ConcMass_24HourRollingMean: { value: 15.003665288163619, weight: 88, raw: 27.317325342785229, calibratedValue: 15.003665288163619 }, pm2_5ConcNum_24HourRollingMean: { value: 26.923120065168903, weight: 88, raw: 26.923120065168903 }, pm10ConcMass_24HourRollingMean: { value: 37.67677915096283, weight: 88, raw: 37.67677915096283 }, pm10ConcNum_24HourRollingMean: { value: 27.273549459197306, weight: 88, raw: 27.273549459197306 } }, average: "hour"}<\/code><\/pre> <\/P> <\/P> <\/P> <\/P>A tarefa é transformar esses dados em um serviço de feição hospedado e automatizar a manutenção do serviço.<\/STRONG><\/P>Uma vantagem de ter um background em GIS é que você provavelmente conhece um pouco de Python, e cargas JSON como a acima parecem exatamente dicionários e listas Python. Você só precisa aprender alguns truques antes de poder lidar com praticamente qualquer API REST.<\/P>Truque #1: Usando HTTPCaller.<\/STRONG><\/P>HTTPCaller<\/span><\/span><\/P> <\/P>
Membros conectados podem postar, seguir atualizações e mais. Novo aqui? Registre uma conta gratuita.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.