java读取nc文件的问题,前端ajax 发送参数进行交互的实例
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 发送参数进行交互的实例的更多相关文章
- java分享第十六天( java读取properties文件的几种方法&java配置文件持久化:static块的作用)
java读取properties文件的几种方法一.项目中经常会需要读取配置文件(properties文件),因此读取方法总结如下: 1.通过java.util.Properties读取Propert ...
- Java读取Excel文件的几种方法
Java读取 Excel 文件的常用开源免费方法有以下几种: 1. JDBC-ODBC Excel Driver 2. jxl.jar 3. jcom.jar 4. poi.jar 简单介绍: 百度文 ...
- Java读取txt文件
package com.loongtao.general.crawler.slave.utils; import java.io.BufferedReader; import java.io.File ...
- java 读取XML文件作为配置文件
首先,贴上自己的实例: XML文件:NewFile.xml(该文件与src目录同级) <?xml version="1.0" encoding="UTF-8&quo ...
- java 读取TXT文件的方法
java读取txt文件内容.可以作如下理解: 首先获得一个文件句柄.File file = new File(); file即为文件句柄.两人之间连通电话网络了.接下来可以开始打电话了. 通过这条线路 ...
- 用java读取properties文件--转
今天为了通过java读取properties文件,google了很长时间,终于找到了.现在特记录之和大家一起分享. 下面直接贴出代码:java类 public class Mytest pub ...
- java读取xml文件报“org.xml.sax.SAXParseException: Premature end of file” .
背景:java读取xml文件,xml文件内容只有“<?xml version="1.0" encoding="UTF-8"?>”一行 java读取该 ...
- java读取TXT文件的方法
java读取txt文件内容.可以作如下理解: 首先获得一个文件句柄.File file = new File(); file即为文件句柄.两人之间连通电话网络了.接下来可以开始打电话了. 通过这条线路 ...
- java读取XML文件的四种方式
java读取XML文件的四种方式 Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT& ...
随机推荐
- POJ2370【水题】
//#include <bits/stdc++.h> #include<iostream> #include<string.h> #include<cstdi ...
- POJ1276【多重背包】
题意: 给出一个价值sum,然后给出n,代表n个方案,接着n对代表个数与价值,要求最接近sum,但不超过sum的价值. 思路: 多重背包,利用二进制拆分达到保证对于0..n间的每一个整数,均可以用若干 ...
- = =写个prim希望能够巨巨们看的懂
prim算法---典型的贪心算法 求最小生成树的算法 (Minimum Spanning Tree)最小生成树: 算法思想:设图G顶点集合为U,首先任意选择图G中的一点作为起始点a,将该点加入集合V, ...
- bzoj 1049: [HAOI2006]数字序列【dp+二分+瞎搞】
第一问明显就是用b[i]=a[i]-i来做最长不下降子序列 然后第二问,对于一对f[i]=f[j]+1的(i,j),中间的数一定要改的,并且是等于b[i]或者b[j],我不会证,然后因为是随机数据,所 ...
- 黑客攻防技术宝典web实战篇:工具web服务器习题
猫宁!!! 参考链接:http://www.ituring.com.cn/book/885 随书答案. 1. 在什么情况下 Web 服务器会显示目录列表? 如果请求某目录的 URL 且满足以下条件,W ...
- [MySQL] LIMIT 分页优化
背景:LIMIT 0,20 这种分页方式,随着 offset 值的不断增大,当达到百万级时,一条查询就需要1秒以上,这时可以借助索引条件的查询来优化. SQL:select * from member ...
- shiro之自定义realm
Shiro认证过程 创建SecurityManager--->主体提交认证--->SecurityManager认证--->Authenticsto认证--->Realm验证 ...
- JS获取屏幕的大小
<html><script>function a(){document.write("屏幕分辨率为:"+screen.width+"*" ...
- django接受表单
from django.shortcuts import render from django.shortcuts import HttpResponse import os # Create you ...
- UvaLive6442(思维、结论)
结论是:按位置排序好以后,对于真正的答案,走法应该是:依次走向第0个等分点,第1个等分点……这样对于这种等分情况,是最优的调度. /* 先假设一个终点位置然后按位站好 这个位置不一定是最优所以要调 调 ...