本次主要基于udig做一个简单的二次开发实例,假如我们手里有一批经纬度的信息,想直接在地图上查看。当然这时候方法非常多,譬如我通过postgis+geoserver+openlayers很容易实现,或者在udig里有create point也可以直接绘制,还有通过openlayers的marker只需要一个简单的txt文件也行,完全用不到二次开发,但这里只是说做一个简单的范例看看udig是怎么样加载地图数据和怎么样我们可以生成一份地图数据。
本次我们生成比较通用的shp文件(postgis等以后再说),生成shp我们这里需要用到geotools,不过udig里已经集成进去了geotools的jar包,我们只需要在我们自己的插件里引用net.refractions.udig.libs这个插件即可。闲话不多说,我们开始先创建一个插件项目(因为是DEMO,所以就一个插件,记得勾选RCP)。
1、 创建项目,如图:
1、 2、创建几个包,如图:
其中command下我们生成一个类ImportDataCommand extends AbstractHandler ,pojo下我们生成一个基础的点实体类 DemoPoint {
private double lon ;
private double lat ;
private String site_name ;
public double getLon() {
return lon;
}
public void setLon(double lon) {
this.lon = lon;
}
public double getLat() {
return lat;
}
public void setLat(double lat) {
this.lat = lat;
}
public String getSite_name() {
return site_name;
}
public void setSite_name(String site_name) {
this.site_name = site_name;
}
}
3、1、 Command中实现 public Object execute(ExecutionEvent event) throws ExecutionException {} 这个方法。里面需要的操作有
a、 a 弹出选择文件对话框,要求使用者导入需要导入的经纬度文件(文件格式预先定义好)。
b、 b 读取文件转换为实体数据
c、 c 根据实体数据生成shp 图层数据文件
d、 d 将shp图层数据文件加载显示到udig的地图中
1、 4、多话不说,我贴代码
a、 a 弹出对话框要求用户选择需要导入的文件。
//弹出选择文件对话框 要求选择文件,要求格式csv 字段要求为LON,LAT,SITE_NAME
FileDialog dialog = new FileDialog(Display.getDefault().getActiveShell(), SWT.OPEN);
dialog.setText("请选择要导入的文件");
String path = dialog.open();
if(path != null) {
//选择的文件不为空 开始读取文件信息 转换为实体数据
}
b、 b 解析文件,转换为我们需要的实体数据
/**
* 解析文件,转换为我们需要的实体数据
* @param path 文件路径
* @return 演示用的点信息集合 文件不存在时返回空
*/
private Collection<DemoPoint> parseFile(String path) {
List<DemoPoint> points = new LinkedList<DemoPoint>();
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(path));
String line = br.readLine() ;//跳过表头
while((line = br.readLine()) != null) {
String[] _ss = line.split(",");
//由于是演示 所以这里不做数据检查
DemoPoint point = new DemoPoint();
point.setLon(Double.valueOf(_ss[0]));
point.setLat(Double.valueOf(_ss[1]));
point.setSite_name(_ss[2]);
points.add(point);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(br != null) {
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return points ;
}
c、c 生成shp图层文件
/**
* 根据数据生成图层文件
* @param data
* @return 返回生成好的图层文件地图 SHP图层 数据保存在当前workspace下
*/
protected String createShpData(Collection<DemoPoint> data){
//拿到当前的workspace路径
String ws = Platform.getInstanceLocation().getURL().getPath();
//文件名用当前系统时间
String layerName = String.valueOf(System.currentTimeMillis()) ;
File shpFile = new File(ws , layerName + ".shp");
//图层的属性配置 坐标系采用4326
String layerFeatures = "GEOM:Point:srid=4326,LON:Double,LAT:Double,SITE_NAME:String" ;
FeatureWriter<SimpleFeatureType, SimpleFeature> fw = null;
try {
ShapefileDataStore myData = new ShapefileDataStore(shpFile
.toURI().toURL());
myData.setStringCharset(Charset.forName("GBK"));
SimpleFeatureType ft = DataUtilities.createType(layerName,
layerFeatures);
myData.createSchema( ft);
//手动事物 发现有时候给自动回出些问题
Transaction tran = new DefaultTransaction();
fw = myData.getFeatureWriter(layerName,
tran);
GeometryFactory gf = new GeometryFactory();
for(DemoPoint point : data) {
Geometry geo = gf.createPoint(new Coordinate(point.getLon(), point.getLat()));
SimpleFeature sf = (SimpleFeature) fw.next();
sf.setDefaultGeometry(geo);
//添加属性
sf.setAttribute("SITE_NAME",point.getSite_name());
fw.write();
}
fw.close();
tran.commit();
tran.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SchemaException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if(fw != null)
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return shpFile.getAbsolutePath();
}
d、 d 创建一个新的地图,加载我们刚才生成的shp图层文件
/**
* 创建一个新地图并打开shp图层文件
* @param path 文件路径
*/
protected void createMapAndOpenShp(String path) {
IRepository local = CatalogPlugin.getDefault().getLocal();
IService service = null;
List<IGeoResource> resources = null;
try {
service = local.acquire(
URLUtils.fileToURL(new File(path)),
new NullProgressMonitor());
resources = (List<IGeoResource>) service.resources(new NullProgressMonitor());
//发布
ApplicationGIS.createAndOpenMap(resources);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
5、注意事项
插件中引用要因为udig的applicationgis类,并且需要生成图层,所以在当前插件里我们要引入5个插件(本次的开发环境udig为1.2的版本):
创建product文件后,最好引入udig的所有包(新手必须).
6、1、 好了 打开看看效果
代码和演示数据在附件中可以下载,有问题请留言或者加我们的 群 251615521
251615521251615521251615521
相关推荐
uDig 是一款开源桌面 GIS 软件,基于 Java 和 Eclipse 平台,可以进行 shp 格式地图文件的编辑和查看······ 但是,纵观整个网络,都是泛泛地讲了讲如何简单地使用 uDig,却从未见过讲解如何对其进行二次开发的...
是一款开源桌面GIS软件,基于Java和Eclipse平台,可以进行shp格式地图文件的编辑和查看;是一个开源空间数据查看器/编辑器,对OpenGIS标准,关于互联网GIS、网络地图服务器和网络功能服务器有特别的加强。uDig提供一...
java是GIS开发的主要语言之一,下面将对java开发GIS的主要开源项目进行介绍。 1. uDig uDIG是一个基于Eclipse RCP的开源项目,同时也是一个GeoSpatial应用程序和平台。开发者可以通过这个平台创建新的应用程序,...
* User-friendly Desktop Internet GIS (uDig):是一个基于 Eclipse 的桌面 GIS 软件,支持多种数据格式的导入和编辑。 * Kosmo Desktop:是一个功能强大且用户友好的桌面 GIS 软件,支持多种数据格式的导入和编辑。...
在构建一个基于开源GIS的地理信息系统时,首先要理解GIS的核心组成部分和其工作原理。GIS,即地理信息系统,是一个集成了地图、数据管理和分析的综合工具,用于处理与地理位置相关的复杂信息。本文将深入探讨如何...
uDig(User-friendly Desktop GIS,用户友好的桌面地理信息系统)是一款开源的桌面GIS软件,它提供了丰富的地图数据处理、分析和展示功能。这个名为“udig软件安装包解压即用.zip”的压缩文件包含了uDig的安装程序...
因此,开发一套基于开源技术的GIS平台成为了一种可行的选择。 #### 二、开源GIS平台架构设计 ##### 1. 技术选型 在设计开源GIS平台时,主要考虑了以下几种技术: - **Udig**:作为开源GIS桌面系统的代表,Udig...
1. **uDig**:uDig(User-friendly DIgital Geographical Environment)是一个基于Eclipse RCP的开源GIS应用,它不仅是一个独立的桌面GIS软件,还是一个开发平台,允许开发者构建基于uDig的定制化应用。uDig支持Web...
8. **自定义开发**:由于UDIG是开源项目,用户可以根据自己的需求进行二次开发。开发者可以使用Java API和插件系统来扩展UDIG的功能,创建自定义工具或模块。 总之,UDIG 2.0作为一款强大的桌面GIS软件,提供了一...
GRASS(Geographic Resources Analysis Support System)是一款基于GNU GPL协议的开源GIS软件,拥有强大的空间数据管理和分析功能。GRASS广泛应用于政府机构、大学和环境咨询公司中。其最新稳定版本为2010年9月3日...
根据开发环境的不同,可以将主流的WebGIS开源解决方案分为两大类:基于C/C++的解决方案和基于JavaEE的解决方案。 - **C/C++解决方案**: - Mapserver(服务器) - QGIS(桌面软件) - Tomcat(中间件) - ...
uDig(Understanding Digital Geography)是一款基于Java开发的开源地理信息系统(GIS),它提供了一个用户友好的界面,使得用户能够轻松处理、分析和展示地理数据。这款软件广泛应用于地理数据的可视化、空间分析...
然而,Udig缺乏空间分析功能,需要二次开发实现。 Quantum GIS(QGIS) Quantum GIS(QGIS)是一个功能强大的开源GIS平台方案,主要功能包括制作地图、支持常见GIS数据编辑绘制、数据格式的转换导入、生成地图样式...
7. **教学与研究**:由于其开源性质,UDIG常被用于地理信息系统教学和研究,因为它允许深入学习GIS原理和开发实践。 在下载“qgis和udig安装包.zip”后,你将获得QGIS和UDIG的安装程序。在解压并运行安装程序之前,...
udig 是一个开源的 GIS 工具,能够查看和处理空间数据。使用 udig 工具可以查看导入的 Shape 文件,包括空间数据和属性数据。 本篇文章介绍了如何使用 PostGIS 将 Shape 文件导入 PostgreSQL 数据库的详细步骤。...
uDig(User-friendly DIgital Geographics Environment)是一款开源的桌面GIS软件,它提供了数据编辑、分析和可视化的功能。在这个过程中,uDig被用来创建和编辑地图样式。地图样式是决定地图外观和感觉的关键元素,...
【开源GIS】在课件中提到了一些开源GIS软件和库,如GRASS、Quantum GIS(QGIS)、OpenJUMP、SharpMap、MapWindow、gvSIG、uDig等,这些都是用于桌面GIS应用的工具。同时,还有JTS、GEOS、NTS、GeoTools等开源地理...