示例代码:https://github.com/bigben0123/spring-boot-spatial-example

1,配置application.properties

#sqlserver configure
spring.datasource.url =jdbc:sqlserver://localhost:1433;DatabaseName=myDatabase
spring.datasource.username=sa
spring.datasource.password=sa
spring.datasource.driverClassName =com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.jpa.database=SQLSERVER
spring.jpa.properties.hibernate.default_schema=dbo #database name
spring.jpa.properties.hibernate.default_catalog=myDatabase #使用空间数据类型 geometry等,需要把方言改成:spring.jpa.properties.hibernate.dialect=org.hibernate.spatial.dialect.sqlserver.SqlServer2008SpatialDialect
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.SQLServer2008Dialect

# Naming strategy
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy spring.jpa.hibernate.ddl-auto=create-drop
#spring.jpa.properties.hibernate.dialect=org.hibernate.spatial.dialect.h2geodb.GeoDBDialect
#spring.jpa.properties.hibernate.dialect=org.hibernate.spatial.dialect.mysql.MySQL56InnoDBSpatialDialect
spring.jpa.show-sql=true
spring.datasource.platform=mysql
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
logging.level.org.hibernate.type=TRACE

2, 在maven中添加sql server的jdbc驱动包

官网下载sqljdbc4的jar包

解压到任意位置(win:E:\sqljdbc_6.0\chs\jre8)。在有sqljdbc4.jar包的文件夹下,通过shift+右键的方式–>此处打开命令窗口,然后执行以下maven命令:

mvn install:install-file -DgroupId=com.microsoft.sqlserver -DartifactId=sqljdbc4 -Dversion=4.2 -Dpackaging=jar -Dfile=E:\sqljdbc_6.0\chs\jre8\sqljdbc42.jar

显示build success,mvn库文件会放在C:\UsersAdministrator\.m2\repository\com\microsoft\sqlserver

3,pom.xml中添加依赖

<!-- sqlserver connector -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId>
<scope>4.2</scope>
<version>4.2</version>
</dependency>

____________________________________________________________________________________________________

源码参考:

super entity:

package org.vaadin.example;

import java.io.Serializable;
import java.util.Objects;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.persistence.Version; /**
*
* @author Matti Tahvonen
*/
@MappedSuperclass
public abstract class AbstractEntity implements Serializable, Cloneable { @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; @Version
private int version; public Long getId() {
return id;
} protected void setId(Long id) {
this.id = id;
} @Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if(this.id == null) {
return false;
} if (obj instanceof AbstractEntity && obj.getClass().equals(getClass())) {
return this.id.equals(((AbstractEntity) obj).id);
} return false;
} @Override
public int hashCode() {
int hash = 5;
hash = 43 * hash + Objects.hashCode(this.id);
return hash;
} }
package org.vaadin.example;

import java.util.Date;

import javax.persistence.Entity;

import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.Point;
import javax.persistence.Column;
import javax.persistence.Temporal;
import javax.persistence.TemporalType; @Entity
public class SpatialEvent extends AbstractEntity { private String title; @Temporal(TemporalType.DATE)
private Date date; //@Column(columnDefinition = "POINT") // this type is known by MySQL
@Column(columnDefinition = "geometry")
private Point location; // @Column(columnDefinition = "POLYGON") // this type is known by MySQL
@Column(columnDefinition = "geometry")
private LineString route; public SpatialEvent() {
} 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 LineString getRoute() {
return route;
} public void setRoute(LineString route) {
this.route = route;
} public Point getLocation() {
return location;
} public void setLocation(Point location) {
this.location = location;
} }
package org.vaadin.example;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext; import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional; /**
* @author mstahv
*/
public interface SpatialEventRepository
extends JpaQueryDslPredicateRepository<SpatialEvent, Long> { }

主代码:

package org.vaadin.example;

import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.GeometryFactory;
import java.util.Date;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean; @SpringBootApplication
public class SpatialSpringBootAppApplication { public static void main(String[] args) {
SpringApplication.run(SpatialSpringBootAppApplication.class, args);
} @Bean
CommandLineRunner init(SpatialEventRepository repo,SimpleEventRepository repo1) {
return (String... strings) -> {
GeometryFactory factory = new GeometryFactory(); // repo.insert(23, 61); SpatialEvent theEvent = new SpatialEvent();
theEvent.setTitle("Example event");
theEvent.setDate(new Date());
theEvent.setLocation(factory.createPoint(new Coordinate(26, 62)));
theEvent.getLocation().setSRID(4326);
repo.save(theEvent); SpatialEvent eventWithPath = new SpatialEvent();
Coordinate[] coords = new Coordinate[] { new Coordinate(22, 60), new Coordinate(23, 61), new Coordinate(22, 63) };
eventWithPath.setRoute(factory.createLineString(coords));
eventWithPath.getRoute().setSRID(4326);
eventWithPath.setLocation(factory.createPoint(new Coordinate(22, 60)));
eventWithPath.getLocation().setSRID(4326);
eventWithPath.setDate(new Date());
eventWithPath.setTitle("MTB cup 1/10");
repo.save(eventWithPath); };
}
}

计算距离:

select location.ToString(),version, geography::STGeomFromText(location.ToString(), 4326).STDistance(geography::STGeomFromText('POINT(22 60)', 4326)) from spatial_event

5公里以内:

select * from spatial_event where  geography::STGeomFromText(location.ToString(), 4326).STDistance(geography::STGeomFromText('POINT(22 60)', 4326))<5000

注意:

sqlserver的java类与数据库名称对应:MyDatabase 对应 my_database


sqlserver 用原生sql语句时,需要写完整的表名:数据库.dbo.表名

        String sql = "select * from  mydb.dbo.mytable"
+" where location.STDistance('POINT(-121.626 47.8315)')<5"; Query query = em.createNativeQuery(sql);
// query.setParameter(1, email);
// query.setParameter(2, id);
query.getResultList();

写表名,实体类名都不行。报错:

ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - 对象名 'spatial_event' 无效。

或者

org.hibernate.QueryException: could not resolve property: point of: org.vaadin.example.SpatialEvent [select p from org.vaadin.example.SpatialEvent p where                         within(p.point, :circle) = true]

这是由于错写了这句:

spring.jpa.properties.hibernate.default_schema=dbo

1、先说说Sql Server中geometry和geography的区别:

geometry:planar    平面坐标系【supported by SQL Server conforms to the Open Geospatial Consortium (OGC) Simple Features for SQL Specification version 1.1.0.】

geography: terrestrial   地理坐标系【stores ellipsoidal (round-earth) data, such as GPS latitude and longitude coordinates.】

如果要计算两个lat/lon点之间的实际距离就需要将geometry类型转成geography类型,不然结果肯定不正确。

2、geometry转geography的方法:

geography::STGeomFromText(boundary.ToString(), 4326)

boundary是geometry类型的,4326是坐标系的参数,4326代表GCS-WGS-1984坐标系,是系统默认的坐标系。

可以通过这个sql获得系统的坐标系(Sql server中):Select * from sys.spatial_reference_systems where authorized_spatial_reference_id=4326

3、STDistance的用法:

https://msdn.microsoft.com/zh-cn/library/bb933952(v=sql.110).aspx

按照里面的例子能够计算出距离,但是如果输入的是经纬度的值,得出的结果总是觉得不对,值比较小,实际上需要按照第二步转化为geography类型再计算就可以了,4326坐标系默认返回距离的单位【unit】是米【meter】。

STDistance也可以计算点到面的最短距离。

---------------------
作者:Spring_Ji
来源:CSDN
原文:https://blog.csdn.net/jcx5083761/article/details/46010215?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!

----------------------------------------------------------------


参考:https://blog.csdn.net/bitree1/article/details/63253685

springboot 通过 hibernate 连接sqlserver 空间数据 位置数据的更多相关文章

  1. SpringBoot 整合 hibernate 连接 Mysql 数据库

    前一篇搭建了一个简易的 SpringBoot Web 项目,最重要的一步连接数据库执行增删改查命令! 经过了一天的摸爬滚打,终于成功返回数据! 因为原来项目使用的 SpringMVC + Hibern ...

  2. ORACLE连接SQLSERVER

    一.实验(实验成功) 1.实验目标:ORACLE连接SQLSERVER以及查询数据 2.搭建的环境: oracle 9i 9.0.2.0.1 地址:192.168.40.139 sql2000 的数据 ...

  3. PHP连接sqlserver的两种方法,向sqlserver2000中写入数据,中文乱码

    项目环境是php5.3.28 项目用的ThinkPHP3.2.3  已经mysql5.5数据库,要和另一个项目对接,需要连接sqlsever2000数据库进行一些操作. 第一种用php自带扩展连接数据 ...

  4. Hibernate 连接MySQL/SQLServer/Oracle数据库的hibernate.cfg.xml文件

    用Hibernate配置连接数据库可以方便我们对POJO的操作,节省了很多时间和代码.下面就分别说明连接不同数据库需要在hibernate.cfg.xml做的配置. 需要数据库驱动包可以点击这里下载: ...

  5. Java采用Hibernate连接MySQL

    现有环境: Java JDK1.8 MySQL5.7 [ps]本文是很早前的基于隐马尔科夫模型进行中文词性标注的后续升级完善版,任务就是将之前的写入文件的模型参数写入MySQL 下载Hibernate ...

  6. Hibernate的检索方式--查询数据的方式

    Hibernate 提供了以下几种检索对象的方式1导航对象图检索方式: 根据已经加载的对象导航到其他对象(根据已经加载的对象,导航到其他对象-例如一对多的查询)2OID 检索方式: 按照对象的 OID ...

  7. 将.Net Core发布至Docker,并连接 Redis、上传文件到本机、连接sqlserver数据库

    此片文章目标是将 .Net Core 发布到 Docker 上,并且连接到在 Docker上的 Redis .上传文件到本机文件夹和连接 sqlserver 数据库. 创建项目 创建项目就不用说了,我 ...

  8. Android通过webservice连接SQLServer 详细教程(数据库+服务器+客户端)

    http://blog.csdn.net/zhyl8157121/article/details/8169172 目录(?)[-] 项目说明 开发环境的部署 数据库设计 服务器端程序设计Webserv ...

  9. 使用thinkphp连接sqlserver数据库时提示“系统不支持:sqlsrv”

    习惯了使用php跟mysql组合,现在接到项目需要调用客户线下的系统软件的数据,具了解,这个软件的数据库是用sqlserver数据库也就是常说的mssql数据库了. 那么我现在需要用PHP连接sqls ...

随机推荐

  1. array_filter、array_walk、array_map的区别

    <?php $arr=array( 1,2,3,4,5,6 ); function filter($var){ if($var%2==0) return true; } $data=array_ ...

  2. [转帖]Windows 内核说明

    来源:https://zhidao.baidu.com/question/398191459.html 自己的理解. windows 的内核文件 是在 c:\windows\system32 目录下面 ...

  3. python学习笔记(11)--词云

    中分词库  jieba 词云 wordcloud import jieba import wordcloud f = open("新时代中国特色社会主义.txt", "r ...

  4. echo显示颜色

    如有转载,不胜荣幸.http://www.cnblogs.com/aaron-agu/ [;;34m hello aaron \[0m”

  5. java构造器和构建器

    本文摘自:https://blog.csdn.net/wh2827991/article/details/79013115 在实例化一个类的过程中,通常会遇到多个参数的构造函数,但如果有些参数是非必需 ...

  6. jaxp的dom方式操作(查找、添加、修改、删除、遍历节点)

    package cn.itcast.jaxptest; import java.io.IOException; import javax.xml.parsers.DocumentBuilder;imp ...

  7. Windows Server 2012 添加角色时出现 failed to open runspace pool

    先把所有的Windows Server 2012的更新更新了.再来添加服务器角色.就不会再出现 The Server Manager WinRM plug-in might be corrupted ...

  8. 实体类注解错误:Could not determine type for: java.util.List

    今天配置实体类注解时,出现以下错误: Caused by: org.hibernate.MappingException: Could not determine type for: java.uti ...

  9. Web API 配置Help Page

    当你创建一个web API,它通常用于创建一个帮助页面,以便其他开发人员知道如何调用你的API.你可以手动创建所有的文档,但最好是autogenerate尽可能多. 简化这个任务,ASP.Web AP ...

  10. poj-1236(强连通分量)

    题意:给你n个点,每个点可能有指向其他点的单向边,代表这个点可以把软件传给他指向的点,然后解决两个问题, 1.问你最少需要给几个点,才能使所有点都能拿到软件: 2.问你还需要增加几条单向边,才能使任意 ...