function CityLandAction(context, id){
this.context = context
this.id = id
this.selected = {}
this.tempVectorLayer = null
this.popup = null
this.obj = new CityLand({
url : context.local_wmts_path
})
}
CityLandAction.prototype = {
clickLock:false,
startStatus : false,
createStatus : false,
create(){
let that = this
this.obj.createTileLayer()
this.tempVectorLayer = this.loadTempVectorLayer()
this.drawMultiPolygon = new DrawMultiPolygon({vector: this.tempVectorLayer, map: this.context.currentMap,wkt: this.context.wkt})
this.popup = new Popup({map: this.context.currentMap,
close(){
that.clickLock = false
},
buttons:[
{"name":"发布任务","click":"pubTask"},{"name":"缩放","click":"fit"}
],
listener: {
info(){
window.location = "/field_point/info"
},
fit(popup, event, ext){
that.context.currentView.fit(ext.getGeometry(),{duration:1000})
},
pubTask(popup, event, ext){
that.saveTask(that, ext)
}
}
});
this.createStatus = true;
},
start(){
if(this.startStatus){
console.log("startStatus is true")
return
}
// this.context.clicks[this.id] = this
this.obj.addTileLayer(this.context.currentMap)
this.context.currentMap.addLayer(this.tempVectorLayer)
this.drawMultiPolygon.show()
this.context.landFilter()
this.context.getSldStyleSign(this.obj.wmsData.params.STYLE)
this.startStatus = true;
// this.showBuffer();
},
stop(){
if(!this.startStatus){
console.log("startStatus is false")
return
}
this.context.currentMap.removeLayer(this.tempVectorLayer)
this.obj.removeTileLayer(this.context.currentMap)
console.log("drawMultiPolygon close")
this.drawMultiPolygon.close()
console.log("tempVectorLayer cleared")
this.context.clicks[this.id] = null
console.log("remove click")
this.popup._close()
console.log("close popup")
this.startStatus = false;
},
click(event, that){
if(that.clickLock){
console.log("clickLock", that.clickLock)
return
}
that.clickLock = true
let layerName = that.obj.wmsData.params.LAYER.substring(that.obj.wmsData.params.LAYER.indexOf(":") + 1)
that.context.getInfo(layerName, event.coordinate, function(res){
try {
if(res.code == -1){
return;
}
console.log(res.data)
let geometry = that.context.wkt.readGeometry(res.data.wkt)
let area = geometry.getArea()
area = (area + area / 2) / 1000
res.data["area"] = area.toFixed(2)
let feature = new ol.Feature({
geometry: geometry
});
for(let key in res.data){
if(key != "wkt"){
feature.set(key, res.data[key])
}
}
that.tempVectorLayer.getSource().clear()
that.tempVectorLayer.getSource().addFeature(feature)
if(res.data.status > 0){
that.addFieldPointOfTempLayer(res.data)
}
that.popup.show(ol.extent.getCenter(feature.getGeometry().getExtent()), that.getInfoHtml(feature), feature)
}catch (e){
console.log(e)
}finally {
that.clickLock = false
}
},function(){
that.clickLock = false
})
},
showBuffer(){
let that = this
that.context.getBuffer([113.26962951874916,23.126323245095218],5000, function(res){
try {
if(res.code == -1){
return;
}
let geometry = that.context.wkt.readGeometry(res.msg)
let feature = new ol.Feature({
geometry: geometry
});
that.tempVectorLayer.getSource().addFeature(feature)
}catch (e){
console.log(e)
}finally {
}
})
},
addFieldPointOfTempLayer(cityLand){
let geometry = this.context.wkt.readGeometry(cityLand.wkt)
let extent = ol.extent.getCenter(geometry.getExtent());
let point = new ol.Feature({
geometry: new ol.geom.Point(extent)
});
point.set("isPoint",1)
point.setId(cityLand.id)
point.set("status",cityLand.status)
let source = this.tempVectorLayer.getSource();
source.addFeature(point)
},
newFieldPoint(data){
let geom = this.context.geojson.readGeometry(data["geojson"])
let point = new ol.Feature({
geometry: geom
});
for(let key in data){
if(key != "geojson"){
point.set(key,data[key])
}
}
point.set("isPoint",1)
point.setId(data["id"])
return point;
}
,loadTempVectorLayer(){
let that = this
let map = this.context.currentMap
const vectorSource = new ol.source.Vector({
loader: function(extent, resolution, projection, success, failure) {
if(!that.context.vectorSwitch){
return;
}
let typeNames = that.obj.getVisibleLayers()
console.log("typeNames",typeNames)
const xhr = new XMLHttpRequest();
xhr.open('GET', "/crop/getGeoJson?tableNames="+typeNames + "&x1=" + extent[0] + "&y1=" + extent[1]+"&x2=" + extent[2] + "&y2="+extent[3]);
const onError = function() {
vectorSource.removeLoadedExtent(extent);
failure();
}
xhr.onerror = onError;
xhr.onload = function() {
if (xhr.status == 200) {
let res = JSON.parse(xhr.responseText);
if(res.code == 0){
let features = []
let datas = res.data;
for(let data of datas){
let feature = that.newFieldPoint(data)
vectorSource.addFeature(feature)
features.push(feature)
}
success(features);
if(datas.length > 0){
that.context.cacheBbox(extent)
that.context.vectorSwitch = false
}
}
} else {
onError();
}
}
xhr.send();
},
strategy: ol.loadingstrategy.bbox,
});
let vector = new ol.layer.Vector({
source:vectorSource,
style: globalStyle.cropStyle,
minZoom:14,
maxZoom:22,
zIndex: 3,
visible: true
});
that.select = new ol.interaction.Select({
condition: ol.events.condition.singleClick,
layers:[vector],
style: globalStyle.selectedCropStyle
})
map.addInteraction(that.select)
that.select.on("select",function(e){
if(e.selected.length > 0){
that.popup.show(ol.extent.getCenter(e.selected[0].getGeometry().getExtent()), that.getInfoHtml(e.selected[0]), e.selected[0])
}
})
return vector;
},getInfoHtml(feature){
let html = ""
console.log(feature.getKeys())
let data = {
"地块类别":this.landType[feature.get("gridcode")],
"名称":feature.get("name"),
"地址":feature.get("address"),
"作物":cropTypes[feature.get("crop_type")],
"地块图斑编号":feature.get("id") || feature.getId(),
"地块状态":this.taskStatus[feature.get("status")],
"生长期":cropPeriods[feature.get("growing_period")],
"图片信息":"点击查看"
.format('"/crop_image/view?id='+feature.get("id")+'"','"60%"','"图片信息"','{area:["90%","90%"],shade:0.1}'),
}
for(let key in data){
html += "
"
}
return html
},
taskStatus:["未发布","已发布","已领取","已完成"],
landType:{0:"其他", 1:"湿地", 2:"耕地", 3:"种植", 4:"林地", 5:"草地", 6:"水域"}
,
saveTask(that, feature){
let id = feature.getId()
layui.tool.submit("/crop/publish",{"id":feature.get("id") || id.substring(id.indexOf(".") + 1)},function(res){
if(res.code == 0){
that.addFieldPointOfTempLayer(res.data)
}
})
}
}
function CityLand(opt){
this.name = "CityLand"
var gridsetName = 'EPSG:4326';
var gridNames = ['EPSG:4326:0', 'EPSG:4326:1', 'EPSG:4326:2', 'EPSG:4326:3', 'EPSG:4326:4', 'EPSG:4326:5', 'EPSG:4326:6', 'EPSG:4326:7', 'EPSG:4326:8', 'EPSG:4326:9', 'EPSG:4326:10', 'EPSG:4326:11', 'EPSG:4326:12', 'EPSG:4326:13', 'EPSG:4326:14', 'EPSG:4326:15', 'EPSG:4326:16', 'EPSG:4326:17', 'EPSG:4326:18', 'EPSG:4326:19', 'EPSG:4326:20', 'EPSG:4326:21'];
this.wmsData = {
url: opt.url,
projection: new ol.proj.Projection({
code: 'EPSG:4326',
units: 'degrees',
axisOrientation: 'neu'
}),
params:{
'VERSION': '1.0.0',
'STYLE': "wuhan:city_land",
'TILEMATRIX': gridNames,
'TILEMATRIXSET': gridsetName,
'SERVICE': 'WMTS',
'FORMAT': "image/png"
}
}
this.layerData = {
layer : [],
source : [],
always : false
}
}
CityLand.prototype = {
visibleLayers:[],
getVisibleLayers(){
let names = "";
let i = 0;
for(let layerName of this.visibleLayers){
if(i > 0){
names += ","
}
names += layerName
i++;
}
return names;
},
layerNames:['wuhan:p_land_banan','wuhan:p_land_beibei','wuhan:p_land_bishan','wuhan:p_land_changshou','wuhan:p_land_chengkou','wuhan:p_land_dadukou','wuhan:p_land_dazu','wuhan:p_land_dianjiang','wuhan:p_land_fengdu','wuhan:p_land_fengjie','wuhan:p_land_fuling','wuhan:p_land_hechuan','wuhan:p_land_jiangbei','wuhan:p_land_jiangjin','wuhan:p_land_jiulongpo','wuhan:p_land_kaizhou','wuhan:p_land_liangping','wuhan:p_land_nanan','wuhan:p_land_nanchuan','wuhan:p_land_pengshui','wuhan:p_land_qianjiang','wuhan:p_land_qijiang','wuhan:p_land_qiuyang','wuhan:p_land_rongchang','wuhan:p_land_shapingba','wuhan:p_land_shizhu','wuhan:p_land_tongliang','wuhan:p_land_tongnan','wuhan:p_land_wanzhou','wuhan:p_land_wulong','wuhan:p_land_wushan','wuhan:p_land_wuxi','wuhan:p_land_xiushan','wuhan:p_land_yongchuan','wuhan:p_land_yubei','wuhan:p_land_yunyang','wuhan:p_land_yuzhong','wuhan:p_land_zhong','wuhan:p_crop'],
createTileLayer(){
for(let layer of this.layerNames){
this.getWMTS(layer)
}
},
addTileLayer(map){
for(let layer of this.layerData.layer){
map.addLayer(layer)
}
},
removeTileLayer(map){
for(let layer of this.layerData.layer){
map.removeLayer(layer)
}
}
,getWMS(typeName){
var resolutions = [0.703125, 0.3515625, 0.17578125, 0.087890625, 0.0439453125, 0.02197265625, 0.010986328125, 0.0054931640625, 0.00274658203125, 0.001373291015625, 6.866455078125E-4, 3.4332275390625E-4, 1.71661376953125E-4, 8.58306884765625E-5, 4.291534423828125E-5, 2.1457672119140625E-5, 1.0728836059570312E-5, 5.364418029785156E-6, 2.682209014892578E-6, 1.341104507446289E-6, 6.705522537231445E-7, 3.3527612686157227E-7];
let source = new ol.source.ImageWMS({
url: 'http://change.zylfsm.com/geoserver/gwc/service/wms?SERVICE=WMS&',
layer: typeName,
matrixSet: this.wmsData.params['TILEMATRIXSET'],
format: this.wmsData.params['FORMAT'],
projection: this.wmsData.projection,
tileGrid: new ol.tilegrid.WMS({
tileSize: [256,256],
extent: [-180.0,-90.0,180.0,90.0],
origin: [-180.0, 90.0],
resolutions: resolutions,
matrixIds: this.wmsData.params['TILEMATRIX']
}),
style: this.wmsData.params['STYLE'],
wrapX: true
})
this.layerData.source.push(source)
let layer = new ol.layer.Image({
source: source,
zIndex: 2,
minZoom: 7,
maxZoom: 30,
visible: true,
});
this.layerData.layer.push(layer)
},getWMTS(typeName){
var resolutions = [0.703125, 0.3515625, 0.17578125, 0.087890625, 0.0439453125, 0.02197265625, 0.010986328125, 0.0054931640625, 0.00274658203125, 0.001373291015625, 6.866455078125E-4, 3.4332275390625E-4, 1.71661376953125E-4, 8.58306884765625E-5, 4.291534423828125E-5, 2.1457672119140625E-5, 1.0728836059570312E-5, 5.364418029785156E-6, 2.682209014892578E-6, 1.341104507446289E-6, 6.705522537231445E-7, 3.3527612686157227E-7];
var baseUrl = this.wmsData.url;
var baseParams = ['VERSION','STYLE','TILEMATRIX','TILEMATRIXSET','SERVICE','FORMAT'];
var url = baseUrl+'?LAYER='+ typeName +'&'
for (var param in this.wmsData.params) {
if (baseParams.indexOf(param.toUpperCase()) < 0) {
url = url + param + '=' + this.wmsData.params[param] + '&';
}
}
url = url.slice(0, -1);
let source = new ol.source.WMTS({
url: url,
layer: typeName,
matrixSet: this.wmsData.params['TILEMATRIXSET'],
format: this.wmsData.params['FORMAT'],
projection: this.wmsData.projection,
tileGrid: new ol.tilegrid.WMTS({
tileSize: [256,256],
extent: [-180.0,-90.0,180.0,90.0],
origin: [-180.0, 90.0],
resolutions: resolutions,
matrixIds: this.wmsData.params['TILEMATRIX']
}),
style: this.wmsData.params['STYLE'],
wrapX: true
})
this.layerData.source.push(source);
let tile = new ol.layer.Tile({
source: source,
zIndex: 2,
minZoom: 7,
maxZoom: 30,
visible: false,
properties:{"name":typeName.substring(typeName.indexOf(":") + 1)}
})
this.layerData.layer.push(tile);
return tile;
},
visibleWMTS(tableNames){
this.visibleLayers = tableNames
for(let layer of this.layerData.layer){
if(tableNames.includes(layer.get("name"))){
layer.setVisible(true)
}else{
layer.setVisible(false)
}
}
}
}
function DrawMultiPolygon(option){
this.vector = option.vector
this.map = option.map
this.wkt = option.wkt
let that = this
let html = "绘制多边形";
$(document.body).append(html)
this.initDraw()
$("#drawMultiPolygon").on("click",function(){
that.vector.getSource().clear()
that.draw.setActive(true)
})
}
DrawMultiPolygon.prototype = {
initDraw(){
let that = this
that.draw = new ol.interaction.Draw({
source : that.vector.getSource(),
type: "MultiPolygon",
freehand: false,//自由绘制
stopClick: true
})
that.draw.setActive(false)
that.draw.on("drawend", function(e){
that.draw.setActive(false)
that.submit(e.feature)
})
that.map.addInteraction(that.draw)
},
show(){
$("#drawMultiPolygon").show()
},
close(){
this.draw.setActive(false)
$("#drawMultiPolygon").hide()
},
submit(feature){
let geometry = feature.getGeometry()
layui.tool.post("/crop/addTest",{"wkt":this.wkt.writeGeometry(geometry)})
}
}