1.问题背景:

需要解析nc文件的数据源,获取一个三维数据,并计算器开发值。

java 后台处理:

定以一个实例来接收解析的数据并返回给前端。

package cn.edu.shou.domain;

import cn.edu.shou.domain.tbjhship;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;

/**
* Created by seky on 16/3/25.
*/
@Entity
@Table(name = "tbjhshipdata")
public class tbjhshipdata {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Setter @Getter
private int id;
@Setter @Getter
private float windspeed;//风速
@Setter @Getter
private float winddir;//方向
@Setter @Getter
private float cwindspeed;//c风速
@Setter @Getter
private float cwinddir;//c风向
@Setter @Getter
private float watertemp;//水温
@Setter @Getter
private float airpressure;//气压
@ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
@JoinColumn(name = "tbjhshipid")
@JsonManagedReference
public cn.edu.shou.domain.tbjhship tbjhship;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public float getWindspeed() {
return windspeed;
}

public void setWindspeed(float windspeed) {
this.windspeed = windspeed;
}

public float getWinddir() {
return winddir;
}

public void setWinddir(float winddir) {
this.winddir = winddir;
}

public float getCwindspeed() {
return cwindspeed;
}

public void setCwindspeed(float cwindspeed) {
this.cwindspeed = cwindspeed;
}

public float getCwinddir() {
return cwinddir;
}

public void setCwinddir(float cwinddir) {
this.cwinddir = cwinddir;
}

public float getWatertemp() {
return watertemp;
}

public void setWatertemp(float watertemp) {
this.watertemp = watertemp;
}

public float getAirpressure() {
return airpressure;
}

public void setAirpressure(float airpressure) {
this.airpressure = airpressure;
}

public tbjhship getTbjhship() {
return tbjhship;
}

public void setTbjhship(tbjhship tbjhship) {
this.tbjhship = tbjhship;
}
}

定义restapi接口:

package cn.edu.shou.web.api;
import cn.edu.shou.domain.tbjhshipdata;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import ucar.ma2.Array;
import ucar.nc2.NetcdfFile;
import ucar.nc2.Variable;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* Created by Administrator on 2016/4/2.
*/
@RestController
@RequestMapping(value = "/api/config")
public class ReadNetcdfController {
NetcdfFile ncfile = null;
String filename = "D:\\jidi\\Wind_wq_sugon_wrf_2015121620.nc";
//获取u v 数据值
// lat 纬度 lon 经度
@RequestMapping(value = "/getSqrt", method =RequestMethod.GET)
public List<Map<String, String>> getNetCdfPredictData(int lat,int lon) throws Exception{
List<Map<String,String>> list = new ArrayList<Map<String,String>>();
Map<String,String> map =new HashMap();
try{
ncfile = NetcdfFile.open(filename);
String variable = "u10";
String variable10 = "v10";
Variable varu10 = ncfile.findVariable(variable);
Variable varv10 = ncfile.findVariable(variable10);

if (null != varu10 && null != varv10) {

//第一个参数为时间编号,表示第几个时刻,
//第二个参数为经度的数据编号,表示从哪个经度数据开始
//第三个参数为维度的数据编号,表示从哪个维度数据开始
int[] origin = new int[]{4, 0, 0};//位置
origin[1]=lat;
origin[2]=lon;
//第一个参数表示时间的范围,72表示要读取72个时刻的数据
//第二个表示经度的数据范围,1表示只读去一个点的数据
//第三个表示纬度的数据范围,1表示只读一个点的数据
int[] size = new int[]{72, lat, lon};//
Array data2D = varu10.read(origin, size);
//v10 read
Array data3D = varv10.read(origin, size);
//计算开方值
Double netcdfSqrt = Math.sqrt((Math.pow(data2D.getDouble(0), 2) + Math.pow(data3D.getDouble(0), 2)));
System.out.println("netcdfsqrt"+netcdfSqrt);
map.put("windSpeed", netcdfSqrt.toString());
map.put("windDir", netcdfSqrt.toString());
list.add(map);
}
}catch (Exception e){
e.printStackTrace();
}finally {
if (null != ncfile)
try {
ncfile.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
return list;
}
@RequestMapping(value = "/PostCoordinates/{lat}/{lon}",method =RequestMethod.GET)
public List<tbjhshipdata> postCoordiantes( @PathVariable int lat,
@PathVariable int lon){
List<Map<String,String>> list1 = new ArrayList<Map<String,String>>();
try {
Map<String,Integer> map=getLatAndLonIndex(lat,lon);
//return list
list1 = getNetCdfPredictData(map.get("latindex"),map.get("lonindex"));
System.out.println("list1 is"+list1);
}catch (Exception e){
e.printStackTrace();
}
List<tbjhshipdata> results=new ArrayList<tbjhshipdata>();
tbjhshipdata shiData=new tbjhshipdata();
for (Map<String,String>list:list1){
shiData.setWindspeed(Float.parseFloat(list.get("windSpeed")));
shiData.setWinddir(Float.parseFloat(list.get("windDir")));
results.add(shiData);
}
return results;
}

private Map<String,Integer>getLatAndLonIndex(int lat,int lon){
Map<String,Integer> latAndLonIndex =new HashMap();//接收鼠标点击经纬度对应nc文件的编号
latAndLonIndex.put("latindex",lat);
latAndLonIndex.put("lonindex",lon);
return latAndLonIndex;
}
}

//前端点击map地图获取底图的point经纬度值,并调用matchLatAndLon函数查询最佳的数据编号

function getPoint(evt){
console.log("evt is",evt);
//单击后获取当前点的坐标值
var point = evt.mapPoint;
console.log("point is",point);
map.graphics.clear();
getshipmessage();
//添加一个graphic在当前点的位置上
var ptGraphic = new Graphic(point, pointSymbol);
map.graphics.add(ptGraphic);
//添加一个半径当前点
var buffer = geometryEngine.geodesicBuffer(point, 10, "miles");
var bufferGraphic = new Graphic(buffer, buffSymbol);
map.graphics.add(bufferGraphic);
for(var i in extents){
if(i == (flag-1) && flag==extents[i].flag){
//判断当前点是否是陆地
if(extents[i].extent[0].XMin<=point.x && point.x<=extents[i].extent[2].XMax
&& extents[i].extent[1].YMin<=point.y&&point.y<=extents[i].extent[3].YMax){
console.log("flag is"+flag);
//弹窗数据展示
switch (flag){
case 1: setwindObserve(point);console.log("海面风数据加载成功,绘制图表");
break;
case 2: setShipObservedWin(point);console.log("海浪数据加载成功,绘制图表");break;
case 3: setflowObserver(point);console.log("海流数据加载成功,绘制图表");break;
case 4: setWaveVisibility(point);console.log("能见度数据加载成功,绘制图表");break;
default :
console.log("eeee");break;
}
}else{
//如果是陆地的话,气泡显示经纬度
console.log("point"+point.x+point.y);
var latitude = point.x;
var longitude = point.y;
var infotemplate = new InfoTemplate("该点坐标信息","lat/lon : " +latitude.toFixed(2) + ", " + longitude.toFixed(2));
var pictureSymbol = new PictureMarkerSymbol('/img/typhoon.jpg', 30, 30);
var pictureGraphic = new Graphic(point, pictureSymbol, null,infotemplate);
// map.graphics.add(pictureGraphic);
}
}
}
};

//点击当前点与已有数据的匹配
function matchLatAndLon(points){
//获取json数据
var result = null;
$.ajax({
type:"GET",
url:"/js/data/LatAndLon.json",
async:false,
success:function(data){
result = acquireMark(data,points);
},
error:function(data){
console.log(data);
}
});

function acquireMark(data,points){
var obj = new Function("return" + data)();
console.log(obj);
var i=0 ,j = 0,
pointX = points.x.toFixed(3),//lon117
pointY = points.y.toFixed(3);//lat171
console.log(pointX);
console.log(pointY);
var arrMarks =[];
//拿到所有的lon整数部分相等的数据
for(i;i<obj.lon.length-1;i++){
var lonParseInt =parseInt(obj.lon[i][0]);
if(lonParseInt==parseInt(pointX)){
console.log("mark is",obj.lon[i][0]);
//匹配最佳的数据位置
if(pointX==obj.lon[i][0]){
arrMarks.push(obj.lon[i][1]);
};
if(obj.lon[i][0]<pointX&&pointX<obj.lon[i+1][0]){
console.log("obj.lon[i][1]",obj.lon[i][1]);
arrMarks.push(obj.lon[i][1]);
break;
};
if(obj.lon[i][0]>pointX){
arrMarks.push(obj.lon[i][1]);
break;
}
}
}
//拿到所有的lat整数部分相等的数据
for(j;j<obj.lat.length-1;j++){
var latParseInt = parseInt(obj.lat[j][0]);
if(latParseInt == parseInt(pointY)){
//匹配最佳的数据位置
if(pointY==obj.lat[j][0]){
console.log("obj.lat[i][1]",obj.lat[j][1]);
arrMarks.push(obj.lat[j][1]);
}else if(obj.lat[j][0]<pointY&&pointY<obj.lat[j+1][0]){
console.log("obj.lat[j][1]",obj.lat[j][1]);
arrMarks.push(obj.lat[j][1]);
break;
};
if(obj.lat[j][0]>pointY){
arrMarks.push(obj.lat[j][1]);
break;
}
}
}
console.log(arrMarks);//lon + lat 编号
//将arrMarks编号post到后台,读取本地nc文件里的数据
return arrMarks;
// postArrMarks(arrMarks[1],arrMarks[0]);
}
return result;
}

ajax请求数据

var chart3 = $.ajax({
type:"GET",
url:"/api/config/PostCoordinates/"+marks[1]+"/"+marks[0],
success:function(data){
console.log(data);
},
error:function(){
console.log("error")
}
});

java读取nc文件的问题,前端ajax 发送参数进行交互的实例的更多相关文章

  1. java分享第十六天( java读取properties文件的几种方法&java配置文件持久化:static块的作用)

     java读取properties文件的几种方法一.项目中经常会需要读取配置文件(properties文件),因此读取方法总结如下: 1.通过java.util.Properties读取Propert ...

  2. Java读取Excel文件的几种方法

    Java读取 Excel 文件的常用开源免费方法有以下几种: 1. JDBC-ODBC Excel Driver 2. jxl.jar 3. jcom.jar 4. poi.jar 简单介绍: 百度文 ...

  3. Java读取txt文件

    package com.loongtao.general.crawler.slave.utils; import java.io.BufferedReader; import java.io.File ...

  4. java 读取XML文件作为配置文件

    首先,贴上自己的实例: XML文件:NewFile.xml(该文件与src目录同级) <?xml version="1.0" encoding="UTF-8&quo ...

  5. java 读取TXT文件的方法

    java读取txt文件内容.可以作如下理解: 首先获得一个文件句柄.File file = new File(); file即为文件句柄.两人之间连通电话网络了.接下来可以开始打电话了. 通过这条线路 ...

  6. 用java读取properties文件--转

    今天为了通过java读取properties文件,google了很长时间,终于找到了.现在特记录之和大家一起分享.     下面直接贴出代码:java类 public class Mytest pub ...

  7. java读取xml文件报“org.xml.sax.SAXParseException: Premature end of file” .

    背景:java读取xml文件,xml文件内容只有“<?xml version="1.0" encoding="UTF-8"?>”一行 java读取该 ...

  8. java读取TXT文件的方法

    java读取txt文件内容.可以作如下理解: 首先获得一个文件句柄.File file = new File(); file即为文件句柄.两人之间连通电话网络了.接下来可以开始打电话了. 通过这条线路 ...

  9. java读取XML文件的四种方式

    java读取XML文件的四种方式 Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT& ...

随机推荐

  1. poj1477(水)

    犯了一个错误,贡献了一次CE: G++里面没有头文件,用scanf会CE:然而C++就可以. 两大cow解释: 最好不要c 的输入和c++的一起用 (特别是关同步的时候) 然而好像他们也不是很了解.. ...

  2. MySQL的分支

    1.MariaDB MariaDB数据库管理系统是 MySQL 的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MyS ...

  3. python __builtins__ tuple类 (68)

    68.'tuple', 转换为元组类型 class tuple(object) | tuple() -> empty tuple | tuple(iterable) -> tuple in ...

  4. Luogu P1373 小a和uim之大逃离【dp】By cellur925

    题目传送门 $50pts$:容易设计出状态$f[i][j][l][r][st]$表示当前的这个人在($i$,$j$),小a和uim魔瓶中的含量分别为$l$,$r$,当$st=0$表明现在是小a在吃,当 ...

  5. 为什么使用Stylus

    CSS预处理器的出现大大的提高了前端开发的效率和逼格,它让CSS可编程化.LESS和Sass/SCSS是两种最为常见的预处理器,拥有大量的用户基数,数目庞杂的第三方库.然而,还有一种预处理器并未引起足 ...

  6. Chips CodeForces - 333B

    Chips CodeForces - 333B 题意:有一个n*n的棋盘,其中有m个格子被禁止.在游戏开始前要将一些芯片(?)放到四条边上(但不能是角上).游戏开始后,每次操作将每一个芯片移动到它四周 ...

  7. 二分查找 2015百度之星初赛1 HDOJ 5246 超级赛亚ACMer

    题目传送门 /* 二分找到不大于m的最大的数,记做p,只要a[p] + k <= a[p+1]就继续 注意:特判一下当没有比m小的数的情况:) */ #include <cstdio> ...

  8. P2629 好消息,坏消息

    题目描述 uim在公司里面当秘书,现在有n条消息要告知老板.每条消息有一个好坏度,这会影响老板的心情.告知完一条消息后,老板的心情等于之前老板的心情加上这条消息的好坏度.最开始老板的心情是0,一旦老板 ...

  9. html5 input 标签

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="content-type" content ...

  10. ES-Apache Lucene

    前言 在介绍Lucene之前,我们来了解相关的历史. 有必要了解的Apache Apache软件基金会(也就是Apache Software Foundation,简称为ASF)是专门为运作一个开源软 ...