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 值判断,否则将导致引擎放弃使用索 ...
随机推荐
- android获取ip和本机的物理地址
<span style="font-size:18px;">/** * 获取ip * * @return */ public static String getLoca ...
- android tv 全屏幕垂直画
它们的定义view 采纳canvas双缓冲方式,它可以减少呈现时间.提高性能. StaggeredView.java 源码例如以下: package com.xxx.demo; import andr ...
- ABP应用层——应用服务(Application services)
ABP应用层——应用服务(Application services) 点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之15.ABP应用层——应用服务(Applic ...
- Python开发一个csv比较功能相关知识点汇总及demo
Python 2.7 csv.reader(csvfile, dialect='excel', **fmtparams)的一个坑:csvfile被csv.reader生成的iterator,在遍历每二 ...
- python 编码转换(转)
主要介绍了python的编码机制,unicode, utf-8, utf-16, GBK, GB2312,ISO-8859-1 等编码之间的转换. 常见的编码转换分为以下几种情况: 自动识别 字符串编 ...
- 网络编程easy错误点-手知道
通常的网络编程socket编程.实际上.socket编程并不仅仅是满足网络间不同主机之间的通信,它也能实现同一台主机上不同进程间的通信需求. 其体如今创建socket时的參数的不同: int sock ...
- cocos2d-x注意事项(十)Lua发展飞机战争-4-创建主角
二战中被称为二战飞机飞机,当然,以飞机作业.这是一个游戏,我们必须加入一个飞机--这是我们的英雄. 首先创建一个层(PlaneLayer)要显示飞机.然后,create飞机初始化方法 module(& ...
- No bean named 'sessionFactory' is defined
1.错误叙述性说明 严重:Servlet service() for servlet default threw exception . org.springframework.beans.facto ...
- HDU4405-Aeroplane chess(可能性DP需求预期)
Aeroplane chess Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 【百度地图API】如何用圆形搜索获取中心点周围100米内全部关键点?如天安门附近所有的餐厅、加油站、宾馆、大厦等
原文:[百度地图API]如何用圆形搜索获取中心点周围100米内全部关键点?如天安门附近所有的餐厅.加油站.宾馆.大厦等 摘要: 在LBS上有这样一个常用的功能,查找附近所有的关键点(POI点,比如标志 ...