GeoTools坐标转换(投影转换和仿射变换)
GeoTools是在java下的gis开源软件,以下介绍坐标转换的两种方法:投影转换和仿射变换
- 投影转换
这里以xian80经纬度坐标转xian80,3度分带 111中央经线平面坐标为例
转换函数如下:
Point pointXian80 = projectTransform(lon, lat, "EPSG:4610", "EPSG:2382");
/**
* 投影转换, lon=经度,lat=纬度,ESPG格式(例):EPSG:4610
*/
public static Point projectTransform(double lon, double lat,
String epsgSource, String epsgTarget) throws FactoryException,
MismatchedDimensionException, TransformException {
// 原始坐标点
// PS:通常逻辑上理解经度应该是横坐标x,纬度是y,可是这里经度要填到y,纬度x,否则会报错
Point sourcePoint = JtsHelper.createPoint(lat, lon); // 定义转换前和转换后的投影,可以用ESPG或者wkt
// "PROJCS[\"Xian_1980_3_Degree_GK_CM_111E\",GEOGCS[\"GCS_Xian_1980\",DATUM[\"D_Xian_1980\",SPHEROID[\"Xian_1980\",6378140.0,298.257]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Gauss_Kruger\"],PARAMETER[\"False_Easting\",500000.0],PARAMETER[\"False_Northing\",0.0],PARAMETER[\"Central_Meridian\",111.0],PARAMETER[\"Scale_Factor\",1.0],PARAMETER[\"Latitude_Of_Origin\",0.0],UNIT[\"Meter\",1.0]]";
// CoordinateReferenceSystem mercatroCRS = CRS.parseWKT(strWKTMercator);
CoordinateReferenceSystem crsSource = CRS.decode(epsgSource);
CoordinateReferenceSystem crsTarget = CRS.decode(epsgTarget);
// 投影转换
MathTransform transform = CRS.findMathTransform(crsSource, crsTarget);
Point pointTarget = (Point) JTS.transform(sourcePoint, transform); return pointTarget;
}
关于定义坐标系的说明,GeoTools中定义坐标系有两种方法,一是坐标系的wkt,二是ESPG
坐标系的wkt可以从arcgis的prj文件中过去,用记事本打开prj文件,里面的内容就是该坐标系的wkt格式内容,例如:PROJCS[\"Xian_1980_3_Degree_GK_CM_111E\",GEOGCS[\"GCS_Xian_1980\",DATUM[\"D_Xian_1980\",SPHEROID[\"Xian_1980\",6378140.0,298.257]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Gauss_Kruger\"],PARAMETER[\"False_Easting\",500000.0],PARAMETER[\"False_Northing\",0.0],PARAMETER[\"Central_Meridian\",111.0],PARAMETER[\"Scale_Factor\",1.0],PARAMETER[\"Latitude_Of_Origin\",0.0],UNIT[\"Meter\",1.0]]
获取到wkt后,可以通过 CoordinateReferenceSystem mercatroCRS = CRS.parseWKT(strWKTMercator); 获取到坐标系对象
另一种方法是ESPG,意思是每一个坐标系都有一个ESPG标准的号码,查询坐标系的ESPG可通过以下网站 http://spatialreference.org/
PS:当转换的两种坐标系的datum不同,会报错Bursa-Wolf parameters,暂时未解决
- 仿射变换
代码如下:
首先是输入三组参考点,前三个是转换前,后三个是转换后
最后结果是pointReuslt
// 参考点坐标
Coordinate s1 = new Coordinate(429275.549, 2801455.153);
Coordinate s2 = new Coordinate(428110.626, 2792148.620);
Coordinate s3 = new Coordinate(428966.479, 2800016.622); Coordinate t1 = new Coordinate(4628.339, 801349.338);
Coordinate t2 = new Coordinate(3515.906, 792036.308);
Coordinate t3 = new Coordinate(4327.381, 799909.069);
// 建立仿射变换对象
AffineTransformationBuilder afb = new AffineTransformationBuilder(s1,
s2, s3, t1, t2, t3);
AffineTransformation atf = afb.getTransformation(); Point pointReuslt = JtsHelper.createPoint(x,y); // 坐标转换
pointReuslt.apply(atf);
GeoTools坐标转换(投影转换和仿射变换)的更多相关文章
- 说说geotools中坐标转换那点事
概述: 本文说说geotools中坐标转换的那点事情,以WGS84和web墨卡托相互转换为例. 效果: 转换前 转换后 单个Geometry转换 实现代码: package com.lzugis.ge ...
- (十七)WebGIS中距离及面积测量的原理和实现以及坐标转换的简单介绍
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 在这一章里我们将讨论基础工具栏中另外两个常用工具:距离测量工 ...
- ArcGIS中的坐标系统定义与投影转换【转】
ArcGIS中的坐标系统定义与投影转换 坐标系统是GIS数据重要的数学基础,用于表示地理要素.图像和观测结果的参照系统,坐标系统的定义能够保证地理数据在软件中正确的显示其位置.方向和距离,缺少坐标系统 ...
- 【转】+【举例】ArcGIS中的坐标系统定义与投影转换
背景知识: UTM (Universal Transverse Mercator)坐标系是由美国军方在1947提出的.虽然我们仍然将其看作与"高斯-克吕格"相似的坐标系统,但实际上 ...
- ArcGIS Engine开发之旅10--空间参考及坐标转换
原文:ArcGIS Engine开发之旅10--空间参考及坐标转换 空间参考(Spatial Reference)是 GIS 数据的骨骼框架,能够将我们的数据定位到相应的位置,为地图中的每一点提供准确 ...
- GDAL坐标转换
一.引言 最近研究了一下GIS.测绘学的坐标转换的问题,感觉大部分资料专业性太强,上来就是一通专业性论述:但感觉对于相关从业者来说,其实不必了解那么多背景知识的:就通过GDAL这个工具,来简单总结下坐 ...
- 简析服务端通过geotools导入SHP至PG的方法
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 项目中需要在浏览器端直接上传SHP后服务端进行数据的自动入PG ...
- Cesium中的地形和坐标转换说明
1 Cesium中的地形 Cesium中的地形系统是一种由流式瓦片数据生成地形mesh的技术,厉害指出在于其可以自动模拟出地面.海洋的三维效果.创建地形图层的方式如下: var terrainProv ...
- ArcGIS进行自定义投影转换(重投影)
这里记录一下使用自定义七参数进行投影转换的过程. 1.主动创建自定义地理(坐标)变换 首先在系统工具箱里面选择创建自定义地理(坐标)变换 在弹出的窗口中输入相关参数即可. 转换方法选择COORDINA ...
随机推荐
- driver, module以及怎么看他们
1. driver和module的区别 https://unix.stackexchange.com/questions/47208/what-is-the-difference-between-ke ...
- MySQL 优化之 EXPLAIN 关键字
MySQL查询优化之explain的深入解析 0. 准备 首先执行如下的 sql 语句: CREATE TABLE IF NOT EXISTS `article` (`id` int(10) unsi ...
- 【Codeforces 762A】 k-th divisor
[题目链接] 点击打开链接 [算法] 我们知道,一个数的因子是成对出现的,一半小于等于sqrt(N),一半大于sqrt(N),因此,我们可以从 2..sqrt(N)枚举因子 [代码] #include ...
- 平衡二叉树、B树、B+树、B*树、LSM树简介
平衡二叉树是基于分治思想采用二分法的策略提高数据查找速度的二叉树结构.非叶子结点最多只能有两个子结点,且左边子结点点小于当前结点值,右边子结点大于当前结点树,并且为保证查询性能增增删结点时要保证左右两 ...
- Task运行带参数的函数
Task<Int32> task = Task.Run(() => fun("s", 9)); 函数定义: private Int32 frun(string ...
- 【转】图像金字塔PyrDown,PyrUP
原文链接:http://blog.csdn.net/davebobo/article/details/51885043 [图像金字塔] 图像金字塔这个词,我们经常在很多地方可以看到.它是图像多尺度表达 ...
- GC 和 Full GC 有什么区别?
GC(或Minor GC):收集 生命周期短的区域(Young area). Full GC (或Major GC):收集生命周期短的区域(Young area)和生命周期比较长的区域(Old are ...
- vs code 代码格式化
1.打开vs code > 文件 > 首选项 > 设置 > 将下面一段粘贴在右侧即可 // Place your settings in this file to overwr ...
- C++笔试题(七)
微软研究院是一个听起来就牛B的地方啊,反正我是进不去,不过不妨碍我看看他的笔试题到底是怎么样的.下面四道题就是微软研究院的笔试题目,题后附有我的解答.微软研究院(亚洲)的网址是:http://rese ...
- c++模板专门化
#include <iostream> #include<cstring> using namespace std; template <typename T> T ...