Leaflet을 사용하여 웹 맵을 만들고 있는데 ArcServer에서 피처 레이어를 가져올 수 있기를 원합니다. 기능 클래스를 JSON으로 검색 할 수 있었지만 Esri의 JSON 객체는 GeoJSON 표준을 따르지 않으므로 표시 할 수 없습니다.
누구든지 이것을 처리하는 변환 스크립트 또는 도구를 알고 있습니까?
그렇지 않다면 ArcServer JSON 객체를 GeoJSON으로 변환하는 스크립트를 만들 계획입니다.
Leaflet을 사용하여 웹 맵을 만들고 있는데 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 바인딩을 사용하여 스크립트 내에서 자동화하거나 라이브러리에서 코드로이를 수행 할 수 있습니다.
웹 서비스를 좋아 하는 사용자는 json을 geojson으로, 그리고 geojson을 shapefile로 변환 할 수있는 ogr2ogr 웹 클라이언트 인 Ogre를 참조하십시오 .
또한 Github에서 Esri의 geojson-utils 를 볼 수 있습니다. "GeoJSON을 다른 지리적 json 형식으로 변환하거나 그 반대로 변환하기위한 [javascript] 유틸리티가 포함되어 있습니다. 현재 GeoJSON 만 Esri JSON으로 개발되었습니다. 또한 WGS84 좌표계의 형상 만 지원됩니다. "
ESRI JSON에서 GeoJSON으로 (OpenLayers 용) * Leaflet 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/
전단지 및 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 이미지 서비스 및 전단지 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을 GeoJSON으로 변환
당신이 할 수있는 두 가지 방법이 있습니다
1) 테라 포머
참고 : node.js에서의 사용과 브라우저에서의 사용이 다릅니다 . 자세한 내용은 링크를 참조하십시오
2) Esri / arcgis-to-geojson-utils
브라우저에서 사용하면 ArcgisToGeojsonUtils는이 모듈의 시작점 인 전역 var 참조입니다.
<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로 컴파일해야합니다.
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라는 이름입니다
이것은 브라우저에서 사용 가능한 전역 변수 이름이됩니다.
요령은 번들 프로세스가 (function xx {})와 같은 인스턴트 구현 기능을 추가하는 것입니다.
(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 스크립트를 만들었고 다른 것들도 잘 작동합니다.
* 일부 지오 프로세싱없이 일대일 변환하지 않는 구멍이있는 다중 부품 다각형은 예외입니다.
일회성 쿼리이고 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- 리플릿 라이브러리 를 사용하여 리프 릿 의 레이어로 기본적으로 추가 할 수 있습니다 .
원하는 매핑 기술에 사용하기 위해 ArcServer Service를 GeoJSON으로 반환하는 것이라면 이 GitHub 문제 대화 상자를 참조하십시오 .
대화를 반복하지 않겠습니다. 시간이 낭비되기 때문입니다. Esri에서 직접 옵션을 명확하게 배치 할 수 있습니다.
arcgis 서버 레스트 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에 레이어가 하나만 있으면 layerID = 0 .....
이 HTML 쿼리 페이지를 시도하십시오. layerID = 0 인 특정 레이어를 쿼리하기 때문에 geojson이 옵션입니다.
http://services3.arcgis.com/your_token/arcgis/rest/services/Parcels/FeatureServer/0/query
참고 : 웹 맵은 모두 이것을 사용하므로 f는 형식을 의미하고 f는 p = pgeojson과 f = geojson이 작동하므로 URL 공간 참조 ID에서 srid = 4326 인 outSR = 4326 & f = geojson이라는 두 매개 변수를 설정해야합니다. SR = 4326을 설정하지 않으면 arcgis 서버 나머지 API는 기본적으로 4326을 사용하지 않고 대신 다른 것을 사용합니다. 대부분의 웹 맵에서 사용되는 단위 등급은 4326입니다. 다른 형식은 웹 맵에서 작동하지 않습니다.
그런데 arcgis 서버 레스트 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