我正在使用Leaflet创建Web地图,并且希望能够从ArcServer抓取要素图层。我已经能够成功将要素类检索为JSON,但是Esri的JSON对象未遵循GeoJSON标准,因此无法显示。
有人知道处理此问题的转换脚本或工具吗?
如果没有,我计划创建一个脚本以将ArcServer JSON对象转换为GeoJSON。
我正在使用Leaflet创建Web地图,并且希望能够从ArcServer抓取要素图层。我已经能够成功将要素类检索为JSON,但是Esri的JSON对象未遵循GeoJSON标准,因此无法显示。
有人知道处理此问题的转换脚本或工具吗?
如果没有,我计划创建一个脚本以将ArcServer JSON对象转换为GeoJSON。
Answers:
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服务的用户,请参阅Ogre ogr2ogr Web客户端,它可以将json转换为geojson并来回转换,也可以将geojson转换为shapefile。
您还可以在Github上看到Esri的geojson-utils,其中“包含[javascript]实用程序,可将GeoJSON转换为其他地理json格式,反之亦然。目前仅开发了将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/
有关Leaflet和ArcGIS的更多信息。
您可以得到支持ArcGIS Server的此fork。
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和Leaflet 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
有两种方法可以做
注意:在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是您命名的库名称
这将成为全局变量名称,可在浏览器中使用。
诀窍是,bundle进程会添加即时执行函数,例如(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-to-1转换为1。
如果它是一次性查询,并且您没有超过1000个功能,请尝试使用添加矢量层将其粘贴到qgis中-选择协议,然后将以下arcgis rest URL替换为您的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
如果您需要将ArcServer服务作为GeoJSON返回,以便在所需的任何映射技术中使用,我强烈建议您查看此GitHub问题对话框。
我不会在这里重复对话,因为那样会浪费时间。您可以直接从Esri那里清楚地列出您的选择。
arcgis服务器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查询页面,您会看到geojson是选项,因为您是查询特定图层的layerID = 0
http://services3.arcgis.com/your_token/arcgis/rest/services/Parcels/FeatureServer/0/query
注意:请记住在URL空间参考ID中设置那两个参数:outSR = 4326&f = geojson,srid = 4326,因为网络地图都使用此参数,f表示格式,f = pgeojson和f = geojson都可以使用。如果未设置outSR = 4326,则默认情况下,arcgis服务器rest api将不使用4326,而是使用其他名称,只有4326具有单位度数,这在大多数Web地图中都使用。其他格式不适用于网络地图。
顺便说一句,对于那些想将Arcgis Server 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