java版WorldWind源代码解析之一

合集下载

JAVA读取WORD文档解决方案

JAVA读取WORD文档解决方案

JAVA读取WORD文档解决方案在Java中读取Word文档需要使用特定的Java库或API来解析和处理Word文档格式(.doc或.docx)。

在下面的解决方案中,我们将介绍两种流行的Java库,即Apache POI和JavaFX的XSSF。

1. Apache POI:Apache POI是一个流行的开源Java库,用于处理Microsoft Office 格式的文件,包括Word文档。

下面是使用Apache POI库读取Word文档的步骤:1.1 添加Apache POI依赖库到项目中。

在Maven项目中,可以在pom.xml文件中添加以下依赖项:```xml<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>```1.2 使用`XWPFDocument`类打开Word文档。

下面是一个示例代码:```javaFileInputStream fis = newFileInputStream("path/to/word/document.docx");XWPFDocument document = new XWPFDocument(fis);fis.close(;```1.3 使用`XWPFParagraph`类和`XWPFRun`类来遍历Word文档中的段落和文本。

java 源码解析

java 源码解析

java源码解析一、引言Java是一种广泛使用的编程语言,其源码是开发者深入理解Java平台的基础。

本解析文档旨在帮助读者全面了解Java源码的结构、设计和实现,为Java开发者提供一份实用的参考资料。

二、Java源码概览Java源码主要由以下几个部分组成:1.Java编译器:用于将Java源代码编译成字节码。

2.Java虚拟机(JVM):负责执行Java字节码,实现Java平台的核心。

3.Java类库:包含一系列标准库和第三方库,提供丰富的功能和工具。

4.Java应用框架:为开发者提供一套构建Java应用的规范和工具。

三、Java编译器解析Java编译器是Java源码的核心部分之一,负责将Java源代码编译成字节码。

以下是其主要组成部分和功能:1.词法分析器:将Java源代码分解成一个个语法单元(Tokens)。

2.语法分析器:根据Java语法规则,将词法分析器的输出进一步分解成语法树。

3.类型检查器:检查语法树中的类型错误,并进行必要的调整。

4.字节码生成器:根据语法树生成Java字节码。

四、Java虚拟机解析Java虚拟机是Java平台的核心,负责执行Java字节码。

以下是其主要组成部分和功能:1.运行时环境:包含内存、线程、垃圾回收等核心组件。

2.字节码解释器:解释执行字节码,提供良好的用户体验。

3.垃圾回收器:自动管理内存,确保内存泄漏和野指针等问题得到有效解决。

4.扩展接口:为开发者提供丰富的扩展机制,支持各种硬件平台和操作系统。

五、Java类库解析Java类库是一系列标准库和第三方库的集合,提供了丰富的功能和工具,帮助开发者更高效地开发Java应用。

以下是其中一些常用库的功能和用法:1.String类:提供了字符串操作的各种方法,如拼接、切割、替换等。

2.Collections类:提供了对集合的操作,如添加、删除、排序等。

3.IO类库:提供了输入输出操作的功能,如文件读写、网络通信等。

Java图形用户界面设计(Swing)的介绍

Java图形用户界面设计(Swing)的介绍

Java图形⽤户界⾯设计(Swing)的介绍前⾔Swing是⼀个⽤于开发Java应⽤程序⽤户界⾯的开发⼯具包。

它以抽象窗⼝⼯具包(AWT)为基础使跨平台应⽤程序可以使⽤任何可插拔的外观风格。

Swing开发⼈员只⽤很少的代码就可以利⽤Swing丰富、灵活的功能和模块化组件来创建优雅的⽤户界⾯。

Swing 是⼀个为Java设计的GUI⼯具包。

Swing是JAVA基础类的⼀部分。

Swing包括了图形⽤户界⾯(GUI)器件如:⽂本框,按钮,分隔窗格和表。

Swing提供许多⽐AWT更好的屏幕显⽰元素。

它们⽤纯Java写成,所以同Java本⾝⼀样可以跨平台运⾏,这⼀点不像AWT。

它们是JFC的⼀部分。

它们⽀持可更换的⾯板和主题(各种操作系统默认的特有主题),然⽽不是真的使⽤原⽣平台提供的设备,⽽是仅仅在表⾯上模仿它们。

这意味着你可以在任意平台上使⽤JAVA⽀持的任意⾯板。

轻量级组件的缺点则是执⾏速度较慢,优点就是可以在所有平台上采⽤统⼀的⾏为。

Hello World 程序HelloWorldSwing.java ⽂件代码如下:import javax.swing.*;public class HelloWorldSwing {/**{* 创建并显⽰GUI。

出于线程安全的考虑,* 这个⽅法在事件调⽤线程中调⽤。

*/private static void createAndShowGUI() {// 确保⼀个漂亮的外观风格JFrame.setDefaultLookAndFeelDecorated(true);// 创建及设置窗⼝JFrame frame = new JFrame("HelloWorldSwing");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 添加 "Hello World" 标签JLabel label = new JLabel("Hello World");frame.getContentPane().add(label);// 显⽰窗⼝frame.pack();frame.setVisible(true);}public static void main(String[] args) {// 显⽰应⽤ GUIjavax.swing.SwingUtilities.invokeLater(new Runnable() {public void run() {createAndShowGUI();}});}}执⾏以下命令输出结果:$ javac HelloWorldSwing.java$ java HelloWorldSwing⼀个⽤户登录框实例SwingLoginExample.java ⽂件代码如下:import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JPasswordField;import javax.swing.JTextField;public class SwingLoginExample {public static void main(String[] args) {// 创建 JFrame 实例JFrame frame = new JFrame("Login Example");// Setting the width and height of frameframe.setSize(350, 200);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/* 创建⾯板,这个类似于 HTML 的 div 标签* 我们可以创建多个⾯板并在 JFrame 中指定位置* ⾯板中我们可以添加⽂本字段,按钮及其他组件。

worldwind技术手册

worldwind技术手册

写在前面虽说是技术手册,但是没有源码的研究就算是一个教程吧。

由于本人能力有限,文章中有很多不当之处,请各位原谅。

Bigheader联系:gdsqz2@worldwind技术手册目录:1.WorldWind软件架构――――――――――――――――02WW功能介绍WW与XMLClient与ServerWW使用链接本地缓存路径本地功能配置http请求与aspWMS、WFS2.WorldWind金字塔体系―――――――――――――――――-03瓦片金字塔详解及其对应公式――――――――――――――――――03NASA World Wind Tile Structure ―――――――――――――――――03NASA World Wind Map Tile System ――――――――――――――――04瓦片请求调度策略―――――――――――――――――052.2.1 当前显示请求及其显示(客户端)――――――――――――――――――052.2.2目标瓦片快速搜索算法――――――――――――――――――082.2.3瓦片数据的请求预测(服务器)――――――――――――――――――082.3 可视化的地球空间数学模型――――――――――――――――――102.3.1 地球三维LOD模型――――――――――――――――――103.Geospatial image processing ――――――――――――――――――143.1步骤:(准备知识:LOTD:0层瓦片大小;TileSize:)―――――――――――143.2 NLT Landsat处理技术范例―――――――――――――153.3 dstile howto ―――――――――――――154.Creat a new world ―――――――――――――174.1World Wind本地文件说明4.1.1. Worlds4.1.2. 在安装目录下4.2 创建新的世界模型5.Making layer ――――――――――――――185.1 添加新图层(更详细可参考)5.2 Point ―――――――――――――――205.3 Lines ―――――――――――――――205.4 Polygon ―――――――――――――――235.5 Model Feature ―――――――――――――――255.6 Effects and Multi-Texturing ―――――――――――――――275.7 Shapefile ―――――――――――――――325.8 KML/KMZ6.ddons与plugins ―――――――――――――――32addons与plugins区别插件总汇及其功能7.script脚本―――――――――――――――――338.编译调试―――――――――――――――――――339.读书籍和论文―――――――――――――――――――――3410.1.4.1版本发展―――――――――――――――35一、WW软件结构1.1 功能介绍World Wind(简称WW,中文有人直翻译为世界风),是NASA发布的一个开放源代码(Open Source)的地理科普软件(由NASA Research开发,由NASA Learning Technologies來發展),它是一个可视化地球仪,将NASA、USGS以及其它WMS服务商提供的图像通过一个三维的地球模型展现,近期还包含了月球、金星、火星、天文星系等的展现。

java读取word并解析

java读取word并解析

java读取word并解析java POI3.8处理word模板,⽂字图⽚表格将word模板⾥⾯的特殊标签换成⽂字,图⽚,以下是处理的代码特殊标签最好的复制粘贴到word模板⾥⾯ ,因为⼿动敲⼊可能有点⼩的差别都导致这个标签不是⼀⼩块(chunk)这样会⽆法识别,⽂字样式设置的时候也最好选择特殊标签整体进⾏设置,尽量不要多选(例如标签后⾯跟上⼀个空格)这⾥的替换包含了⽂字样式的替换,图⽚的替换-------------------------------------------------------------------------------------------------------------------------------------package com.util.export;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Map.Entry;import org.apache.poi.POIXMLDocument;import org.apache.poi.openxml4j.exceptions.InvalidFormatException;import ermodel.ParagraphAlignment;import ermodel.UnderlinePatterns;import ermodel.VerticalAlign;import ermodel.XWPFDocument;import ermodel.XWPFParagraph;import ermodel.XWPFRun;import ermodel.XWPFTable;import ermodel.XWPFTableCell;import ermodel.XWPFTableRow;import org.apache.xmlbeans.XmlException;import org.apache.xmlbeans.XmlToken;import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;public class WordCompileReport {public static void searchAndReplace(String srcPath, String destPath,Map map,Map mapImage) {try {XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(srcPath));//替换表格占位符checkTables(document,map);//替换段落占位符checkParagraphs(document,map);//在末尾添加⽂字addParagraphToWord(document,"这⾥添加⽂字",30,0,"#EB9074",true);//替换图⽚replaceTextToImage(document,mapImage,200,200);FileOutputStream outStream = null;outStream = new FileOutputStream(destPath);document.write(outStream);outStream.close();} catch (Exception e) {e.printStackTrace();}}public static void checkTables(XWPFDocument document,Map map) {Iterator it = document.getTablesIterator();while (it.hasNext()) {XWPFTable table = (XWPFTable) it.next();int rcount = table.getNumberOfRows();for (int i = 0; i < rcount; i++) {XWPFTableRow row = table.getRow(i);List cells = row.getTableCells();for (XWPFTableCell cell : cells) {List listCell;for (Entry e : map.entrySet()) {listCell = cell.getParagraphs();List cellRun;Map mapAttr = new HashMap();for (int j = 0; j < listCell.size(); j++) {if (listCell.get(j).getText().indexOf(e.getKey()) != -1) {cellRun = listCell.get(j).getRuns();for (int c = 0; c < cellRun.size(); c++) {if (cellRun.get(c).getText(0).equals(e.getKey())) {mapAttr = getWordXWPFRunStyle(cellRun.get(c));listCell.get(j).removeRun(c);XWPFRun newRun = listCell.get(j).insertNewRun(c);setWordXWPFRunStyle(newRun, mapAttr,e.getValue(), false);}}}}}}}}}public static void checkParagraphs(XWPFDocument document,Map map){List listRun;Map mapAttr = new HashMap();List listParagraphs = document.getParagraphs();for (int sa = 0; sa < listParagraphs.size(); sa++) {for (Entry e : map.entrySet()) {if (listParagraphs.get(sa).getText().indexOf(e.getKey()) != -1) {listRun = listParagraphs.get(sa).getRuns();for (int p = 0; p < listRun.size(); p++) {if (listRun.get(p).toString().equals(e.getKey())) {//得到占位符的⽂本格式XWPFRun runOld = listParagraphs.get(sa).getRuns().get(p);mapAttr=getWordXWPFRunStyle(runOld); //封装该占位符⽂本样式到map listParagraphs.get(sa).removeRun(p);//移除占位符//创建设置对应占位符的⽂本XWPFRun runNew = listParagraphs.get(sa).insertNewRun(p);setWordXWPFRunStyle(runNew,mapAttr,e.getValue(),true);}}}}}}public static Map getWordXWPFRunStyle(XWPFRun runOld){Map mapAttr = new HashMap();mapAttr.put("Color", runOld.getColor());if(-1==runOld.getFontSize()){mapAttr.put("FontSize", 12);}else{mapAttr.put("FontSize", runOld.getFontSize());}mapAttr.put("Subscript", runOld.getSubscript());mapAttr.put("Underline", runOld.getUnderline());mapAttr.put("FontFamily",runOld.getFontFamily());return mapAttr;}public static XWPFRun setWordXWPFRunStyle(XWPFRun runNew,Map mapAttr,String text,boolean flag){ runNew.setColor((String) mapAttr.get("Color"));if("-1".equals(mapAttr.get("FontSize").toString())){//处理⼩四字号读取为-1的问题runNew.setFontSize(12);}else{runNew.setFontSize((Integer) mapAttr.get("FontSize"));}runNew.setBold(flag);runNew.setUnderline((UnderlinePatterns) mapAttr.get("Underline"));runNew.setText(text);runNew.setSubscript((VerticalAlign) mapAttr.get("Subscript"));runNew.setFontFamily((String) mapAttr.get("FontFamily"));return runNew;}public static void updatePicture(XWPFDocument document,int id, int width, int height) {if(id==0){id = document.getAllPictures().size()-1;}final int EMU = 9525;width *= EMU;height *= EMU;String blipId = document.getAllPictures().get(id).getPackageRelationship().getId();CTInline inline = document.createParagraph().createRun().getCTR().addNewDrawing().addNewInline();String picXml = ""+ ""+ " "+ " "+ " " + "+ id+ "\" name=\"Generated\"/>"+ " "+ " "+ " "+ "+ blipId+ "\" xmlns:r=\"/officeDocument/2006/relationships\"/>"+ " "+ " "+ " "+ " "+ " "+ " "+ " "+ "+ width+ "\" cy=\""+ height+ "\"/>"+ " "+ " "+ " "+ " "+ " "+ " "+ " " + "";// CTGraphicalObjectData graphicData =inline.addNewGraphic().addNewGraphicData();XmlToken xmlToken = null;try {xmlToken = XmlToken.Factory.parse(picXml);} catch (XmlException xe) {xe.printStackTrace();}inline.set(xmlToken);// graphicData.set(xmlToken);inline.setDistT(0);inline.setDistB(0);inline.setDistL(0);inline.setDistR(0);CTPositiveSize2D extent = inline.addNewExtent();extent.setCx(width);extent.setCy(height);CTNonVisualDrawingProps docPr = inline.addNewDocPr();docPr.setId(id);docPr.setName("IMG_" + id);docPr.setDescr("IMG_" + id);}public static void addPictureToWord(XWPFDocument document,String imagePath,int imageType,int width,int height){if(0==imageType){imageType=XWPFDocument.PICTURE_TYPE_JPEG;}try {String ind = document.addPictureData(new FileInputStream(imagePath), imageType);} catch (InvalidFormatException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();}updatePicture(document,document.getAllPictures().size()-1,400,400);}public static void addParagraphToWord(XWPFDocument document,String text,int fontSize,int alignment,String RGBColor,boolean isBold){XWPFParagraph paragraph = document.createParagraph();if(1==alignment){paragraph.setAlignment(ParagraphAlignment.CENTER);}else if(2==alignment){paragraph.setAlignment(ParagraphAlignment.CENTER);}else if(3==alignment){paragraph.setAlignment(ParagraphAlignment.RIGHT);}else{paragraph.setIndentationLeft(alignment);}XWPFRun runOne = paragraph.createRun();runOne.setText(text);runOne.setBold(isBold);runOne.setFontSize(fontSize);if(RGBColor.startsWith("#")){runOne.setColor(RGBColor.substring(1));}else{runOne.setColor(RGBColor);}}public static void addRunToParagraph(XWPFParagraph paragraph,String text,int fontSize,String RGBColor,boolean isBold,boolean isWrap){XWPFRun runText = paragraph.createRun();// runText.setStrike(true); //删除线runText.setBold(isBold);runText.setColor(RGBColor);runText.setFontSize(fontSize);runText.setText(text);if(isWrap)runText.addBreak();}public static void replaceTextToImage(XWPFDocument document,Map mapImage,int width,int height){List listRun;List listParagraphs = document.getParagraphs();for (int sa = 0; sa < listParagraphs.size(); sa++) {for (Entry e : mapImage.entrySet()) {if (listParagraphs.get(sa).getText().indexOf(e.getKey()) != -1) {listRun = listParagraphs.get(sa).getRuns();for (int p = 0; p < listRun.size(); p++) {if (listRun.get(p).toString().equals(e.getKey())) {listParagraphs.get(sa).removeRun(p);//移除占位符//获得当前CTInlineCTInline inline = listParagraphs.get(sa).createRun().getCTR().addNewDrawing().addNewInline();try {insertPicture(document,e.getValue(),inline,width,height);} catch (InvalidFormatException e1) {e1.printStackTrace();} catch (FileNotFoundException e1) {e1.printStackTrace();}}}}}}}public static void insertPicture(XWPFDocument document,String filePath,CTInline inline,int width, int height) throws InvalidFormatException, FileNotFoundException{String ind = document.addPictureData(new FileInputStream(filePath), 5);int id = document.getAllPictures().size()-1;final int EMU = 9525;width *= EMU;height *= EMU;String blipId = document.getAllPictures().get(id).getPackageRelationship().getId();String picXml = ""+ ""+ " "+ " "+ " " + "+ id+ "\" name=\"Generated\"/>"+ " "+ " "+ " "+ "+ blipId+ "\" xmlns:r=\"/officeDocument/2006/relationships\"/>"+ " "+ " "+ " "+ " "+ " "+ " "+ " "+ "+ width+ "\" cy=\""+ height+ "\"/>"+ " "+ " "+ " "+ " "+ " "+ " "+ " " + "";inline.addNewGraphic().addNewGraphicData();XmlToken xmlToken = null;try {xmlToken = XmlToken.Factory.parse(picXml);} catch (XmlException xe) {xe.printStackTrace();}inline.set(xmlToken);inline.setDistT(0);inline.setDistB(0);inline.setDistL(0);inline.setDistR(0);CTPositiveSize2D extent = inline.addNewExtent();extent.setCx(width);extent.setCy(height);CTNonVisualDrawingProps docPr = inline.addNewDocPr(); docPr.setId(id);docPr.setName("IMG_" + id);docPr.setDescr("IMG_" + id);}public static void main(String[] args) {HashMap map = new HashMap();HashMap mapImage = new HashMap();map.put("${name}$", "02");map.put("${userIDs}$", "5201314");mapImage.put("${image1}$", "F:\\A.jpg");mapImage.put("${image2}$", "F:\\B.jpg");String srcPath = "c:\\zhenli\\cc.docx";String destPath = "c:\\zhenli\\输出模版.docx";searchAndReplace(srcPath, destPath, map,mapImage);}}。

Java解析word文档

Java解析word文档
for(int j=1;j<imgCount+1;j++){ Dispatch shape = Dispatch.call(imgDispatch, "Item", new Variant(1)).toDispatch(); Dispatch imageRange = Dispatch.get(shape, "Range").toDispatch(); Dispatch.call(imageRange, "Copy"); (imageRange, "Paste"); } }
Java解 析 word文 档 背景 在互联网教育行业,做内容相关的项目经常碰到的一个问题就是如何解析word文档。 因为系统如果无法智能的解析word,那么就只能通过其他方式手动录入word内容,效率低下,而且人工成本和录入出错率都较高。 疑难点 word解析可以预见的困难主要有以下几个方面: word 结构问题 —— word不开源,且含有很多非文本内容,比如图表,而已知的常规方法只能解析纯文本内容,所以如果不知道word内部 层级结构,解析将难以进行。 word 公式问题 —— word公式来源并非单一,可能是用MathType插件生成的latex公式,也可能是用word自带公式编辑器生成的公式,还有 可能公式部分手敲,部分使用搜狗输入法或者其它编辑器输入。不同来源处理方式是否一样?且能否有效读取文档各种上下脚标?方便后 期展示? word 非文本问题 —— word含有很多的非文本内容,比如图表。来源也多样,图表可能是用word自带的画图工具生成的,也有可能是复制 粘贴的,不同来源解析方式是否一样?且读取的时候是否能有效获取图片的位置及大小信息?方便文档内容后期在PC端和移动端展示。无 论最终方案是什么,肯定是将所有的且需要的非文本信息转换为文本信息。 word 版本问题 —— word有03、07等好几个版本,还有WPS版本,解析是否要全部兼容?后缀名有docx和doc,是否全部兼容?当然,前 提是已经成功解析一种类型。 word 规范问题 —— 有些word可能是早期制作的,返工代价太大,所以格式内容多样化。而且就算制定word格式规范,新制作的word也无 法保证格式一定正确,除非是程序自动生成的文档。举个例子,试题的题序,肉眼无法区分的格式就有好几种。程序只可能尽量覆盖绝大 部分情况,考虑的情况越多,解析正确率越高,当然程序也更复杂。

worldwind学习系列一至六

worldwind学习系列一至六

WorldWind系列一:顺利起航篇来源:博客园作者:无痕客今天从官方下载WorldWind 1.4版的源代码开始研究,可是运行时,发现有很多问题。

下面是我的解决对策,帮助遇到相同问题的网友顺利起航!错误1:原因:无法找到引用的DLL文件解决方法:1.更改发布模式为调试模式(最简单,不用重新添加引用)2.将Debug文件下所有文件复制到World_Wind_1.4.0_Source\WorldWind\bin\x86\Release目录下参看:/showtopic-324487.aspx假定所有的源文件的根目录为World_Wind_1.4.0_Source,在该目录下,找到World_Wind_1.4.0_Source\bin\Debug,将该目录下的Config、Data和Plugins目录,以及AviFile.dll、FlickrNet.dll、Org.Mentalis.Security.dll、ZedGraph.dll等拷贝粘贴到World_Wind_1.4.0_Source\WorldWind\bin\x86\Release目录下即可。

错误2:LoaderLock问题解决方法:ctrl+D+E或alt+ctl+e或使用菜单(调试-》异常)——》异常窗口——》ManagerDebuggingAssistants ——》去掉LoaderLock选项参照我的blog:/wuhenke/archive/2009/09/12/1565135.html#1644371错误3:Debug调试状态下运行,生成成功,但没有启动程序原因:不详解决方法:1 ctrl+f5 不调试下运行2. 设置解决方案平台为x86下面是我搜集相关的内容,现转载其内容:/paladin1893/blog/item/e359f9cabd581217be09e6d8.htmlNASA World Wind开源项目配置详细解说2009-05-31 19:46NASA World Wind开源项目配置详细解说NASA World Wind 是C#开发地个人电脑上地开源地3D图形虚拟地球系统。

WorldWind Java应用于数字城市的建设

WorldWind Java应用于数字城市的建设
参 考 文献 [ ] vdG e 1Dai B l NAS ol n : esuc SfrMiin l AW r wid Opno reGI o so d s
第 二层 : 将原始高分辨率的图片在第一层的基础上再分割 , 即按经
度 1 。纬度 1。 割 。 8, 8切
O e — o s ]IE r s t n o es ec a dRe o e s g p r d n[ . E Ta a i s n G o i e n m t Sn n , a J E n co cn e i
科技信息
计 算机 与 网络
W o IW idJ v r d a a应 用 于 数字 城 市 昀 建 设 n
成都 理 工大 学信 息 工程 学院 蒋佩伶
[ 摘 要] 本文主要介 绍了 NAS AwolWidJv 的技 术框架及 显著特 点。W0l n Jv 是 由NA A和 开源社 区共 同开发的一款 r n aa d r Wid aa d S 免 费开源的虚拟世 界软件 。本文对在 NA AW olWid aa的基础上 , S r n Jv d 开发建设数字城 市进行 了研 究。 [ 关键词 ] r Wid aa 开源 数 字城 市 Wol n Jv d
20 , )14 0 6 ( .0 8 2 [ 2NAS S olW id lB/ j t : e. kpdaogwi J ANA A W r d n E OL . t / nwiiei. / — hp / r
数字城市是数字地球的一个组成部分 ,可以看作是一个系统工程 或发展战略 。数字城市与园林 城市 , 生态城市一样 , 是对城市发展方向 的一种描述 , 是指数 字技 术 、 信息技术 、 网络技术要渗透到城 市生活的 各个方面 。 建设数字城市 能够制止猖獗的违法建筑 , 并避免制约工程招 标 和房地产建设中的大量弊端。数字城市符合中国 目前工业化和信息 化并行 的经济生活现状 , 中国城市现代化建设中具有 重要意义 。 在 4WolW i a a应有 于数 字 城 市 的 建 设 . r n Jv d d 建设数字城市最重要的一个基础就是空间数据 。据统计人类生活 和生产 的信息有 8 %与空间位置有关 ,数字地球” 的基本概念也是定 0 “ 义在地球空间框架上集成和展示各种数据 ,数字地 图和数字影像是数 字城市 的基础框架。而将 空间地理信息与地图和影像 图片结合起来 , 正 是 WolWidJv r n a的一大特点 。 d a 为 了满足建设数字城市 的需要 ,我们重新组合 了 Wo d n v r Wi J a l da 的显示界面 , 并增加了其对 K L文件 显示的支持。K L 是 K yo 标 M M , ehl e 记 语言 ( eh l Mal ag ae 的缩 写 , K yoe r Ln ug ) &p 是一种 采用 X ML语法 与格 式的语言 , 用于描述和保存 地理信 息 , 如点 、 、 线 图像 、 多边形和模型等 。 我们只需 将城 市文本 信息 , 图片 , 频和 3 视 D模 型以及 与其对应的空间 地理位置信息 以 K L文件 的形式保存并导入应用程序 。 M 我们的代码会 自动对 KML文件解 析 , 并将文件中包含的城市文本信息 、 图片 、 视频和 3 D模型以及 与其对应空间地理位置信息正确无误 的展示在 WolWid r n d Jy aa的球 体 E。

java解析world 文件 修改内容

java解析world 文件 修改内容

java解析world 文件修改内容Java解析World文件是一种常见的操作,可以通过读取并修改World文档中的内容。

World文件是一种二进制文件格式,通常用于Microsoft Office中的Word软件。

在Java中,我们可以使用一些库来实现这个功能,例如Apache POI。

首先,我们需要导入Apache POI的相关依赖。

可以在Maven项目的pom.xml 文件中添加以下代码:```xml<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency>```接下来,我们可以通过以下步骤来解析并修改World文件的内容:1. 创建一个`FileInputStream`对象,用于打开World文件:```javaFileInputStream file = new FileInputStream("path/to/your/world.doc");```2. 创建一个`XWPFDocument`对象,用于表示整个解析后的文档:```javaXWPFDocument document = new XWPFDocument(file);```3. 遍历文档中的段落,并修改需要修改的内容:```javafor (XWPFParagraph paragraph : document.getParagraphs()) {String text = paragraph.getText();// 进行内容修改,例如替换指定文本text = text.replace("需要修改的内容", "替换后的内容");// 将修改后的文本重新设置回段落中paragraph.setText(text);}```4. 保存修改后的文档到新的文件中:```javaFileOutputStream outputStream = newFileOutputStream("path/to/your/modified_world.doc");document.write(outputStream);outputStream.close();```通过以上步骤,我们可以实现Java解析并修改World文件的功能。

JAVA生成word文档代码加说明

JAVA生成word文档代码加说明

import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.util.Iterator;import java.util.Map;import javax.servlet.http.HttpServletResponse;import org.apache.poi.hwpf.HWPFDocument;import org.apache.poi.hwpf.model.FieldsDocumentPart;import ermodel.Field;import ermodel.Fields;import ermodel.Range;import ermodel.Table;import ermodel.TableIterator;import ermodel.TableRow;publicclass WordUtil {publicstaticvoid readwriteWord(String filePath, String downPath, Map<String, String> map, int[] num, String downFileName) { //读取word模板FileInputStream in = null;try {in = new FileInputStream(new File(filePath));} catch (FileNotFoundException e1) {e1.printStackTrace();}HWPFDocument hdt = null;try {hdt = new HWPFDocument(in);} catch (IOException e1) {e1.printStackTrace();}Fields fields = hdt.getFields();Iterator<Field> it = fields.getFields(FieldsDocumentPart.MAIN) .iterator();while (it.hasNext()) {System.out.println(it.next().getType());}//读取word表格内容try {Range range = hdt.getRange();//得到文档的读取范围TableIterator it2 = new TableIterator(range);//迭代文档中的表格int tabCount = 0;while (it2.hasNext()) {//System.out.println(" 第几个表格 "+tabCount);//System.out.println(num[tabCount] +" 行");Table tb2 = (Table) it2.next();//迭代行,默认从0开始for (int i = 0; i < tb2.numRows(); i++) {TableRow tr = tb2.getRow(i);// System.out.println(" fu "+num[tabCount] +" 行");if (num[tabCount] < i && i < 7) {tr.delete();}} //end fortabCount++;} //end while//替换word表格内容for (Map.Entry<String, String> entry : map.entrySet()) { range.replaceText("$"+ entry.getKey().trim() + "$", entry.getValue());}// System.out.println("替换后------------:"+range.text().trim());} catch (Exception e) {e.printStackTrace();}//System.out.println("--------------------------------------------------------------------------------------");ByteArrayOutputStream ostream = new ByteArrayOutputStream();String fileName = downFileName;fileName += ".doc";String pathAndName = downPath + fileName;File file = new File(pathAndName);if (file.canRead()) {file.delete();}FileOutputStream out = null;out = new FileOutputStream(pathAndName, true);} catch (FileNotFoundException e) {e.printStackTrace();}try {hdt.write(ostream);} catch (IOException e) {e.printStackTrace();}//输出字节流try {out.write(ostream.toByteArray());} catch (IOException e) {e.printStackTrace();}try {out.close();} catch (IOException e) {e.printStackTrace();}try {ostream.close();} catch (IOException e) {e.printStackTrace();}}/***实现对word读取和修改操作(输出文件流下载方式)*@param response响应,设置生成的文件类型,文件头编码方式和文件名,以及输出*@param filePathword模板路径和名称*@param map待填充的数据,从数据库读取*/publicstaticvoid readwriteWord(HttpServletResponse response, String filePath, Map<String, String> map) {//读取word模板文件//String fileDir = newFile(base.getFile(),"//.. /doc/").getCanonicalPath();//FileInputStream in = new FileInputStream(newFile(fileDir+"/laokboke.doc"));FileInputStream in;HWPFDocument hdt = null;in = new FileInputStream(new File(filePath));hdt = new HWPFDocument(in);} catch (Exception e1) {e1.printStackTrace();}Fields fields = hdt.getFields();Iterator<Field> it = fields.getFields(FieldsDocumentPart.MAIN) .iterator();while (it.hasNext()) {System.out.println(it.next().getType());}//替换读取到的word模板内容的指定字段Range range = hdt.getRange();for (Map.Entry<String, String> entry : map.entrySet()) { range.replaceText("$" + entry.getKey() + "$",entry.getValue());}//输出word内容文件流,提供下载response.reset();response.setContentType("application/x-msdownload");String fileName = "" + System.currentTimeMillis() + ".doc";response.addHeader("Content-Disposition", "attachment;filename="+ fileName);ByteArrayOutputStream ostream = new ByteArrayOutputStream();OutputStream servletOS = null;try {servletOS = response.getOutputStream();hdt.write(ostream);servletOS.write(ostream.toByteArray());servletOS.flush();servletOS.close();} catch (Exception e) {e.printStackTrace();}}}注:以上代码需要poi包, 可以下载。

WorldWind介绍

WorldWind介绍


worldwind的矢量处理显示类比较混乱。效果也不 是太好。

通过一个插件能够支持KML,不过想达到 googleearth的添加等功能,还需要做很多工作。

按理,c#不会存在内存泄露。出现问题的地方是 QuadTile.Dispose,D3D的纹理没有进行清除。 使得资源占用越来越大,速度越来越慢
ห้องสมุดไป่ตู้

每个Tile之间未作平滑处理,经常会出现深坑、断 档。

大多数基于worldwind的软件,可以看到影像边 缘很明显的黑边、锯齿。究其原因,是Jpg压缩, 出现黑色渗透交融导致黑边锯齿。 两种解决办法, a)边缘地带采用png。b)严格的数据组织。

可以说,国内很多高手都解决了上述的问题,并且 发扬WorldWind的优势。典型代表EVGlobe等等。 很不容易,从某种角度上来说,确实是自主研发。
WorldWind的基本情况
WorldWind知名度很高,介绍也很全。链接在这里 NASAWorld Wind 目前分为.net版本和java版本。 开发语言:c#.java 渲染方式:DirectX,Opengl(Java)

WorldWind的软件架构应该来说还是很不错的, 很优秀。开放的设计,使得Worldwind的扩展非常 方便和快捷,目前已有上百种各式各样的插件,很 多插件都很有意思和实用。使用.net和java,研究 它的工作原理变的相对容易。 相对来说.net版本的容易深入些。java版的 严格面向对象方法的使用,使得java版的精简,但 深入起来不如.net容易。



速度慢 三维支持能力稍差 矢量支持能力稍差 KML支持不完善 内存泄露 DEM显示缺陷 影像黑边

【转】worldwindjavasdk运行环境搭建

【转】worldwindjavasdk运行环境搭建
请求出错错误代码503请尝试刷新页面重试
【转】 worldwindjavasdk运行环境搭建
1、安装java sdk,必须的 2、安装eclipse,当然用netbeans也是可以的,老外比较喜欢netbeans,netbeans免费嘛,老外对于版权还是比较老实的。 3、下载worldwind java sdk,现在最新发行版本是0.6.702.14304。下载后解压。 4、在eclipse中新建工程,将worldwind的src目录中的文件夹复制到新建工程的src下。 5、将worldwind中的gluegen-rt.dll、jogl.dll、jogl_awt.dll、jogl_cg.dll复制到jre的bin文ቤተ መጻሕፍቲ ባይዱ夹下,当然加入classpath也可以,复制到bin下可 以一劳永逸嘛。
6、在工程中找到gov.nasa.worldwind.examples,这个包下都是自带的例程(当然包括gov.nasa.worldwind.examples.*.*),找到一个,右 键run as --> java application,就可以看到效果啦

在Eclipse中嵌入NASAWorldWindJavaSDK

在Eclipse中嵌入NASAWorldWindJavaSDK

在Eclipse中嵌入NASAWorldWindJavaSDKNASA 开发的开源 World Wind Java (WWJ) SDK 为地理信息系统(Geographic Information Systems,GIS)社区提供了新的可能性。

World Wind 是一种使用Java™ 语言和 OpenGL 编写的 3D 交互式地球查看工具,使用户可以从外太空观看地球上的任何地方。

本文将讲述想要增强基于 Eclipse 的应用程序的 GIS 开发人员如何将 WWJ SDK 作为插件嵌入到 Eclipse 中。

WWJ SDK 是一种构建在 Java OpenGL (JOGL) 扩展之上的 3D 图形地球仪。

WWJ 类层次结构的核心是GLCanvas的子类WorldWindowGLCanvas。

而GLCanvas 是一个 Abstract Window Toolkit (AWT) 组件。

WWJ 对 AWT 的依赖性对于想在 Eclipse 应用程序中使用 WWJ 的 GIS 开发人员来讲是一个障碍。

您可能知道,Eclipse 使用了 Standard Widget Toolkit (SWT),而 SWT 与 AWT 不兼容。

而且,AWT 和 JOGL 紧密集成,这使得很难从 AWT 移植到 SWT。

本文将提供一种解决方案,使您可以在 Eclipse 应用程序中使用WWJ SDK。

进入 SWT/AWT 桥梁SWT 因能够快速构建可伸缩和强大的客户端应用程序而迅速成为一种顶级窗口工具包。

SWT 和 AWT/Swing 都在争当 Java 用户界面开发的权威。

由于它们各有利弊,Eclipse 基金会意识到有必要构建一座允许在SWT 中嵌入AWT/Swing 组件的 SWT/AWT 桥梁。

从 Eclipse version 3.0 开始,这座桥梁就已成为 SWT 的一部分。

这个的 API 位于org.eclipse.swt.awt包中(参见)。

worldwind技术资料

worldwind技术资料

技术资料一、主界面类WorldWind.cs,程序入口,主界面生成,程序初始化,各子线程启动并初始化。

二、显示渲染窗口类WorldWindow.cs,渲染窗口,包含因用户操作而引起的更新而对显示窗口的更新。

三、菜单类Menu.cs,对于浮动或者停靠的菜单的定义,也可以在这里添加自定义的类。

四、类RenderableObject.csRenderableobject类是所有渲染元素的基类,包括影像层元素(Imagelayer)、地形层元素(TerrainTile)、矢量元素(shapefilelayer)、精灵元素(icon)等。

1、Imagelayer类ImageLayer.cs,ImageStore.cs,ImageTileRequest.cs,ImageHelper.cs,ImageTileService.cs,影像层元素类,也就是纹理图层,贴到地形上就生成了简单的三维场景。

该类中包含了块调度算法,按所处位置查找对应的文件名进行读取影像块,然后生成纹理。

2、TerrainTile类TerrainTileService.cs,地形层元素类,跟上面的影像层元素类紧密关联。

该类可以通过对高程数据构建三角面生成连续的有起伏的曲面,只要贴上纹理就形成了简单的三维场景。

和影像层元素类一样,类中也包含了块调度算法,也是按所处位置查找对应的文件名进行读取高程块,然后构建曲面。

3、Shapefilelayer类ShapeLayer.cs,shapefiilelayer.cs,这两个类包含了对矢量文件(.shp)的读取解析以及对矢量的渲染。

4、Icon类Icon.cs,这个类是对一些精灵元素进行渲染,包括各类信息点,兴趣点,标注等。

五、初始启动设置类WorldSettings.cs,WorldWindSettings.cs,这两个类将程序关闭时的一些设置保存到XML 文件中,然后在下次启动程序时读取这些设置来初始化程序。

WorldWind系列五: 插件加载过程全解析

WorldWind系列五: 插件加载过程全解析

WorldWind系列五:插件加载过程全解析来源:博客园作者:无痕客不得不承认World Wind的代码真的很庞大,没有太多帮助文档的前提下,一头钻进代码里肯定令你头疼的,甚至研究代码间关联仿佛是在走迷宫。

我最近一直想弄明白如何在MenuBar中加载那些插件的,WorldWind学习系列四中研究的只是特殊的三个功能加载的,那三个没有继承Plugin类,不算是插件功能加载。

所以WorldWind学习系列四加载的三个是特殊情况,不是一般的插件加载。

今天下午终于柳暗花明,如果你真正关注World Wind分析,那么就好好看看下面的插件加载过程全解析。

我们先看看Plugin类的继承图,看看到底都有些什么插件,然后在分析一般性的插件加载全过程。

哦,原来这么多插件,我们要基于WW开发自己的应用,只需继承Plugin类写出自己的插件功能即可的。

我们现在分析插件加载过程,请确保你看过WorldWind学习系列二:擒贼先擒王篇2中的(5.加载上次使用的配置信息)。

加载的插件入口就是WorldWind.cs的Main()中调用的LoadSettings()静态方法。

1.读取WorldWind的配置中插件信息加载WorldWind配置private static void LoadSettings(){try{//先读取上次使用时保存的“使用插件配置文件”,如果存在,则从文件中读取配置实例化WorldWindSettingsSettings = (WorldWindSettings) SettingsBase.Load(Sett ings, er);if(!File.Exists(Settings.FileName)){//我们假定是配置文件不存在,这就是一个个地加载插件,保存到Ar rayList中Settings.PluginsLoadedOnStartup.Add("ShapeFileInf oTool");//Settings.PluginsLoadedOnStartup.Add("OverviewFo rmLoader");//Settings.PluginsLoadedOnStartup.Add("Atmosphere ");Settings.PluginsLoadedOnStartup.Add("SkyGradient ");Settings.PluginsLoadedOnStartup.Add("BmngLoader");//Settings.PluginsLoadedOnStartup.Add("Compass"); //Settings.PluginsLoadedOnStartup.Add("ExternalLa yerManagerLoader");Settings.PluginsLoadedOnStartup.Add("MeasureTool ");//Settings.PluginsLoadedOnStartup.Add("MovieRecor der");Settings.PluginsLoadedOnStartup.Add("NRLWeatherLo ader");Settings.PluginsLoadedOnStartup.Add("ShapeFileLoa der");Settings.PluginsLoadedOnStartup.Add("Stars3D");Settings.PluginsLoadedOnStartup.Add("GlobalClouds ");Settings.PluginsLoadedOnStartup.Add("PlaceFinderLoader");Settings.PluginsLoadedOnStartup.Add("LightControl ler");Settings.PluginsLoadedOnStartup.Add("Earthquake_2.0.2.1");Settings.PluginsLoadedOnStartup.Add("Historical_E arthquake_2.0.2.2");Settings.PluginsLoadedOnStartup.Add("KMLImporter ");//Settings.PluginsLoadedOnStartup.Add("doublezoom ");//Settings.PluginsLoadedOnStartup.Add("PlanetaryR ings");Settings.PluginsLoadedOnStartup.Add("TimeControll er");//Settings.PluginsLoadedOnStartup.Add("WavingFlag s");Settings.PluginsLoadedOnStartup.Add("ScaleBarLege nd");Settings.PluginsLoadedOnStartup.Add("Compass3D"); Settings.PluginsLoadedOnStartup.Add("AnaglyphSter eo");Settings.PluginsLoadedOnStartup.Add("GlobeIcon");}// decrypt encoded user credentialsDataProtector dp = new DataProtector(DataProtector.St E_USER_STORE);if(Settings.ProxyUsername.Length > 0) Settings.ProxyU sername = dp.TransparentDecrypt(Settings.ProxyUsername);if(Settings.ProxyPassword.Length > 0) Settings.ProxyP assword = dp.TransparentDecrypt(Settings.ProxyPassword);}catch(Exception caught){Log.Write(caught);}}2.Main()中后面调用MainApplication()方法,该MainApplication()调用OpenStartupWorld(),用来初始化启动World对象。

java版WorldWind源代码解析之二

java版WorldWind源代码解析之二

WorldWind学习经历今天,我们接着上一天的研究内容来继续研究WorldWind源代码,先回忆一下上一节我们所研究的内容吧。

上一节里我们提到,WorldWind源代码的研究顺序(当然,如果你希望从别的地方开始研究它,我们也不会反对,因为研究一项东西,在没有相关教程的前提下,我们所做的都是在摸索,当然,我也有我的摸索顺序,我所编写的这些文档,实际上就是我个人研究WorldWind的顺序。

),下面我们就研究一下昨天提到的那个loadBitmap方法,他的基本的情况如下:上面就是所说的那个类的核心函数,简单浏览一下,会发现该函数主要做的事情就和它的名字一样。

所以,我们以后可以通过一个函数的名字,来基本了解这个函数的功能,关于具体的实现方法和实现的逻辑,还是要打开这个方法仔细研究的(因为它给出了你实现的逻辑,通常意义上所讲的代码优化,其实一大部分还是来自于这些基本功能实现的优化上,比方说,我想用计算机计算出圆周率的更为准确的值,你可以用泰勒展式,也可用割圆法,也可以用蒙特卡罗法,当然,不同的方法执行的精确度不一样,执行效率也有差别。

不过这些方法我都已经忘得差不多了)。

这里,我们就转到主线上来,我们不会在某一个方法或者一个类上面停留太多时间,我们的目的是要对每一个方法都比较清楚它要做什么,具体怎样做,如何优化,我们以后再做讨论。

这里只是指引大家研究的顺序,或者叫研究路径,因为有些人可能用的很熟练,但是内部的作用机理可能没有搞透彻,我们就是要从主线上,慢慢向外扩展,从而达到完全解析并优化WorldWind源代码的最终目的。

好,我们继续研究这个包里面的第二个类文件GLDisplay.java,首先我们还是参照我们之前的研究方法,类结构----类注释----类方法名称------具体方法的实现,这里我们只写出这个类文件以及所包含的方法的大致的描述:咱们先来给GLDisplay.java这个类文件加上一个主函数,运行一下,看一下结果如何,添加内容如下:这里添加的代码可以做好多的修改,可以任意调用它的方法,大家就自己慢慢调用,去观察效果吧。

数位DP--P2657--Windy数java实现

数位DP--P2657--Windy数java实现

数位DP--P2657--Windy数java实现什么是数位DP数位 DP 问题往往都是这样的题型,给定⼀个闭区间 [L,R],让你求这个区间中满⾜ 某种条件 的数的总数。

(来⾃ )按照⼀般的⽅法,我们会遍历区间[L,R],对每个数字进⾏判断,是否符合题⽬要求.但是这类题⽬的区间范围往往都⽐较⼤,单纯地遍历每⼀个数字,会超时.这种情况下,使⽤数位DP的⽅式,进⾏求解.下⾯根据进⾏具体分析这类算法,基本都是套模板.所以也按照这道题⽬,将模板写出来.题⽬背景windy 定义了⼀种 windy 数。

题⽬描述不含前导零且相邻两个数字之差⾄少为 2 的正整数被称为 windy 数。

windy 想知道,在 a 和 b 之间,包括 a 和 b ,总共有多少个 windy 数?输⼊格式输⼊只有⼀⾏两个整数,分别表⽰ a 和 b。

输出格式输出⼀⾏⼀个整数表⽰答案。

对于全部的测试点,保证1≤a≤b≤2⋅109总体思路1.问题转化对于区间中的问题,我们将它简化成只有⼀个边界的问题.类似于计算区间和.对于在区间[L,R]上,计算满⾜某项条件的数字的个数result.假设我们有函数F(x),表⽰在[0,x]区间上,满⾜条件的数字的个数.那么result = F(R)-F(L-1);2.具体求出F(x)对于给定的输⼊M,在区间范围[0,M]中,我们按照每⼀位数字进⾏枚举(区别于遍历每⼀个数字),记录所有的情况---相邻数字的差⾄少为2.将结果记录到数组 A[]中.如何描述⼀类数字的状态:我们使⽤当前枚举的数字的i位,当前位的前⼀位具体是数字j来来记录此种情况下的满⾜题⽬条件的情况有多少种.A[i][j] = result;举例:A[3][4] 记录的是当前位置在第三位,并且前⼀位(第⼆位)数字是4的情况.如何写转移⽅程考虑⼀般情况.举例:对于数字(范围)12345.A[3][1]=9∑i=0A[4][i]当且仅当|i−前⼀位的数字|≥2的时候表⽰当前位置是第三位,前⼀个位置是1的数,能够组成满⾜题⽬要求的情况的总和等于当前位置是第四位,前⼀个位置是0~9,能够组成满⾜题⽬要求的情况的总和.另外,对于记录状态的重复使⽤:对于11,可以使⽤数组A[2][1]表⽰.对于10,可以使⽤数组A[2][1]表⽰.它们都表⽰当前位置在第⼆位,前⾯⼀位是1的状态.所以只要计算过⼀次后,后⾯再次到这个状态,就能够直接使⽤了.特殊情况对于前⾯数字位已经在边界的数字,需要单独计算,不能够使⽤之前表⽰的状态.仍旧以12345举例.对于状态A[3][2],表⽰当前位置是3,前⾯位置的状态是2的情况,表⽰的数字是12.(10,11 因为第⼆为取得了0或者1,所以后⾯的数字仍旧能够取0~9,所以不算边界)这种情况下,就不能使⽤跟之前类似的公式:A[3][1]=9∑i=0A[4][i]当且仅当|i−前⼀位的数字|≤2的时候Processing math: 100%因为第三位只能够取0~3三位, 如果取4~9,最终的数字会超出范围.所以,这部分单独处理.因为只有前⾯全部都取到了数字的边界,才会出现这种情况,所以增加对于状态的记录,记作limit引⼊"前导零"状态,表⽰当前位置之前的所有数字全部是零.因为我们在枚举数字每⼀位的时候,会碰到例如这样的情况:00123.实际上代表数字123.但是我们不能因为第⼆位和第三位之间相差⼀,就否定这种情况.所以增加 "前导零" 状态, 记作lead .表⽰当前位置之前的所有位置,全部都是0.这种状态下,当前位置的数字可以没有顾及地从0取值到9.具体代码可以再对照着注释部分,理解代码.import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.Arrays;import java.util.StringTokenizer;public class Main {static long[][] dp;static int[] positionNum;public static void main(String[] args) throws Exception {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));StringTokenizer st = new StringTokenizer(br.readLine());int a = Integer.parseInt(st.nextToken());int b = Integer.parseInt(st.nextToken());int aa = Math.min(a,b);int bb = Math.max(a,b);//因为问的是闭区间,所以对于[L,R],需要的结果是F(R)和F(L-1).long aResult = getCnt(aa-1);long bResult = getCnt(bb);System.out.println(bResult-aResult);}private static long getCnt(int num){positionNum = new int[11];//这⾥记录数字地每⼀位,到数组positionNum中int index = 0;while (num>0){positionNum[index++] = num%10;num /= 10;}//因为给定数字的范围最⼤不超过2亿,所以数字位数不超过9位,这⾥第⼀维度使⽤了11//因为第⼆维代表数字的取值范围,所以最多就是0~9,⼀共10位.dp = new long[11][10];//将dp数组初始化为-1.因为后续需要记忆化搜索,通过初始化的-1,来表⽰,某个状态没有被记录到for(int i = 0;i<dp.length;i++){Arrays.fill(dp[i],-1);}return dfs(index-1,0,true,true);}//通过dfs,进⾏动态规划过程.//position:当前数字是第⼏位,对应于A[i][j]中的i//preNum:当前位置的前⼀位是哪个数字,对应于A[i][j]中的j//isLimit:当前位置之前的所有数字位置,是否填⼊了它们能够达到的最⼤值//lead:前导零.当前位置之前所有位置,是否都为零.private static long dfs(int position, int preNum, boolean isLimit,boolean lead) {//如果搜索到了-1,说明每⼀位都被搜索到了,dfs可以在这⾥结束.if(position < 0){return 1;}//⽤于记录结果long result = 0;//记忆化的步骤.//1.如果前⾯位置填写的数字,没有达到最⼤值//2.dp[position][preNum]这个状态之前有过记录//3.前⾯数字全部都不是零//这种状态说明之前dfs时,已经计算过,这⾥直接使⽤.if(!isLimit && dp[position][preNum]!=-1 && !lead){return dp[position][preNum];}//如果position位置之前的所有数字都为它们位置的最⼤值,//那么当前位置最⼤只能够是读取的数字的当前位置的值//否则,这⼀位能够填写0~9,因为这种情况下不管怎么填写,数字都不会超过给定范围.int maxNum = isLimit?positionNum[position]:9;int abs;for(int i = 0;i<=maxNum;i++){abs = Math.abs(i-preNum);//条件:相邻两个数字之间的差值必须不⼩于2,并且是没有前导零的情况//如果有前导零,那么就不需要这个条件.if(abs<2 && !lead){continue;}//下⾯进⾏的都是下⼀位的dfs.分类了不同情况,不同情况下,dfs的第三第四个参数不同//当前位置填写了最⼤的数字,并且前⾯的数字也填写成为了当前位置最⼤的数字if(i == maxNum && isLimit){result += dfs(position-1,i,true,false);}//当前位置取值不是0或者没有前导零//1.如果没有前导零,⽆论当前位取值如何,该状态表⽰的数字都不会是当前位置之前全部是零的情况//2.如果当前位置取值⾮零,那么之后⼀定不是前导零的状态了else if(i != 0 || !lead){result+= dfs(position-1,i,false,false);}//和上⾯的状态相反,这⾥就表⽰了,是前导零的状态. else{result += dfs(position-1,i,false,true);}}//这⾥针对⼀般的情况,进⾏了结果记录,以便后续使⽤ //⼀般情况的条件://1.各个位置不是最⼤取值//2.不包含前导零状态if(!isLimit && !lead){dp[position][preNum] = result;}return result;}}。

WORLDWIND

WORLDWIND

WorldWind类型地址资源/java/Demo /java/demos/WorldWind源码/wiki/NASA_World_Wind_Download WWJ文档/wiki/Category:WWJ_Dev_Documentation WorldWind学习网站:(国外)(国内,上帝之眼)WorldWind软件终极教程2009年05月05日1.新手上路篇1.介绍:World Wind(以下简称“WW”)是一款可以让用户通过从太空视角全面观察地球表面的软件。

WW以他优秀的卫星图库与地形资料,通过3D技术的应用,让用户拥有身临其境的感觉,这一切就象是真的一样。

事实上你可以浏览世界上任何的角落,想象一下从高空观赏纵横交错的ANDES(安第斯山脉)山脉,进入美国大峡谷,从空中如飞机般的跃过ALPS(阿尔卑斯山)以及走入非洲的撒哈拉沙漠2.安装2.1下载要想使用WW这款软件,首先肯定是要得到这款软件。

目前WW通过几次版本的提升,已经由原来的共享变为了免费,如果你想要了解WW的最新信息以及下载WW,你可以方便的从本站或者官方网站中取得资料(相比国外服务器的速度而言,当然是国内本土的下载速度更快一些了)。

2.2安装相比较Google Earth来说NASA的安装方式并不是特别的友好,甚至是有些麻烦。

在你下载完其总共100多M的软件包后,先不要着急直接安装。

因为你现在需要确认以下几件事情:1.电脑中是否安装了MS DX9C(要安装并顺利运行NASA WW电脑中首先需要具备DX9)2.显卡驱动是否安装正确,没有任何错误(这里并不要求你的显卡具备支持DX9的渲染特效的功能,但是至少是可以对DX渲染方式可以正确处理)3.操作系统可以是Win9X、Win ME、Win2000、Winxp其中的任何一个(暂时只有兼容MS与MAC两种版本的WW)4.系统配置不低于:700MHz或更高主频的CPU128MB以上内存1GB以上的硬盘容量显卡只要支持DX即可确认了之后,便可以进行对WW的安装了。

wordcount源代码详解

wordcount源代码详解

wordcount源代码详解package wordcount;import java.io.IOException;import java.util.StringTokenizer;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Job;import org.apache.hadoop.mapreduce.Mapper;import org.apache.hadoop.mapreduce.Reducer;import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import org.apache.hadoop.util.GenericOptionsParser;public class wordcount {public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{ //继承泛型类Mapperprivate final static IntWritable one = new IntWritable(1); //定义hadoop数据类型IntWritable实例one,并且赋值为1private Text word = new Text(); //定义hadoop数据类型Text实例wordpublic void map(Object key, Text value, Context context) throws IOException, InterruptedException { //实现map函数StringTokenizer itr = new StringTokenizer(value.toString());//Java的字符串分解类,默认分隔符“空格”、“制表符(‘\t’)”、“换⾏符(‘\n’)”、“回车符(‘\r’)”while (itr.hasMoreTokens()) { //循环条件表⽰返回是否还有分隔符。

world模板 java解析

world模板 java解析

world模板 java解析
世界模板是一种常用的数据格式,它可以被用来描述各种不同的物品、实体或场景等。

在Java中,我们可以通过解析世界模板来获取其中的信息,进而实现各种不同的功能。

世界模板一般由一组键值对组成,每个键值对表示一个属性或特征。

例如,一个人物的世界模板可能包括姓名、年龄、性别、职业等信息。

解析世界模板的方法有多种,其中比较常见的一种是使用JSON 格式。

Java中有很多JSON解析库可以使用,例如Jackson、Gson等。

使用JSON解析库,我们可以将世界模板转换成Java对象,然后通过对象的属性或方法获取其中的信息。

例如,对于上面提到的人物世界模板,我们可以定义一个Person类,然后将世界模板转换成一个Person对象,再通过对象的方法或属性获取姓名、年龄、性别、职业等信息。

除了JSON格式,世界模板还可以使用XML、YAML等格式。

不同的格式有不同的解析方法和库,需要根据具体情况选择合适的解析方式。

总之,通过解析世界模板,我们可以快速获取各种不同的信息,为程序的实现提供了很大的便利性。

- 1 -。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java版WorldWind源代码学习笔记该文档编写者系数学系毕业且未满一年工作经验的职场新人,java知识有限,对于新事物Worldwind刚接触不久,总结一下。

不足之处,希望得到各位大师的指点。

刚开始,我看了一些WorldWind的相关简介,感觉从整体上给了WorldWind非常好的框架感,所以我将它拷贝了过来。

之后,我们的研究就从大的框架转到细节去。

毕竟,“研究”不只是看大的框架,还要将细节进行分析。

我作为一个新手,对此也非常陌生,那么,就让我们一起来学习吧。

不足之处请见谅。

首先,我们贴出官网上给出的WorldWind的源代码结构如下∙gov.nasa.worldwind顶级包∙gov.nasa.worldwind.awt 用于awt的组件∙gov.nasa.worldwind.formats.gpx GPS轨道格式∙gov.nasa.worldwind.formats.nmea GPS轨道格式∙gov.nasa.worldwind.geom 几何与数学类∙gov.nasa.worldwind.globes 地球、火星等星球的实现∙yers图层∙yers.Earth专用于地球的图层WorldWindow和View接口以下是WorldWindow接口:∙set/getModel(Model)∙set/getView(View)∙getSceneController(...)∙pick(java.awt.Point)∙set/getInputHandler(...)以下监听器:∙PositionListener∙SelectListener∙RenderingListener∙repaint()View 接口:∙Fields∙Position, direction, field of view, altitude, heading, pitch, roll,∙Actionso apply()o goto(lat/lon/elev/altitude)o project(Point 3Dpoint)∙Computeo horizon()o positionFromScreenPoint(...)o rayFromScreenPoint(...)在Applet中使用WorldWind要使用Applet,需要Java API for OpenGL(JOGL) Applet Launcher。

新版本的JOGL Applet Launcher具备在applet中创建和部署基于OpenGL的3D图形的功能,而不需要客户端安装任何软件。

它可以在任何支持JOGL的操作系统和CPU上运行,只需要浏览器上安装JRE1.4.2以上版本。

以下是典型的在applet中部署WorldWind组件的代码:<applet code="com.sun.opengl.util.JOGLAppletLauncher"width=400height=260codebase="/applet"archive="jogl.jar,gluegen-rt.jar,jogl-demos.jar"><param name="subapplet.classname"VALUE="worldwinddemo.Applet1Up"><param name="subapplet.displayname"VALUE="WorldWind Applet Demo"><param name="progressbar" value="true"><param name="cache_archive"VALUE="jogl.jar,gluegen-rt.jar,Applet1Up.jar"><param name="cache_archive_ex"VALUE="jogl.jar;preload,gluegen-rt.jar;preload,Applet1Up;preload"></applet>其中Applet1Up.jar文件中包含WorldWindApplet类,无需声明,而是作为参数引入;而应当声明的是JOGL Applet Launcher,它的相关类jogl.jar和gluegen-rt.jar也需要列出。

架构和APINASA拥有的海量数据可以以T来计算,这些数据来自卫星和太空望远镜。

NASA World Wind的可视化技术可以用最便捷和低冗余的方式传送地理空间数据。

下图为ww架构图:ww包含了交互式的3D图形组件,可用于Swing,AWT和SWT或其他UI组件。

World Wind API主要以接口设计,因此用户可以选择性地替换已有最高级的接口为WorldWindow,相关的UI组件为Swing/AWT。

其他五个主要的接口为:∙Globe接口表现地形∙Layer接口表现影像信息∙Model接口聚合Globe和Layer,用于创建星球模型∙SceneController接口控制Model的渲染,可以用于表现事件、时间等∙View接口控制用户视图在典型的应用中,程序在一个Model对象中关联一个Globe对象和多个Layer对象。

然后将model传给SceneController对象,用于在一个WorldWindow中显示globe和layers。

SceneController对象控制globe和layers的显示,并与View接口互动来决定用户视图。

实现这些接口的对象可能由ww或其他开发者提供,而实现这些接口的对象可用于任何需要此类接口的地方。

ww已经提供了地球、火星和月球的模型的Globe实现,其他一些基本的Model,SceneController,View接口也都有了基本的实现。

FrameController接口将ww的渲染和整个程序的渲染集成,以便于所有的数据以缓存文件形式存取,文件缓存可以管理位于多个磁盘的文件碎片的取用、文件缓存可以同区难过WorldWind以单例模式访问。

下面开始我们将开始逐个研究Worldwind的类的作用,包含的属性和方法,继承的父类和实现的接口等等(以下是java版的源代码解析)我们要研究WorldWind的源代码,首先我们要先找到WorldWind里不依赖于自身包的源代码,也就是说,我们要先找到它的源代码中,依赖于java语言的最近本的部分。

所以我们逐个包进行查看,发现当我们查看到gov.nasa.worldwind.exception包里的所有类,都不依赖于WorldWind的其他包(当然,我是通过最笨的方法,将包里的每个类都检查了一遍,发现了没有引入WorldWind自带的包,后面还有没有类似这样的包,暂时没看,不妨就先从这个开始研究吧),所以我们可以先研究一下他的这个包里的源代码。

这个包的结构如下:我们下面不妨先打开一个类文件看看,到底里面写的是什么,这里我就拿第一个类文件开始吧。

我们打开NoItemException.java发现如下代码(这里刚开始我们给出比较详细的介绍,后面我们就不再这么啰嗦了):这里我们可以发现他继承了另外的一个类文件,那么我们只能将鼠标放在他继承的类上面,然后按住“Ctrl”不放,再鼠标点击这个类文件,我们进去看看,他又是什么一个情况。

结果如下:这里我们不妨就在跟进去看一看,他具体是个什么情况,如下:好了,到这里,我们已经跟的差不多了,因为RuntimeException已经不是WorldWind里的内容了,但是,如果你有兴趣,还可以继续往下跟。

这里我们就不跟了。

那么,我们就可以从WWRuntimeException开始研究源代码了。

后面我们将不再介绍这些即琐碎又简单的操作了。

好吧,这里我们言归正传,开始我们的java版的Worldwind研究之旅(这里我们猜测,Exception是WorldWind源代码中不依赖于自带包的其中一部分,可定还会有别的包,也不依赖于他的自带包,我们就慢慢研究着看吧。

作为第一个吃螃蟹的人,没有人会告诉你一个新东西该怎么学习,这里我们只能凭感觉试探。

好吧,这里就此打住,要不我真的就成老太婆了)这里我看完了这个包里的六个类文件,发现他都是Super()函数,好吧,没必要仔细研究这个包了,我们接着向下寻找我们要查找的包。

方法不再赘述。

上面就是他所包含的类文件,打开上面的包中的某些类文件,还是会发现类似下面的引包字眼:不过,我猜测应该不会太深了,直觉这样告诉我,这里还有一个比直觉更合适的理由,那就是,搜索到这里,其实我已经基本上快搜索完了整个Worldwind源代码了。

叹气,嗨,没办法。

这就是研究。

(后面证明,这些无谓的过程并不是一文不值,因为他可以让你大致了解了整个源代码的继承情况,为后面扩展开来研究源代码提供了“经历基础”。

)继续查找发现了org.codehaus.jackson.type这个包,完全不依赖与任何Worldwind包,欧耶,我们成功了。

来看一下他所包含的内容吧。

这个包里一共三个类,那就分析一下吧。

下面我们先来分析JavaType.java这个类文件吧首先我们看到这个类文件里的如下信息:这里我们看见Base class字样,好了,终于发现了他的真正的源头。

如果是比较正式的源代码,应该都会标识这样的信息的,所以,我们这里可以先小小的兴奋一下,好,我们开始使用快速搜索法吧,可以不用如此辛苦的逐个摸索了。

于是我们就“Ctrl+Shift+H”输入“Base class”来查找我们想要的基础类,即为没有引入任何Worldwind包的类,事实证明,我们的猜测是正确的,搜索的结果如下:结果不是太多,嗯,我们这里找到了WorldWind源代码里最原始的部分。

那么我们可以迈出研究WorldWind源代码的第一步了。

下面我们将我们的思路跳转回来,继续研究我们的JavaType.java类文件。

先打开该文件,我们看一下该文件所包含的内容吧。

好了,上面就是JavaType.java类文件所包含的内容,我们从结构上粗略的看一下,应该很简单吧,但是作为研究WorldWind源代码,我们还是有必要打开该类文件进行仔细学习和研究的,这里我就忽略这一步了。

说实话,我是数学专业出身的,再加上又是刚毕业不到一年,所学的java知识还很有限,这里我就不班门弄斧了。

接下来我们看一下这个包里面的第二个类文件吧。

相关文档
最新文档