前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >经纬度坐标和投影坐标的转换

经纬度坐标和投影坐标的转换

作者头像
卡尔曼和玻尔兹曼谁曼
发布于 2019-01-22 03:00:45
发布于 2019-01-22 03:00:45
2.9K00
代码可运行
举报
运行总次数:0
代码可运行

昨天,有朋友要我帮忙看看一个将经纬度坐标转换成墨卡托投影(墨卡托投影有很多变种,我也不知道他说的是哪一种)的程序,他说转换以后的坐标精度太差。当时,他的程序没怎么看懂,然后研究了一下Geotools,自己写了一个转换小程序,很简单的几行代码!

Geotools是Java语言编写的开源GIS工具包。该项目已有十多年历史,生命力旺盛,代码非常丰富,包含多个开源GIS项目,并且基于标准的GIS接口。Geotools主要提供各种GIS算法,各种数据格式的读写和显示。由于Geotools库依赖比较复杂,所以在Eclipse中我采用Maven进行建构。对于在Eclipse下怎么使用Maven,请自己百度之。貌似最新的Eclipse是直接集成Maven插件的不需要自己单独安装了。虽说Eclipse不需要安装Maven插件了,可以使用Eclipse自带的Eclipse Maven插件,但是还是建议自己安装一个最新的Maven二进制包。

在Eclipse新建Maven工程,添加库和依赖:

这里主要添加的是要下载Geotools的库:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<repositories>
    <repository>
        <id>maven2-repository.dev.java.net</id>
        <name>Java.net repository</name>
        <url>http://download.java.net/maven/2</url>
    </repository>
    <repository>
        <id>osgeo</id>
        <name>Open Source Geospatial Foundation Repository</name>    <url>http://download.osgeo.org/webdav/geotools/</url>
    </repository>
  </repositories>

以及用到的Geotools库:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.geotools</groupId>
        <artifactId>gt-referencing</artifactId>
        <version>${geotools.version}</version>
    </dependency>
    <dependency>
        <groupId>org.geotools</groupId>
        <artifactId>gt-epsg-wkt</artifactId>
        <version>${geotools.version}</version>
    </dependency>
    <dependency>
        <groupId>org.geotools</groupId>
        <artifactId>gt-api</artifactId>
        <version>${geotools.version}</version>
    </dependency>
    <dependency>
        <groupId>com.vividsolutions</groupId>
        <artifactId>jts</artifactId>
        <version>1.13</version>
    </dependency>
  </dependencies>

最后的pom.xml文件如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>cn.tzy</groupId>
  <artifactId>geotools</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>geotools</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <geotools.version>14.1</geotools.version>
  </properties>

  <repositories>
    <repository>
        <id>maven2-repository.dev.java.net</id>
        <name>Java.net repository</name>
        <url>http://download.java.net/maven/2</url>
    </repository>
    <repository>
        <id>osgeo</id>
        <name>Open Source Geospatial Foundation Repository</name>    <url>http://download.osgeo.org/webdav/geotools/</url>
    </repository>
  </repositories>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.geotools</groupId>
        <artifactId>gt-referencing</artifactId>
        <version>${geotools.version}</version>
    </dependency>
    <dependency>
        <groupId>org.geotools</groupId>
        <artifactId>gt-epsg-wkt</artifactId>
        <version>${geotools.version}</version>
    </dependency>
    <dependency>
        <groupId>org.geotools</groupId>
        <artifactId>gt-api</artifactId>
        <version>${geotools.version}</version>
    </dependency>
    <dependency>
        <groupId>com.vividsolutions</groupId>
        <artifactId>jts</artifactId>
        <version>1.13</version>
    </dependency>
  </dependencies>
</project>

下面开始写程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package cn.tzy.geotools;

import org.geotools.geometry.jts.JTS;
import org.geotools.referencing.CRS;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.opengis.geometry.MismatchedDimensionException;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.MathTransform;
import org.opengis.referencing.operation.TransformException;

import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.Point;

/**
 * Hello world!
 *
 */
public class CoordConverter 
{
    public static double[] convert(double lon, double lat) 
            throws FactoryException, MismatchedDimensionException, TransformException {
        // 传入原始的经纬度坐标
        Coordinate sourceCoord = new Coordinate(lon, lat);
        GeometryFactory geoFactory = new GeometryFactory();
        Point sourcePoint = geoFactory.createPoint(sourceCoord);

        // 这里是以OGC WKT形式定义的是World Mercator投影,网页地图一般使用该投影
        final String strWKTMercator = "PROJCS[\"World_Mercator\","
                + "GEOGCS[\"GCS_WGS_1984\","
                + "DATUM[\"WGS_1984\","
                + "SPHEROID[\"WGS_1984\",6378137,298.257223563]],"
                + "PRIMEM[\"Greenwich\",0],"
                + "UNIT[\"Degree\",0.017453292519943295]],"
                + "PROJECTION[\"Mercator_1SP\"],"
                + "PARAMETER[\"False_Easting\",0],"
                + "PARAMETER[\"False_Northing\",0],"
                + "PARAMETER[\"Central_Meridian\",0],"
                + "PARAMETER[\"latitude_of_origin\",0],"
                + "UNIT[\"Meter\",1]]";
        CoordinateReferenceSystem mercatroCRS = CRS.parseWKT(strWKTMercator);
        // 做投影转换,将WCG84坐标转换成世界墨卡托投影转
        MathTransform transform = CRS.findMathTransform(DefaultGeographicCRS.WGS84, mercatroCRS);
        Point targetPoint = (Point) JTS.transform(sourcePoint, transform);

        // 返回转换以后的X和Y坐标
        double[] targetCoord = {targetPoint.getX(), targetPoint.getY()};
        return targetCoord;
    }

    // 将目标投影坐标系作为参数输入,其实和第一个程序类似,我懒得提取公共部分再抽取函数了
    public static double[] convert(double lon, double lat, String strWKT) 
            throws FactoryException, MismatchedDimensionException, TransformException {
        Coordinate sourceCoord = new Coordinate(lon, lat);
        GeometryFactory geoFactory = new GeometryFactory();
        Point sourcePoint = geoFactory.createPoint(sourceCoord);

        CoordinateReferenceSystem mercatroCRS = CRS.parseWKT(strWKT);
        MathTransform transform = CRS.findMathTransform(DefaultGeographicCRS.WGS84, mercatroCRS);
        Point targetPoint = (Point) JTS.transform(sourcePoint, transform);

        double[] targetCoord = {targetPoint.getX(), targetPoint.getY()};
        return targetCoord;
    }

    // main函数进行验证
    public static void main( String[] args ) throws Exception
    {
        double longitude = 113.926982;
        double latitude = 22.53089;
        double[] coordinate = convert(longitude, latitude);

        System.out.println("X: " + coordinate[0] + ", Y: " + coordinate[1]);
    }
}

程序很简单:CRS.findMathTransform()方法定义转换的坐标系,JTS.transform()进行坐标的转换。

其中第一个方法是我专门写的将WGS84经纬度坐标转成World Mercator投影坐标的函数。第二个函数是对第一个函数的抽象,将要转换到的投影坐标提取出来作为参数,如果想要转换到某种投影坐标系,只需要传递一个该投影坐标系的OGC WKT(Well Known Text)给函数,就可以做转换了。常见投影的WKT表示可以在http://spatialreference.org/进行查询! 看懂了该程序的朋友,就可以写自己的实现了,上面只是一个简单的Hello World示例程序。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015年12月11日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​Python数据类型
序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。
PayneWu
2020/12/18
7380
图解python | 列表
教程地址:http://www.showmeai.tech/tutorials/56
ShowMeAI
2022/02/23
4790
图解python | 列表
[Python] 列表和元组详解
在 Python 中,列表和元组是最常用的序列数据类型,它们用于存储一组数据。虽然它们的用途非常相似,但在一些特性上有明显的区别。本文将面向刚学习 Python 的读者,详细讲解列表和元组的概念、操作方法及其区别,并通过经典示例帮助你更好地掌握这些内容。
DevKevin
2024/10/09
2830
【0基础学Python】基础语法Part3
在函数定义的时候, 可以在 ( ) 中指定 “形式参数” (简称 形参), 然后在调用的时候, 由调用者把 “实际参数” (简称 实参) 传递进去.
Skrrapper
2025/03/15
530
【0基础学Python】基础语法Part3
Python基础数据类型之列表和元组
一、列表   list   列表是python中的基础数据类型之一,其他语言中也有类似于列表的数据类型,比如js中叫数组,他是以[]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型比如: li = [‘alex’,123,Ture,(1,2,3,’wusir’),[1,2,3,’小明’,],{‘name’:’alex’}] 列表相比于字符串,不仅可以储存不同的数据类型,而且可以储存大量数据,32位python的限制是 536870912 个元素,64位python的限制是 115292150460
新人小试
2018/04/12
7250
Python学习笔记_Day05
python l2w.py userdb.py =>生成新文件,已经具有windows的换行符
非著名运维
2022/06/22
3860
Python基础数据类型:列表【增删改查
1 知识大纲 列表的初识 列表的索引切片 列表的增删改查 列表的嵌套 元组的初识(了解) 元组的简单应用(了解) range 2 主要内容 1.列表的初识 why: 字符串: 存储少量的数据。字符串只能存储少量的数据,对于大量的数据用字符串操作不方便也不易存储。 字符串:无论切片还是对其进行任何操作,获取的内容全都是str类型。字符串存储的数据类型太单一,只能是字符串类型。 what:list 容器类数据类型:能承载多种数据类型。它可以存储大量的数据。列表list就属于容器类的数据类型。 列表
py3study
2020/01/16
1.1K0
python序列(二)
####访问list 1.列表是有序的数据集,通过列表名[索引]的方式访问列表中的元素 2.索引编号 3.从左向右依次为0,1,2,3,…,n – 1 4.从右向左一次为-1,-2,-3,…,-n 5.访问元素的索引必须存在,否则报错 6.元素修改 7.通过直接给 列表名[索引] 修改对应索引位置的值 8.修改元素的索引必须存在,否则报错 9.删除 del
py3study
2020/01/14
6710
python_列表_元组_字典
insert(index, object) 在指定位置index前插入元素object
以某
2023/03/07
2.4K0
python_列表_元组_字典
python3 列表、元组操作
alist = [1,2,3,4,5,6,7,8,9] alist [1, 2, 3, 4, 5, 6, 7, 8, 9] alist. #两次TAB键 alist.append( #添加 alist.count(9) #统计单个字符出现的次数 alist.insert( #插入在指定位置插入参数 >>> alist.insert(3,4) >>> alist [1, 2, 3, 4] alist.rev
py3study
2020/01/03
4750
《Python入门03》对于Python列表和元组你了解多少?
上一节中,主要介绍了python的变量和python的基本类型。那么本节将首先介绍序列的基本操作,然后具体python的列表和元组。
ShuYini
2019/08/08
5700
《Python入门03》对于Python列表和元组你了解多少?
python学习笔记2.4-数据结构之列表和元组
本文介绍了Python中列表和元组的基本操作,包括列表的创建、删除、查找和修改,以及元组的创建、修改和删除。同时,还介绍了Python中列表和元组的一些其他方法,包括列表和元组的长度、拼接、重复、排序和反转等。
锦小年
2018/01/02
8160
【Python从入门到精通】(六)Python内置的数据类型-列表(list)和元组(tuple),九浅一深,十个章节,用的到
列表作为Python序列类型中的一种,其也是用于存储多个元素的一块内存空间,这些元素按照一定的顺序排列。其数据结构是:
码农飞哥
2021/08/18
7300
python基本数据类型(二)-python
python基本数据类型 序列类型的自带方法 1.列表的常用方法 2.元祖的常用方法 3.字符串的常用方法 1.列表常用的方法 L.append(obj) #在列表末尾添加新的对象 L.clear() #清空列表 L.copy() #复制列表,不是同一个对象,内容相同,有返回值。id不同(内存中的地址不同) L.count(obj) #统计某个元素在列表中出现的次数 L.extend(obj) #用obj扩展原来的列表 L.in
py3study
2020/01/14
4630
3-序列、列表、元组
序列就是一堆数据元素的集合,并对每个元素进行编号。在Python中,字符串、列表、元组都属于序列,他们都具有一些特定的操作,如索引、切片、相加、相乘、in、长度、最大值和最小值。
用户3106371
2018/09/12
7800
Python复习 一
从上边可以看出,list直接复制和list[:]分片复制的结果一样,但其实暗藏心急哦!
Mirror王宇阳
2020/11/13
1.3K0
Python的基础知识
布尔值也叫做布尔类型,总共有两个值,一个为True(真),一个为False(假),一般被用于逻辑判断
星陨1357
2023/03/14
7050
Python的基础知识
python基础语法——函数、列表、元组和字典
本文基于pycharm编译器,也可以使用Anaconda 里的编译器,将讲解一些python的一些基础语法知识,是对上篇文章的补充,可以和我写的python数据分析——Python语言基础(数据结构基础)结合起来看,有些知识点可能在这篇文章写的不是很全面。
鲜于言悠
2024/03/20
2170
python基础语法——函数、列表、元组和字典
python起步
python是动态语言,不需要预先声明变量的类型,变量的类型和值在赋值的那一刻被初始化
py3study
2020/01/09
4270
Python之路--->list、元组、字典
  接下来我要记录下最近学的list、元组、字典相关的知识点,望各位大神给予指导!
用户5745385
2019/07/03
4750
相关推荐
​Python数据类型
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验