總結:一、地圖的基本操作
我們需要用到 navigation.js
載入相關的模組:esri/toolbars/navigation
1、
//建立基本小工具
var navToolbar = new Navigation(map); //放大 navToolbar.activate(Navigation.ZOOM_OUT); //縮小 navToolbar.activate(Navigation.ZOOM_IN); //漫遊 navToolbar.activate(Navigation.PAN);
2、禁止地圖平移、放大、縮小等
//一般我會這樣寫
map.on("load", function () { var div = document.getElementById("mapDiv_zoom_slider").style; div.visibility = "collapse"; //隱藏地圖左上角的放大縮小按鈕 map.disablePan();//禁止拖放 map.disableScrollWheelZoom();//禁止滾輪縮放 map.disableShiftDoubleClickZoom();//禁止shift map.disableDoubleClickZoom();//滑鼠雙擊縮放 });
3、鷹眼圖、比例尺、實時座標等
(1)、鷹眼圖
載入: "esri/dijit/OverviewMap",
var overviewMap = new OverviewMap({ map: map, visible: true, //初始化可見,預設為false attachTo: "bottom-left",//位置,預設右上,放在左下 width: 250, height: 150, opacity: 0.3,//透明度 maximizeButton: true, //最大化/最小化按鈕,預設false expandEactor: 2, //概覽地圖和總覽圖上顯示的程度矩形的大小之間的比例。預設值是2,這意味著概覽地圖將至少是兩倍的大小的程度矩形。 color: "#000000" }); overviewMap.startup();
(2)、比例尺
載入:
"esri/dijit/Scalebar",//比例尺
//比例尺的幹活~~~ var scalebar = new Scalebar({ map: map, width: 11, scalebarStyle: "ruler",//line 比例尺樣式型別 attachTO: "bottom-right", scalebarUnit: "metric"//顯示地圖的單位,這裡是km });
(3)、獲取地圖座標,即滑鼠移動到哪裡,實時顯示座標
//首先要給地圖繫結一個滑鼠移上事件
map.on("mouse-move",showCoordinates);
function showCoordinates(evt) { //the map is in web mercator but display coordinates in geographic (lat, long) var mp = evt.mapPoint; //display mouse coordinates dom.byId("jwd").innerHTML = "當前座標為:" + mp.x.toFixed(3) + ", " + mp.y.toFixed(3); }
滑鼠點選獲取經緯度:
map.on("click",function(evt){
console.log(evt.mapPoint);
})
設定地圖的初始範圍大小
var startExtent = new Extent(XMin,YMin, XMax, YMax,
new SpatialReference({
wkid : 4326
}));
map.setExtent(startExtent);
設定地圖的中心點
map.centerAndZoom(point,18);
18是代表縮放的level
4、 通過arcgis js呼叫天地圖
同樣,我們把js放到arcgis js api同個目錄下
require([
//天地圖
"tdlib/TDTLayer",
"tdlib/TDTAnnoLayer",
"tdlib/TDT_ImgLayer",
"tdlib/TDT_ImgAnnoLayer",
"dojo/domReady!"
],function(TDTLayer,TDTAnnoLayer,TDT_ImgLayer,TDT_ImgAnnoLayer){
var tdtLayer =new TDTLayer();
var tdtAnnoLayer =new TDTAnnoLayer();
var tdtImgLayer =new TDT_ImgLayer();
var tdtImgAnnoLayer =new TDT_ImgAnnoLayer();
map.addLayer(tdtLayer);
map.addLayer(tdtAnnoLayer);
map.addLayer(tdtImgLayer);
map.addLayer(tdtImgAnnoLayer);
//先隱藏影像圖
tdtImgLayer.hide();
tdtImgAnnoLayer.hide();
//這裡順便也把影像和向量切換一起說了
//切換向量
tdtLayer.show();
tdtAnnoLayer.show();
tdtImgLayer.hide();
tdtImgAnnoLayer.hide();
//切換影像
tdtLayer.hide();
tdtAnnoLayer.hide();
tdtImgLayer.show();
tdtImgAnnoLayer.show();
})
5、測量實戰
(1)、arcgis js 自帶的測量工具
首先有個測量工具的容器,一開始為隱藏
#measurementDiv{
position: absolute;
background: #fff;
border: 1px solid #ddd;
margin-top:10px;
border-radius: 5px;
width: 278px;
height: auto;
padding:10px;
margin-left:50px;
right: 106px;
top:57px;
display:none;
z-index:1;
}
<div id="measurementDiv"></div>
啟動測量小工具
//測量小工具
var measurement = new Measurement({
map: map,
defaultAreaUnit: Units.SQUARE_KILOMETERS,
defaultLengthUnit: Units.KILOMETERS
}, dom.byId("measurementDiv"));
measurement.startup();
當你點選測量時:
dom.byId("measurementDiv").style.display = dom.byId("measurementDiv").style.display == "block"?"none":"block";
navToolbar.deactivate();
(2)、面對需求測面和測線分開時:可以用另一種方法實現測量的功能,即使用GeometryService
需要用到的模組:
"esri/geometry/webMercatorUtils",
"esri/tasks/GeometryService",
"esri/symbols/Font",
"esri/symbols/SimpleMarkerSymbol",
"esri/symbols/SimpleLineSymbol",
"esri/Color",
"esri/toolbars/draw",
"esri/symbols/TextSymbol",
"esri/graphic", "esri/layers/GraphicsLayer",
"esri/tasks/LengthsParameters", "esri/geometry/Polyline", "esri/geometry/Polygon", "esri/geometry/Point", "dojo/number", "esri/symbols/SimpleFillSymbol", "esri/tasks/AreasAndLengthsParameters", "esri/tasks/ProjectParameters", "esri/units", "esri/SpatialReference",
首先初始化引數:
var geometryService = new GeometryService("http://localhost:6080/arcgis/rest/services/Utilities/Geometry/GeometryServer");
var startFont = new Font('12px').setWeight(Font.WEIGHT_BOLD);//定義文字樣式
var makerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_CIRCLE,8, new
SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,new
Color([204,102,51]),1),new Color([158.184,71,0.65]));//定義標記點樣式
var toolbar_mesure = new Draw(map);
//
直接上程式碼了,我有點累了,今晚不想弄太晚了,
//長度量算
function distanceMeasure() {
map.enableScrollWheelZoom();
disFun=true;
areaFun=false;
toolbar_mesure.activate(Draw.POLYLINE);
}
//面積量算
function areaMeasure() {
map.enableScrollWheelZoom();
disFun=false;
areaFun=true;
toolbar_mesure.activate(Draw.POLYGON);
}
//生成兩點之間的連線
toolbar_mesure.setLineSymbol(new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,new Color([255,0,0]),2));
// 量算功能觸發
map.on("click",function (evt) {
mapClick(evt);
});
//觸發完成的事件
toolbar_mesure.on("draw-end",function (evt) {
addToMap(evt);
});
//生成兩點之間的連線
toolbar_mesure.setLineSymbol(new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,new Color([255,0,0]),2));
//量算函式
function mapClick(evt) {
if(disFun){
inputPoints.push(evt.mapPoint);
var textSymbol;
if(inputPoints.length ===1){
textSymbol = new TextSymbol("起點",startFont,new Color([204,102,51]));
textSymbol.setOffset(0,-20);
map.graphics.add(new Graphic(evt.mapPoint,textSymbol));
}
map.graphics.add(new Graphic(evt.mapPoint,makerSymbol));
if(inputPoints.length >=2){
// 設定距離測量的引數
var lengthParams = new LengthsParameters();
lengthParams.distanceUnit = GeometryService.UNIT_METER;
lengthParams.calculationType = "preserveShape";
var p1 = inputPoints[inputPoints.length-2];
var p2 = inputPoints[inputPoints.length-1];
if(p1.x ===p2.x &&p1.y===p2.y){
return;
}
// z在兩點之間劃線將兩點連結起來
var polyline = new Polyline(map.spatialReference);
polyline.addPath([p1,p2]);
lengthParams.polylines=[polyline];
// 根據引數,動態的計算長度
geometryService.lengths(lengthParams,function(distance){
var _distance = number.format(distance.lengths[0]/1000);
totleDistance+=parseFloat(_distance);//計算總長度
var beetwentDistances = _distance+"千米";
var tdistance = new TextSymbol(beetwentDistances,startFont,new Color([204,102,51]));
tdistance.setOffset(40,-3);
map.graphics.add(new Graphic(p2,tdistance));
if(totalGraphic){
map.graphics.remove(totalGraphic);
}
var total=number.format(totleDistance,{
pattern:"#.000"
});
// 設定總長度的顯示樣式,並新增到地圖上
var totalSymbol=new TextSymbol("總長度:"+total+"千米",startFont,new Color([204,102,51]));
totalSymbol.setOffset(40,-15);
totalGraphic= map.graphics.add(new Graphic(p2,totalSymbol));
});
}
}
}
// 新增圖形函式
function addToMap(evt) {
if(disFun||areaFun){
var geometry = evt.geometry;//繪製圖形的geometry
console.log(geometry);
//將繪製的圖形新增到地圖上去
var symbol = null;
switch (geometry.type){
case "point":
symbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_CIRCLE,10,
new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,new Color([255,0,0]),1),
new Color([0,255,0,0.25]));
break;
case "polyline":
symbol = new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
new Color([255,0,0,0.8]),2);
break;
case "polygon":
symbol = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID,
new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,new Color([255,0,0]),2),
new Color([255,255,0,0.25]));
break;
case "extent":
symbol = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID,
new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,new Color([255,0,0]),2),
new Color([255,255,0,0.25]));
break;
}
map.graphics.add(new Graphic(geometry,symbol));
if(disFun){
inputPoints.splice(0,inputPoints.length);//刪除陣列中的所有元素
totleDistance =0.0;
totalGraphic = null;
}
else if(areaFun){
//設定面積和長度的引數
var areasAndLengthsParameters =new AreasAndLengthsParameters();
areasAndLengthsParameters.lengthUnit = GeometryService.UNIT_METER;//設定距離單位
areasAndLengthsParameters.areaUnit = GeometryService.UNIT_SQUARE_KILOMETERS;//設定面積單位
this.outSR = new esri.SpatialReference({ wkid: 102113 });
geometryService.project([geometry], this.outSR, function (geometry) {
/*console.log(geometry[0]);
console.log(geometry.getCentroid());*/
geometryService.simplify(geometry, function (simplifiedGeometries) {
areasAndLengthsParameters.polygons = simplifiedGeometries;
// areasAndLengthsParameters.polygons[0].spatialReference = new esri.SpatialReference(4490);
geometryService.areasAndLengths(areasAndLengthsParameters,function (result) {
console.log(areasAndLengthsParameters.polygons[0]);
console.log(result.areas);
var font =new Font("16px",Font.STYLE_NORMAL,Font.VARIANT_NORMAL,Font.WEIGHT_BOLDER);
var areaResult = new TextSymbol(number.format(result.areas,{
pattern:'#.000'
})+"平方公里",font,new Color([204,102,51]));
var spoint = new Point(areasAndLengthsParameters.polygons[0].getExtent().getCenter().x,areasAndLengthsParameters.polygons[0].getExtent().getCenter().y,new SpatialReference({ wkid:102113 }));
var point_center;
var PrjParams = new ProjectParameters();
PrjParams.geometries = [spoint];
PrjParams.outSR = new SpatialReference({wkid: 4490});
geometryService.project(PrjParams, function (outputpoints) {
point_center = new Point(outputpoints[0].x,outputpoints[0].y,new SpatialReference({ wkid:4326 }));
//alert("經度:"+outputpoints[0].x+",緯度:"+ outputpoints[0].y);
map.graphics.add(new Graphic(point_center,areaResult));//在地圖上顯示測量的面積
});
console.log(spoint);
});
});
});
}
}
}
好了,今天的arcgis js總結就到這裡,我去整理下前段時間頭疼的arcsde 連線oracle = =
加油!你是最胖的~