jsp连接MySQL数据库显示GIS地理数据乱码问题的解决(select AsText(the_geom))
oh,fuck,经过我昨天下午到今天的努力,终于将这一问题成功解决了,哈哈哈
问题详细描述:
我通过jsp页面连接上MySQL数据库,取出存在表中的地理数据(类型是geometry,具体有POINT、MULTILINESTRING等),其在数据库中的存储格式为(以POINT类为例):POINT(121.38785 28.426766),表的设计及表内具体内容见下图:
前天就测试了把表中的全部数据取出来,但取出来之后发现经纬度部分是乱码的,由于我昨天先要解决jsp往数据库存数据乱码的问题,所以就先把经纬度乱码的问题放了一放。昨天下午终于把存数据乱码的问题解决了之后就开始考虑如何解决经纬度显示乱码的问题。
我首先想到的是,既然我存进数据库的是字符串(如POINT(121.38785 28.426766)),那么我取出来的也应该是字符串啊,因而也就应该能正常显示到页面啊。如果能正常显示的话,我就能使用字符串分离提取出经度值和纬度值来使用了。可是乱码问题出在哪儿呢?
在openlayers技术群1里问了下,有人提示我试试使用类似于SELECT X(GeometryFromText(P))、SELECT Y(GeometryFromText(P))的语句取the_geom的数值试下,我把p用the_geom替换,添加到我的jsp页面的语句中,测试,不可行,而且这样的话会对我的代码结构产生影响,并且会影响我的结果的输出,具体为什么请看我的代码结构(主要是我使用了String query_sql = "select * from biandianzhan_point_tb";这一语句):
String connUrl = "jdbc:mysql://localhost/" + DBName + "?user=" + DBUser + "&password=" + DBPasswd;
Class.forName(driverName).newInstance();
Connection conn = DriverManager.getConnection(connUrl);
Statement stmt = conn.createStatement();
stmt.executeQuery("SET NAMES UTF8");
String query_sql = "select * from biandianzhan_point_tb";
try {
ResultSet rs = stmt.executeQuery(query_sql);
while(rs.next()) {
%>
ID:<%=rs.getString("id")%> </br>
名称:<%=rs.getString("name")%> </br>
电压等级:<%=rs.getString("voltage_level")%> </br>
经纬度:<%=rs.getString("AsText(the_geom)")%> </br>
<%
}
}catch(Exception e) {
e.printStackTrace();
}
//rs.close();
stmt.close();
conn.close();
群里的那位仁兄同时还给我发来MySQL官网中介绍MySQL对空间数据支持的扩展的API链接(http://dev.mysql.com/doc/refman/5.1/zh/spatial-extensions-in-mysql.html#fetching-spatial-data),我进去看了下,很有收获,最终锁定了一个函数AsText(),非常感谢这位仁兄啊!
但是,我自己尝试着使用了下这个函数,没测试成功,很遗憾。后来发现我是测试的对象不对,我测试的是age和name,这两个变量的类型和the_geom的类型不对,估计是AsText()函数指定了参数类型。测试的结果如下图:
因为我对AsText()这个函数不了解,不知道怎么正确使用,于是我在网上搜索了一下这个函数,遗憾的是可用资源太少,庆幸的是我找到了一片很有用的博客,在此非常感谢博主!博文的网址为http://blog.sina.com.cn/s/blog_a48af8c001018q1p.html,下面我摘抄了一段有用的内容:
从Points表中读取数据也是非常简单的:
SELECT name, AsText(location) FROM Points;
以上语句的返回结果中location会被转换成跟第二步中一样的GIS标准字符串。实际上AsText函数仅仅是把数据库内部存储的几何对象格式化成一个字符串而已。
下面一个函数也是非常有用的:
SELECT name, AsText(location) FROM Points WHERE X(location) < 10 and Y(location) > 12;
该Select语句返回一系列location的X()(经度)小于10并且Y()(经度)大于12的点集合。
空间表的高级查询
把指定的几何对象转变易读的文本:
SELECT AsText(Envelope(GeomFromText('LineString(1 1,2 2)')));
返回指定几何对象的大小:
SELECT GeometryType(GeomFromText('POINT(1 1)'));
返回指定几何对象的类型:
SELECT GeometryType(GeomFromText('POINT(1 1)'));
于是,我现在数据库命令行里测试了下命令:select AsText(the_geom) from biandianzhan_point_tb ,哈哈哈,成功地显示了我需要的字符串信息:经纬度。于是我又扩展了一下这个语句,改为:select id,name,voltage_level,AsText(the_geom) from biandianzhan_point_tb,呵呵,也成功地显示了目标信息,测试结果如下:
可以看出命令行显示的中文字符是乱码的,不过不要紧,这是命令行dos窗口的编码方式导致的。总的来说,我现在是非常高兴的,因为终于能够显示我想要的信息了。
接下来就是要把这些语句放进jsp页面代码中执行了,修改后,我的jsp代码为:
String connUrl = "jdbc:mysql://localhost/" + DBName + "?user=" + DBUser + "&password=" + DBPasswd;
Class.forName(driverName).newInstance();
Connection conn = DriverManager.getConnection(connUrl);
Statement stmt = conn.createStatement();
stmt.executeQuery("SET NAMES UTF8");
String insert_sql = "INSERT INTO biandianzhan_point_tb VALUES('" + id + "','" + name + "','" + voltage_level + "',GeometryFromText('POINT (" + lon + " " + lat + ")') )";
String query_sql = "select id,name,voltage_level,AsText(the_geom) from biandianzhan_point_tb"; try {
stmt.execute(insert_sql);
}catch(Exception e) {
e.printStackTrace();
}
try {
ResultSet rs = stmt.executeQuery(query_sql);
while(rs.next()) {
%>
ID:<%=rs.getString("id")%> </br>
名称:<%=rs.getString("name")%> </br>
电压等级:<%=rs.getString("voltage_level")%> </br>
经纬度:<%=rs.getString("AsText(the_geom)")%> </br> </br>
<%
}
}catch(Exception e) {
e.printStackTrace();
}
//rs.close();
stmt.close();
conn.close();
修改好后,直接在浏览器访问insert_map.jsp,见证奇迹的时刻就要到了啊!
哈哈,我期望的效果终于出来了啊!经纬度值终于显示了!
下一步我就可以使用字符串分离分别得到经度值和纬度值用于其他地方了。
jsp连接MySQL数据库显示GIS地理数据乱码问题的解决(select AsText(the_geom))的更多相关文章
- JSP连接MySQL数据库问题
之前写了一大段,还说了一下具体JDBC连接数据库API的具体包的基本知识,哪知道自己手残不小心按了删除按钮.结果去看自动保存记录时,就只剩下下面这段了.好吧,其实最主要最核心的也就是下面这点了.具体如 ...
- Jsp连接Mysql数据库取数方法
我将Jsp连接Mysql数据库方法整理如下,供大家学习交流! 1.首先在myslq数据库中新建mldn数据库,并新建emp表.(方法不展开介绍) 插入数据如下: create table `emp` ...
- java web 程序---jsp连接mysql数据库的实例基础+表格显示
<%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="g ...
- tomcat之jsp连接mysql数据库
一.下载并部署mysql连接类 首先下载mysql连接类,下载地址https://dev.mysql.com/downloads/connector/j 如图所示,选择第一个箭头所指的平台无关版本,然 ...
- 值得收藏的JSP连接mysql数据库的例子
1:用mysql驱动把mysql与tomcat的连接起来.把mysql驱动包(不用解压)放到Tomcat安装目录中lib文件夹下即可. 2:然后在自己的新建的web应用程序上面就可以下下面的代码 3: ...
- JSP连接mysql数据库的重点
1:用mysql驱动把mysql与tomcat的连接起来.把mysql驱动包(不用解压)放到Tomcat安装目录中lib文件夹下即可. 2:然后在自己的新建的web应用程序上面就可以下下面的代码 3: ...
- VS2017项目中使用代码连接MySQL数据库,以及进行数据添加
//头文件 #include "mysql.h" //函数定义 // 执行sql语句, 包括增加.删除.更新数据 bool ExecuteSql(MYSQL m_mysql,con ...
- jsp连接mysql数据库
1.新建一个Java web项目. 2.导入mysql驱动包.(这个跟上一篇写的Java连接mysql类似) 3.编写测试代码 <%@ page contentType="text/h ...
- mysql数据库优化方法大数据量查询轻松解决
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
随机推荐
- Web API之消息处理管道
Web API之消息处理管道 前言 MVC有一套请求处理的机制,当然Web API也有自己的一套消息处理管道,该消息处理管道贯穿始终都是通过HttpMessageHandler来完成.我们知道请求信息 ...
- 随笔 - Internet缓存文件
Internet缓存文件 本文地址: http://blog.csdn.net/caroline_wendy 互联网上全部的使用记录, 图片, 音乐, 视频, 都会缓存在本地. 1. 位置: IE-& ...
- Android Activity和Fragment生命周期图
- 第2章 简单工厂模式(Sample Factory)
原文 第2章 简单工厂模式(Sample Factory) 一般用到的场景:对象多次被实例引用,切有可能会发生变化 拿我们的简单三层举例子 先定义dal层 1 2 3 4 5 6 7 8 cl ...
- 源码安装saltstack的时候遇到的问题
公司的系统都是内网,无法连接互联网,所以没办法只有源码安装了. 看了下saltstack的官网,需要安装的包有 https://docs.saltstack.com/en/latest/topics/ ...
- Oracle缓存机制
- 只有有lua编译能力不足200K代码吧?NO! Python 有可能。
如今Python给人的感觉是大,东西多,在Windows上安装后竟然要占100多兆的空间. lua给人的感觉是非常小,非常轻便.Python 2.7在linux下编译出来的代码在strip之后也有3M ...
- jQuery实现按键盘方向键翻页
1.jQuery代码: $(document).ready(function(){ var prevpage=$("#pre").attr("href"); v ...
- 开源 java CMS - FreeCMS2.2 模型管理
项目地址:http://www.freeteam.cn/ 模型管理 从FreeCMS 2.0開始支持 通过模型添加删除字段,调整后台功能;支持网站.栏目.信息等模型. 因为操作方法同样.本文档以网站模 ...
- 安卓MonkeyRunner源码分析之启动
在工作中因为要追求完成目标的效率,所以更多是强调实战,注重招式,关注怎么去用各种框架来实现目的.但是如果一味只是注重招式,缺少对原理这个内功的了解,相信自己很难对各种框架有更深入的理解. 从几个月前开 ...