岩心三维图综合管理模块实现了岩心图册展示、综合图文显示及三维综合显示功能,如下图所示:
1.岩心图像图册展示功能
选择井号和筒次,单击查询按钮:
上图为图册功能实际效果图。岩心图文数据通过井号和筒次查询后图册化显示,暂缺数据以空白代替。以“可见图即可得数据信息”的理念,系统实现了点击查看数据功能,即点击岩心图片,鼠标点击处即会显示红线以标示位置,同时弹出数据显示框,显示信息包括井号、筒次、岩心编号、起始深度、终止深度、当前深度、图像长度、层位。
核心功能局部图:
核心代码:
<td ><a href="#" style="cursor:hand" ><img id="<%=picNum%>" st = "<%=Double.parseDouble(oilList.get(picNum).get("ISTARTDEPTH").toString()) %>" len = "<%=Double.parseDouble(oilList.get(picNum).get("ILENGTH").toString()) %>" mytitle="井号:<%=oilList.get(picNum).get("WELLNUMBER").toString() %> 筒次:<%=oilList.get(picNum).get("CORENUMBER") %> 岩心编号:<%=oilList.get(picNum).get("CORECOD").toString() %> 起始深度:<%=Double.parseDouble(oilList.get(picNum).get("ISTARTDEPTH").toString()) %>m 终止深度:<%=Double.parseDouble(oilList.get(picNum).get("IENDDEPTH").toString()) %>m
" mytitle1 = "m
图像长度:<%=Double.parseDouble(oilList.get(picNum).get("ILENGTH").toString()) %>m 层位:<%=oilList.get(picNum).get("POSITION").toString() %>" border="0" src="load.jsp?path=<%=oilList.get(picNum).get("SECTIONPATH").toString()%>&name=<%=oilList.get(picNum).get("SECTIONNAME").toString()%>" onclick = "dodraw()" class="mod4" height="230px" width="100px" /></a></td>
function dodraw(e){
var eve = e || window.event;
var x = eve.clientX, // 相对于客户端的X坐标
y = eve.clientY, // 相对于客户端的Y坐标
x1 = eve.screenX, // 相对于计算机屏幕的X坐标
y1 = eve.screenY; // 相对于计算机屏幕的Y坐标
var tid = eve.srcElement.id;
var elemet = document.getElementById(tid);
var objTop = elemet.getBoundingClientRect().top;//对象x位置
var objLeft = elemet.getBoundingClientRect().left;//对象y位置
//计算点击的相对位置
var objX = eve.clientX - objLeft;
var objY = eve.clientY - objTop;
var clickObjPosition = objTop + "," + objLeft;
var startlen = elemet.st;
var nowl = (elemet.len *1 /228 *objX + startlen*1).toFixed(3);
document.getElementById("myDiv").innerText = elemet.mytitle + "当前深度:" + nowl + elemet.mytitle1;
var o=$("#myDiv");
o.css({
position:"absolute",
top:eve.clientY + document.body.scrollTop + 50+"px",
left:eve.clientX+ 50+"px"
})
2.岩心数据综合显示
选择井号和筒次,单击查询按钮:
岩心数据综合显示将岩心图片的层位、深度、图像和描述信息综合排列显示,整体显示,方便了数据管理及浏览。
核心代码如下:
// List<Map<String, String>> list = oilDao.getCoreImageLists();
Map<String, String> map4=oilList.get(0);
double st1 = Double.parseDouble(map4.get("ISTARTDEPTH"));
int pNUM = oilList.size();//图片总数
double startLine[];//进尺起始位置
startLine = new double [pNUM];
double endLine[];//进尺结束位置
endLine = new double [pNUM];
numC = 100;
double deepTh[];//进尺深度 决定图片高度
deepTh = new double [pNUM];
double tdNum[];//进尺深度 决定图片高度
tdNum = new double [pNUM + 50];
String imgWBM[];//图片列表
imgWBM = new String[pNUM +50];
String imgZQM[];//图片列表
imgZQM = new String[pNUM +50];
String imgBH[];//图片列表
imgBH= new String[pNUM +50];
String imgWBMID[];//图片ID
imgWBMID = new String[pNUM +50];
pcount = 0;
tablecount = 0;
piccount = 0;
tempn = 0;
for (Map<String, String> map : oilList) {
startLine[pcount] = Double.parseDouble(map.get("ISTARTDEPTH"));
endLine[pcount] = Double.parseDouble(map.get("IENDDEPTH"));
deepTh[pcount] = Math.round((endLine[pcount] - startLine[pcount])*numC);
if(pcount != 0 && startLine[pcount]!=endLine[tempn])
{
if((pcount+1)%2 == 0)
{
tdNum[tablecount] = Math.round((startLine[pcount] - endLine[tempn])*500 );
imgWBM[piccount] = "未衔接处";
piccount++;
tablecount++;
}
else
{
tdNum[tablecount] = Math.round((startLine[pcount] - endLine[tempn])*500 );
imgWBM[piccount] = "未衔接处";
tablecount++;
piccount++;
}
}
if((pcount+1)%2 == 0)
{
tdNum[tablecount] = Math.round(deepTh[pcount]*5);
}
else
{
tdNum[tablecount] = Math.round(deepTh[pcount]*5);
}
imgWBM[piccount] = map.get("SURFACENAME");
imgZQM[piccount] = map.get("SECTIONNAME");
imgWBMID[piccount]=map.get("COREIMAGEID");
tempn = pcount;
pcount++;
tablecount++;
piccount++;
}
%>
<%
if(oilList!=null){
Map<String, String> mm=oilList.get(0);
%>
3.岩心三维综合显示
选择井号和筒次,单击查询按钮:
岩心三维综合显示将岩心深度、图像及岩心描述信息进行综合显示。点击左侧岩心图像,则中部三维浏览区域将以柱状来三维展示岩心图片;同时右侧岩心资料区域显示本图片的岩心资料数据。本系统通过三维技术完美展示了岩心柱状形态(三维显示具备岩心柱体自转、鼠标随动、半径缩放和整体缩放)。
核心代码如下:
<script type="text/javascript">
var jsReady = false;
function refreshWell(){
var wellId = $("#wellId").attr("value");
if(wellId != '')
{
$.post("../cylinder/jquery.jsp?coreNumber=<%=coreNumber%>", {Action:"post",wellId:wellId}, function(data, textStatus){
var coreNumber = $("#coreNumber");
coreNumber.empty();
coreNumber.append(data);
});
}
}
function refreshCoreNumber(){
var wellId = $("#wellId").attr("value");
if(wellId != '')
{
$.post("../cylinder/jquery.jsp", {Action:"post",wellId:wellId}, function(data, textStatus){
var coreNumber = $("#coreNumber");
coreNumber.empty();
coreNumber.append(data);
});
}
}
function query(){
var wellId = document.form1.wellId;
if(wellId.value==null||wellId.value==""){
alert("请选择井号!");
wellId.focus();
return false;
}
var coreNumber = document.form1.coreNumber;
if(coreNumber.value==null||coreNumber.value==""){
alert("请选择筒次!");
coreNumber.focus();
return false;
}
document.form1.submit();
}
function isReady() {
return jsReady;
}
function pageInit(id,url) {
jsReady = true;
sendToActionScript(url);
var wellId = $("#wellId").attr("value");
var coreNumber = $("#coreNumber").attr("value");
var imageId = id;
$.post("loaddes.jsp", {Action:"post",wellId:wellId,coreNumber:coreNumber,imageId:imageId}, function(data, textStatus){
$('#show').html(data);
});
}
function thisMovie(movieName) {
if (navigator.appName.indexOf("Microsoft") != -1) {
return window[movieName];
} else {
return document[movieName];
}
}
function sendToActionScript(value) {
thisMovie("ExternalInterfaceExample").sendToActionScript(value);
}
function sendToJavaScript(value) {
document.forms["form1"].output.value += "ActionScript says: " + value + "\n";
}
function testLine() {
line(1, 2, 88, 88, document.getElementById(container));
}
function line(startX, startY, endX, endY, container) {
if (startX == endX) {
if (startY > endY) {
var tempY = startY;
startY = endY;
endY = tempY;
}
for (var k = startY; k < endY; k++) {
createPoint(container, startX, k);
}
}
// y = ax + b
var a = (startY - endY) / (startX - endX);
var b = startY - ((startY - endY) / (startX - endX)) * startX;
if (Math.abs(startX - endX) > Math.abs(startY - endY)) {
if (startX > endX) {
var tempX = endX;
endX = startX;
startX = tempX;
}
var left = container.style.left;
var top = container.style.top;
for (var i = startX; i <= endX; i++) {
createPoint(container, i, a * i + b);
}
} else {
if (startY > endY) {
var tempY = startY;
startY = endY;
endY = tempY;
}
for (var j = startY; j <= endY; j++) {
createPoint(container, (j - b) / a, j);
}
}
}
function createPoint(container, x, y) {
var node = document.createElement(div);
node.className = line;
node.style.marginTop = y;
node.style.marginLeft = x;
container.appendChild(node);
}
</script>