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. HDU 1713 相遇周期 (最小公倍数)

    题意:... 析:求周期就是这两个分数的最小公倍数,可以先通分,再计算分子的最小倍数. 代码如下: #pragma comment(linker, "/STACK:1024000000,10 ...

  2. AndroidStudio中添加依赖的三种方式以及如何引入so文件和arr文件

    AndroidStudio中添加依赖的三个选项,如图:    分别为:库依赖(Library dependency).文件依赖(File dependency)和module依赖(Module dep ...

  3. fzu2280 Magic(暴力+哈希预处理)

    传送门 题意 q次操作,每次两种操作: 1 x y:将wx变成y 2 x:查询满足一下两个条件的字符串(①以字符串x为后缀②字符串值\(\le wx\)) 分析 对n个字符串预处理,设f[i][j]为 ...

  4. bzoj 4240: 有趣的家庭菜园【树状数组+贪心】

    以为是逆序对数-- 实际上,原数组移动若干次后我们会得到一个新的下标序列,需要的移动次数是这个新下标序列的逆序对数 然后我们要让这个最小,考虑贪心先按h把下标排一遍序,然后每次询问到一种值的时候,对每 ...

  5. wordpress数据库结构及表说明

    数据表结构: wp_commentmeta:存储评论的元数据wp_comments:存储评论wp_links:存储友情链接(Blogroll)wp_options:存储WordPress系统选项和插件 ...

  6. web.xml报错:Invalid content was found starting with element 'init-param'

    问题与分析 在web.xml中配置servlet节点时报错如下: cvc-complex-type.2.4.a: Invalid content was found starting with ele ...

  7. mysql用户和授权

    CREATE USER 'monitor'@'10.224.32.%' IDENTIFIED BY '123@abAB'; mysql> GRANT select,insert,update O ...

  8. 17972 Golden gun的巧克力

    17972 Golden gun的巧克力 时间限制:1000MS  内存限制:65535K提交次数:93 通过次数:13 收入:124 题型: 编程题   语言: G++;GCC;JAVA Descr ...

  9. D. Black Hills golden jewels 二分答案 + 二分判定

    http://codeforces.com/gym/101064/problem/D 题目是给定一个数组,如果两两组合,有C(n, 2)种结果,(找出第一个大于等于第k大的结果) 思路, 二分答案va ...

  10. python_函数嵌套(4)

    第1章 名称空间 1.1 定义 1.2 变量运行流程 1.3 临时名称空间 1.4 python三种名称空间 第2章 作用域 2.1 作用域分类 2.2 加载顺序 2.3 取值顺序 函数嵌套 2.4 ...