是否有人知道处理此问题的转换脚本或工具?
如果没有,我计划创建一个脚本将ArcServer JSON对象转换为GeoJSON。
#1 楼
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。
参考:http://www.gdal.org/drv_geojson.html
评论
我下载了FWTools。当我运行该命令时,出现以下错误,提示“无法在此处打开数据源“我的URL””。 -> ESRI Shapefile-> MapInfo文件-> UK .NTF-> SDTS->老虎-> S57-> DGN-> VRT-> REC->内存-> 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”之类的内容。
–鞣剂
2011年8月3日在20:15
@Tanner:FWTools随附OGR v1.7,其中v1.8.0添加了GeoJSON支持。我在这里运行GDAL / OGR 1.9dev,尽管不是通过FWTools。我想我是从gisinternals.com/sdk获得的
– Sasa Ivetic
2011年8月3日在20:33
谢谢。我让它在命令行上工作。我仍在努力使其能够在我的Javascript中运行-任何提示将不胜感激。
–鞣剂
2011年8月4日在18:03
@Tanner您如何克服这个错误?对我来说这不是版本问题,但我在Windows机器上却遇到了相同的错误
–kflaw
16年6月22日在19:45
@kflaw抱歉,我不记得确切。我想我只是在命令行上使用了ogr2ogr,而无需使用FWTools。
–鞣剂
16年6月23日在17:19
#2 楼
您还可以在Github上看到Esri的geojson-utils,其中“包含[javascript]实用程序,可将GeoJSON转换为其他地理json格式,反之亦然。目前仅开发了将GeoJSON转换为Esri JSON。此外,请注意,只有WGS84坐标系中的几何受支持。“评论
更新12/2017:不推荐使用geojson-utils。参见arcgis-to-geojson-utils或terraformer
– GavinR
17年12月11日14:44
#3 楼
现在,ArcGIS现在支持GeoJSONArcGIS Server(自10.4起),并且ArcGIS Online通过ArcGIS Rest API URL具有GeoJSON。您只需要在URL中设置
f=geojson
并配置服务即可。请注意,默认情况下,在您明确允许其他输出格式之前,ArcGIS Online将不允许GeoJSON导出。以下是启用导出的方法:
登录到ArcGIS Online
单击要素图层,
单击“设置”选项卡
选中显示“
导出数据
”的复选框,以允许其他人导出为不同格式。
5。保存并等待几分钟。
在查询页面中,您应该看到带有GeoJSON选项的输出格式下拉列表。旧的叫做
json
。这里是新闻发布,宣布2014年12月的功能
您可以在此处看到他们的GeoJSON示例
这是一个带有可自定义选项的HTML论坛,向您显示了ArcGIS API的功能
评论
轻松休息服务与ArcGIS Server休息服务是否不同?只能由agol提供geoJSON作为休息服务,而不提供服务器吗?
– jotamon
18年3月29日在23:57
我刚刚编辑了答案,希望很快就会显示出来,从10.4开始,ArcGIS Server也支持该答案。
– Philip Nagel
20年7月9日,下午1:36
#4 楼
从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;>
源:
http://mapbutcher.com / blog /?p = 62
评论
如果要进行转换,则应使用ogr2ogr
–埃文·卡洛尔(Evan Carroll)
17年1月12日在7:36
“ *可能要为Leaflet javascript进行修改”-是否有更新? (而且,地图屠夫URL是404 :-(
–莫格说要恢复莫妮卡
20-11-10在21:09
#5 楼
传单和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图像服务和传单
http://blog.geomusings.com/2012/04/17/arcgis-image-services-and-leaflet/
#6 楼
它通常*非常容易转换。我制作了一个脚本https://github.com/calvinmetcalf/esri2geo,还有其他脚本也能很好地工作。
*例外是具有孔的多部分多边形,在不进行某些地理处理的情况下不会将其一对一转换。
#7 楼
我已经构建了一个服务器对象扩展,可以从ArcGIS Server地图服务生成GeoJSON。它已经在10.1和10.2上进行了测试,但是还没有过测试。 https://github.com/geobabbler/AGSOpenFormats#8 楼
对于一次转换,我将使用@Sasa Ivetic可接受的答案,但需要实时进行,Terraformer为此进行了体面的工作。不幸的是,默认情况下它仅适用于单个功能,因此对于多个功能,您需要遍历数组并为每个功能添加一个ID:除了多部分多边形(即阿拉斯加及其岛)以外,但是我对此并不陌生,所以可能我编写的代码不正确!
#9 楼
将ArcGIS JSON转换为GeoJSON在纯浏览器中有两种方法
1)TERRAFORMER
注意:在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。您的根目录中的bundle.js文件。
现在在浏览器html文件中,包含此bundle.js文件
$ rollup index.js --format umd --name "esri_arcgis_to_geojson" --file bundle.js
您可以使用现在通过
<script src='.../.../.../bundle.js'>
记住esri_arc gis_to_geojson是您命名为lib的名称。
这将成为全局变量名称,可在浏览器中使用。 })是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
arcgis-to-geojson-utils
#10 楼
如果它是一次性查询,并且您没有超过1000个功能,请尝试使用添加矢量层将其粘贴到qgis中-选择协议,并将此arcgis rest 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#11 楼
我在https://observablehq.com/@thadk/arcgis-json-parser-to-geojson的浏览器中制作了用于ESRI JSON-> GeoJSON转换的ESRI Terraformer工具的网络版本,可以在ArcGIS服务器上根据需要进行自定义不允许您直接将其导出为GeoJSON。#12 楼
也许甚至更容易,您可以使用Esri-leaflet库将本机添加为Leaflet中的图层。
评论
您能否在帖子中加入一个示例,概述此答案是OP的问题?
– Paul
2013年9月26日18:00
#13 楼
如果您需要将ArcServer Service作为GeoJSON返回以在所需的任何映射技术中使用,我强烈建议您查看此GitHub问题对话框。因为那会浪费时间。您可以直接从Esri那里清楚地列出您的选择。#14 楼
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仅具有1层,则layerID = 0 .....
尝试此html查询页面,可以看到geojson是选项,因为您是查询特定图层的layerID = 0
http://services3.arcgis.com/your_token/arcgis/rest/services/Parcels/FeatureServer/0/query
注意:记得设置这2个参数: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与tile服务一起使用的人,
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
评论
我无法让ogr2ogr吃来自MapServer功能查询的ESRI json。 (@SasaIvetic的示例使用FeatureServer请求,并且我需要使用的MapServer结果一定不能互换。)无论如何,此站点完全可以做到:http://ogre.adc4gis.com/