Leafletを使用してWebマップを作成していますが、ArcServerからフィーチャレイヤーを取得できるようにしたいと考えています。フィーチャクラスをJSONとして正常に取得できましたが、EsriのJSONオブジェクトはGeoJSON標準に準拠していないため、表示できません。
誰もこれを処理する変換スクリプトまたはツールを知っていますか?
そうでない場合は、ArcServer JSONオブジェクトをGeoJSONに変換するスクリプトを作成する予定です。
Leafletを使用してWebマップを作成していますが、ArcServerからフィーチャレイヤーを取得できるようにしたいと考えています。フィーチャクラスをJSONとして正常に取得できましたが、EsriのJSONオブジェクトはGeoJSON標準に準拠していないため、表示できません。
誰もこれを処理する変換スクリプトまたはツールを知っていますか?
そうでない場合は、ArcServer JSONオブジェクトをGeoJSONに変換するスクリプトを作成する予定です。
回答:
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を参照してください。
また、GithubのEsriのgeojson-utilsには、「GeoJSONを他の地理的json形式に、またはその逆に変換するための[javascript]ユーティリティが含まれています。現在、GeoJSONからEsri JSONのみが開発されています。サポートされています。」
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 > 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=&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects&where=%22FIPS_CNTRY%22+%3D+%27AS%27&returnGeometry=true&outSR=4326&outFields=&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 < 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 < o.rings.length; s++)
{
//create geojson start & 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 < 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;>
現在、ArcGIS Onlineには、ArcGIS Rest API URLを介したGeoJSONがあります。必要なことはf=geojson
、URLに設定してサービスを構成することだけです。デフォルトでは、他の出力形式を明示的に許可するまで、ArcGIS OnlineはGeoJSONエクスポートを許可しないことに注意してください。
エクスポートを有効にする方法は次のとおりです。
データのエクスポート
他のユーザーが異なる形式にエクスポートできるようにします。
クエリページに、GeoJSONオプションを含む出力形式のドロップダウンリストが表示されます。老人は呼ばれたjson
。
リーフレットとArGISベクターレイヤー。
https://github.com/JasonSanford/leaflet-vector-layers
作業デモ。 http://geojason.info/leaflet-vector-layers/demos/arcgis-server/
LeafletとArcGISの詳細。
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/
ArcGIS ServerマップサービスからGeoJSONを生成するサーバーオブジェクトエクステンションを構築しました。10.1および10.2でテストされていますが、それ以前ではありません。https://github.com/geobabbler/AGSOpenFormats
ワンタイム変換のために私は@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)
};
マルチパートポリゴン(つまり、アラスカとその島)を除いて、これはうまくいきましたが、私はこれが初めてなので、間違って何かをコーディングした可能性があります!
純粋なブラウザでの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***
})));
通常は非常に簡単に変換できます。
スクリプトhttps://github.com/calvinmetcalf/esri2geoを作成しましたが、他にもうまく機能するものがあります。
*例外は、ジオプロセシングなしでは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がインストールされていることを前提としています
おそらくもっと簡単に、Esri-leafletライブラリを使用して、それをLeafletのレイヤーとしてネイティブに追加できます。
必要なのが、ArcServerサービスをGeoJSONとして返して、必要なマッピングテクノロジーで使用する場合、このGitHubの問題ダイアログを確認することを強くお勧めします。
時間を無駄にするので、ここでダイアログを再現するつもりはありません。Esriから直接、オプションが明確にレイアウトされています。
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