¿Convertir ArcGIS Server JSON a GeoJSON?

41

Estoy creando un mapa web utilizando Leaflet , y quiero poder capturar capas de entidades de nuestro ArcServer . He logrado recuperar una clase de entidad como JSON, pero los objetos JSON de Esri no siguen los estándares de GeoJSON por lo que no se pueden mostrar.

¿Alguien sabe de un script de conversión o herramienta que maneje esto?

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

    
pregunta Tanner 03.08.2011 - 19:23

13 respuestas

39

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 suministrarlo con un archivo de texto que contenga su JSON o puede suministrar directamente JSON codificado en la línea de comandos. Por supuesto, puede usar los enlaces ORG de Python para automatizarlo dentro de un script si es necesario, o la biblioteca para hacerlo en código.

Para aquellos que les gustan los servicios web, consulte Ogre un cliente web ogr2ogr que puede convertir json a geojson hacia y desde atrás, así como geojson a shapefile.

Referencia: enlace

    
respondido por el Sasa Ivetic 03.08.2011 - 19:46
7

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

    
respondido por el nicogis 22.03.2013 - 15:12
5

ESRI JSON a GeoJSON (para OpenLayers) * Es probable que se modifique para el javascript del folleto

        //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: enlace

    
respondido por el Mapperz 03.08.2011 - 19:52
5

ArcGIS ahora admite GeoJSON

Ahora ArcGIS Online tiene GeoJSON a través de la URL de la API de ArcGIS Rest. Todo lo que necesita hacer es establecer f=geojson en la URL y configurar el servicio. Tenga en cuenta que, de forma predeterminada, ArcGIS en línea no permitirá la exportación de GeoJSON hasta que usted explícitamente permita otros formatos de salida.

Aquí es cómo habilitar la exportación:

  1. Inicia sesión en arcgis en línea
  2. haga clic en las capas de entidades,
  3. haga clic en la pestaña de configuración
  4. marca esta casilla que dice
      

    Exportar datos

         

    Permitir que otros exporten a diferentes formatos.

  5. Guarda y espera 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 .

respondido por el hoogw 18.10.2016 - 01:00
4

Capa vectorial de folletos y ArGIS.

enlace

Demo de trabajo. enlace

Más sobre Leaflet y ArcGIS.

  • Capas de Leaflet y ArcGIS Server, es decir, AgsDynamicLayer y AgsFeatureLayer.

Puede obtener esta bifurcación que es compatible con el servidor de ArcGIS.

enlace

 var sitesLayer = new L.AgsDynamicLayer(
    'http://ags2.dtsagile.com/ArcGIS/rest/services/LiveFeeds/WxMappr/MapServer',
    { maxZoom: 19,
        attribution: "NOAA",
        opacity: 1,
        layers: 'show:2' });
_map.addLayer(sitesLayer);

enlace

ArcGIS Image Services and Leaflet enlace

    
respondido por el ns-1m 21.04.2012 - 05:58
3

He creado una extensión de objeto de servidor para generar GeoJSON desde los servicios de mapas de ArcGIS Server. Ha sido probado con 10.1 y 10.2 pero no antes. enlace

    
respondido por el Bill Dollins 11.09.2013 - 04:40
3

Para una conversión única, habría utilizado la respuesta aceptada de @Sasa Ivetic pero necesitaba algo en tiempo real, y Terraformer Trabajé decentemente para eso. Desafortunadamente, solo es para funciones individuales de forma predeterminada, por lo que para múltiples funciones necesita recorrer la matriz y agregar una ID a cada característica:

var FeatureCollection = {
  type: "FeatureCollection",
  features: []
}

for (var i = 0; i < arcgis.features.length; i++) {
  var feature = Terraformer.ArcGIS.parse(arcgis.features[i]);
  feature.id = i;
  FeatureCollection.features.push(feature)
};

Esto funcionó bien para mí, excepto en polígonos de varias partes (es decir, Alaska y sus islas), pero soy nuevo en esto, ¡así que es posible que haya codificado algo incorrectamente!

    
respondido por el abettermap 18.07.2014 - 15:13
2

Es usualmente * bastante fácil de convertir.

Hice un script enlace y hay otros que también funcionan bien.

* La excepción son los polígonos de varias partes con agujeros que no convierten 1 a 1 sin un geoprocesamiento.

    
respondido por el Calvin 31.12.2012 - 21:54
2

Conversión de ArcGIS JSON a GeoJSONHay en navegador puro

hay dos formas de hacerlo

1) TERRAFORMER

Nota: el uso en node.js y el uso en el navegador son diferentes , detalles ver enlace

2) Esri / arcgis-to-geojson-utils

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

<script src="https://unpkg.com/@esri/[email protected]/dist/arcgis-to-geojson.js"></script>//parseArcGISJSON,convertittoGeoJSONconstgeojson=ArcgisToGeojsonUtils.arcgisToGeoJSON({"x":-122.6764,
"y":45.5165,
"spatialReference": {
  "wkid": 4326
}

});

Sin embargo, si desea agrupar por su cuenta, solo para aprender, siga los pasos

a) Debe compilar todo el archivo fuente del módulo en un solo bundle.js

rollup.js instalar por

npm install --global rollup

luego ve a tu carpeta raíz js lib, encuentra el archivo js del 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 su navegador, incluya este archivo bundle.js

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

Puedes usarlo ahora por

  // 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

Recuerda que esri_arcgis_to_geojson es el nombre que llamaste lib_

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

El truco es que el proceso de agrupación agrega una función de implementación instantánea como (función 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

    
respondido por el hoogw 14.10.2016 - 19:31
1

Si es una consulta de una sola vez y no tiene más de 1000 funciones, intente pegar esto en qgis utilizando la capa vectorial de adición. Elija el protocolo y reemplace esta URL de resto arcgis con la suya: enlace * & f = json ... This asume que tienes instalado gdal 1.10

    
1

Quizás aún más fácil puede usar la biblioteca de folletos Esri para agregarla de forma nativa como una capa en el Folleto.

    
respondido por el Andrew Turner 26.09.2013 - 19:29
0

Si todo lo que necesita es devolver el Servicio de ArcServer como GeoJSON para usarlo en cualquier tecnología de mapeo que desee, le recomiendo que consulte este diálogo sobre temas de GitHub .

No voy a replicar el diálogo aquí porque eso perdería tiempo. Sus opciones están claramente establecidas allí directamente desde Esri.

    
respondido por el Shawn Goulet 27.01.2017 - 18:46
-1

api de resto de servidor arcgis, servicio de características,

si consulta la capa, con una URL como esta, ... / FeatureServer / query? layerDefs = ...

http://services3.arcgis.com/your_token/arcgis/rest/services/Parcels/FeatureServer/query?layerDefs={"0":""}&returnGeometry=true&f=pgeojson&geometryType=esriGeometryEnvelope&geometry={"xmin" : -117.923158, "ymin" : 33.644081, "xmax" : -117.921436, "ymax" : 33.645157,"spatialReference" : {"wkid" : 4326}}

No puedes configurar el formato geojson, f = pgeojson será una solicitud incorrecta, f = json, porque el material de retorno no es una característica, las capas json fueron devueltas.

Prueba esta página de consulta html, puedes ver, no hay opción geojson,

 http://services3.arcgis.com/you_token/arcgis/rest/services/Parcels/FeatureServer/query

Si desea devolver geojson (función), debe usar esta URL ... / FeatureServer / 0 / query ...

/ 0 / significa layerID, si tiene solo 1 capa, layerID = 0 .....

Prueba esta página html de consulta, puedes ver, geojson es una opción, porque eres una capa específica de consulta con layerID = 0

http://services3.arcgis.com/your_token/arcgis/rest/services/Parcels/FeatureServer/0/query

Nota: recuerde establecer esos 2 parámetros: outSR = 4326 & f = geojson en la URL ID de referencia espacial, srid = 4326, porque todos los mapas web usan esto, f significa formato, tanto f = pgeojson como f = geojson funciona. Si no establece outSR = 4326, la API de arcgis server rest por defecto NO usará 4326, en lugar de eso, use otra cosa, solo 4326 tiene un grado de unidad, que se usa en la mayoría de los mapas web. Otro formato no funcionaría con mapas web.

Por cierto, para aquellos que quieran usar la api de resto del servidor arcgis con el servicio de mosaico,

tilestream y otros

/zoom(z)/x/y.png

http://localhost/v2/city_parcels/12/706/1641.png

servicio de mosaico del servidor arcgis: no png, xey en otro orden

     /zoom(z)/y/x

enlace

    
respondido por el hoogw 18.10.2016 - 18:24

Lea otras preguntas en las etiquetas