GIS 根据投影坐标点获取投影坐标所属的投影坐标系EPSG

什么是EPSG?

EPSG(The European Petroleum Survey Group,官网 http://www.epsg.org/)维护着空间参照对象的数据集,OGC标准中空间参照系统的SRID(Spatial Reference System Identifier)与EPSG的空间参照系统ID相一致。

EPSG成立于1986年,并已于2005年“重组”为国际石油和天然气生产商协会(The OGP Surveying and Positioning Committee),维护并发布坐标参照系统的数据集参数,以及坐标转换描述。该数据集被广泛接受并使用,通过一个Web发布平台进行分发,同时提供了微软Acess数据库的存储文件,通过SQL 脚本文件,mySQL, Oracle 和PostgreSQL等数据库也可使用。

该组织发布了一个坐标参照系统的数据集,并维护坐标参照系统的数据集参数,以及坐标转换描述,数据集对全球收录到的坐标参照系统进行了编码。


代码实现

首先pom文件中引入相关geotools依赖


        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-main</artifactId>
            <version>24.3</version>
        </dependency>

        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-epsg-hsql</artifactId>
            <version>24.3</version>
        </dependency>

新建CRSUtil工具类,代码如下:



import lombok.extern.slf4j.Slf4j;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.referencing.CRS;

import org.opengis.geometry.Envelope;
import org.opengis.referencing.crs.CoordinateReferenceSystem;


/**
 * @author tarzan
 */
@Slf4j
public class CRSUtil {

	public static void main(String[] args) {
	    String code=getCRS(39559047.43599, 3977293.67339,CRSConstant.CGCS_2000);
		System.out.println(code);

	}

	static 	int[] codes={
			//WGS 84
			3857,
			//CGCS2000
			4512, 4511, 4510, 4509, 4508, 4507, 4506, 4505, 4504, 4503, 4502, 4501, 4500, 4499, 4498, 4497, 4496, 4495, 4494, 4493, 4492, 4491,
			4554, 4553, 4552, 4551, 4550, 4549, 4548, 4547, 4546, 4545, 4544, 4543, 4542, 4541, 4540, 4539, 4538, 4537, 4536, 4535, 4534,
			4533, 4532, 4531, 4530, 4529, 4528, 4527, 4526, 4525, 4524, 4523, 4522, 4521, 4520, 4519, 4518, 4517, 4516, 4515, 4514, 4513,
			//Beijing 1954
			21463, 21462, 21461, 21460, 21459, 21458, 21457, 21456, 21455, 21454, 21453,
			21423, 21422, 21421, 21420, 21419, 21418, 21417, 21416, 21415, 21414, 21413,
			2442, 2441, 2440, 2439, 2438, 2437, 2436, 2435, 2434, 2433, 2432, 2431, 2430, 2429, 2428, 2427, 2426, 2425, 2424, 2423, 2422,
			2421, 2420, 2419, 2418, 2417, 2416, 2415, 2414, 2413, 2412, 2411, 2410, 2409, 2408, 2407, 2406, 2405, 2404, 2403, 2402, 2401,
			//New Beijing  
			4589, 4588, 4587, 4586, 4585, 4584, 4583, 4582, 4581, 4580, 4579,
			4578, 4577, 4576, 4575, 4574, 4573, 4572, 4571, 4570, 4569, 4568,
			4822, 4812, 4800, 4799, 4798, 4797, 4796, 4795, 4794, 4793, 4792, 4791, 4790, 4789, 4788, 4787, 4786, 4785, 4784, 4783, 4782,
			4781, 4780, 4779, 4778, 4777, 4776, 4775, 4774, 4773, 4772, 4771, 4770, 4769, 4768, 4767, 4766, 4756, 4755, 4754, 4753, 4753,
			//Xian 80
			2348, 2347, 2346, 2345, 2344, 2343, 2342, 2341, 2340, 2339, 2338,
			2337, 2336, 2335, 2334, 2333, 2332, 2331, 2330, 2329, 2328, 2327,
			2390, 2389, 2388, 2387, 2386, 2385, 2384, 2383, 2382, 2381, 2380, 2379, 2378, 2377, 2376, 2375, 2374, 2373, 2372, 2371, 2370,
			2369, 2368, 2367, 2366, 2365, 2364, 2363, 2362, 2361, 2360, 2359, 2358, 2357, 2356, 2355, 2354, 2353, 2352, 2351, 2350, 2349,
	};


	/**
	 * 方法描述: 获取投影坐标系
	 *
	 */
	public static String getCRS(double x, double y,String crsName) {
		for (int code : codes) {
			try {
				String epsgCode="EPSG:"+code;
				CoordinateReferenceSystem crs = CRS.decode(epsgCode);
				Envelope envelope=CRS.getEnvelope(crs);
				ReferencedEnvelope projectedBounds = new ReferencedEnvelope(envelope.getMinimum(1),envelope.getMaximum(1),envelope.getMinimum(0),envelope.getMaximum(0),crs);
				if(projectedBounds.contains(x,y)){
					String nameCode=crs.getName().getCode();
					if(nameCode.startsWith(crsName)){
						return epsgCode;
					}
				}
			}catch (Exception e){
				log.error(e.getMessage());
			}
		}
		return null;
	}






}

idea等编辑器里运行主方法测试,输出如下:

	public static void main(String[] args) {
	    String code=getCRS(39559047.43599, 3977293.67339,CRSConstant.CGCS_2000);
		System.out.println(code);
	}

替换你的投影坐标的下x和y,指定地理坐标系。 

中间尝试过,根据投影坐标直接获取地理坐标系,通过百度和AI对话,发现只有投影坐标,即使是多个,也无法获取到地理坐标。

最近又发现一个问题 就是gt-epsg-hsql 包里读取北京54坐标的转换参数,和地理范围包围坐标和epsg官网的对应不上,北京54,读取出来的信息和新北京坐标的投影参数一模型。中间试着向更新hsql数据库,但是发现操作麻烦外,去官网下载epsg下载数据集也是个问题,国外的网站非常慢,邮箱注册不成功。最后放弃了,暂时打算把设计北京54坐标判断的和转换坐标的。用wtk或者proj4j字符串,替换。

附加部分代码示例:

 geotools使用

	public static void main(String[] args) throws FactoryException {
		String wkt = "PROJCS[\"Beijing 1954 / 3-degree Gauss-Kruger zone 25\",GEOGCS[\"Beijing 1954\",DATUM[\"Beijing_1954\",SPHEROID[\"Krassowsky 1940\",6378245,298.3],TOWGS84[12.646,-155.176,-80.863,0,0,0,0]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4214\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",75],PARAMETER[\"scale_factor\",1],PARAMETER[\"false_easting\",25500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AUTHORITY[\"EPSG\",\"2401\"]]";
		CoordinateReferenceSystem crs = CRS.parseWKT(wkt);
		System.out.println(crs.toWKT());
	}

 proj4j包使用

pom文件引入依赖:

        <dependency>
            <groupId>org.locationtech.jts</groupId>
            <artifactId>jts-core</artifactId>
            <version>1.17.1</version>
        </dependency>

        <dependency>
            <groupId>org.locationtech.proj4j</groupId>
            <artifactId>proj4j</artifactId>
            <version>1.2.3</version>
        </dependency>

代码示例


import org.locationtech.proj4j.*;

public class Proj4jTest {

		public static void main(String[] args) {
			CRSFactory crsFactory = new CRSFactory();
			//源坐标系统
			//根据投影字符串参数获取坐标系统
			String SourceCRS= "2442";
			String SourceCRS_params="+proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=12.646,-155.176,-80.863,0,0,0,0 +units=m +no_defs";
			CoordinateReferenceSystem source = crsFactory.createFromParameters(SourceCRS, SourceCRS_params);
			//目标坐标系统
			//根据投影字符串参数获取坐标系统
			String TargetCRS= "4326";
			String TargetCRS_params="+proj=longlat +datum=WGS84 +no_defs";
			CoordinateReferenceSystem  target = crsFactory.createFromParameters(TargetCRS, TargetCRS_params);


			//定义转换类
			CoordinateTransformFactory ctf = new CoordinateTransformFactory();
			CoordinateTransform transform = ctf.createTransform(source,target);

			//坐标系转换
			ProjCoordinate projCoordinate = new ProjCoordinate(-2088963.21,4174250.75);
			transform.transform(projCoordinate, projCoordinate);
			System.out.println("转换后x:"+projCoordinate.x);
			System.out.println("转换后y:"+projCoordinate.y);
		}

}

相关文章

常用的地理和投影坐标系的WKID 

用epsg官方数据的gis工具站,国内比官网访问快​​​​​​​

《geotools官网》

《epsg官网》

猜你喜欢

转载自blog.csdn.net/weixin_40986713/article/details/130605308