372 lines
13 KiB
JavaScript
372 lines
13 KiB
JavaScript
|
||
//模块:
|
||
var addmarkerWidget = xjsdk.widget.bindClass(xjsdk.widget.BaseWidget.extend({
|
||
viewer: null, //框架会自动对map赋值
|
||
options: {
|
||
resources: ['map.css'],
|
||
//弹窗
|
||
view: {
|
||
type: "window",
|
||
url: "view.html",
|
||
windowOptions: {
|
||
width: 300,
|
||
height: 400
|
||
}
|
||
}
|
||
},
|
||
drawControl: null,
|
||
//初始化[仅执行1次]
|
||
create: function () {
|
||
this.drawControl = new xjsdk.Draw(this.viewer, {
|
||
hasEdit: false,
|
||
});
|
||
|
||
//事件监听
|
||
var that = this;
|
||
this.drawControl.on(xjsdk.draw.event.DrawCreated, function (e) {
|
||
var entity = e.entity;
|
||
that.bindMarkerEx(entity);
|
||
});
|
||
this.drawControl.on(xjsdk.draw.event.EditMovePoint, function (e) {//编辑修改了点
|
||
var entity = e.entity;
|
||
|
||
that.saveEntity(entity);
|
||
});
|
||
|
||
//添加到图层控制
|
||
if (window.bindToLayerControl) {
|
||
this.layerWork = bindToLayerControl({
|
||
pid: 0,
|
||
name: '我的标记',
|
||
visible: true,
|
||
onAdd: function () {//显示回调
|
||
that.drawControl.setVisible(true);
|
||
},
|
||
onRemove: function () {//隐藏回调
|
||
that.drawControl.setVisible(false);
|
||
},
|
||
onCenterAt: function (duration) {//定位回调
|
||
var arr = that.drawControl.getEntitys();
|
||
that.viewer.flyTo(arr, { duration: duration });
|
||
},
|
||
});
|
||
}
|
||
|
||
this.getList();
|
||
},
|
||
viewWindow: null,
|
||
//每个窗口创建完成后调用
|
||
winCreateOK: function (opt, result) {
|
||
this.viewWindow = result;
|
||
},
|
||
//激活插件
|
||
activate: function () {
|
||
this.hasEdit(true);
|
||
},
|
||
//释放插件
|
||
disable: function () {
|
||
this.viewWindow = null;
|
||
this.stopDraw();
|
||
this.hasEdit(false);
|
||
|
||
// //从图层控制中 移除
|
||
// if(this.layerWork){
|
||
// unbindLayerControl(this.layerWork);
|
||
// }
|
||
},
|
||
stopDraw: function () {
|
||
this.drawControl.stopDraw();
|
||
},
|
||
drawPoint: function () {
|
||
this.stopDraw();
|
||
this.drawControl.startDraw({
|
||
type: "billboard",
|
||
style: {
|
||
scale: 1,
|
||
image: this.path + "img/marker.png"
|
||
}
|
||
});
|
||
},
|
||
editable: false,
|
||
hasEdit: function (val) {
|
||
this.editable = val;
|
||
this.drawControl.hasEdit(val);
|
||
},
|
||
bindMarkerEx: function (entity) {
|
||
if (entity == null || entity.position == null) return;
|
||
entity.attribute.attr = entity.attribute.attr || {};
|
||
entity.attribute.attr.id = "0";//(new Date()).format("yyyyMMddHHmmss");
|
||
entity.attribute.attr.name = "我的标记";
|
||
entity.label = this.getLabelStyle(entity.attribute.attr.name);
|
||
entity.billboard.scaleByDistance = new Cesium.NearFarScalar(1.5e2, 1, 8.0e6, 0.2);
|
||
var that = this;
|
||
this.saveEntity(entity, function () {
|
||
entity.popup = {
|
||
html: function (entity) {
|
||
return that.getMarkerInhtml(entity.attribute.attr);
|
||
},
|
||
anchor: [0, -35]
|
||
};
|
||
that.viewer.xjsdk.popup.show(entity, entity.position._value);
|
||
});
|
||
},
|
||
//========================
|
||
saveEditFeature: function (id) {
|
||
var entity = this.drawControl.getEntityById(id);
|
||
|
||
entity.attribute.attr = entity.attribute.attr || {};
|
||
entity.attribute.attr.name = $.trim($("#addmarker_attr_name").val());
|
||
entity.attribute.attr.remark = $.trim($("#addmarker_attr_remark").val());
|
||
|
||
this.viewer.xjsdk.popup.close();
|
||
entity.label.text = entity.attribute.attr.name;
|
||
|
||
this.saveEntity(entity);
|
||
},
|
||
deleteEditFeature: function (id) {
|
||
var entity = this.drawControl.getEntityById(id);
|
||
this.drawControl.deleteEntity(entity);
|
||
|
||
this.viewer.xjsdk.popup.close();
|
||
this.viewWindow.refMarkerList();
|
||
|
||
//服务端存储
|
||
if (window.hasServer) {
|
||
sendAjax({
|
||
url: 'map/mark/' + id,
|
||
type: "delete",
|
||
success: function (data) {
|
||
}
|
||
});
|
||
}
|
||
else {//浏览器本地存储
|
||
var storagedata = this.getJsonData();
|
||
haoutil.storage.add(this.storageName, storagedata);
|
||
}
|
||
},
|
||
getMarkerDataList: function () {
|
||
var arr = [];
|
||
var arrEntity = this.drawControl.getEntitys();
|
||
for (var i = 0, len = arrEntity.length; i < len; i++) {
|
||
if (!arrEntity[i].attribute.attr.name) arrEntity[i].attribute.attr.name = "我的标记";
|
||
arr.push(arrEntity[i].attribute.attr);
|
||
}
|
||
return arr;
|
||
},
|
||
getMarkerInhtml: function (attr) {
|
||
var inhtml;
|
||
if (this.editable) {
|
||
if (!attr.name || attr.name == "我的标记")
|
||
attr.name = "";
|
||
if (!attr.remark)
|
||
attr.remark = "";
|
||
if (!attr.id)
|
||
attr.id = "0";
|
||
inhtml = '<div class="addmarker-popup-titile">添加标记</div><div class="addmarker-popup-content" ><form >' +
|
||
'<div class="form-group"> <label for="addmarker_attr_name">名称</label><input type="text" id="addmarker_attr_name" class="form-control" value="' + attr.name + '" placeholder="请输入标记名称" /> </div>' +
|
||
'<div class="form-group"> <label for="addmarker_attr_remark">备注</label><textarea id="addmarker_attr_remark" class="form-control" rows="3" style="resize: none;" placeholder="请输入备注(可选填)" >' + attr.remark + '</textarea></div>' +
|
||
'<div class="form-group" style="text-align: center;"><input type="button" class="btn btn-primary btn-sm" value="保存" onclick="addmarkerWidget.saveEditFeature(' + attr.id + ')" />' +
|
||
' <input type="button" class="btn btn-danger btn-sm" value="删除" onclick="addmarkerWidget.deleteEditFeature(' + attr.id + ')" /></div>' +
|
||
'</form></div>';
|
||
} else {
|
||
inhtml = '<div class="addmarker-popup-titile">我的标记</div><div class="addmarker-popup-content" ><form >' +
|
||
'<div class="form-group"><label>名称</label>:' + attr.name + '</div>' +
|
||
'<div class="form-group"><label>备注</label>:' + attr.remark + '</div>' +
|
||
'</form></div>';
|
||
}
|
||
return inhtml;
|
||
},
|
||
centerAt: function (id) {
|
||
var entity = this.drawControl.getEntityById(id);
|
||
if (entity) {
|
||
//参数解释:点数据:radius控制视距距离
|
||
this.viewer.xjsdk.flyTo(entity, { radius: 2500 });
|
||
}
|
||
},
|
||
deleteAll: function () {
|
||
this.drawControl.deleteAll();
|
||
|
||
if (this.viewWindow)
|
||
this.viewWindow.refMarkerList();
|
||
|
||
//服务端存储
|
||
if (window.hasServer && userId) {
|
||
sendAjax({
|
||
url: 'map/mark/del/' + userId,
|
||
type: "delete",
|
||
dataType: "json",
|
||
success: function (data) {
|
||
}
|
||
});
|
||
}
|
||
else {//浏览器本地存储
|
||
//本地存储
|
||
haoutil.storage.del(this.storageName);
|
||
}
|
||
},
|
||
label_font_style: "normal small-caps normal 19px 楷体",
|
||
getLabelStyle: function (name) {
|
||
return new Cesium.LabelGraphics({
|
||
text: name == "" ? "我的标记" : name,
|
||
font: this.label_font_style,
|
||
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
|
||
outlineColor: Cesium.Color.BLACK,
|
||
outlineWidth: 3,
|
||
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
|
||
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
|
||
pixelOffset: new Cesium.Cartesian2(0, -50),
|
||
distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0.0, 200000)
|
||
});
|
||
},
|
||
getJsonData: function () {
|
||
var arr = [];
|
||
var arrEntity = this.drawControl.getEntitys();
|
||
for (var i = 0, len = arrEntity.length; i < len; i++) {
|
||
var entity = arrEntity[i];
|
||
var attr = entity.attribute.attr;
|
||
var coord = xjsdk.draw.attr.billboard.getCoordinates(entity);
|
||
|
||
var item = {
|
||
id: attr.id,
|
||
name: attr.name,
|
||
remark: attr.remark,
|
||
x: coord[0][0],
|
||
y: coord[0][1],
|
||
z: coord[0][2]
|
||
};
|
||
arr.push(item);
|
||
}
|
||
return JSON.stringify(arr);
|
||
},
|
||
jsonToLayer: function (arr, isclear) {
|
||
if (arr == null || arr.length == 0) return;
|
||
if (isclear) {
|
||
this.drawControl.deleteAll();
|
||
}
|
||
|
||
var that = this;
|
||
var arrEntity = [];
|
||
for (var i = 0; i < arr.length; i++) {
|
||
var item = arr[i];
|
||
if (!item.x || !item.y) continue;
|
||
|
||
var attribute = {
|
||
type: "billboard",
|
||
attr: {
|
||
id: item.id || "",
|
||
name: item.name || "",
|
||
remark: item.remark || ""
|
||
},
|
||
style: {
|
||
scale: 1,
|
||
image: this.path + "img/marker.png"
|
||
}
|
||
};
|
||
|
||
if (!isclear) { //叠加时,清除已有同id数据
|
||
var entity = this.drawControl.getEntityById(attribute.attr.id);
|
||
this.drawControl.deleteEntity(entity);
|
||
}
|
||
|
||
var position = Cesium.Cartesian3.fromDegrees(item.x, item.y, item.z || 0.0);
|
||
var entity = this.drawControl.attributeToEntity(attribute, position);
|
||
entity.popup = {
|
||
html: function (entity) {
|
||
return that.getMarkerInhtml(entity.attribute.attr);
|
||
},
|
||
anchor: [0, -35]
|
||
};
|
||
entity.billboard.scaleByDistance = new Cesium.NearFarScalar(1.5e2, 1, 8.0e6, 0.2);
|
||
entity.label = this.getLabelStyle(attribute.attr.name);
|
||
arrEntity.push(entity);
|
||
}
|
||
|
||
this.viewer.flyTo(arrEntity, { duration: 2.0 });
|
||
|
||
if (this.viewWindow)
|
||
this.viewWindow.refMarkerList();
|
||
},
|
||
storageName: "xjsdkgis_addmarker",
|
||
getList: function () {
|
||
var that = this;
|
||
|
||
//读取服务端存储
|
||
if (window.hasServer) {
|
||
var that = this;
|
||
sendAjax({
|
||
url: 'map/mark/list',
|
||
type: 'get',
|
||
success: function (arr) {
|
||
that.jsonToLayer(arr, true);
|
||
}
|
||
});
|
||
}
|
||
else {//读取本地存储
|
||
var laststorage = haoutil.storage.get(this.storageName); //读取localStorage值
|
||
if (laststorage != null && laststorage != 'null') {
|
||
|
||
var arr = JSON.parse(laststorage);
|
||
this.jsonToLayer(arr, true);
|
||
}
|
||
}
|
||
},
|
||
saveEntity: function (entity, endfun) {
|
||
//服务端存储
|
||
if (window.hasServer) {
|
||
var attr = entity.attribute.attr;
|
||
var coord = xjsdk.draw.attr.billboard.getCoordinates(entity);
|
||
var that = this;
|
||
if (attr.id == "0") {//新增
|
||
sendAjax({
|
||
url: 'map/mark/add',
|
||
data: JSON.stringify({
|
||
name: attr.name,
|
||
remark: attr.remark,
|
||
x: coord[0][0],
|
||
y: coord[0][1],
|
||
z: coord[0][2]
|
||
}),
|
||
type: 'post',
|
||
contentType: "application/json",
|
||
success: function (data) {
|
||
entity.attribute.attr.id = data.id;
|
||
if (endfun) endfun();
|
||
that.viewWindow.refMarkerList();
|
||
}
|
||
});
|
||
} else {//修改
|
||
sendAjax({
|
||
url: 'map/mark/update',
|
||
data: JSON.stringify({
|
||
id: attr.id,
|
||
name: attr.name,
|
||
remark: attr.remark,
|
||
x: coord[0][0],
|
||
y: coord[0][1],
|
||
z: coord[0][2],
|
||
}),
|
||
type: 'post',
|
||
contentType: "application/json",
|
||
success: function (data) {
|
||
if (endfun) endfun();
|
||
that.viewWindow.refMarkerList();
|
||
}
|
||
});
|
||
}
|
||
|
||
}
|
||
else {//浏览器本地存储
|
||
if (entity.attribute.attr.id == "0")
|
||
entity.attribute.attr.id = (new Date()).format("yyyyMMddHHmmss");
|
||
|
||
var storagedata = this.getJsonData();
|
||
haoutil.storage.add(this.storageName, storagedata);
|
||
|
||
if (endfun) endfun();
|
||
this.viewWindow.refMarkerList();
|
||
}
|
||
|
||
},
|
||
|
||
|
||
})); |