google maps提供了与arcgis的接口,实现了google maps 与arcgis结合
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Google Maps Adapter to ArcGIS Server Map Cache</title>
<!-- replace your key -->
<script src="http://maps.google.com/maps?file=api&v=2.x&key=ABQIAAAAGY8Xhrw1zw6Ia3dwUJVxKRT_Dik9yxNP5XbRDcNbZKLa1CrDkxRDjJast2WNsqXjiEGPt_8s229nyw"
type="text/javascript"></script>
<style type="text/css">
html, body { margin: 0px; height: 100%;}
</style>
<script type="text/javascript">
function LCC(params){
/*=========parameters=================*/
params=params||{};
this.name=params.name||"LCC";
var _a = (params.semi_major ||6378137.0 )/(params.unit||0.3048006096012192);
var _f_i=params.inverse_flattening||298.257222101;//this.
var _phi1 = (params.standard_parallel_1||34.33333333333334) * (Math.PI / 180);
var _phi2 = (params.standard_parallel_2||36.16666666666666) * (Math.PI / 180);
var _phiF = (params.latitude_of_origin||33.75) * (Math.PI / 180);
var _lamdaF = (params.central_meridian||-79.0)* (Math.PI / 180);
var _FE = params.false_easting||2000000.002616666;//this.
var _FN = params.false_northing||0.0;//this.
/*========== functions to calc values, potentially can move outside as static methods=========*/
var calc_m = function(phi, es){
var sinphi = Math.sin(phi);
return Math.cos(phi) / Math.sqrt(1 - es * sinphi * sinphi);
};
var calc_t = function(phi, e){
var esinphi = e * Math.sin(phi);
return Math.tan(Math.PI / 4 - phi / 2) / Math.pow((1 - esinphi) / (1 + esinphi), e / 2);
};
var calc_r = function(a, F, t, n){
return a * F * Math.pow(t, n)
};
var calc_phi = function(t_i, e, phi){
var esinphi = e * Math.sin(phi);
return Math.PI / 2 - 2 * Math.atan(t_i * Math.pow((1 - esinphi) / (1 + esinphi), e / 2));
};
var solve_phi = function(t_i, e, init){
// iteration
var i = 0;
var phi = init;
var newphi = calc_phi(t_i, e, phi);//this.
while (Math.abs(newphi - phi) > 0.000000001 && i < 10) {
i++;
phi = newphi;
newphi = calc_phi(t_i, e, phi);//this.
}
return newphi;
}
/*=========shared, not point specific params or intermediate values========*/
var _f = 1.0 /_f_i;//this.
/*e: eccentricity of the ellipsoid where e^2 = 2f - f^2 */
var _es = 2 * _f - _f * _f;
var _e = Math.sqrt(_es);
var _m1 = calc_m(_phi1, _es);//this.
var _m2 = calc_m(_phi2, _es);//this.
var _tF = calc_t(_phiF, _e);//this.
var _t1 = calc_t(_phi1, _e);//this.
var _t2 = calc_t(_phi2, _e);//this.
var _n = Math.log(_m1 / _m2) / Math.log(_t1 / _t2);
var _F = _m1 / (_n * Math.pow(_t1, _n));
var _rF = calc_r(_a, _F, _tF, _n);//this.
this.forward = function(latlng){
var phi = latlng[1] * (Math.PI / 180);
var lamda = latlng[0] * (Math.PI / 180);
var t = calc_t(phi, _e);//this.
var r = calc_r(_a, _F, t, _n);//this.
var theta = _n * (lamda - _lamdaF);
var E = _FE + r * Math.sin(theta);
var N = _FN + _rF - r * Math.cos(theta);
return [E, N];
};
this.inverse = function(xy){
var E = xy[0];
var N = xy[1];
var theta_i = Math.atan((E - _FE) / (_rF - (N - _FN)));
var r_i = (_n > 0 ? 1 : -1) * Math.sqrt((E - _FE) * (E - _FE) + (_rF - (N - _FN)) * (_rF - (N - _FN)));
var t_i = Math.pow((r_i / (_a * _F)), 1 / _n);
var phi = solve_phi(t_i, _e, 0);//this.
var lamda = theta_i / _n + _lamdaF;
return [lamda * (180 / Math.PI), phi * (180 / Math.PI)];
};
this.circum = function(){
return Math.PI * 2 * _a;
};
}
function GMapCacheProjection(params){
params = params||{};
this.zoomOffset = params.zoomOffset||10;
this.originX = params.originX || 0;
this.originY = params.originY || 2000000;// pixel Y increase downwards.
this.projection = params.projection||new LCC();
this.resolutions = params.resolutions||[434.027777777778,
217.013888888889, 108.506944444444, 55.5555555555556,
27.7777777777778, 13.8888888888889, 6.94444444444444,
3.47222222222222,1.73611111111111,1,0.5] ; // units/pixel
this.bounds = params.bounds||null;
}
GMapCacheProjection.prototype = new GProjection();
GMapCacheProjection.prototype.fromLatLngToPixel = function(latlng, zoom){
if (latlng == null)
return null;
var coords = this.projection.forward([latlng.lng(), latlng.lat()]);
var zoomInx = zoom - this.zoomOffset;
var x = Math.round((coords[0] - this.originX) / this.resolutions[zoomInx]);
var y = Math.round((this.originY - coords[1]) / this.resolutions[zoomInx]);
return new GPoint(x, y);
};
GMapCacheProjection.prototype.fromPixelToLatLng = function(pixel, zoom, unbound){
if (pixel == null)
return null;
var zoomInx = zoom - this.zoomOffset;
var x = pixel.x * this.resolutions[zoomInx] + this.originX;
var y = this.originY - pixel.y * this.resolutions[zoomInx];
var geo = this.projection.inverse([x, y]);
return new GLatLng(geo[1], geo[0]);
};
GMapCacheProjection.prototype.tileCheckRange = function(tile, zoom, tilesize){
var b=this.bounds;
if (!b||b==null) return true;
var zoomInx = zoom - this.zoomOffset;
var minX = tile.x * tilesize * this.resolutions[zoomInx] + this.originX;
var minY = this.originY - (tile.y + 1) * tilesize * this.resolutions[zoomInx];
var maxX = (tile.x + 1) * tilesize * this.resolutions[zoomInx] + this.originX;
var maxY = this.originY - tile.y * tilesize * this.resolutions[zoomInx];
return ! (b.minX>maxX||b.maxX<minX||b.maxY<minY||b.minY>maxY);
};
// This is the X sizes in pixel of the earth under this projection.
GMapCacheProjection.prototype.getWrapWidth = function(zoom){
var zoomInx = zoom - this.zoomOffset;
return this.projection.circum() / this.resolutions[zoomInx];
}
// To realworld coordinates, not required for GProjection implementation
GMapCacheProjection.prototype.fromLatLngToCoords = function(latlng){
var xy = this.projection.forward([latlng.lng(), latlng.lat()]);
return new GPoint(xy[0], xy[1]);
};
GMapCacheProjection.prototype.fromCoordsToLatLng = function(coords){
var geo = this.projection.inverse([coords.x, coords.y]);
return new GLatLng(geo[1], geo[0]);
};
//==========end GMapCacheProjection code ==================/
function initialize() {
if (GBrowserIsCompatible()) {
//This is state plane north carolina NAD83 feet.
var prj=new LCC({semi_major:6378137.0,
inverse_flattening:298.257222101,
standard_parallel_1:34.33333333333334,
standard_parallel_2:36.16666666666666,
central_meridian:-79.0,
latitude_of_origin: 33.75,
false_easting:2000000.002616666,
false_northing:0,
unit:0.3048006096012192});
// This is the tile scheme info. values can be derived from conf.xml in the cache folder
var params={
zoomOffset:10,
originX:0,
originY:2000000,
projection:prj,
resolutions:[
434.027777777778, 217.013888888889, 108.506944444444,
55.5555555555556,27.7777777777778,13.8888888888889,
6.94444444444444,3.47222222222222,1.73611111111111]
};
var gprj=new GMapCacheProjection(params);
//create a layer
var acopy=new GCopyrightCollection('Data ');
acopy.addCopyright(new GCopyright(1, new GLatLngBounds(new GLatLng(34.9642,-81.1470), new GLatLng(35.5870,-80.5079)), 0, 'Copyright(c) 2008 City of Charlotte, Mecklenburg County, NC'));
var agsLayer1= new GTileLayer(acopy, params.zoomOffset, (params.zoomOffset+params.resolutions.length-1));
agsLayer1.getTileUrl = function(tile,zoom){
return 'http://mt'+((tile.x+tile.y)%4)+'.charmeck.org/mapcache/PLAN_zoning/Layers/_alllayers/L'+('00'+(zoom-params.zoomOffset).toString(10)).substring(('00'+(zoom-params.zoomOffset).toString(10)).length-2)+'/R'+('00000000'+tile.y.toString(16)).substring(('00000000'+tile.y.toString(16)).length-8)+'/C'+('00000000'+tile.x.toString(16)).substring(('00000000'+tile.x.toString(16)).length-8)+'.png';
}
// create a MapType
var agsMap1 = new GMapType([agsLayer1],gprj,'Zoning', {tileSize: 512});
var agsLayer2= new GTileLayer(acopy, 10, 17);
agsLayer2.getTileUrl = function(tile,zoom){
return 'http://mt'+((tile.x+tile.y)%4)+'.charmeck.org/mapcache/GET_Aerial/Layers/_alllayers/L'+('00'+(zoom-10).toString(10)).substring(('00'+(zoom-10).toString(10)).length-2)+'/R'+('00000000'+tile.y.toString(16)).substring(('00000000'+tile.y.toString(16)).length-8)+'/C'+('00000000'+tile.x.toString(16)).substring(('00000000'+tile.x.toString(16)).length-8)+'.jpg';
}
var agsMap2 = new GMapType([agsLayer2],gprj,'2007 Aerial', {tileSize: 512});
var map= new GMap2(document.getElementById("map_canvas"), {mapTypes:[agsMap1, agsMap2]});
// make sure change to your latlng if not in Charlotte, NC.
map.setCenter(new GLatLng(35.249208, -80.843099), 11);
map.addControl(new GMapTypeControl());
map.addControl(new GLargeMapControl ());
map.addControl(new GScaleControl());
map.enableDoubleClickZoom();
map.enableContinuousZoom();
map.enableScrollWheelZoom();
}
}
</script>
</head>
<body onload="initialize()" onunload="GUnload();">
<div id="map_canvas" style="width: 100%; height: 100%">
</div>
</body>
</html>
分享到:
相关推荐
将ArcGIS与Silverlight结合,可以利用其强大的地图渲染和地理处理功能,同时享受到Silverlight提供的用户界面和动画支持。 加载Google Maps切片数据到ArcGIS for Silverlight的过程主要包括以下几个步骤: 1. **...
要将Google Maps与ArcGIS Server结合,你需要在Flex应用中创建一个地图容器,既可以显示ArcGIS服务,也可以显示Google地图。 以下是一些关键步骤: 1. **配置环境**:确保已经正确安装了Flex Builder或相关IDE,并...
总之,通过ArcGIS API 4.10加载谷歌地图,开发者可以将谷歌地图的强大功能与ArcGIS的GIS特性相结合,创造出更加丰富的地图应用。这需要对两个API都有深入的理解,以及一定的JavaScript编程技巧。希望以上内容能帮助...
至于KML(Keyhole Markup Language),这是一种用于存储地理位置和元数据的XML格式,常用于Google Earth和Google Maps。在OpenLayers中,你可以使用KML Layer来加载和显示KML文件,这提供了另一种丰富地图内容的方法...
例如,Google Maps的用户界面和导航功能与ArcGIS Server的强大地图处理和空间分析能力相结合,可以创建出功能丰富的混合地图应用。这种集成可以帮助开发者在不牺牲地图功能的情况下,利用Esri的GIS服务。 ...
而JavaScript(js)作为Web开发的主流语言,与ArcGIS结合,可以构建交互式的Web地图应用。本Demo主要展示了如何使用ArcGIS JavaScript API来调用三种常见的地图服务:Google地图、百度地图和天地图。下面我们将详细...
本教程将详细介绍如何使用JS与ArcGIS结合,调用各种地图服务,包括谷歌地图、百度地图、天地图、腾讯地图以及Mapabc地图。 首先,理解ArcGIS JavaScript API是关键。这个API允许开发者通过JavaScript代码在网页上...
开发者可以结合其他开源库(如Google Maps API)进行混合开发,打造个性化的地理信息解决方案。 总之,ArcGIS for Android 10.2.7是Android开发者的有力工具,它不仅提供了全面的GIS功能,还具有良好的兼容性和灵活...
### Google maps for ArcMap ...通过以上步骤,用户可以顺利地安装和使用Google maps for ArcMap Extension (for 9.2及9.3),有效地将Google Maps的图层与ArcMap结合使用,提高地理信息系统工作的效率和便捷性。
发布MapServices后,需要按照ArcGISOnline、BingMaps或GoogleMaps的方式执行切片。切片完成后,可以在API中使用服务地址来加载切片服务。 4. 地形服务的发布和部署 地形服务的发布仍通过GlobeService方式完成,发布...
- **定位服务**: 支持GPS定位,集成Google Maps、OpenStreetMap等多种定位服务。 - **地理编码和反向地理编码**: 能够将地址转换为坐标(地理编码)和将坐标转换为地址(反向地理编码)。 - **地理处理任务**: ...
2. **ArcGIS Extension for Bing Maps**:将Microsoft Bing Maps的地图制图功能与ArcGIS Server的功能相结合,允许开发者利用通过ArcGIS Server创建的服务。 3. **ArcGIS Extension for the Google Maps API**:扩展...
JavaScript APIs不仅可以直接与ArcGIS Server交互,还支持扩展Microsoft VirtualEarth和Google Maps的JavaScript APIs,从而实现跨平台的地图服务整合。 4. **Mobile ADF** - 为了适应移动设备的GIS应用需求,9.3版...
介绍ArcGIS9.2与Google Earth中Google maps所提供的地理数据应用程序接口(API);重点介绍GOOGLE.EARTH与其它遥感软件互操作与数据下载的使用方法及GOOGLE.EARTH遥感图像数据共享。 主讲人:GIS硕士、南京路川公司...
"谷歌地图"则是全球广泛使用的在线地图服务,开发者可以利用Google Maps API在Android应用中集成谷歌地图,提供全球范围的地理信息展示。 加载SHP文件是另一个重要的测试项目。SHAP是ESRI定义的一种矢量数据格式,...
通过结合Google Maps API与DOM(Document Object Model),开发者能够实现企业地理信息的加载、用户交互的增强以及地图数据的修正。二次开发的具体步骤包括但不限于: - **加载企业地理信息**:根据企业的业务需求...
这个Demo对于学习如何将第三方地图服务集成到ArcGIS应用中具有参考价值,同时也展示了C#和ArcGIS SDK的结合使用。开发者可以通过源码学习如何在实际项目中处理地图数据的获取和展示,这对于GIS应用的开发人员来说是...
例如,通过ArcGIS Server REST API,可以将Google Earth、Virtual Earth等第三方地图服务与ArcGIS Server的地图服务结合在一起,实现数据的无缝融合和展示。 #### 六、支持的Web客户端 ArcGIS Server支持多种Web...