Konvertieren von ArcGIS Server JSON nach GeoJSON?


47

Ich erstelle eine Webkarte mit Leaflet und möchte Feature-Layer von unserem ArcServer abrufen können. Es ist mir gelungen, eine Feature-Class als JSON abzurufen, aber die JSON-Objekte von Esri entsprechen nicht den GeoJSON-Standards, sodass sie nicht angezeigt werden können.

Kennt jemand ein Konvertierungsskript oder Tool, das dies erledigt?

Wenn nicht, plane ich, ein Skript zum Konvertieren von ArcServer JSON-Objekten in GeoJSON zu erstellen.


Ich hatte Probleme, ogr2ogr dazu zu bringen, ESRI json zu essen, das von einer MapServer-Feature-Abfrage stammt. (Das Beispiel von @ SasaIvetic verwendet eine FeatureServer-Anfrage, und das MapServer-Ergebnis, das ich verarbeiten muss, darf nicht austauschbar sein.) Auf
jeden Fall

Antworten:


40

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

Dieser Befehl liest das Abfrageergebnis direkt von der URL. Sie können es auch mit einer Textdatei versehen, die Ihren JSON-Code enthält, oder Sie können den codierten JSON-Code direkt in der Befehlszeile eingeben. Sie können natürlich ORG Python-Bindungen verwenden, um es bei Bedarf innerhalb eines Skripts zu automatisieren, oder die Bibliothek, um es in Code auszuführen.

Für diejenigen, die Webdienste mögen, finden Sie unter Ogre einen ogr2ogr-Webclient, der Json in Geojson in und zurück sowie Geojson in Shapefile konvertieren kann.

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


Ich habe FWTools heruntergeladen. Wenn ich diesen Befehl ausführe, wird die Fehlermeldung "Die Datenquelle" Meine URL hier "kann nicht mit den folgenden Treibern geöffnet werden. -> ESRI-Shapefile -> MapInfo-Datei -> UK .NTF -> SDTS -> TIGER -> S57 -> DGN -> VRT -> REC -> Speicher -> 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 In der Liste der Treiber wird so etwas wie "ESRI JSON" nicht angezeigt.
Tanner

1
@Tanner: FWTools wird mit OGR v1.7 geliefert, wobei GeoJSON-Unterstützung mit v1.8.0 hinzugefügt wurde. Ich verwende hier GDAL / OGR 1.9dev, allerdings nicht über FWTools. Ich glaube, ich habe sie von gisinternals.com/sdk
Sasa Ivetic

Vielen Dank. Ich habe dies auf der Kommandozeile arbeiten. Ich arbeite immer noch daran, es in meinem Javascript zum Laufen zu bringen - für Tipps wäre ich dankbar.
Tanner

@Tanner wie bist du an diesem Fehler vorbei gekommen? Es ist kein Versionsproblem für mich, aber ich
erhalte

@kflaw Sorry, aber ich erinnere mich nicht genau. Ich glaube, ich habe gerade ogr2ogr in der Befehlszeile verwendet und FWTools nicht benötigt oder verwendet.
Tanner

7

Sie können auch Esris Geojson-Utils auf Github sehen, die [Javascript] -Dienstprogramme zum Konvertieren von GeoJSON in andere geografische Json-Formate und umgekehrt enthalten. Derzeit wurde nur GeoJSON in Esri JSON entwickelt. Beachten Sie außerdem, dass nur Geometrien im WGS84-Koordinatensystem vorhanden sind sind unterstützt."


2
Update 12/2017: geojson-utilsist veraltet. Siehe arcgis-to-geojson-utils oder terraformer
GavinR

5

ESRI JSON zu GeoJSON (für OpenLayers) * Wird wahrscheinlich für Leaflet Javascript geändert

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

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



5

ArcGIS unterstützt jetzt GeoJSON

Jetzt verfügt ArcGIS Online über GeoJSON über die URL der ArcGIS Rest-API. Sie müssen lediglich f=geojsondie URL eingeben und den Dienst konfigurieren. Beachten Sie , dass ArcGIS Online standardmäßig keinen GeoJSON-Export zulässt, bis Sie explizit andere Ausgabeformate zulassen.

So aktivieren Sie den Export:

  1. Melden Sie sich online bei arcgis an
  2. Klicken Sie auf die Feature-Layer.
  3. Klicken Sie auf die Registerkarte Einstellungen
  4. Aktivieren Sie dieses Kontrollkästchen

    Daten exportieren

    Anderen erlauben, in andere Formate zu exportieren.

  5. Speichern und einige Minuten warten.

Auf der Abfrageseite sollte die Dropdown-Liste Ausgabeformat mit der Option GeoJSON angezeigt werden. Der Alte wurde gerufen json.


Unterscheidet sich ein Agol-Rest-Service von einem ArcGIS-Server-Rest-Service? Kann nur Agol GeoJSON als Rest-Service und nicht als Server bereitstellen?
Jotamon

4

Prospekt- und ArGIS-Vektorebene.

https://github.com/JasonSanford/leaflet-vector-layers

Arbeitsdemo. http://geojason.info/leaflet-vector-layers/demos/arcgis-server/

Weitere Informationen zu Leaflet und ArcGIS.

  • Leaflet- und ArcGIS Server-Layer, dh AgsDynamicLayer und AgsFeatureLayer.

Sie können diese Abzweigung erhalten, die Unterstützung für ArcGIS-Server bietet.

https://github.com/dtsagile/Leaflet/

 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);

http://blog.davebouwman.com/2011/08/04/leaflet-lean-mean-javascript-maps/

ArcGIS Image Services und Broschüre http://blog.geomusings.com/2012/04/17/arcgis-image-services-and-leaflet/



3

Für eine einmalige Konvertierung hätte ich die akzeptierte Antwort von @Sasa Ivetic verwendet, brauchte aber etwas in Echtzeit, und Terraformer hat anständig dafür gearbeitet. Leider ist dies standardmäßig nur für einzelne Features vorgesehen. Für mehrere Features müssen Sie eine Schleife durch das Array führen und jedem Feature eine ID hinzufügen:

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)
};

Das hat bei mir gut funktioniert, außer bei mehrteiligen Polygonen (z. B. Alaska und seine Inseln), aber ich bin neu darin, daher ist es möglich, dass ich etwas falsch codiert habe!


3

Konvertieren von ArcGIS JSON in GeoJSON Dort im reinen Browser

Es gibt zwei Möglichkeiten

1) TERRAFORMER

Hinweis: Verwendung in node.js und Verwendung im Browser sind unterschiedlich , Details siehe Link

2) Esri / Arcgis-to-Geojson-Utils

Für die Verwendung im Browser ist ArcgisToGeojsonUtils eine globale var-Referenz, die den Einstiegspunkt dieses Moduls darstellt

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

});

Wenn Sie jedoch alleine bündeln möchten, nur zum Lernen, befolgen Sie die folgenden Schritte

a) Sie müssen die gesamte Modulquelldatei in eine einzige bundle.js kompilieren

rollup.js installieren von

npm install --global rollup

Wechseln Sie dann in Ihren js lib-Stammordner und suchen Sie die js-Datei für den Einstiegspunkt. In diesem Fall handelt es sich um index.js

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

Sie sollten eine neue Datei bundle.js in Ihrem Stammverzeichnis finden.

Fügen Sie nun in die HTML-Datei Ihres Browsers die Datei bundle.js ein

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

Sie können es jetzt von verwenden

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

Denken Sie daran, esri_arcgis_to_geojson ist der Name, den Sie als lib bezeichnet haben

Dies wird zum globalen Variablennamen, der im Browser verfügbar ist.

Der Trick ist, Bundle-Prozess fügen Sie Instant-Implement-Funktion wie (Funktion xx {}) hier ist der obere Teil von 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



1

Wenn es sich um eine einmalige Abfrage handelt und Sie nicht über mehr als 1000 Funktionen verfügen, versuchen Sie, diese mithilfe des Layers "Vektor hinzufügen" in qgis einzufügen. Wählen Sie ein Protokoll aus und ersetzen Sie diese arcgis-Rest-URL durch Ihre URL: http://geodata.epa.gov/arcgis / rest / services / OAR / USEPA_NEI_2005 / MapServer / 1 / query? where = objectid +% 3D + objectid & outfields = * & f = json ... Dies setzt voraus, dass Sie gdal 1.10 installiert haben



0

Wenn Sie den ArcServer-Service nur als GeoJSON zurückgeben müssen, um ihn in der gewünschten Mapping-Technologie zu verwenden, sollten Sie sich unbedingt diesen GitHub- Problemdialog ansehen .

Ich werde den Dialog hier nicht wiederholen, weil das Zeit verschwenden würde. Ihre Möglichkeiten werden dort direkt von Esri übersichtlich dargestellt.


-1

ArcGIS Server Rest API, Feature-Service,

Wenn Sie den Layer mit einer URL wie dieser abfragen, ... / 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}}

Sie können kein Geojson-Format einstellen, f = pgeojson wird eine schlechte Anfrage sein, f = json, weil das Rückgabematerial keine Funktion hat, die Schichten json wurden zurückgegeben.

Versuchen Sie diese HTML-Abfrageseite, Sie können sehen, keine Geojson-Option,

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

Wenn Sie Geojson (Feature) zurückgeben möchten, müssen Sie diese URL verwenden ... / FeatureServer / 0 / query ...

/ 0 / bedeutet layerID, wenn on nur 1 Layer hat, dann ist layerID = 0 .....

Probieren Sie diese HTML-Abfrageseite aus. Sie sehen, Geojson ist eine Option, da Sie einen bestimmten Layer mit der Layer-ID 0 abfragen

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

Hinweis: Denken Sie daran, diese beiden Parameter festzulegen: outSR = 4326 & f = geojson in der URL-Raumbezugs-ID srid = 4326, da alle Webkarten dieses Format verwenden. F bedeutet, dass sowohl f = pgeojson als auch f = geojson funktionieren. Wenn Sie outSR = 4326 nicht festlegen, verwendet arcgis server rest api standardmäßig NICHT 4326, sondern nur 4326 mit dem Einheitsgrad, der in den meisten Webkarten verwendet wird. Andere Formate funktionieren mit Webkarten nicht.

Übrigens, für diejenigen, die arcgis server rest api mit tile service verwenden möchten,

tilestream und andere

/zoom(z)/x/y.png

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

Kachelservice für ArcGis-Server: Keine PNG, X und Y in unterschiedlicher Reihenfolge

     /zoom(z)/y/x

http://services3.arcgis.com/your_token/ArcGIS/rest/services/Parcels/MapServer/tile/12/1641/706

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.