PIE-Engine APP:凉山州火灾高发地异常度分析系统

简介: PIE-Engine APP:凉山州火灾高发地异常度分析系统

   这里我们利用凉山州作为火灾边界,同样可以切换我们所需要的区域,可以切换省级代码来进行,需要手动修改。这里我们用到的swith 和case的案例条件判断分析,

语法

switch(n)
{
    case 1:
        执行代码块 1
        break;
    case 2:
        执行代码块 2
        break;
    default:
        与 case 1 和 case 2 不同时执行的代码
}

实例

显示今天的星期名称。请注意 Sunday=0, Monday=1, Tuesday=2, 等等:

var d=new Date().getDay(); 
switch (d) 
{ 
  case 0:x="今天是星期日"; 
  break; 
  case 1:x="今天是星期一"; 
  break; 
  case 2:x="今天是星期二"; 
  break; 
  case 3:x="今天是星期三"; 
  break; 
  case 4:x="今天是星期四"; 
  break; 
  case 5:x="今天是星期五"; 
  break; 
  case 6:x="今天是星期六"; 
  break; 
}

这里面所需的函数:

ui.DateSelect(type,placeholder,value,onChange,disabled,style)

时间选择。

方法参数:

- ui(ui)

调用者:ui对象。

- type(String)

日期选择类型,可选值为date|daterange|year|month|datetime|datetimerange。

- placeholder(String)

占位符内容。

- value(String|List)

选择具体的日期,格式为:yyyy-MM-dd|yyyy-MM-dd HH:mm:ss

- onChange(Function)

更新选择日期触发事件。

- disabled(Boolean)

是否禁用日期组件。

- style(Object)

组件样式。

返回值:ui.DateSelect

这里同样可以导出影像:

image(image,description,assetId,pyramidingPolicy,dimensions,region,scale,crs,crsTransform,maxPixels)

导出影像到个人存储空间。

方法参数:

- export(Export)

Export方法。

- image(Image)

要导出的影像。

- description(String, optional)

导出影像任务的描述。

- assetId(String, optional)

导出影像的存储路径。

- pyramidingPolicy(Object, optional)

金字塔规则。

- dimensions(Int, optional)

维度。

- region(Geometry, optional)

导出影像的范围。

- scale(Float, optional)

缩放比例,目前默认都是1。

- crs(Projection, optional)

投影的基准坐标参考系,暂指定为EPSG:4326或EPSG:3857参考系。

- crsTransform(List, optional)

投影坐标系变换值的列表。

- maxPixels(Long, optional)

要导出的最大像素数。

返回值:null

这个代码的还有提升的结果,如果要发布成为APP,那么就不太容易改变我们的研究区,因为在APP中没有code editor的界面,同样此APP的影像导出结果如果要下载,并没有出现在面板上。另外,对于chart图表的加载并没有加载到MAP上,如果转化为APP的化可能结果都无法显示,所以这个程序只能在code Editor界面中的控制台查看

代码:

/**
 * @Name    :   凉山州火灾高发地异常度分析系统
 * @Author  :   西南大学天生一队
 * @Source  :   航天宏图第四届 “航天宏图杯”PIE软件二次开发大赛云开发组三等奖获奖作品
 */
//定义程序运行过程需要用到的变量
var date = ["2018-03-20", "2018-04-20"]; //开始日期和结束日期
var mapID = null; //当前图层ID
var maplegend = null; //当前图层图例ID
var roiID = null; //当前研究范围ID
var selectTag = "LST"; //选择的计算项目
var areaCode = "0"; //行政区划代码,默认为0
var roi = null; //研究区,在程序运行时动态变化
var default_roi = null; //默认研究区,凉山州
var sec_year = 2018; //要显示TVDI变化图的年份
var animationlayerID = []; //如果显示了动态图,则用此数组记录动态图的图层ID
var currentImg = null; //当前图层所对应的影像,导出时使用
var exportScale = 500; //导出分辨率
//获得凉山州矢量
roi = pie
  .FeatureCollection("NGCC/CHINA_CITY_BOUNDARY")
  .filter(pie.Filter.eq("name", "凉山彝族自治州"))
  .getAt(0)
  .geometry();
default_roi = roi; //将默认研究区设置为凉山彝族自治州
//设置渲染样式(默认拉伸渲染,参数为最小值为最大值)
function setVis(minvalue, maxvalue) {
  var newVis = {
    min: minvalue,
    max: maxvalue,
    palette: [
      "217303",
      "268303",
      "2a9203",
      "2fa203",
      "33b203",
      "37c203",
      "3bd203",
      "40e203",
      "44f203",
      "4bfc09",
      "56fd18",
      "6dfe37",
      "79fe47",
      "8cff05",
      "98ff04",
      "a5fe04",
      "b1fe03",
      "befe02",
      "cbfe02",
      "d7fd02",
      "e3fc02",
      "effb02",
      "faf802",
      "f9eb02",
      "f7dd03",
      "f6cf03",
      "f5c203",
      "f4b503",
      "f3a803",
      "f29b04",
      "f18e04",
      "f08104",
      "ef7404",
      "ee6804",
      "ed5b05",
      "ec4f05",
      "eb4305",
      "e93705",
      "e82b05",
      "e72006",
      "e61406",
      "e50906",
    ],
  };
  return newVis;
}
//按顺序输入影像集,起始时间、结束时间,要提取的波段名,研究区矢量【仅限单个波段提取】
function loadCol(nameCol, start, end, bandname, roi) {
  var rCol = pie
    .ImageCollection(nameCol)
    .filterDate(start, end)
    .filterBounds(roi)
    .select(bandname)
    .mean()
    .clip(roi);
  return rCol;
}
//更改行政区划后调用的函数
function getROI(code) {
  var new_roi = null;
  if (code !== 0) {
    var fCol = pie.FeatureCollection("NGCC/CHINA_PROVINCE_BOUNDARY");
    new_roi = fCol
      .filter(pie.Filter.eq("code", parseInt(code)))
      .first()
      .geometry();
  } else {
    new_roi = default_roi;
  }
  return new_roi;
}
//下载landsat8影像
function l8Col_load(start, end) {
  var l8Col = pie
    .ImageCollection("LC08/01/T1")
    .filterDate(start, end)
    .select(["B2", "B3", "B4", "B5", "B6", "BQA"])
    .filterBounds(roi)
    .map(function (image) {
      var qa = image.select("BQA");
      var cloudMask = qa.bitwiseAnd(1 << 3).eq(0);
      return image.updateMask(cloudMask);
    });
  return l8Col;
}
//定义Landsat8不同指数计算方式
var landsat8 = {
  //NDWI: (B03 - B05)/(B03 + B05)
  NDWI: function (image) {
    var b3 = image.select("B3");
    var b5 = image.select("B5");
    var ndvi = b3.subtract(b5).divide(b3.add(b5));
    return ndvi.rename("NDVI");
  },
  //MNDWI: (G - SWIR)/(G + SWIR)
  MNDWI: function (image) {
    var b3 = image.select("B3");
    var b6 = image.select("B6");
    var ndvi = b3.subtract(b6).divide(b3.add(b6));
    return ndvi.rename("MNDWI");
  },
  //NDVI: (B05 - B04)/(B05 + B04)
  NDVI: function (image) {
    var b5 = image.select("B5");
    var b4 = image.select("B4");
    var ndvi = b5.subtract(b4).divide(b5.add(b4));
    return ndvi.rename("NDVI");
  },
  //EVI: 2.5*(B05 - B04) / (B05 + 6*B04 - 7.5*B02 + 1)
  EVI: function (image) {
    var nir = image.select("B5").divide(10000);
    var red = image.select("B4").divide(10000);
    var blue = image.select("B2").divide(10000);
    var evi = nir
      .subtract(red)
      .multiply(2.5)
      .divide(nir.add(red.multiply(6)).subtract(blue.multiply(7.5)).add(1));
    return evi.rename("EVI");
  },
};
//点击“确定”按钮后调用的计算函数,用于计算选择的指标
function calcuate(roi, startDate, endDate, tag) {
  //影像集合
  var l8Col = pie.ImageCollection("LC08/01/T1");
  //通过日期过滤影像集合,并计算
  l8Col = l8Col
    .filterDate(startDate, endDate)
    .select(["B2", "B3", "B4", "B5", "B6", "BQA"])
    .filterBounds(roi)
    .map(function (image) {
      var qa = image.select("BQA");
      var cloudMask = qa.bitwiseAnd(1 << 4).eq(0);
      return image.updateMask(cloudMask);
    });
  var image = null;
  var vis = null;
  switch (tag) {
    case "LST":
      image = loadCol("USGS/MOD11A1/006", date[0], date[1], "LST_Day_1km", roi)
        .multiply(0.02)
        .subtract(273.15);
      vis = setVis(0, 40);
      addLegend("地表温度(°C)", [10, 20, 30, 40]);
      break;
    case "NDVI":
      image = l8Col.map(landsat8.NDVI).mean().clip(roi);
      vis = setVis(-0.2, 0.8);
      addLegend("NDVI Value", ["0", "0.6"]);
      break;
    case "NDWI":
      image = l8Col.map(landsat8.NDWI).mean().clip(roi);
      vis = setVis(-1, 0.3);
      addLegend("NDWI Value", ["-0.8", "0.1"]);
      break;
    case "MNDWI":
      image = l8Col.map(landsat8.MNDWI).mean().clip(roi);
      vis = setVis(-1, 0.3);
      addLegend("MNDWI Value", ["-0.8", "0.1"]);
      break;
    case "EVI":
      image = l8Col.map(landsat8.EVI).mean().clip(roi);
      vis = setVis(-0.2, 0.8);
      addLegend("EVI Value", ["0", "0.6"]);
      break;
    case "TVDI": //调用TVDI数据产品
      image = loadCol("BNU/GLOBAL_1KM_TVDI", date[0], date[1], "B1", roi);
      image = image.divide(10000);
      vis = setVis(0, 1);
      addLegend("TVDI Value(0~1)", ["0.25", "0.75"]);
      break;
    case "火点": //调用MODIS数据产品
      image = loadCol("USGS/MOD14A2/006", date[0], date[1], "FireMask", roi);
      vis = setVis(3, 8);
      addLegend("置信等级", ["<3", 4, 5, 6, 7, 8]);
      break;
  }
  if (mapID !== null) {
    Map.removeLayer(mapID); //如果有图层ID则将其移除,保证只有1个图层显示
  }
  mapID = Map.addLayer(image, vis, tag);
  currentImg = image;
}
//添加图例样式的函数,作用在于计算的项目发生改变时动态调整图例,参数:1)titile:string;2)labels:object[]
function addLegend(title, labels) {
  var data = {
    title: title,
    colors: [
      "#217303",
      "#268303",
      "#2a9203",
      "#2fa203",
      "#33b203",
      "#37c203",
      "#3bd203",
      "#40e203",
      "#44f203",
      "#4bfc09",
      "#56fd18",
      "#6dfe37",
      "#79fe47",
      "#8cff05",
      "#98ff04",
      "#a5fe04",
      "#b1fe03",
      "#befe02",
      "#cbfe02",
      "#d7fd02",
      "#e3fc02",
      "#effb02",
      "#faf802",
      "#f9eb02",
      "#f7dd03",
      "#f6cf03",
      "#f5c203",
      "#f4b503",
      "#f3a803",
      "#f29b04",
      "#f18e04",
      "#f08104",
      "#ef7404",
      "#ee6804",
      "#ed5b05",
      "#ec4f05",
      "#eb4305",
      "#e93705",
      "#e82b05",
      "#e72006",
      "#e61406",
      "#e50906",
    ],
    labels: labels,
    step: 30,
  };
  var style = {
    right: "150px",
    bottom: "10px",
    height: "70px",
    width: "350px",
  };
  if (maplegend !== null) {
    Map.removeUI(maplegend); //如果存在图例则将其移除,保证只有一个图例
  }
  maplegend = ui.Legend(data, style);
  Map.addUI(maplegend);
}
//导出当前图层所对应的影像
function exportCurrentMap(img, description, roi, scale) {
  if (currentImg !== null && animationlayerID.length == 0) {
    Export.image({
      image: img,
      description: description,
      region: roi,
      scale: scale,
    });
    print("导出成功!");
  } else {
    print("当前图层为空或图层不唯一!");
  }
}
//根据年份计算每个月的TVDI,并显示折线图。TVDI值越大,土壤湿度越低,反之土壤湿度越高
function calculateTVDI(start, end) {
  var img = pie
    .ImageCollection("BNU/GLOBAL_1KM_TVDI")
    .filterDate(start, end)
    .select("B1")
    .filterBounds(roi)
    .mean()
    .clip(roi)
    .divide(10000);
  return img;
}
function showTVDI(year) {
  var month = [
    "-01",
    "-02",
    "-03",
    "-04",
    "-05",
    "-06",
    "-07",
    "-08",
    "-09",
    "-10",
    "-11",
    "-12",
  ];
  var day = [
    "-31",
    "-28",
    "-31",
    "-30",
    "-31",
    "-30",
    "-31",
    "-31",
    "-30",
    "-31",
    "-30",
    "-31",
  ];
  var data = [];
  for (var i = 0; i < 12; i++) {
    var t1 = calculateTVDI(year + month[i] + "-01", year + month[i] + day[i]);
    var t2 = t1.reduceRegion(pie.Reducer.mean(), roi, 1000);
    data.push(t2);
  }
  var line_a = {
    title: year + "年TVDI变化",
    legend: ["TVDI"],
    xAxisName: "月份",
    yAxisName: "TVDI值",
    chartType: "line",
    yMin: 0,
    yMax: 1,
    smooth: true,
  };
  // 显示折线图
  var mark = [
    "01",
    "02",
    "03",
    "04",
    "05",
    "06",
    "07",
    "08",
    "09",
    "10",
    "11",
    "12",
  ];
  ChartImage(data, mark, line_a);
}
//显示某年动态图的函数
function showAnimation(year) {
  var month = [
    "-01",
    "-02",
    "-03",
    "-04",
    "-05",
    "-06",
    "-07",
    "-08",
    "-09",
    "-10",
    "-11",
    "-12",
  ];
  var day = [
    "-31",
    "-28",
    "-31",
    "-30",
    "-31",
    "-30",
    "-31",
    "-31",
    "-30",
    "-31",
    "-30",
    "-31",
  ];
  var data = [];
  if (mapID !== null) {
    Map.removeLayer(mapID);
  }
  if (animationlayerID.length > 0) {
    for (var i = 0; i < animationlayerID.length; i++) {
      Map.removeLayer(animationlayerID[i]);
    }
    animationlayerID = [];
  }
  switch (selectTag) {
    case "TVDI":
      for (var i = 0; i < 12; i++) {
        var img = null;
        var start = year + month[i] + "-01";
        var end = year + month[i] + day[i];
        img = calculateTVDI(start, end);
        var map = Map.addLayer(
          img,
          setVis(0, 1),
          year + month[i] + "TVDI",
          false
        );
        animationlayerID.push(map);
        data.push(year + month[i] + "TVDI");
      }
      addLegend("TVDI Value(0~1)", ["0.25", "0.75"]);
      break;
    case "LST":
      for (var i = 0; i < 12; i++) {
        var img = null;
        var start = year + month[i] + "-01";
        var end = year + month[i] + day[i];
        img = loadCol("USGS/MOD11A1/006", start, end, "LST_Day_1km", roi)
          .multiply(0.02)
          .subtract(273.15);
        var map = Map.addLayer(
          img,
          setVis(0, 40),
          year + month[i] + "LST",
          false
        );
        animationlayerID.push(map);
        data.push(year + month[i] + "LST");
      }
      addLegend("地表温度(°C)", [10, 20, 30, 40]);
      break;
    case "火点":
      for (var i = 0; i < 12; i++) {
        var img = null;
        var start = year + month[i] + "-01";
        var end = year + month[i] + day[i];
        img = loadCol("USGS/MOD14A2/006", start, end, "FireMask", roi);
        var map = Map.addLayer(
          img,
          setVis(3, 8),
          year + month[i] + "火点",
          false
        );
        animationlayerID.push(map);
        data.push(year + month[i] + "火点");
      }
      addLegend("置信等级", ["<3", 4, 5, 6, 7, 8]);
      break;
    case "NDVI":
      for (var i = 0; i < 12; i++) {
        var img = null;
        var start = year + month[i] + "-01";
        var end = year + month[i] + day[i];
        img = l8Col_load(start, end).map(landsat8.NDVI).mean().clip(roi);
        var map = Map.addLayer(
          img,
          setVis(-0.2, 0.8),
          year + month[i] + "NDVI",
          false
        );
        animationlayerID.push(map);
        data.push(year + month[i] + "NDVI");
      }
      addLegend("NDVI Value", ["0", "0.6"]);
      break;
    case "NDWI":
      for (var i = 0; i < 12; i++) {
        var img = null;
        var start = year + month[i] + "-01";
        var end = year + month[i] + day[i];
        img = l8Col_load(start, end).map(landsat8.NDWI).mean().clip(roi);
        var map = Map.addLayer(
          img,
          setVis(-1, 0.3),
          year + month[i] + "NDWI",
          false
        );
        animationlayerID.push(map);
        data.push(year + month[i] + "NDWI");
      }
      addLegend("NDWI Value", ["-0.8", "0.1"]);
      break;
    case "MNDWI":
      for (var i = 0; i < 12; i++) {
        var img = null;
        var start = year + month[i] + "-01";
        var end = year + month[i] + day[i];
        img = l8Col_load(start, end).map(landsat8.MNDWI).mean().clip(roi);
        var map = Map.addLayer(
          img,
          setVis(-1, 0.3),
          year + month[i] + "MNDWI",
          false
        );
        animationlayerID.push(map);
        data.push(year + month[i] + "MNDWI");
      }
      addLegend("MNDWI Value", ["-0.8", "0.1"]);
      break;
    case "EVI":
      for (var i = 0; i < 12; i++) {
        var img = null;
        var start = year + month[i] + "-01";
        var end = year + month[i] + day[i];
        img = l8Col_load(start, end).map(landsat8.EVI).mean().clip(roi);
        var map = Map.addLayer(
          img,
          setVis(-0.2, 0.8),
          year + month[i] + "EVI",
          false
        );
        animationlayerID.push(map);
        data.push(year + month[i] + "EVI");
      }
      addLegend("EVI Value", ["0", "0.6"]);
      break;
  }
  Map.playLayersAnimation(data, 1, -1); //动图间隔时间1秒,无限次循环。
}
Map.centerObject(roi, 5); //将地图中心转到研究范围
/* -------------------------以下代码是控件的布局以及事件的绑定等参数设置----------------------------- */
function funDateSelect(value) {
  date[0] = value[0];
  date[1] = value[1];
}
var dateSelect = ui.DateSelect({
  type: "daterange",
  placeholder: "请输入数值",
  value: ["2018-03-20", "2018-04-20"],
  onChange: funDateSelect,
  disabled: false,
});
function changeSelect(value) {
  selectTag = value;
}
var select1 = ui.Select({
  items: ["LST", "TVDI", "火点", "NDVI", "NDWI", "MNDWI", "EVI"],
  placeholder: "请选择",
  value: selectTag,
  multiple: false,
  onChange: changeSelect,
});
var selectIndex = ui.Label("选择项目:");
var selectPanel = ui.Panel({
  widgets: [selectIndex, select1],
  layout: ui.Layout.flow("horizontal"),
});
function inputArea(value) {
  areaCode = value;
  roi = getROI(areaCode);
}
var textBox3 = ui.TextBox({
  placeholder: "请输入行政区划编码",
  value: areaCode,
  onChange: inputArea,
  disabled: false,
});
var textboxName3 = ui.Label("更改行政区划(省级):");
var txtPanel1 = ui.Panel({
  widgets: [textboxName3, textBox3],
  layout: ui.Layout.flow("horizontal"),
});
var selecDateLabel = ui.Label("选择日期范围:");
var txtPanel2 = ui.Panel({
  widgets: [selecDateLabel, dateSelect],
  layout: ui.Layout.flow("horizontal"),
});
//点击“确定”按钮调用的函数
function click_BtnOK() {
  print("当前计算项目:", selectTag + "," + date[0] + "~" + date[1]);
  //调用计算函数计算选择的指标添加到地图
  calcuate(roi, date[0], date[1], selectTag);
  if (animationlayerID.length > 0) {
    for (var i = 0; i < animationlayerID.length; i++) {
      Map.removeLayer(animationlayerID[i]);
    }
    animationlayerID = [];
  }
}
var btnOK = ui.Button({
  label: "确定",
  type: "success",
  onClick: click_BtnOK,
  style: { left: "50px" },
});
function click_btnExport() {
  exportCurrentMap(
    currentImg,
    date[0] + "-" + date[1] + selectTag,
    roi,
    exportScale
  );
}
var btnExport = ui.Button({
  label: "导出当前图层",
  type: "success",
  onClick: click_btnExport,
  style: { left: "50px" },
});
function changeScale(value) {
  exportScale = value;
}
var select2 = ui.Select({
  items: [30, 50, 100, 200, 500, 1000, 2000],
  placeholder: "请选择",
  value: exportScale,
  multiple: false,
  onChange: changeScale,
});
var selectPanel2 = ui.Panel({
  widgets: [ui.Label("选择导出分辨率(米):"), select2],
  layout: ui.Layout.flow("horizontal"),
});
function click_btnMonthly() {
  showAnimation(sec_year);
}
var btnMonthly = ui.Button({
  label: "显示当前指标每月动态图",
  type: "success",
  onClick: click_btnMonthly,
  style: { left: "10px" },
});
function click_showBtn() {
  //画出选择的年份TVDI变化图
  showTVDI(sec_year);
}
var btnShow = ui.Button({
  label: "显示TVDI变化折线图",
  type: "success",
  onClick: click_showBtn,
  style: { left: "10px" },
});
var btnPanel1 = ui.Panel({
  widgets: [btnOK, btnExport],
  layout: ui.Layout.flow("horizontal"),
});
function inputYear(value) {
  sec_year = value;
}
var txtBoxyear = ui.TextBox({
  placeholder: "请输入年份",
  value: sec_year,
  onChange: inputYear,
  disabled: false,
});
var labelyear = ui.Label("输入年份:");
var txtPanel3 = ui.Panel({
  widgets: [labelyear, txtBoxyear],
  layout: ui.Layout.flow("horizontal"),
});
var btnPanel2 = ui.Panel({
  widgets: [btnShow, btnMonthly],
  layout: ui.Layout.flow("horizontal"),
});
var panel = ui.Panel({
  widgets: [
    ui.Label("凉山彝族自治州火灾异常监测", { "font-size": "18px" }),
    ui.Label(
      "默认区域为凉山彝族自治州,若想更换区域请输入行政区代码(省级),若输入0则为默认区域",
      { "font-size": "18px" }
    ),
    selectPanel,
    txtPanel1,
    txtPanel2,
    btnPanel1,
    selectPanel2,
    txtPanel3,
    btnPanel2,
  ],
  style: {
    width: "400px",
    height: "500px",
    backgroundColor: "#fff",
  },
});
ui.root.add(panel);
/* 以上是网页上的整体框架布局*/

结果:

image.png

 

image.png


相关文章
|
7天前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
|
1月前
|
Linux 开发工具 数据安全/隐私保护
linux异常一:feng 不在 sudoers 文件中,此事将被报告。yum提示Another app is currently holding the yum lock; waiting for
这篇文章介绍了在CentOS 7系统中安装Docker时遇到的两个常见问题及其解决方法:用户不在sudoers文件中导致权限不足,以及yum被锁定的问题。
37 2
linux异常一:feng 不在 sudoers 文件中,此事将被报告。yum提示Another app is currently holding the yum lock; waiting for
|
16天前
|
小程序 数据挖掘 UED
开发1个上门家政小程序APP系统,都有哪些功能?
在快节奏的现代生活中,家政服务已成为许多家庭的必需品。针对传统家政服务存在的问题,如服务质量不稳定、价格不透明等,我们历时两年开发了一套全新的上门家政系统。该系统通过完善信用体系、提供奖励机制、优化复购体验、多渠道推广和多样化盈利模式,解决了私单、复购、推广和盈利四大痛点,全面提升了服务质量和用户体验,旨在成为家政行业的领导者。
|
14天前
|
机器人
布谷直播App系统源码开发之后台管理功能详解
直播系统开发搭建管理后台功能详解!
|
2月前
|
移动开发 Android开发 数据安全/隐私保护
移动应用与系统的技术演进:从开发到操作系统的全景解析随着智能手机和平板电脑的普及,移动应用(App)已成为人们日常生活中不可或缺的一部分。无论是社交、娱乐、购物还是办公,移动应用都扮演着重要的角色。而支撑这些应用运行的,正是功能强大且复杂的移动操作系统。本文将深入探讨移动应用的开发过程及其背后的操作系统机制,揭示这一领域的技术演进。
本文旨在提供关于移动应用与系统技术的全面概述,涵盖移动应用的开发生命周期、主要移动操作系统的特点以及它们之间的竞争关系。我们将探讨如何高效地开发移动应用,并分析iOS和Android两大主流操作系统的技术优势与局限。同时,本文还将讨论跨平台解决方案的兴起及其对移动开发领域的影响。通过这篇技术性文章,读者将获得对移动应用开发及操作系统深层理解的钥匙。
|
3月前
|
JavaScript Linux 数据中心
【Azure Function App】解决Function App For Container 遇见ServiceUnavailable的异常
【Azure Function App】解决Function App For Container 遇见ServiceUnavailable的异常
【Azure Function App】解决Function App For Container 遇见ServiceUnavailable的异常
|
2月前
|
安全
【Azure App Service】App service无法使用的情况分析
App Service集成子网后,如果子网网段中的剩余IP地址非常少的情况下,会在App Service实例升级时( 先加入新实例,然后在移除老实例 )。新加入的实例不能被分配到正确的内网IP地址,无法成功的访问内网资源。 解决方法就是为App Service增加子网地址, 最少需要/26 子网网段地址。
|
3月前
【Azure Function App】本地运行的Function发布到Azure上无法运行的错误分析
【Azure Function App】本地运行的Function发布到Azure上无法运行的错误分析
|
3月前
|
JSON 数据格式
【Azure App Service】当App Service中使用系统标识无法获取Access Token时
【Azure App Service】当App Service中使用系统标识无法获取Access Token时
|
3月前
|
关系型数据库 MySQL Linux
【Azure 应用服务】在创建Web App Service的时候,选Linux系统后无法使用Mysql in App
【Azure 应用服务】在创建Web App Service的时候,选Linux系统后无法使用Mysql in App
【Azure 应用服务】在创建Web App Service的时候,选Linux系统后无法使用Mysql in App

热门文章

最新文章