"Necesitarás escribir un conector". Eso es lo que la gente solía decir cuando surgía la necesidad de construir una integración entre ArcGIS y otro sistema. Sin embargo, hoy en día el panorama de la tecnología de la información ha madurado y la forma en que las aplicaciones se comunican entre sí se ha centrado en un puñado de patrones que todos (quienes quieren mantenerse relevantes) usan. ArcGIS Data Interoperability camina y habla en este espacio.<\/P>
Un claro ganador se llama REST<\/A>, y como no soy científico informático no entraré en detalles que puedes leer por ti mismo, todo lo que me importa es que prácticamente todo en la web puede enviar y recibir datos de una manera que puedo usar fácilmente (principalmente JSON, con algunos rezagados que aún usan XML y unos pocos estirando la usabilidad con cargas útiles de protocolo buffer pero los vigilaré por ti, creo que eso pasará 😉<\/span>.) con ArcGIS Data Interoperability.<\/P>Necesito agregar un gráfico antes de que los motores de búsqueda se aburran de mí y no me indexen. Aquí hay un workspace (StubOutAPIJSONReading.fmw<\/STRONG> en la descarga del post) que usé para explorar inicialmente una API (detalles a seguir):<\/P>Explorando una API<\/span><\/span><\/P>Mi API de ejemplo es publicada por las buenas personas de Clarity Movement.<\/A><\/P>Clarity fue fundada en 2014 para abordar la crisis global de contaminación del aire y ahora proporciona monitoreo de calidad del aire rentable, escalable y confiable a clientes en más de 60 países alrededor del mundo. La solución de Clarity permite a gobiernos y comunidades recopilar datos de calidad del aire de mayor resolución al suplementar los monitores regulatorios existentes con redes densas de sensores de calidad del aire calibrados continuamente.<\/P>Me gusta el endpoint Measurements<\/A> de Clarity como un buen ejemplo del patrón más común que encontrarás, a saber, manejar datos JSON<\/STRONG> devueltos desde una llamada HTTP<\/STRONG>. Antes de que te asustes por cosas como protocolos de transporte y análisis JSON, ¡relájate! Data Interoperability lo maneja todo por ti, lo cual es bueno porque si no tendrías que leer cosas como esta:<\/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>El trabajo es convertir estos datos en un servicio de entidades alojado y automatizar el mantenimiento del servicio.<\/STRONG><\/P>Una ventaja de tener experiencia en GIS es que probablemente conoces algo de Python, y las cargas JSON como la anterior se parecen mucho a diccionarios y listas Python. Solo necesitas aprender un par de trucos antes de poder abordar prácticamente cualquier API REST.<\/P>Truco #1: Usar HTTPCaller.<\/STRONG><\/P>HTTPCaller<\/span><\/span><\/P> <\/P> HTTPCaller<\/A> te permite simplemente llenar un formulario para hacer una llamada web y recibir una respuesta (JSON en este caso). Primero debes leer tu documentación API<\/A> y determinar los parámetros requeridos, además de los opcionales que quieras, y si usar un método GET<\/STRONG> o POST<\/STRONG>. GET suele ser para URLs más cortas, POST soporta URLs más largas y también cargas enviadas en un Body. Otro aspecto es la autenticación. Muchas APIs requieren una clave API (como ves aquí) o un token. Normalmente las claves no expiran y los tokens sí, además los tokens requieren un paso de generación (que puede hacerse por separado vía HTTP o vía OAuth2 en una conexión web<\/A><\/STRONG> que configuras para tu cuenta). Mi ejemplo requiere una clave. Mi llamada solicita un arreglo JSON de 10 mediciones de calidad del aire y lo devuelve en un atributo llamado _response_body<\/STRONG>.<\/P>Truco #2: Desempaquetar JSON<\/STRONG><\/P>Estoy listo para ingerir números arbitrarios de mediciones de calidad del aire pero primero debo averiguar cómo extraer datos del JSON. Solicité 10 mediciones así que el JSON devuelto será un arreglo. Cada medición en el arreglo tendrá el mismo esquema usado por los campos de mis entidades - el JSON anterior es una entidad medición. Necesito averiguar cómo extraer valores de campo. La forma más simple es escribir el JSON de una entidad del arreglo a un archivo y usar la capacidad consciente de datos del JSONExtractor<\/A> para permitirme construir consultas sin codificar ninguna consulta JSON.<\/P>Si temporalmente<\/<EM>> configuro el JSONExtractor para leer desde un archivo JSON entonces obtengo un selector muy útil para construir mis consultas JSON. Luego puedo copiar-pegar el JSONExtractor en una herramienta productiva, configurarlo para leer desde el atributo JSON entrante de la entidad, extraerá y expondrá todos los valores disponibles de campo. ¡Qué fácil es eso!<\/<p>Aquí está mi JSONExtractor mientras leo desde un archivo y construyo mis consultas:<\/<p>JSONExtractor Ahora todo va cuesta abajo hacia crear y mantener mi servicio de entidades.Clarity2GDB.fmw usa la exploración JSON hecha arriba para escribir una clase entidad en la geodatabase local del proyecto Pro - se hace algún renombramiento de atributos, y por supuesto se establecen sus tipos deseados al escribir.Clarity2GDBLuego, después de crear mi servicio de entidades desde la clase entidad geodatabase puedo reciclar el trabajo para mantener el servicio con RefreshClarityService.fmw, que solo difiere en el paso del escritor. Notarás que solo las entidades cambiadas se escriben al servicio destino, el workspace tiene un parámetro que establece el intervalo histórico para mis entidades, entidades en el servicio más antiguo que eso se elimina por antigüedad.<\/P>RefreshClarityService<\/span><\/span><\/P> Esta herramienta final puede programarse o ejecutarse bajo demanda.<\/P>¡Eso es todo! He conquistado las complejidades de la integración web y tengo un feature service que puedo usar para potenciar mis mapas, apps y dashboards.<\/P>Feature Service<\/span><\/span><\/P>La descarga del blog tiene las herramientas ETL que usé, menos una clave API funcional, por favor contacte a Clarity si desea probar e implementar una integración.<\/P> <\/P>
Clarity fue fundada en 2014 para abordar la crisis global de contaminación del aire y ahora proporciona monitoreo de calidad del aire rentable, escalable y confiable a clientes en más de 60 países alrededor del mundo. La solución de Clarity permite a gobiernos y comunidades recopilar datos de calidad del aire de mayor resolución al suplementar los monitores regulatorios existentes con redes densas de sensores de calidad del aire calibrados continuamente.<\/P>
Me gusta el 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>El trabajo es convertir estos datos en un servicio de entidades alojado y automatizar el mantenimiento del servicio.<\/STRONG><\/P>Una ventaja de tener experiencia en GIS es que probablemente conoces algo de Python, y las cargas JSON como la anterior se parecen mucho a diccionarios y listas Python. Solo necesitas aprender un par de trucos antes de poder abordar prácticamente cualquier API REST.<\/P>Truco #1: Usar HTTPCaller.<\/STRONG><\/P>HTTPCaller<\/span><\/span><\/P> <\/P>
Si temporalmente<\/<EM>> configuro el JSONExtractor para leer desde un archivo JSON entonces obtengo un selector muy útil para construir mis consultas JSON. Luego puedo copiar-pegar el JSONExtractor en una herramienta productiva, configurarlo para leer desde el atributo JSON entrante de la entidad, extraerá y expondrá todos los valores disponibles de campo. ¡Qué fácil es eso!<\/<p>Aquí está mi JSONExtractor mientras leo desde un archivo y construyo mis consultas:<\/<p>JSONExtractor
Ahora todo va cuesta abajo hacia crear y mantener mi servicio de entidades.
Clarity2GDB.fmw usa la exploración JSON hecha arriba para escribir una clase entidad en la geodatabase local del proyecto Pro - se hace algún renombramiento de atributos, y por supuesto se establecen sus tipos deseados al escribir.
Clarity2GDB
Luego, después de crear mi servicio de entidades desde la clase entidad geodatabase puedo reciclar el trabajo para mantener el servicio con RefreshClarityService.fmw, que solo difiere en el paso del escritor. Notarás que solo las entidades cambiadas se escriben al servicio destino, el workspace tiene un parámetro que establece el intervalo histórico para mis entidades, entidades en el servicio más antiguo que eso se elimina por antigüedad.<\/P>
RefreshClarityService<\/span><\/span><\/P> Esta herramienta final puede programarse o ejecutarse bajo demanda.<\/P>¡Eso es todo! He conquistado las complejidades de la integración web y tengo un feature service que puedo usar para potenciar mis mapas, apps y dashboards.<\/P>Feature Service<\/span><\/span><\/P>La descarga del blog tiene las herramientas ETL que usé, menos una clave API funcional, por favor contacte a Clarity si desea probar e implementar una integración.<\/P> <\/P>
Los miembros registrados pueden publicar, seguir actualizaciones y más. ¿Nuevo aquí? Regístrate para una cuenta gratuita.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.