Konwertujesz ArcGIS Server JSON na GeoJSON?


47

Tworzę mapę internetową za pomocą Ulotki i chcę mieć możliwość pobierania warstw obiektów z naszego ArcServer. Udało mi się pobrać klasę obiektów jako JSON, ale obiekty JSON Esri nie są zgodne ze standardami GeoJSON, więc nie można ich wyświetlić.

Czy ktoś wie o skrypcie konwersji lub narzędziu, które to obsługuje?

Jeśli nie, planuję utworzyć skrypt do konwersji obiektów ArcServer JSON na GeoJSON.


Miałem problem z nakłonieniem ogr2ogr do zjedzenia jsona ESRI pochodzącego z zapytania funkcji MapServer. (Przykład @ SasaIvetic wykorzystuje żądanie FeatureServer, a wynik MapServer, który muszę wykorzystać, nie może być wymienny.) W każdym razie ta strona całkowicie
załatwiła sprawę

Odpowiedzi:


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

To polecenie odczyta wynik zapytania bezpośrednio z adresu URL. Możesz również dostarczyć go z plikiem tekstowym zawierającym JSON lub możesz bezpośrednio podać zakodowany JSON w wierszu poleceń. Możesz oczywiście użyć powiązań Python ORG do zautomatyzowania go w skrypcie, jeśli to konieczne, lub biblioteki, aby to zrobić w kodzie.

Dla tych, którzy lubią usługi sieciowe, zobacz Ogre i klient sieci ogr2ogr, który może konwertować json na geojson do iz powrotem, a także geojson na shapefile.

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


Pobrałem FWTools. Po uruchomieniu tego polecenia pojawia się błąd „Nie można otworzyć źródła danych„ Mój adres URL tutaj ”z następującymi sterownikami. -> Plik kształtu ESRI -> Plik MapInfo -> UK .NTF -> SDTS -> TIGER -> S57 -> DGN -> VRT -> REC -> Pamięć -> 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 Nie widzę czegoś takiego jak „ESRI JSON” na liście sterowników.
Tanner

1
@Tanner: FWTools jest dostarczany z OGR v1.7, w którym dodano obsługę GeoJSON z v1.8.0. Używam GDAL / OGR 1.9dev tutaj, choć nie przez FWTools. Wydaje
Sasa Ivetic

Dzięki. Mam to do pracy w wierszu poleceń. Nadal pracuję nad tym, aby działał w moim Javascript - wszelkie wskazówki byłyby mile widziane.
Tanner

@Tanner, jak udało ci się ominąć ten błąd? Nie jest to dla mnie problem z wersją, ale
pojawia

@kflaw Przepraszamy, ale nie pamiętam dokładnie. Myślę, że właśnie użyłem ogr2ogr w wierszu poleceń i nie potrzebowałem ani nie użyłem FWTools.
Tanner

7

Możesz także zobaczyć geojson-utils Esri na Github, który „zawiera narzędzia [javascript] do konwersji GeoJSON na inne formaty jsonów geograficznych i odwrotnie. Obecnie opracowano tylko GeoJSON na Esri JSON. Zwróć też uwagę, że tylko geometrie w układzie współrzędnych WGS84 są obsługiwane ”.


2
Aktualizacja 12/2017: geojson-utilsjest przestarzała. Zobacz arcgis-to-geojson-utils lub terraformer
GavinR

5

ESRI JSON do GeoJSON (dla OpenLayers) * Prawdopodobnie będzie modyfikowany w javascript ulotki

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

źródło: http://mapbutcher.com/blog/?p=62


Jeśli zamierzasz dokonać konwersji , powinieneś użyć ogr2ogr
Evan Carroll

5

ArcGIS obsługuje teraz GeoJSON

Teraz ArcGIS Online ma GeoJSON poprzez ArcGIS Rest API URL. Wszystko, co musisz zrobić, to ustawić f=geojsonadres URL i skonfigurować usługę. Pamiętaj, że domyślnie ArcGIS online nie zezwala na eksport GeoJSON, dopóki nie zezwolisz na inne formaty wyjściowe.

Oto jak włączyć eksport:

  1. Zaloguj się do Arcgis online
  2. kliknij warstwy obiektów,
  3. kliknij kartę ustawień
  4. zaznacz to pole z napisem

    Eksportuj dane

    Pozwól innym eksportować do różnych formatów.

  5. Zapisz i poczekaj kilka minut.

Na stronie zapytania powinna zostać wyświetlona lista rozwijana formatu wyjściowego z opcją GeoJSON. Stary został nazwany json.


Czy usługa odpoczynku agol różni się od usługi odpoczynku serwera ArcGIS? Czy tylko agol może zapewnić geoJSON jako usługę odpoczynku, a nie serwer?
jotamon

4

Warstwa wektorowa ulotki i ArGIS.

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

Działające demo. http://geojason.info/leaflet-vector-layers/demos/arcgis-server/

Więcej na temat Ulotki i ArcGIS.

  • Warstwy serwera Leaflet i ArcGIS, tj. AgsDynamicLayer i AgsFeatureLayer.

Możesz uzyskać ten widelec, który obsługuje serwer ArcGIS.

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 and Leaflet http://blog.geomusings.com/2012/04/17/arcgis-image-services-and-leaflet/



3

Do jednorazowej konwersji użyłbym zaakceptowanej odpowiedzi @Sasa Ivetic, ale potrzebowałem czegoś w czasie rzeczywistym, a Terraformer działał na to przyzwoicie. Niestety domyślnie jest to tylko dla pojedynczych funkcji, więc w przypadku wielu funkcji należy przejrzeć tablicę i dodać identyfikator do każdej funkcji:

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

Działa to dla mnie dobrze, z wyjątkiem wieloczęściowych wielokątów (tj. Alaski i jej wysp), ale jestem nowy, więc możliwe, że kodowałem coś niepoprawnie!


3

Konwersja ArcGIS JSON na GeoJSON Istnieje w czystej przeglądarce

możesz to zrobić na 2 sposoby

1) TERRAFORMER

Uwaga: użycie w node.js i użycie w przeglądarce są różne , szczegóły patrz link

2) Esri / arcgis-to-geojson-utils

używać w przeglądarce ArcgisToGeojsonUtils jest globalnym zmiennym referencyjnym punktem wejścia tego modułu

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

});

Jeśli jednak chcesz połączyć pakiet samodzielnie, tylko dla nauki, wykonaj następujące kroki

a) Musisz skompilować cały plik źródłowy modułu w jednym pakiecie.js

rollup.js zainstaluj przez

npm install --global rollup

następnie przejdź do głównego folderu js lib, znajdź plik js punktu wejścia, w tym przypadku jest to index.js

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

W katalogu głównym powinieneś znaleźć nowy plik bundle.js.

Teraz w pliku HTML przeglądarki dołącz ten plik bundle.js

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

Możesz go teraz użyć przez

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

Pamiętaj, esri_arcgis_to_geojson to nazwa, którą nazwałeś lib

Staje się nazwą globalnej zmiennej dostępnej w przeglądarce.

Sztuczka polega na tym, że proces pakietowania dodaje natychmiastową funkcję implementacji, taką jak (funkcja xx {}), oto górna część z pliku 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

Być może jeszcze łatwiej można użyć biblioteki Esri-leaflet, aby dodać ją natywnie jako warstwę w Ulotce.


2
Czy możesz zamieścić w swoim poście przykład przedstawiający, w jaki sposób ta odpowiedź jest pytaniem PO?
Paul

0

Jeśli wszystko, czego potrzebujesz, to zwrócenie usługi ArcServer jako GeoJSON do użycia w dowolnej technice mapowania, gorąco polecam przyjrzeć się temu dialogowi problemów GitHub .

Nie zamierzam tutaj powtarzać dialogu, ponieważ marnuje to czas. Twoje opcje są wyraźnie określone bezpośrednio od Esri.


-1

arcgis server rest api, obsługa funkcji,

jeśli zapytasz warstwę, z takim adresem URL, ... / 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}}

Nie można ustawić formatu geojson, f = pgeojson będzie złym żądaniem, f = json, ponieważ zwracane elementy nie są dostępne, warstwy json zostały zwrócone.

Wypróbuj tę stronę html, możesz zobaczyć, brak opcji geojson,

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

Jeśli chcesz zwrócić geojson (funkcję), musisz użyć tego adresu URL ... / FeatureServer / 0 / query ...

/ 0 / oznacza layerID, jeśli on ma tylko 1 warstwę, to layerID = 0 .....

Wypróbuj tę stronę zapytania HTML, możesz zobaczyć, geojson jest opcją, ponieważ jesteś konkretną warstwą zapytania o layerID = 0

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

Uwaga: pamiętaj, aby ustawić te 2 parametry: outSR = 4326 i f = geojson w identyfikatorze przestrzennego odwołania do adresu URL, srid = 4326, ponieważ wszystkie mapy internetowe używają tego, f oznacza format, działa zarówno f ​​= pgeojson, jak i f = geojson. Jeśli nie ustawisz outSR = 4326, interfejs API spoczynku serwera Arcgis domyślnie NIE użyje 4326, zamiast tego użyje czegoś innego, tylko 4326 ma stopień jednostkowy, który jest używany w większości map internetowych. Inny format nie działałby z mapami internetowymi.

Nawiasem mówiąc, dla tych, którzy chcą korzystać z ArcGis Server Rest API z usługą kafelkową,

tilestream i inni

/zoom(z)/x/y.png

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

usługa kafelkowa serwera arcgis: brak png, xiy w innej kolejności

     /zoom(z)/y/x

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.