ArcGIS Server JSON'u GeoJSON'a dönüştürme?


47

Leaflet kullanarak bir web haritası hazırlıyorum ve ArcServer'ımızdan özellik katmanları yakalayabilmek istiyorum. Bir özellik sınıfını JSON olarak başarılı bir şekilde alabildim, ancak Esri'nin JSON nesneleri GeoJSON standartlarına uymadığından görüntülenemiyorlar.

Bunu yapan bir dönüştürme komut dosyası veya aracı bilen var mı?

Değilse, ArcServer JSON nesnelerini GeoJSON'a dönüştürmek için bir komut dosyası oluşturmayı planlıyorum.


Ogr2ogr'u bir MapServer özelliği sorgusundan gelen ESRI jsonunu yemekte zorlanıyordum. (SasaIvetic en örnek FeatureServer isteği kullanır ve MapServer @ ı değiştirilebilir olmalı değil tüketmek gerekir sonuçlanır.) Neyse, bu site tamamen hile yaptı: http://ogre.adc4gis.com/
elrobis

Yanıtlar:


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

Bu komut, sorgu sonucunu doğrudan URL’den okuyacaktır. JSON'nuzu içeren bir metin dosyası da sağlayabilir veya doğrudan komut satırında JSON kodlu kaynağı sağlayabilirsiniz. Elbette, gerektiğinde bir komut dosyasında veya kodda yapmak için kütüphanede otomatikleştirmek için ORG Python bağlarını kullanabilirsiniz.

Web servislerini sevenler için bkz. Ogre , json'u geojson'a geri ve geri dönüştürebilen, jjjson'u shapefile'e dönüştürebilen bir ogr2ogr web istemcisi.

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


FWTools'u indirdim. Bu komutu çalıştırdığımda, aşağıdaki veri kaynaklarıyla 'Veri kaynağı açılamıyor' URL burada 'URL'si hatası alıyorum. -> ESRI Şekil Dosyası -> MapInfo Dosyası -> İngiltere .NTF -> SDTS -> TIGER -> S57 -> DGN -> VRT -> REC -> Bellek -> 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 Sürücü listesinde 'ESRI JSON' gibi bir şey görmüyorum.
Tanner,

1
@Tanner: FWTools, GeoJSON desteğinin v1.8.0 ile eklendiği OGR v1.7 ile birlikte geliyor. Burada GDAL / OGR 1.9dev kullanıyorum, ancak FWTools aracılığıyla değil. Galiba onları gisinternals.com/sdk adresinden
Sasa Ivetic

Teşekkürler. Bunu komut satırında çalışmak için aldım. Hala Javascript'imde çalışmasını sağlamak için çalışıyorum.
Tanner

@Tanner bu hatayı nasıl aştınız? Bu benim için bir sürüm sorunu değil ama aynı zamanda windows
makinemde

@kflaw Üzgünüm, ama tam olarak hatırlamıyorum. Sanırım komut satırında ogr2ogr kullandım ve FWTools'a ihtiyaç duymadım ya da kullanmadım.
Tanner,

7

Ayrıca ESRI'nın görebilirsiniz GeoJSON-utils'i o Github "tersi diğer coğrafi json formatları ve yardımcısı GeoJSON'a dönüştürmek için yardımcı programları [javascript] içeriyor. Şu anda Esri JSON sadece GeoJSON geliştirilmiştir. Ayrıca, not WGS84'e tek geometriler koordinat sistemi olduğunu Desteklenmektedir."


2
Güncelleme 12/2017: geojson-utilskullanımdan kaldırıldı. Bkz ArcGIS-to-GeoJSON-utils veya terraformer
GavinR

5

ESRI JSON to GeoJSON (OpenLayers için) * Leaflet javascript için değiştirilme olasılığı yüksek

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

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


Eğer dönüştürecekseniz , ogr2ogr kullanmalısınız
Evan Carroll

5

ArcGIS artık GeoJSON'u destekliyor

Şimdi ArcGIS Online, ArcGIS Rest API URL'si aracılığıyla GeoJSON'a sahiptir. Tek yapmanız gereken f=geojsonURL’de ayarlamak ve servisi yapılandırmak. Dikkat edin, varsayılan olarak, ArcGIS Online edecek değil kadar açık izin diğer çıkış biçimleri GeoJSON ihracat izin verir.

Dışa aktarmanın nasıl etkinleştirileceği aşağıda açıklanmaktadır:

  1. Arggis online olarak giriş yapın
  2. özellik katmanlarını tıklayın,
  3. ayar sekmesini tıklayın
  4. yazan bu kutuyu işaretleyin

    Verileri Dışa Aktar

    Başkalarının farklı biçimlerde dışa aktarmasına izin ver.

  5. Kaydet ve birkaç dakika bekle.

Sorgu sayfasında, GeoJSON seçeneğiyle çıkış biçimi açılır listesini görmelisiniz. Eski çağrıldı json.


Bir agol dinlenme servisi bir ArcGIS server dinlenme servisinden farklı mıdır? Sadece agol, geoJSON'u sunucu olarak değil dinlenme servisi olarak sağlayabilir mi?
jotamon

4

Broşür ve ArGIS vektör katmanı.

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

Çalışma demosu. http://geojason.info/leaflet-vector-layers/demos/arcgis-server/

Leaflet ve ArcGIS hakkında daha fazla bilgi.

  • Leaflet ve ArcGIS Server katmanları, yani AgsDynamicLayer ve AgsFeatureLayer.

ArcGIS sunucusunu destekleyen bu çatalı alabilirsiniz.

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 Görüntü Servisleri ve Broşürü http://blog.geomusings.com/2012/04/17/arcgis-image-services-and-leaflet/



3

Bir kerelik bir dönüşüm için @Sasa Ivetic'ten kabul edilen cevabı kullanırdım ama gerçek zamanlı bir şeye ihtiyacım vardı ve Terraformer bunun için düzgün bir şekilde çalıştı. Ne yazık ki, yalnızca varsayılan olarak tek özellikler için geçerlidir; bu nedenle birden çok özellik için dizi içinde dolaşmanız ve her özelliğe bir ID eklemeniz gerekir :

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

Çok parçalı çokgenler dışında (örneğin Alaska ve adaları) bu benim için iyi çalıştı, ancak bunun için yeniyim, bu yüzden yanlış bir şey kodladım!


3

ArcGIS JSON'u saf Tarayıcı'da GeoJSONThere'e dönüştürme

yapabileceğin 2 yol var

1) TERRAFORMER

Not: node.js içinde kullanın ve tarayıcıda kullanın farklı , ayrıntılar için bağlantıya bakınız.

2) Esri / arcgis-to-geojson-utils

Tarayıcıda kullanmak, ArcgisToGeojsonUtils global var başvuru bu modülün giriş noktası

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

});

Ancak, kendiniz paketlemek istiyorsanız, sadece öğrenme için, adımları izleyin

a) Tüm modül kaynak dosyasını tek bir bundle.js içinde derlemeniz gerekir.

rollup.js tarafından yüklenir

npm install --global rollup

sonra js lib root klasörüne gidin, js giriş noktasını bulun, bu durumda index.js

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

Kök dizininizde yeni bir dosya bundle.js bulmalısınız.

Şimdi tarayıcınızın html dosyasına bu bundle.js dosyasını ekleyin

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

Şimdi tarafından kullanabilirsiniz

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

Esri_arcgis_to_geojson adlı kişinin lib adını verdiğiniz ad olduğunu unutmayın.

Bu, tarayıcıda mevcut olan global değişken adı olur.

İşin püf noktası, paket işlemi gibi anında uygulama işlevi ekleme işlevi (işlev xx {}) buradaki bundle.js öğesinin üst kısmı

  (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


2

Genellikle * oldukça kolay dönüştürme.

Bir komut dosyası https://github.com/calvinmetcalf/esri2geo yazdım ve iyi çalışan başkaları da var.

* Bunun istisnası, bazı coğrafi işlemler olmadan 1'e 1'e dönüşmeyen delikleri olan çok parçalı çokgenlerdir.




0

İhtiyacınız olan tek şey, istediğiniz haritalama tekniğinde kullanmak için ArcServer Hizmetini bir GeoJSON olarak iade etmekse, GitHub'ın bu sorun diyaloguna bakmanızı şiddetle tavsiye ederim .

Buradaki diyalogu kopyalamayacağım çünkü bu zaman harcar. Seçenekleriniz açıkça doğrudan Esri'den ortaya çıkıyor.


-1

arcgis server rest api, özellik servisi,

katmanı sorgularsanız, bunun gibi bir URL ile, ... / 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}}

Geojson formatını ayarlayamazsınız, f = pgeojson hatalı bir istek olacaktır, f = json, dönüş nesnesi özelliği olmadığı için, json katmanları geri döndü.

Bu html sorgu sayfasını deneyin, görebilirsiniz, geojson seçeneği yok,

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

Geojson (özellik) döndürmek istiyorsanız, bu URL'yi kullanmalısınız ... / FeatureServer / 0 / query ...

/ 0 / layerID, eğer sadece 1 katmana sahipse, layerID = 0 ..... demektir.

Bu html sorgu sayfasını deneyin, görebilirsiniz, geojson seçeneği, çünkü layerID = 0 ile belirli bir katman sorgusu yapıyorsunuz

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

Not: bu 2 parametreyi ayarlamayı unutmayın: outSR = 4326 & f = geojson URL mekansal referans kimliğinde, srid = 4326, çünkü web haritası tümü bunu kullanır, f hem f = pgeojson hem de f = geojson çalışır. SSR = 4326'yı ayarlamazsanız, arcgis server rest api varsayılan olarak 4326 kullanmaz, bunun yerine başka bir şey kullanın, yalnızca 4326 çoğu web haritasında kullanılan birim derecesine sahiptir. Diğer format web haritalarıyla çalışmaz.

Bu arada, arcgis server istirahat api'lerini döşeme servisi ile kullanmak isteyenler için,

akıntı ve diğerleri

/zoom(z)/x/y.png

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

arcgis server tile servisi: farklı sıralarda png, x ve y yok

     /zoom(z)/y/x

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.