HsqlDB Demo

目录

  1. 前言
  2. 前台已毕
  3. 后台完结
  4. 总结

import java.sql.Connection;

一、前言

     
 看到这几个难题有人肯定会说那有如何可写的,最简易的本人假使用文件系统一个个找寻、打开就足以兑现,再高档一点自己可以领到出富有数据的元数据,做个元数据管理连串就足以兑现查找成效,有必要用geotrellis用分布式吗?那不是杀鸡用牛刀吗?理论上是这么的,可是要看大家着想难题的尺度,尽管您只是有些大致的数据用传统方法自然好,省事、省时、不难、速度快,不过当我们将数据的量加大到一个区域甚至全世界的时候恐怕事情就不是那么简单了,比如大家有了环球Landsat数据,如何查看某一地段此数据的景色,传统艺术恐怕要自己先计算出此区域的Landsat的带号,然后再找到此数额并开拓之。如果觉得那海不费事,那么当用户需求考察Landsat的云量或者NDVI的时候是否又要用户自己打开数据并运用Arcgis等活动计算?是还是不是很劳苦,而本文介绍的点子是只要求用户输入有关此点的音讯(带号或者点位音信),系统能够自行显示此区域的数目(或者云量、NDVI等结果),那样是还是不是逼格立刻刻去了吧?

import java.sql.DriverManager;

二、前台完结

     
 此成效的前台也不可谓不复杂,然而难不倒我那些全栈工程师(请忽略此话),费了半天劲,基本达成了前台的机能。总体就是一个招来框加一个按钮,然后发送搜索关键词到后台,后台再次来到数据列表,前台逐条浮现之,单机每条数据的时候在地形图中(地图框架选取leaflet)突显此数额的景况,类似谷歌、百度。那其间我主要介绍以下知识点。

import java.sql.ResultSet;

2.1 在地图中拉长、删除标记

     
 要给用户呈现数据处境,最根本的就是多少的长空限制,简而言之就是将五个(或几个)顶点逐一连成线在地形图中显得出来。leaflet可以省略的使用如下语句完结该意义:

geoJsonOverlay = L.geoJson(geoJson);
geoJsonOverlay.addTo(map);

     
 其中map为L.map(‘map’)对象,geoJson就是想要添加的标志对象,此处用的是GeoJson,GeoJson简单的话就是将空间对象转成相应的json对象,便于交互、传输等。

     
 又一次查询或其他景况下或者又必要将上述的标记层去掉,这时候只需下述语句即可:

map.removeLayer(geoJsonOverlay);

import java.sql.SQLException;

2.2 空间数据的突显

     
 当用户想要查看某个检索出来的数量情状的时候就要求将此数量显示到地图当中,后台暂且不表,倘诺用到瓦片技术那么突显在leaflet中的形式就是添加一层,同样移除数据就是删除该层。代码如下:

//add
WOLayer = new L.tileLayer(baseurl + '/{z}/{x}/{y}', {
    format: 'image/png',
    transparent: true,
    attribution: 'SJZX'
});

WOLayer.addTo(map);
map.lc.addOverlay(WOLayer, "Landsat");

//delete
map.lc.removeLayer(WOLayer);
map.removeLayer(WOLayer);

import java.sql.Statement;

三、后台达成

     
 后台牵涉到的事物较多,重倘若数据检索、数据范围生成GeoJson、数据存放、数据处理、数据发送等。

import java.util.logging.Level;

3.1 数据检索

     
 那块与观念方法一样,可是本文采取全文检索的格局,该内容涉及到的标题也比较多,会在继续另立新篇,详细介绍本系统全文检索以及空间检索的兑现,总体上依照前台传入的重大词重返与之相关联的数额,相当于地理音讯连串版的谷歌。

import java.util.logging.Logger;

3.2 数据范围生成GeoJson

     
 简单说来就是从元数据中读出多少的半空中限制,将此限制生成GeoJson对象发送到前台。具体元数据新闻方可经过地点的数据检索获取,此处若是已经取到了半空中范围的WKT标记对象,剩下的干活就是将WKT转成GeoJson,代码如下:

import geotrellis.vector.io.json.Implicits._
val geom = WKT.read(wkt)
geom.toGeoJson

     
 当然那里还亟需考虑geometry对象的投影变换等题材,要考虑前台、后台以及数据等的黑影格局,转换成自己索要的影子格局。

 

3.3 数据存放

     
 那块是本系统的中坚,面对这么大的数据量唯有成立的数目存放方式才能促成连忙响应。近年来应用的法子是后边小说讲述过的将数据导入到Accumulo,那种措施的补益是请求数据快,但同时造成的一个标题是数据量大(相当于数据保存了2-3份,即使再考虑HDFS的备份特性,相当于6-9份),以上述Landsat为例,拔取此种格局必须要将满世界的Landsat数据都导入到Accumulo中,那个量是不行大的,若是有多套数据须求动用此种形式检索,那么这么些数据量确实尤其大,不过分布式框架本身就是为着解决大数据量的标题。近期也正值摸索折中的解决方案。

import org.hsqldb.Server;

3.4 数据处理

     
 比如Landsat数据大家得以实时总结用户查找区域的云量以及NDVI等并将之显示给用户,那样用户可以对数据的身分有一个更为浓厚的认识,而不必要用户再拓展下载数据解析处理等。

import org.hsqldb.result.Result;

3.5 数据发送

     
 数据发送的目的是将上述处理好的数量或原始数据发送到前台,前台举行展现。此处须求留意的是要根据请求的范围对请求结果进行覆盖,因为用户感兴趣(查找)的是某一个或某多少个数据,假诺不加掩盖,前台获取到的如故是整个世界的数据,那样就一向不意义。单个瓦片的呼吁在后边的篇章中一度讲过,那里紧要讲一下蒙面操作。前台的差别就是在乞请数据的时候要多发送一个伸手范围,比如为用户检索数据时后台发送的数据空间范围GeoJson对象,后台首先根据请求的x、y、z取到相应的瓦片,然后判断此瓦片与GeoJson对象的上空关系,取出在限定内的数额,其余数据赋为无值,那样就足以获得掩盖后的瓦片,看似复杂其实Geotrellis已经为大家落到实处了该进程,只需求简单几行代码即可完成:

import geotrellis.vector.io.json.Implicits._
val extent = attributeStore.read[TileLayerMetadata[SpatialKey]](id, Fields.metadata).mapTransform(key)
val geom = geoJson.parseGeoJson[Geometry]
tile.mask(extent, geom)

     
 其中attributeStore是Accumulo操作的实例,id为代表请求层的对象,key为代表请求瓦片的x、y,geoJson就是传播的空中限制对象,依据上述代码就能兑现范围覆盖操作。

 

四、总结

     
 本文简单为我们介绍了如何兑现海量空间数据的摸索以及详情查看,有些部分会在再而三详细介绍,本文仅为框架介绍。

Geotrellis系列小说链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html

/**

 *
方便单机程序行使HSQL的工具类,包含启动,关闭,连接。数据库默许不加密,用户为sa,密码空

 * @author 郑高强

 */

public class HSQL_Util {

 

    public static final int PORT = 9002;

    public static final String DB_NAME = “kenko”;      
//数据库文件名,同时也是本类中的数据库名

    public static final String DB_PATH = “./db/”;

    public static final String USER_NAME = “sa”;

    public static final String PASSWORD = “”;

    public static final int SERVER_MODE = 0;

    public static final int STAND_ALONE_MODE = 1;   //In-Process

    public static int mode = SERVER_MODE;         
//记录当前用哪些形式,开发时用Server,公布时用standalone

 

    

 

    /**

     * 测试

     */

    public static void main(String[] args) {

        HSQL_Util.mode = HSQL_Util.STAND_ALONE_MODE;

        HSQL_Util.startHSQL();

//        Connection conn = HSQL_Util.getConnection();

        try {

            createDB();

            

//            testQuery();

                

            

        } catch (SQLException ex) {

           
Logger.getLogger(HSQL_Util.class.getName()).log(Level.SEVERE, null,
ex);

        }

        

        

        HSQL_Util.stopHSQL();

    }

 

private static void createDB() throws
SQLException {

Statement statement =
getConnection().createStatement();

 

statement.executeUpdate(“create table
customer2(id integer not null primary key,firstname
varchar(100),lastname varchar(100))”);

for (int i = 10; i < 60000; i++)
{

    statement.executeUpdate(“insert into
customer2 values(” + i + “,’liu’,’zhaoyang’)”);

}

 

statement.close();

}

    

    private static void testQuery() throws SQLException {

    Connection conn =
HSQL_Util.getConnection();

    

    ResultSet r =
conn.createStatement().executeQuery(“select * from customer”);

    

    while(!r.isLast()){

    

    r.next();

    Object o = r.getObject(1);

    Object o1 = r.getObject(2);

    

    

   
System.out.println(o.toString()+o1.toString());

    }

    

 

}

 

/**

     * 启动数据库服务

     */

    public static boolean startHSQL() {

        if (mode == SERVER_MODE) {

            Server server = new Server();//它可是hsqldb.jar里面的类呀。

            server.setDatabaseName(0, DB_NAME);

            server.setDatabasePath(0, DB_PATH + DB_NAME);

            server.setPort(PORT);

            server.setSilent(true);

            server.start();         //自动二十十六线程运行

            System.out.println(“hsqldb started…”);

        } else if (mode == STAND_ALONE_MODE) {

           
//standalone格局,打开连接就同时开动数据库,所以这边可以什么都不做

        System.out.println(“hsqldb
STAND_ALONE_MODE started…”);

        }

 

        try {

            Thread.sleep(800);        // 等待Server启动

        } catch (InterruptedException e) {

        }

        return true;

    }

 

    /**

     * 关闭数据库服务

     */

    public static boolean stopHSQL() {

        try {

            Statement statement = getConnection().createStatement();

            statement.executeUpdate(“SHUTDOWN;”);

            return true;

        } catch (SQLException ex) {

           
Logger.getLogger(HSQL_Util.class.getName()).log(Level.SEVERE, null,
ex);

            return false;

        }

    }

 

    /**

     * 获取连接

     */

    public static Connection getConnection() {

        Connection conn = null;

        try {

            Class.forName(“org.hsqldb.jdbcDriver”);

            if (mode == SERVER_MODE) {

                conn =
DriverManager.getConnection(“jdbc:hsqldb:hsql://localhost:” + PORT + “/”

  • DB_NAME, USER_NAME, PASSWORD);

            } else if (mode == STAND_ALONE_MODE) {

                conn = DriverManager.getConnection(“jdbc:hsqldb:file:” +
DB_PATH + DB_NAME, USER_NAME, PASSWORD);

            }

        } catch (ClassNotFoundException ex) {

           
Logger.getLogger(HSQL_Util.class.getName()).log(Level.SEVERE, null,
ex);

        } catch (SQLException ex) {

           
Logger.getLogger(HSQL_Util.class.getName()).log(Level.SEVERE, null,
ex);

        }

        return conn;

    }

 

}

发表评论

电子邮件地址不会被公开。 必填项已用*标注