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& ...
随机推荐
- UVa 1642 Magical GCD (暴力+数论)
题意:给出一个长度在 100 000 以内的正整数序列,大小不超过 10^ 12.求一个连续子序列,使得在所有的连续子序列中, 它们的GCD值乘以它们的长度最大. 析:暴力枚举右端点,然后在枚举左端点 ...
- 51nod 1094 【水题】
暴力即可!!! #include <stdio.h> #include <string.h> #include <iostream> using namespace ...
- poj1338【丑数·DP】
我记得这道题以前写过,而且是写出来了.DP吧. 然后现在想了好久...没想出来.... 然后考虑一下递推..mdzz-直接就是让之前的这个每次乘以2,3,5就好了嘛,然后每轮取最小. //#inclu ...
- MySQL 错误码对照
1005:创建表失败 1006:创建数据库失败 1007:数据库已存在,创建数据库失败 1008:数据库不存在,删除数据库失败 1009:不能删除数据库文件导致删除数据库失败 1010:不能删除数据目 ...
- (数位DP)51NOD 1042 数字0-9的数量
给出一段区间a-b,统计这个区间内0-9出现的次数. 比如 10-19,1出现11次(10,11,12,13,14,15,16,17,18,19,其中11包括2个1),其余数字各出现1次. 输入 ...
- ubuntu 直接用软件的名字启动非apt安装的软件
方法一: 可以在.bashrc文件中加入 alias命令,把软件的名字就等于软件执行文件的绝对路径 方法二: 在/usr/bin 目录下为执行文件创建软链接(未尝试)不过应该可以 软件自启动的方法 在 ...
- 使用pytesseract识别验证码,报错WindowsError: [Error 2]
问题现象: 按照网上的方式进行代码编写,使用pytesseract模块,然后导入指定图片进行解析,报错WindowsError: [Error 2] 问题原因: 源代码里面的路径设置错误,这里有一个坑 ...
- android 显示目录下图片
知识点 1. 网格视图 2. 读取文件 MainAcitvity package com.test.gridview; import android.support.v7.app.AppCompatA ...
- 洛谷p1955[NOI2015]程序自动分析
题目: 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量 ...
- 【前端】jQurey Plugin
; (function ($, window, document, undefined) { "use strict"; var defaults = { name: " ...