49 votos

¿Conversión de ArcGIS Server JSON a GeoJSON?

Estoy creando un mapa web utilizando Folleto y quiero ser capaz de tomar las capas de características de nuestro ArcServer. He podido recuperar con éxito una clase de característica como JSON, pero los objetos JSON de Esri no siguen los estándares GeoJSON por lo que no se pueden mostrar.

¿Alguien sabe de algún script o herramienta de conversión que se encargue de esto?

Si no, planeo crear un script para convertir los objetos JSON de ArcServer a GeoJSON.

0 votos

Estaba teniendo problemas para conseguir ogr2ogr para comer ESRI json procedentes de una consulta característica MapServer. (El ejemplo de @SasaIvetic utiliza una petición FeatureServer, y el resultado MapServer que necesito consumir no debe haber sido intercambiable). De todos modos, este sitio totalmente hizo el truco: http://ogre.adc4gis.com/

42voto

Jason Z Puntos 111

OGR:

ogr2ogr -f GeoJSON test.json "http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Hydrography/Watershed173811/FeatureServer/0/query?where=objectid+%3D+objectid&outfields=*&f=json" OGRGeoJSON

Ese comando leerá el resultado de la consulta directamente desde la URL. También puede suministrarle un archivo de texto que contenga su JSON o puede suministrar directamente el JSON codificado en la línea de comandos. Por supuesto, puede utilizar los enlaces de ORG Python para automatizarlo dentro de un script si es necesario, o la biblioteca para hacerlo en código.

Para los que les gustan los servicios web, véase Ogro un cliente web de ogr2ogr que puede convertir json a geojson y viceversa, así como geojson a shapefile.

Referencia: http://www.gdal.org/drv_geojson.html

0 votos

He descargado FWTools. Cuando ejecuto ese comando, obtengo el error 'Unable to open datasource 'My URL here' with the following drivers. -> ESRI Shapefile -> MapInfo File -> UK . NTF -> SDTS -> TIGER -> S57 -> DGN -> VRT -> REC -> Memoria -> BNA -> CSV -> NAS -> GML -> GPX -> KML -> GeoJSON -> Interlis 1 -> Interlis 2 -> GMT -> SQLite -> ODBC -> PGeo -> OGDI -> PostgreSQL -> MySQL -> XPlane -> AVCBin -> AVCE00 -> DXF -> Geoconcept -> GeoRSS -> GPSTrackMaker -> VFK No veo algo como 'ESRI JSON' en la lista de controladores.

1 votos

@Tanner: FWTools viene con OGR v1.7 donde el soporte GeoJSON se añadió con v1.8.0. Estoy ejecutando GDAL/OGR 1.9dev aquí, aunque no a través de FWTools. Creo que los obtuve de gisinternals.com/sdk

0 votos

Gracias. He conseguido que funcione en la línea de comandos. Todavía estoy trabajando en conseguir que funcione en mi Javascript - cualquier consejo sería apreciado.

9voto

todd kman Puntos 11

ArcGIS ahora soporta GeoJSON

Ahora ArcGIS Server (desde 10.4) y ArcGIS Online tienen GeoJSON a través de la URL de la API Rest de ArcGIS. Todo lo que necesita hacer es establecer f=geojson en la URL y configurar el servicio. Tenga en cuenta que, por defecto, ArcGIS Online no permitir la exportación de GeoJSON hasta que permita explícitamente otros formatos de salida.

A continuación se explica cómo activar la exportación:

  1. Inicie sesión en ArcGIS Online
  2. Haga clic en las capas de características,
  3. Haga clic en la pestaña de configuración
  4. Marque esta casilla que dice

Exportación de datos

Permitir que otros exporten a diferentes formatos. 5. Guarde y espere unos minutos.

En la página de consulta, debería ver la lista desplegable de formato de salida con la opción GeoJSON. El antiguo se llamaba json .

1 votos

¿Es diferente un servicio rest de agol de un servicio rest de ArcGIS server? ¿Sólo agol puede proporcionar geoJSON como servicio rest y no servidor?

0 votos

Acabo de editar la asnwer, espero que se mostrará pronto, esto también es compatible con ArcGIS Server a partir de 10.4

0 votos

Aunque AGOL/ArcGIS Server "soportan" GeoJSON, intentar exportar datos utilizando este formato puede provocar tiempos de espera. Intente descargar datos de los puntos finales "Mapa Nacional" del USGS. Los puntos finales JSON no parecen sufrir este problema de tiempo de espera.

9voto

MHG Puntos 81

También puede ver la página de Esri geojson-utils en Github que " contiene utilidades [javascript] para convertir GeoJSON a otros formatos json geográficos y viceversa. Actualmente sólo se ha desarrollado la conversión de GeoJSON a Esri JSON. Además, hay que tener en cuenta que sólo se soportan geometrías en el sistema de coordenadas WGS84".

2 votos

Actualización 12/2017: geojson-utils está obsoleto. Véase arcgis-to-geojson-utils o terraformador

7voto

Erik Öjebo Puntos 6937

ESRI JSON to GeoJSON (para OpenLayers) *Es probable que se modifique para Leaflet javascript

        //create esri JSON object
    var myReturn = "esriObj = "+xmlHttpGet(restCall, false);
    eval(myReturn);

I can now work with esriObj as a JSON object i.e. esriObj.geometryType. What happens in the xmlHttpGet method? Basically I create a XMLHttpRequest and pass in my REST URL – your can see this code here

3. OK i have my ‘ESRI query’ JSON object now I need to parse the features in this object and essentially create GeoJSON strings which the OpenLayers sample will be happy with – cue the code butchery…

function esriDeserialize(geojson)
{

    var element = document.getElementById('text');
    var type = document.getElementById("formatType").value;
    var features = formats['in'][type].read(geojson);
    var bounds;
    if(features)
    {
        if(features.constructor != Array) {
            features = [features];
        }
        for(var i=0; i<features.length;>
            if (!bounds) {
                bounds = features[i].geometry.getBounds();
            } else {
                bounds.extend(features[i].geometry.getBounds());
            }

        }
        vectors.addFeatures(features);
        //map.zoomToExtent(bounds);
        var plural = (features.length &gt; 1) ? 's' : '';
        //element.value = features.length + ' feature' + plural + ' added'
    } else {
        element.value = 'Bad input ' + type;
    }
}

function getEsriGeom(restCall){

    //call ESRI Rest API
    //"http://pc302926/ArcGIS/rest/services/worldadmin/MapServer/0/query?text=&amp;geometry=&amp;geometryType=esriGeometryEnvelope&amp;inSR=&amp;spatialRel=esriSpatialRelIntersects&amp;where=%22FIPS_CNTRY%22+%3D+%27AS%27&amp;returnGeometry=true&amp;outSR=4326&amp;outFields=&amp;f=json"
    var element = document.getElementById('text');  

    //create esri JSON object
    var myReturn = "esriObj = "+xmlHttpGet(restCall, false);
    eval(myReturn);

    element.value = "";
    var coordPairsPerFeature = 0;

    //for each feature
    for (var i=0; i &lt; esriObj.features.length; i++)
    {
        //get the geometry
        var o = esriObj.features[i].geometry;
        element.value = element.value + esriObj.features[i].attributes.ADMIN_NAME;

        //loop through all the rings
        for (var s=0; s &lt; o.rings.length; s++)
        {
            //create geojson start &amp; end - i know i'm getting polygons
            var geojsonstart = '{"type":"Feature", "id":"OpenLayers.Feature.Vector_124", "properties":{}, "geometry":{"type":"Polygon", "coordinates":[['
            var geojsonend = ']]}, "crs":{"type":"OGC", "properties":{"urn":"urn:ogc:def:crs:OGC:1.3:CRS84"}}}';

            //the coordinates for this ring
            var coords = o.rings[s];

            //loop through each coordinate
            var coordPair="";
            for (var g=0; g &lt; coords.length; g++)
            {
                coordPairsPerFeature = coordPairsPerFeature+1;

                //alert(coords[g]);
                if(g==coords.length-1){
                    coordPair = coordPair+"["+coords[g]+"]";
                }else{
                    coordPair=coordPair+"["+coords[g]+"],";
                }
            }

            //combine to create geojson string
            esriDeserialize(geojsonstart+coordPair+geojsonend);
        }

        element.value = element.value + "," + coordPairsPerFeature +"n";
    }

}
</features.length;>

fuente: http://mapbutcher.com/blog/?p=62

0 votos

Si vas a convertir debe utilizar ogr2ogr

0 votos

"*Likely to be modified for Leaflet javascript" - ¿hay alguna actualización? (además, la URL de Map Butcher es 404 :-(

4voto

todd kman Puntos 11

Conversión de ArcGIS JSON a GeoJSONThere en un navegador puro

hay dos maneras de hacerlo

1) TERRAFORMER

Nota: el uso en node.js y el uso en el navegador son diferentes , los detalles se encuentran en el enlace

2) Esri/arcgis-to-geojson-utils

uso en el navegador, ArcgisToGeojsonUtils es global var referencia el punto de entrada de este módulo

<script src="https://unpkg.com/@esri/arcgis-to-geojson-utils@1.2.0/dist/arcgis-to-geojson.js"></script>

// parse ArcGIS JSON, convert it to GeoJSON
const geojson = ArcgisToGeojsonUtils.arcgisToGeoJSON({
"x":-122.6764,
"y":45.5165,
"spatialReference": {
  "wkid": 4326
}

});

Sin embargo, si quieres agrupar por ti mismo, sólo para aprender, sigue los pasos

a) Tienes que compilar todos los archivos fuente de los módulos en un único bundle.js

rollup.js instalar por

npm install --global rollup

luego vaya a su carpeta raíz js lib, encontrar el archivo js punto de entrada, en este caso es index.js

$ rollup index.js --format umd --name "esri_arcgis_to_geojson" --file bundle.js

Debería encontrar un nuevo archivo bundle.js en su directorio raíz.

Ahora, en el archivo html de tu navegador, incluye este archivo bundle.js

<script src='.../.../.../bundle.js'>

Puede utilizarlo ahora

  // parse ArcGIS JSON, convert it to GeoJSON
  var geojson = esri_arcgis_to_geojson.arcgisToGeoJSON({
                            "x":-122.6764,
                            "y":45.5165,
                            "spatialReference": {
                              "wkid": 4326
                            }
                            });

 // take GeoJSON and convert it to ArcGIS JSON
  var arcgis = esri_arcgis_to_geojson.geojsonToArcGIS({
                            "type": "Point",
                              "coordinates": [45.5165, -122.6764]
                            });enter code here

Recuerde esri_arcgis_to_geojson es el nombre que ha dado a la biblioteca

Esto se convierte en el nombre de la variable global, disponible en el navegador.

El truco es, que el proceso de bundle añada una función de implementación instantánea como (function xx {}) aquí está la parte superior de bundle.js

  (function (global, factory) {
     typeof exports === 'object' && typeof module !== 'undefined' ? 
        factory(exports) :
      typeof define === 'function' && define.amd ? define(['exports'], 
         factory) :
      (factory((global.arcgis_to_geojson = {})));
      }(this, (function (exports) { 'use strict';

         ***ORIGINAL SOURCE CODE OF JS MODULE***

     })));

arcgis-to-geojson-utils

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X