geoJson隨機點生成(echarts)
阿新 • • 發佈:2019-01-24
/**
* 思路 先寫生成隨機的 geojson 地點 (去除重複),配置一鍵生成多少個
*
* 然後生成的 geojson 展示在地圖中
*
* 後期可以擴充套件生成真實的geojson資料
* 現在的問題 1.是如何生成真正隨機的點,然後生成在這個範圍內
* 2.如何生成真個範圍內的資料
*
* 介面 1.確定使用的json地圖
* 2.確認對應的json地圖的名稱 必須是中文
* 3.選擇一鍵生成多少個數據,可以勾選是否生成 地區的名稱(預設生成55個部門的資料,可以自己修改)
* 4.可以選擇複製
*
*/
//第一步先生成對應的json
$(function() {
var jiaozuoMap = document.getElementById("map");
var mapChart = echarts.init(jiaozuoMap); //0988d7
var jsonUrl = "json/" + "jiaozuo410800.json";
var cityName = "焦作";
var areaName = "孟州" ; //想要生成隨機地點的geo資料 //如果查詢不到就生成本區域的資料
var areaRandomNum = 3; //生成隨機數的數量
//預設的部門名稱 超出部門的以變數起
var depNameArr = ["人社局", "公安局", "工商局", "國稅局", "衛計委", "交運局", "食品藥品監督管理局", "質量技術監督局", "地稅局", "住建局", "環保局", "民政局", "司法局", "安監局", "農林局", "文廣新局", "行政服務中心", "鹽業管理局", "糧食局" , "發改委", "水利局", "商務局", "人防辦", "畜牧局", "科技局", "財政局", "旅遊局", "銀監會焦作銀監分局孟州辦事處", "教育局", "統計局", "法院", "檔案局", "移民安置局", "國土資源局", "供銷社", "審計局", "體育局", "編辦", "菸草專賣局", "氣象局", "郵政局", "城管局", "市政府金融辦", "人行孟州支行", "農業機械管理局", "市政府法制辦", "檢察院", "信訪局", "監察委", "工信委", "河務局", "機關事務管理局", "市網路經濟發展促進中心", "市新聞網路中心", "市文明辦", "公共資源交易中心", "信用辦", "市殘聯", "市愛衛辦", "市民宗委", "電力公司", "電信公司", "移動公司", "聯通公司"];
var content = ""; //生成的內容顯示到textarea礦中
var numberObj = {}; //生成的物件
//表單的物件
var $jsonUrl = $("#jsonUrl"),
$cityName = $("#cityName"),
$areaName = $("#areaName"),
$areaRandomNum = $("#areaRandomNum"),
$content = $("#content");
$("#geoJsonButton").click(function() { //賦值點選生成的事件
jsonUrl = getValue($jsonUrl);
areaName = getValue($areaName);
areaRandomNum = getValue($areaRandomNum);
cityName = getValue($cityName);
//開始獲取值
$.getJSON(jsonUrl, function(result) { //開啟就預設生成這個地圖
callback(result);
map(result); //生成地圖
});
});
function getValue(obj) { //傳遞的時jquery物件
var value = obj.val();
if(value == "" || value == undefined || value == null) {
alert(obj.attr("name") + "不能為空");
}
return value;
}
//開始獲取值
$.getJSON(jsonUrl, function(result) { //開啟就預設生成這個地圖
callback(result);
map(result); //生成地圖
});
//執行
function callback(geoJson) {
var polygonArr =Array(); //不規則區域陣列
var maxX=0,maxY=0,minX=1000,minY=1000;
//然後開始執行
var geoJsonObj = geoJson //$.parseJSON(geoJson);
var featuresArr = geoJsonObj.features;
var areaArr = Array(); //區域的array的儲存
for(var key in featuresArr) {
var model = featuresArr[key];
if(model.properties.name.indexOf(areaName) > -1 ||cityName==areaName) { //相同的區域 如果區域相同時生成全部的
var arr = model.geometry.coordinates; //經緯度的陣列
for(var key2 in arr) {
var arr2 = arr[key2];
for(var key3 in arr2) {
var arr3 = arr2[key3];
for(var key4 in arr3) {
var arr4 = arr3[key4];
//生成 不規則點陣列
var pt=new point();
pt.x=arr4[0];
pt.y=arr4[1];
polygonArr.push(pt);
areaArr.push(arr3[key4]);
//獲取最高維度, 獲取最低維度 獲取最東經度 獲取最東短經度
if(arr4[0]>maxX){
maxX = arr4[0];
}
if(arr4[0]<minX){
minX = arr4[0];
}
if(arr4[1]>maxY){
maxY = arr4[1];
}
if(arr4[1]<minY){
minY = arr4[1];
}
}
//現在的陣列就是經緯度了
}
}
//新增完成 然後生成在不規則區域內的點
//新增完成後 生成隨機 json
console.log(polygonArr);
console.log("maxX="+maxX);
console.log("minX="+minX);
console.log("maxY="+maxY);
console.log("minY="+minY);
var len = polygonArr.length;
numberObj={}; //重新為空
areaArr=[];//暫時清空 不取邊界點
var flagIndex=0;
for(;;){//無限迴圈
var indexX = (Math.random() * (maxX-minX)+minX).toFixed(6); //四捨五入取後六位
var indexy = (Math.random() * (maxY-minY)+minY).toFixed(6);
var pt=new point();
pt.x=indexX;
pt.y=indexy;
//判斷生成的點是否在區域內
var flag = PointInPoly(pt,polygonArr);
if(flag){
areaArr.push([indexX,indexy]);
flagIndex++;
}
if(flagIndex==areaRandomNum){ //如果等於生成的點 則結束
break;
}
}
for(var i = 0; i < areaRandomNum; i++) {
numberObj[areaName + depNameArr[i]] = areaArr[i]; //動態增加物件
}
//額外生成 中心點
var centerX = ((maxX+minX)/2).toFixed(6);
var centerY = ((maxY+minY)/2).toFixed(6);
numberObj[areaName] = [centerX,centerY];
//複製給全域性變數
console.log(numberObj); //這個現在可以顯示
//輸出物件的json
$content.val(JSON.stringify(numberObj));
}
}
}
function map(geoJson) {
echarts.registerMap(cityName, geoJson);
var data = Array(); //焦點陣列
for(var key in numberObj) {
var jiaodian = {};
jiaodian.name = key;
jiaodian.value = 60; //先固定大小
data.push(jiaodian); //增加焦點的顯示
}
var geoCoordMap = numberObj; //這裡放置生成的
var dataFrom = areaName; //顯示的中心點 修改為孟州 '焦作市'
var series = [{
name: areaName, //執行的線
type: 'lines',
zlevel: 1,
effect: {
show: true,
period: 6,
trailLength: 0.7,
color: '#fff',
symbolSize: 3
},
lineStyle: {
normal: {
color: '#a6c84c',
width: 0,
curveness: 0.2
}
},
data: data.map(function(dataItem) {
return {
fromName: dataFrom,
toName: dataItem.name,
coords: [
geoCoordMap[dataItem.name],
geoCoordMap[dataFrom],
]
}
})
},
{
name: areaName, //執行的線2
type: 'lines',
zlevel: 2,
symbol: ['none', 'arrow'],
symbolSize: 10,
effect: {
show: true,
period: 6,
trailLength: 0,
},
lineStyle: {
normal: {
color: '#a6c84c',
width: 1,
opacity: 0.6,
curveness: 0.2
}
},
data: data.map(function(dataItem) {
return {
fromName: dataFrom,
toName: dataItem.name,
coords: [ //第一個資料一對多, 第二個資料 多對一
geoCoordMap[dataItem.name],
geoCoordMap[dataFrom]
]
}
})
},
{
name: areaName, //顯示的點點
type: 'effectScatter',
coordinateSystem: 'geo',
zlevel: 2,
rippleEffect: {
scale: 5,
brushType: 'stroke'
},
label: {
normal: {
show: true,
position: 'right',
formatter: '{b}'
}
},
symbolSize: function(val) {
return val[2] / 6;
},
itemStyle: {
normal: {
color: '#a6c84c'
}
},
data: data.map(function(dataItem) {
return {
name: dataItem.name,
value: geoCoordMap[dataItem.name].concat([dataItem.value])
};
})
}
];
option = {
backgroundColor: '', //地圖背景顏色 #154e90
dataRange: {
min: 0,
max: 100,
calculable: true,
color: ['#ff3333', 'orange', 'yellow', 'lime', 'aqua'],
textStyle: {
color: '#fff'
},
show: true,
right: 10
},
title: {
text: '模擬生成geojson', //主標題 區縣接入情況
subtext: '', //副標題
left: 'center',
textStyle: {
color: '#fff'
}
},
tooltip: { //提示框元件。
trigger: 'item', //觸發型別
formatter: '{b0}:\n {c0}', //{a}(系列名稱),{b}(區域名稱),{c}(合併數值), {d}(無)
},
geo: {
map: cityName,
center: geoCoordMap[areaName], //當前視角的中心點,用經緯度表示 這個搭配放大 可開始就定位
zoom: 1, //當前視角的縮放比例。
scaleLimit: { //滾輪縮放的極限控制,通過min, max最小和最大的縮放值,預設的縮放為1。
min: 2,
max: 10
},
label: {
normal: {
show: false
},
emphasis: {
show: false
}
},
roam: true, // 是否開啟滑鼠縮放和平移漫遊。預設不開啟。如果只想要開啟縮放或者平移,可以設定成 'scale' 或者 'move'。設定成 true 為都開啟
/* itemStyle: {
normal: {
areaColor: 'black',
borderColor: '#404a59'
},
emphasis: {
areaColor: '#2a333d'
}
},
*/
label: {
normal: {
show: true,
textStyle: {
color: '#fff'
}
},
emphasis: {
textStyle: {
color: '#fff'
}
}
},
itemStyle: {
normal: {
color: 'rgba(0, 41, 97, 1)', //圖形的顏色
borderColor: 'rgba(86, 155, 197, 1)', //'rgba(147, 235, 248, 1)', //圖形的描邊顏色。支援的顏色格式同 color,不支援回撥函式。
borderWidth: 2,
areaColor: {
type: 'radial',
x: 0.5,
y: 0.5,
r: 0.8,
colorStops: [{
offset: 0,
color: '#3399ff' // 0% 處的顏色 #3399ff 實現一個好的團 rgba(0, 41, 97, 1)
}, {
offset: 1,
color: 'rgba(0, 41, 97, 1)' // 100% 處的顏色
}],
globalCoord: false // 預設為 false
},
shadowColor: 'rgba(0, 41, 97, 1)', // 陰影顏色 rgba(128, 217, 248, 1)
// shadowColor: 'rgba(255, 255, 255, 1)',
shadowOffsetX: -2,
shadowOffsetY: 2,
shadowBlur: 10
},
emphasis: { //圖形div 的 盒子模型
areaColor: '#00bfff', //'rgba(70, 144, 196, 1)',//'#389BB7',
borderWidth: 0,
/* itemStyle:{ //高亮下的圖形顏色
color:'red',
areaColor :'red'
} */
}
},
},
series: series
};
if(option && typeof option === "object") {
mapChart.setOption(option, true);
}
}
});