- 浏览: 264344 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
cuiqi4016:
正在做json转换的功能,帮大忙了,感谢博主分享
java 通过反射获取泛型的类型 -
cxshun:
写得很好,感谢博主的分享
java 通过反射获取泛型的类型 -
joy3229233:
[url][/url][flash=200,200][/fla ...
(转)flex checkbox 选中 -
linkagebest:
盗版可耻。。。。。
(转)flex checkbox 选中 -
shuai0420:
...
flex数据绑定
今天上午一位朋友问到了,关于hibernate中是否支持postgis函数的问题 ,我就这个问题,随便聊几句。
要想使用hibernate的空间数据操作,就要提到一个概念 java Topology Suite (字面上理解就是 空间拓扑的意思,简称JTS,
注意:过需要声明一点,本文中的JTS与进行java事务处理的JTS、JTA没有联系).
HIBERNATE中对空间数据作了支持(Hibernate Spatial),Hibernate Spatial是对处理空间数据的一个Hibernate扩展 ,
Hibernate Spatial 使用标准的方式处理地理信息数据 ,并且提供了一个可以跨数据库的处理的接口函数,
Hibernate Spatial 中包含了多种 OGC 简单的处理函数. 支持的数据库为: Oracle 10g/11g, Postgresql/Postgis, and MySQL.
要想使用 Hibernate Spatial 就要引入JTS, JTS 从根本上而言其实并不是很复杂,它主要是完成了java对几何对象、空间拓扑得核心操作算法。
下面通过简单配置来说明一下如何使用(我们使用的数据库是postgis):
数据库脚本:
sql:
1,引入 jts-1.8.jar, hibernate3.jar 等包 ,同时还要应用 hibernate-spatial-postgis-1.0-20070920.111959-1.jar 和
hibernate-spatial-1.0-20070920.111959-1.jar 包(如果不是postgre sql就要引用相应的数据库包)。
2,创建一个持久化类(po对象)
如下:
3,创建相应的Mapping 文件
4,配置hibernate 配置文件
这句配置起到了重要的作用,这里声明了 hibernate 的方言。该方言声明了对postgis的一些支持。
并且大家也应该知道,在使用hibernate时候,如果需要自定义函数,要需要自定义方言。
5,第一个主类
英文好的可以看看这个:http://www.hibernatespatial.org/tutorial.html
要想使用hibernate的空间数据操作,就要提到一个概念 java Topology Suite (字面上理解就是 空间拓扑的意思,简称JTS,
注意:过需要声明一点,本文中的JTS与进行java事务处理的JTS、JTA没有联系).
HIBERNATE中对空间数据作了支持(Hibernate Spatial),Hibernate Spatial是对处理空间数据的一个Hibernate扩展 ,
Hibernate Spatial 使用标准的方式处理地理信息数据 ,并且提供了一个可以跨数据库的处理的接口函数,
Hibernate Spatial 中包含了多种 OGC 简单的处理函数. 支持的数据库为: Oracle 10g/11g, Postgresql/Postgis, and MySQL.
要想使用 Hibernate Spatial 就要引入JTS, JTS 从根本上而言其实并不是很复杂,它主要是完成了java对几何对象、空间拓扑得核心操作算法。
下面通过简单配置来说明一下如何使用(我们使用的数据库是postgis):
数据库脚本:
sql:
CREATE TABLE events ( id bigint NOT NULL, event_date timestamp without time zone, title character varying(255), "location" geometry, CONSTRAINT events_pkey PRIMARY KEY (id) )
1,引入 jts-1.8.jar, hibernate3.jar 等包 ,同时还要应用 hibernate-spatial-postgis-1.0-20070920.111959-1.jar 和
hibernate-spatial-1.0-20070920.111959-1.jar 包(如果不是postgre sql就要引用相应的数据库包)。
2,创建一个持久化类(po对象)
如下:
import java.util.Date; import com.vividsolutions.jts.geom.Point; public class Event { private Long id; private String title; private Date date; private Point location; public Event() {} public Long getId() { return id; } private void setId(Long id) { this.id = id; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public Point getLocation(){ return this.location; } public void setLocation(Point location){ this.location = location; } }注意:上面的po对象中的location属性的类型。这个类型是空间数据类型。
3,创建相应的Mapping 文件
<hibernate-mapping> <class name="Event" table="EVENTS"> <id name="id" column="EVENT_ID"> <generator class="native"/> </id> <property name="date" type="timestamp" column="EVENT_DATE"/> <property name="title"/> <property name="location" type="org.hibernatespatial.GeometryUserType" column="location"/> </class> </hibernate-mapping>注意:在上面的影射文件中,type="org.hibernatespatial.GeometryUserType" 这type类型声明很特别,我们知道在hibernate中要自定义影射类型,可以自定义类型UserType.在这个配置文件中定义的类型 org.hibernatespatial.GeometryUserType就是hibernatespatial中定义支持空间数据库的类型。
4,配置hibernate 配置文件
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- Database connection settings --> <property name="connection.driver_class">org.postgresql.Driver</property> <property name="connection.url">jdbc:postgresql://localhost:5432/test</property> <property name="connection.username">postgres</property> <property name="connection.password">test</property> <!-- JDBC connection pool (use the built-in) --> <property name="connection.pool_size">1</property> <!-- SPATIAL SQL dialect --> <property name="dialect">org.hibernatespatial.postgis.PostgisDialect</property> <!-- Enable Hibernate's automatic session context management --> <property name="current_session_context_class">thread</property> <!-- Disable the second-level cache --> <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> <!-- Echo all executed SQL to stdout --> <property name="show_sql">true</property> <!-- Drop and re-create the database schema on startup --> <property name="hbm2ddl.auto">create</property> <mapping resource="Event.hbm.xml"/> </session-factory> </hibernate-configuration>注意:在上面的配置文件中, <property name="dialect">org.hibernatespatial.postgis.PostgisDialect</property>
这句配置起到了重要的作用,这里声明了 hibernate 的方言。该方言声明了对postgis的一些支持。
并且大家也应该知道,在使用hibernate时候,如果需要自定义函数,要需要自定义方言。
5,第一个主类
import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.Session; import org.hibernatespatial.criterion.SpatialRestrictions; import org.postgis.Geometry; import org.postgis.LineString; import org.postgis.MultiLineString; import org.postgis.MultiPolygon; import org.postgis.PGgeometry; import org.postgis.Polygon; import com.vividsolutions.jts.geom.Point; import com.vividsolutions.jts.io.ParseException; import com.vividsolutions.jts.io.WKTReader; import com.vividsolutions.jts.geom.*; import java.util.Date; import java.util.List; import util.HibernateUtil; public class EventManager { public int SRID = 4326; public static void main(String[] args) { EventManager mgr = new EventManager(); String testPiont = "2,3"; mgr.createAndStoreEvent("My Event", new Date(), testPiont); HibernateUtil.getSessionFactory().close(); } private void createAndStoreEvent(String title, Date theDate, String wktPoint) { com.vividsolutions.jts.geom.Geometry geom = null; try { geom = pointFromText(wktPoint); } catch (Exception e) { throw new RuntimeException("Not a WKT string:" + wktPoint); } Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); Event theEvent = new Event(); theEvent.setTitle(title); theEvent.setDate(theDate); theEvent.setLocation((Point) geom); session.save(theEvent); session.flush(); session.getTransaction().commit(); List l= find("POLYGON((1 1,20 1,20 20, 1 20, 1 1))"); System.out.println(l.size()); List l1= find1("POLYGON((1 1,20 1,20 20, 1 20, 1 1))"); System.out.println(l1.size()); } private List find(String wktFilter){ WKTReader fromText = new WKTReader(); com.vividsolutions.jts.geom.Geometry filter = null; try{ filter = fromText.read(wktFilter); filter.setSRID(SRID); } catch(ParseException e){ throw new RuntimeException("Not a WKT String:" + wktFilter); } Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); System.out.println("Filter is : " + filter); Criteria testCriteria = session.createCriteria(Event.class); testCriteria.add(SpatialRestrictions.within("location", filter, filter)); List results = testCriteria.list(); session.getTransaction().commit(); return results; } private List find1(String wktFilter){ WKTReader fromText = new WKTReader(); com.vividsolutions.jts.geom.Geometry filter = null; try{ filter = fromText.read(wktFilter); filter.setSRID(SRID); } catch(ParseException e){ throw new RuntimeException("Not a WKT String:" + wktFilter); } Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); Query query = session.createQuery("select within(location,'srid=4326;POLYGON ((1 1, 20 1, 20 20, 1 20, 1 1))') from Event "); List list = query.list(); return list; } public Point pointFromText(String txt) throws Exception { String tmp = txt; if (!tmp.startsWith("POINT")) { tmp = tmp.replace(",", " "); tmp = "POINT(" + tmp + ")"; } try { WKTReader fromText = new WKTReader(); Geometry geom = fromText.read(tmp); Point pt = (Point) fromText.read(tmp); pt.setSRID(SRID); return pt; } catch (Exception e) { return null; } } }通过上面的方法,我们可以测试出来,hibernate已经可以支持空间数据类型的数据操作了,可以实现空间数据入库到空间数据对象影射到java 对象中(插入和查询方法),但是有一个问题,就是支持的空间数据操作方法太少了。例如 contains,disjoint,within等十几个方法。这些方法都是简单的空间数据操作方法,要想实现复杂的空间数据这还远远不够的。相对于这方面来说ibatis 就很方便的使用了。
英文好的可以看看这个:http://www.hibernatespatial.org/tutorial.html
评论
2 楼
lorry1113
2011-01-13
ibatis没有怎么用过的,不大清楚
不过,hibernate有空间支持,ibatis也应该有的,google一下吧
不过,hibernate有空间支持,ibatis也应该有的,google一下吧
1 楼
zhjgrace
2011-01-13
ibatis怎么解析mysql的opengis中的point函数呢
发表评论
-
oracle 设置SGA
2013-03-14 11:12 1074SQL> show parameter sga; ... -
oracle sequence
2012-03-23 13:35 1018create or replace procedure p_c ... -
oracle 触发器
2012-03-23 13:11 1082触发器是指存放在数据库中,并被隐藏执行的存储过程。在Oracl ... -
两个经典的Oracle触发器示例 .
2012-03-23 11:48 1153【案例一】 题目: --触发器: --添加员工信息,流水号作 ... -
oracle sql 优化
2011-06-07 15:53 1228Oracle SQL的优化规则: 尽量少用IN操作符,基本 ... -
查看一个函数被哪些存储过程调用
2011-02-28 14:37 1565查看一个函数被哪些存储过程调用: select * from ... -
Oracle 常用SQL技巧
2010-11-24 17:44 8631. SELECT子句中避免使用 ... -
oracle 存储过程的基本语法
2010-11-05 15:59 10881.基本结构 CREATE OR REPLACE PROCE ... -
oracle存储过程,游标及循环应用实例
2010-07-21 14:45 1564最近在项目中做了一个关于系统与系统之间数据同步的业务,之前使用 ... -
oracle中用START WITH...CONNECT BY PRIOR子句实现递归查询
2010-05-26 11:24 893今天发现在oracle中的select语句可以用START W ... -
ArcSDE系统表的说明
2010-02-01 17:09 1400当基于Oracle或是SQL Server安装ArcSde后, ... -
(转)Oracle常用数据字典的查询使用方法
2010-01-14 16:40 1012查看当前用户的缺省表空间 SQL>select use ... -
(转)PL/SQL存储过程编程
2010-01-14 16:34 1764PL/SQL存储过程编程(上) ... -
oracle 分页语句
2010-01-06 17:28 852select * from (select a.*, ro ... -
数据库设计5步骤
2009-12-23 16:43 819数据库设计5步骤 ... -
数据库设计
2009-12-23 10:07 903说到数据库,我认为不 ... -
oracle 优化
2009-11-25 15:36 965Oracle的优化器有两种优 ... -
oracle 字段类型
2009-11-13 16:49 1080Char 用于描述定长的字符型数据,长度<=2000字节 ... -
oracle PROCEDURE
2009-11-13 16:13 2991.基本结构 CREATE OR REPLACE PROCED ... -
通过一个实际的例子学习Oracle存储过程
2009-11-10 18:10 1504--创建存储过程 CREATE OR REPLACE PROC ...
相关推荐
postgis函数总结 postgis函数总结
1、转换函数 wkt和geom之间的相互转化 2、空间关系判断函数 常见的空间关系(Geometry Relationships)包括:Disjoint、Intersects、Touches、Crosses、Within、Contains、Overlaps、Relates。 3、空间操作函数 ...
OGC+PostGIS函数.txt
### PostGIS中的常用函数 #### 一、概述 PostGIS是一种扩展了PostgreSQL数据库功能的扩展模块,使得数据库能够存储和处理地理空间数据。PostGIS提供了丰富的地理空间数据类型和函数,可以对地理空间数据进行复杂的...
描述中提到“postgis的官网上不去”,这可能是因为网络问题或者官方站点暂时不可访问。在这种情况下,分享这个jar包是为了确保开发者或用户能够获取到所需的驱动,以便在自己的项目中连接和操作PostGIS数据库。"可以...
6. **拓扑支持**:PostGIS 提供的拓扑功能允许用户创建和操作具有拓扑关系的空间对象,这对于网络分析(如道路网络)至关重要。 7. **投影与坐标系**:理解不同坐标系和投影系统,以及如何在它们之间进行转换。 8....
我们计划继续支持和发展PostGIS以便支持一系列重要的GIS功能,包括对OpenGIS的完全支持,高级拓扑构建 (coverages, surfaces, networks类型),方便用户浏览和编辑GIS数据的桌面用户界面工具以及基于web的访问工具。 ...
PostGIS 是一个强大的开源扩展,它将空间地理数据处理功能集成到 PostgreSQL 数据库管理系统中,使得 PostgreSQL 成为一个全面的地理信息系统(GIS)。这个“postgis-2.2.0dev 手册中文版(伏念译)”是 PostGIS 2.2.0...
在本文中,我们将介绍如何安装PostgreSQL和PostGIS,并将空间数据导入到PostGIS数据库中。 一、PostgreSQL的安装 PostgreSQL的安装非常简单,用户可以根据自己的操作系统选择合适的安装包。对于Windows用户,可以...
PostGIS 是 PostgreSQL 数据库的一个扩展,它为地理空间数据提供了强大的支持。PostGIS 提供了丰富的函数库,用于处理和操作空间数据。在本文中,我们将深入探讨 PostGIS 中的一些核心空间函数,包括缓冲区、相交、...
PostGIS是一个对象关系型数据库系统PostgreSQL的扩展,它能吧...PostGIS有基于GiST的-R树空间索引的支持以及丰富的分析和GIS对象的处理函数支持本文档为postgis官方2.2版本中文版,包含各函数的使用方法与数据库理论.
在整个安装过程中,用户需要配置 PostGIS Extension,以便正确地安装和使用 PostGIS 功能。 PostGIS 使用指导 ---------------- 1. 创建 PostGIS 数据库 用户可以使用 PostGIS Extension 创建 PostGIS 数据库,并...
PostGIS支持多种地理数据类型,如`POINT`、`LINESTRING`、`POLYGON`等,以及丰富的空间操作函数,例如计算两点之间的距离、判断几何对象的交集、合并几何对象等。这些功能使得PostGIS成为地理信息系统(GIS)和地图...
文档中不仅解释了如何安装和配置PostGIS,还提供了SQL函数和类型的参考,以及示例代码来帮助理解如何使用这些功能。通过学习文档,你可以了解如何创建空间表、执行空间查询、进行地理编码和反地理编码,以及如何利用...
PostGIS是一个开源的地理信息系统(GIS)扩展,它为PostgreSQL关系数据库提供了空间对象支持,使其能够存储和操作空间数据。PostGIS遵循OpenGIS标准,并支持各种几何和地理类型的数据模型,它广泛用于地理空间数据...
Hibernate是一个非常优秀的,成熟的ORM框架,可以在不用写SQL语句的情况下,仅仅对持久化对象进行操作便可以完成对数据库的操作,可以使开发者更为专注于业务代码的编写,提高了开发效率,相对于JDBC而言,大大简化...
- 长事务支持(Long Transactions Support)描述了如何在PostGIS中使用长事务。 - 杂项函数(Miscellaneous Functions)包括了其他的PostGIS函数,如估算扩展等。 - 异常函数(Exceptional Functions)描述了一些...
此外,PostGIS提供的丰富的空间函数库使得在GeoServer中进行空间分析变得可能。例如,可以使用ST_Intersects检查两个地理对象是否相交,或者使用ST_Simplify对复杂的几何对象进行简化,以提高渲染性能。通过结合...
而pgrouting则是一个用于构建路由应用的开源库,它基于PostGIS,专门用于解决地理空间中的路径规划问题。 在GIS应用中,路径查询是常见的需求,比如导航系统、物流配送、紧急救援等。PostGIS结合pgrouting可以提供...
2. **空间操作函数**:提供了丰富的空间分析和操作函数,例如计算两点之间的距离、求几何对象的面积、检查两个几何对象是否相交等。 3. **空间索引**:支持使用R-Tree等高效的空间索引,加速空间查询性能。 4. **...