ArcGIS Server JSONをGeoJSONに変換しますか?


47

Leafletを使用してWebマップを作成していますが、ArcServerからフィーチャレイヤーを取得できるようにしたいと考えています。フィーチャクラスをJSONとして正常に取得できましたが、EsriのJSONオブジェクトはGeoJSON標準に準拠していないため、表示できません。

誰もこれを処理する変換スクリプトまたはツールを知っていますか?

そうでない場合は、ArcServer JSONオブジェクトをGeoJSONに変換するスクリプトを作成する予定です。


MapServer機能クエリからのESRI jsonをogr2ogrで取得するのに問題がありました。(SasaIveticの例はFeatureServer要求を使用し、MapServerの@私が交換されていてはならない消費する必要が発生。)とにかく、このサイトは完全にトリックでした:http://ogre.adc4gis.com/
elrobis

回答:


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

そのコマンドは、クエリ結果をURLから直接読み取ります。JSONを含むテキストファイルを指定するか、コマンドラインでエンコードされたJSONを直接指定することもできます。もちろん、必要に応じてORG Pythonバインディングを使用してスクリプト内で自動化することも、ライブラリでコード内で実行することもできます。

Webサービスが好きな人は、jsonからgeojsonへの変換とその逆変換、およびgeojsonからshapefileへの変換ができるogr2ogr WebクライアントOgreを参照してください。

参照:http : //www.gdal.org/drv_geojson.html


FWToolsをダウンロードしました。そのコマンドを実行すると、次のドライバーで「データソース「My URL here」を開くことができません」というエラーが表示されます。-> ESRI Shapefile-> MapInfo File-> UK .NTF-> SDTS-> TIGER-> S57-> DGN-> VRT-> REC-> Memory-> 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ドライバーのリストに「ESRI JSON」のようなものが表示されません。
タナー

1
@Tanner:FWToolsには、GeoJSONサポートがv1.8.0で追加されたOGR v1.7が付属しています。私はここでGDAL / OGR 1.9devを実行していますが、FWTools経由ではありません。私はgisinternals.com/sdk
ササIvetic

ありがとう。これをコマンドラインで動作させました。私は今でもJavascriptで動作するように取り組んでいます-ヒントはありがたいです。
タナー

@Tannerどうやってそのエラーを乗り越えましたか?それは私のために、バージョンの問題ではないのですが、私は私のWindowsマシン上で同じエラーを取得しています
kflaw

@kflaw申し訳ありませんが、正確には思い出せません。コマンドラインでogr2ogrを使用しただけで、FWToolsを必要とせず、使用しなかったと思います。
タナー

7

また、GithubのEsriのgeojson-utilsには、「GeoJSONを他の地理的json形式に、またはその逆に変換するための[javascript]ユーティリティが含まれています。現在、GeoJSONからEsri JSONのみが開発されています。サポートされています。」


2
アップデート12/2017:geojson-utils廃止されました。参照のArcGISツーにGeoJSON-utilsのterraformer
GavinR

5

ESRI JSONからGeoJSONへ(OpenLayers用)*リーフレット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;>

ソース:http : //mapbutcher.com/blog/?p=62



5

ArcGISはGeoJSONをサポートするようになりました

現在、ArcGIS Onlineには、ArcGIS Rest API URLを介したGeoJSONがあります。必要なことはf=geojson、URLに設定してサービスを構成することだけです。デフォルトでは、他の出力形式を明示的に許可するまで、ArcGIS OnlineはGeoJSONエクスポートを許可しないことに注意してください。

エクスポートを有効にする方法は次のとおりです。

  1. arcgisオンラインにログインします
  2. フィーチャレイヤーをクリックし、
  3. 設定タブをクリックします
  4. 言うこのボックスをチェックしてください

    データのエクスポート

    他のユーザーが異なる形式にエクスポートできるようにします。

  5. 保存して数分待ちます。

クエリページに、GeoJSONオプションを含む出力形式のドロップダウンリストが表示されます。老人は呼ばれたjson


agolレストサービスはArcGISサーバーレストサービスと異なりますか?agolは、geoJSONのみをサーバーではなく、レストサービスとして提供できますか?
-jotamon

4

リーフレットとArGISベクターレイヤー。

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

作業デモ。 http://geojason.info/leaflet-vector-layers/demos/arcgis-server/

LeafletとArcGISの詳細。

  • リーフレットおよびArcGIS Serverレイヤー(AgsDynamicLayerおよびAgsFeatureLayer)。

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およびリーフレット http://blog.geomusings.com/2012/04/17/arcgis-image-services-and-leaflet/



3

ワンタイム変換のために私は@Sasa Iveticから受け入れ答えを使用しますが、何かをリアルタイムで必要としているでしょうTerraformerは、そのためにちゃんと働いていました。残念ながら、デフォルトでは単一の機能のみであるため、複数の機能の場合、配列ループして各機能にIDを追加する必要があります。

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

マルチパートポリゴン(つまり、アラスカとその島)を除いて、これはうまくいきましたが、私はこれが初めてなので、間違って何かをコーディングした可能性があります!


3

純粋なブラウザでのArcGIS JSONからGeoJSONThereへの変換

できる方法は2つあります

1)テラフォーマー

注:node.jsでの使用とブラウザでの使用は異なります。詳細はリンクを参照してください

2)Esri / arcgis-to-geojson-utils

ブラウザで使用する場合、ArcgisToGeojsonUtilsはこのモジュールのエントリポイントを参照するグローバル変数です。

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

});

ただし、学習のためだけに自分でバンドルする場合は、手順に従ってください

a)すべてのモジュールソースファイルを単一のbundle.jsにコンパイルする必要があります

rollup.jsのインストール

npm install --global rollup

次に、js libルートフォルダーに移動し、エントリポイントjsファイルを見つけます。この場合、index.jsです。

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

ルートディレクトリに新しいファイルbundle.jsが見つかるはずです。

ブラウザのhtmlファイルに、このbundle.jsファイルを含めます

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

あなたは今それを使用することができます

  // 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はlibに名前を付けたことを思い出してください

これは、ブラウザーで使用可能なグローバル変数名になります。

秘Theは、バンドルプロセスが(function xx {})のようなインスタント実装関数を追加することです。ここが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


2

通常は非常に簡単に変換できます。

スクリプトhttps://github.com/calvinmetcalf/esri2geoを作成しましたが、他にもうまく機能するものがあります。

*例外は、ジオプロセシングなしでは1対1に変換されない穴のあるマルチパートポリゴンです。


1

1回限りのクエリで、1000を超える機能がない場合は、ベクターレイヤーの追加を使用してこれをqgisに貼り付けてみてください-プロトコルを選択し、このarcgisの残りのURLを次のものに置き換えます:http : //geodata.epa.gov/arcgis / rest / services / OAR / USEPA_NEI_2005 / MapServer / 1 / query?where = objectid +%3D + objectid&outfields = *&f = json ...これは、gdal 1.10がインストールされていることを前提としています



0

必要なのが、ArcServerサービスをGeoJSONとして返して、必要なマッピングテクノロジーで使用する場合、このGitHubの問題ダイアログを確認することを強くお勧めします。

時間を無駄にするので、ここでダイアログを再現するつもりはありません。Esriから直接、オプションが明確にレイアウトされています。


-1

arcgis server rest api、機能サービス、

このような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}}

geojson形式を設定することはできません。f= pgeojsonは要求が悪いf = jsonになります。返品は機能ではないため、jsonが返されたレイヤーです。

このhtmlクエリページを試してください。geojsonオプションは表示されませんが、

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

geojson(機能)を返す場合は、このURL ... / FeatureServer / 0 / query ...を使用する必要があります

/ 0 /はlayerIDを意味し、onに1つのレイヤーしかない場合、layerID = 0 .....

このHTMLクエリページを試してみてください。layerID= 0の特定のレイヤーをクエリしているため、geojsonはオプションです。

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

注:URL空間参照IDでoutSR = 4326&f = geojson、srid = 4326の2つのパラメーターを設定することを忘れないでください。Webマップはすべてこれを使用するため、fは形式を意味し、f = pgeojsonとf = geojsonの両方が機能します。outSR = 4326を設定しない場合、arcgis server rest apiはデフォルトで4326を使用せず、代わりに他のものを使用します。ほとんどのWebマップで使用される単位度は4326のみです。他の形式はWebマップでは機能しません。

ちなみに、タイルサービスでarcgisサーバーREST APIを使用する場合は、

tilestreamなど

/zoom(z)/x/y.png

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

arcgisサーバータイルサービス:png、x、yの順序は異なる

     /zoom(z)/y/x

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.