这里先给大家介绍几个坐标系:

1.WGS84:国际坐标系,为一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系。
2.GCJ02:火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系。

工作中有时需要将shape数据转换成高德坐标数据,由于目前数据大部分都是WGS84国际坐标系,因此需要通过使用高德地图提供的API将84坐标转换成GCJ02即火星坐标系。

第一步:准备数据

方法1:

从shape图上随机提取一些点,根据shape图形大小提取,如果图形较大,建议多提取一些。一般在拐点和图形的四周均匀选择。

点提取完成后获取坐标点的经纬度值。可以使用Arcgis的计算工具获取x,y值。画红框的地方需要注意,要选择十进制表示的经纬度。

坐标提取完成后新建一个excel表,将x,y值分别复制黏贴在excel表中的前两列。

方法2:

将shape数据存入postgresql,并使用postgis提供的函数随机从shape上提取点,并取出其x,y值。此方法是随机选择,因此选择的点未必均匀分布在图形四周和拐点处。

 SELECT ST_X(geom), ST_Y(geom) from(
SELECT
(ST_Dump (ST_GeneratePoints (nanjing.geom, 20))).geom AS geom,
md5((random()*random())::text) as id,
random()*1000 as val
FROM nanjing where name = '浦口区')
k1

第二步:执行下面的python代码调取高德API进行坐标转换

 import xlrd
from xlutils.copy import copy
from urllib import request
import json class ToGd():
def __init__(self, key, coordsys='gps', output='JSON'):
self.key = key # 高德应用的key
self.coordsys = coordsys # 原坐标系,默认选择gps,此处实际对应4326的坐标系
self.output = output # 设置高德api数据返回类型,可选JSON和xml
self.file_path = input('请输入你的文件路径') # 获取文件路径,即上面新建的excel文件名称 def split_li(self, locations_li):
# 拆分坐标列表
li = list()
for location in locations_li:
location_li = location.split(',')
# print(location_li)
li.append(location_li)
# print(li)
return li def locations(self):
# 读取文件中的数据并返回locations字符串及原坐标列表
f = xlrd.open_workbook(self.file_path)
index = f.sheet_names()[0]
sheet = f.sheet_by_name(index)
nrows = sheet.nrows
data_str = ''
old_locations_li = list()
for i in range(nrows):
if i == (nrows - 1):
data_li = str(sheet.row_values(i)[0]) + ',' + str(sheet.row_values(i)[1])
else:
data_li = str(sheet.row_values(i)[0]) + ',' + str(sheet.row_values(i)[1]) + '|'
data_str += data_li
old_locations_li.append(sheet.row_values(i))
return data_str, old_locations_li def make_response(self, locations):
# 构造请求url,并获取响应数据,返回拆分后的坐标列表
url = 'https://restapi.amap.com/v3/assistant/coordinate/convert?locations=%s&coordsys=%s&output=%s&key=%s' % \
(locations, self.coordsys, self.output, self.key)
# 返回值为json
resp_json = request.urlopen(url)
# json转换成字典
resp_dict = json.loads(resp_json.read().decode())
# 提取转换为高德坐标后的坐标
locations_str = resp_dict.get('locations')
# 字符串分割
locations_li = locations_str.split(';')
new_locations_li = self.split_li(locations_li)
return new_locations_li def save(self, old_locations_li, new_locations_li):
# 保存成excel或txt文件
# new_file = copy(f)
# new_sheet = new_file.get_sheet(0)
# for m in range(len(locations_li)):
# for n in range(len(locations_li[m])):
# new_sheet.write(m, n + 2, locations_li[m][n])
# file_path = self.file_path + '2'
# new_file.save(file_path)
file_path = 'result.txt'
with open(file_path, 'w', encoding='utf-8')as f:
for m in range(len(new_locations_li)):
# for n in range(len(new_locations_li[m])):
f.write(str(old_locations_li[m][0]))
f.write(' ')
f.write(str(old_locations_li[m][1]))
f.write(' ')
f.write(str(new_locations_li[m][0]))
f.write(' ')
f.write(str(new_locations_li[m][1]))
f.write('\n') def run(self):
data_str, old_locations_li = self.locations()
new_locations_li = self.make_response(data_str)
self.save(old_locations_li, new_locations_li) if __name__ == '__main__':
test = ToGd('154c586add07ef456b90b079935f47a4') # 输入高德应用的key,实例化对象
test.run()

这段代码的主要作用是调用高德地图的API将84坐标转换成对应的高德坐标,并按相应格式输出成txt文件。

上面的代码是用python写的,执行的话需要安装python环境,另外还需要申请高德应用的key,相关申请方法可查看https://lbs.amap.com/dev/key

代码执行完成后会在本地生成一个result.txt的文件,下面需要用这个文件做空间校正。

第三步:空间校正

在Arcgis中对需要做坐标转换的数据开启编辑功能,打开空间校正工具栏,输入连接文件。连接文件即第二步得出的result.txt文件。

可以点击View Link Table查看误差值,如果误差值太大,需要重新做连接文件。

选择需要校正的数据。

点击校正。

校正完成后即可得到与高德地图匹配的shape数据。

上述方法只能用于小范围测试使用,未做精度评估。如需大规模商业化使用,还需再想别的方法。

坐标转换,EPSG:4326转换成高德坐标教程的更多相关文章

  1. 编写Python脚本把sqlAlchemy对象转换成dict的教程

    编写Python脚本把sqlAlchemy对象转换成dict的教程 在用sqlAlchemy写web应用的时候,经常会用json进行通信,跟json最接近的对象就是dict,有时候操作dict也会比操 ...

  2. vue 实现高德坐标转GPS坐标

    vue 实现高德坐标转GPS坐标 首先介绍一下常见的几种地图的坐标类型: WGS-84:这是一个国际标准,也就是GPS坐标(Google Earth.或者GPS模块采集的都是这个类型). GCJ-02 ...

  3. ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100)

    原文:ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100) 对于非地理专业的开发人员,对与这些生涩的概念,我们不一定都要了解,但是我们要理解,凡是 ...

  4. 转:ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100)

    对于非地理专业的开发人员,对与这些生涩的概念,我们不一定都要了解,但是我们要理解,凡是以经纬度为单位的都是地理坐标系,因为它归根结底是一个椭球体,只不过各个国家为了反映该国家所在区域地球的真实形状,而 ...

  5. PaintCode 教程:矢量图轻松转换成CoreGraphics代码

    本文译自Ranwenderlich的这篇:http://www.raywenderlich.com/100281/paintcode-for-designers-getting-started Pai ...

  6. 爬虫:把廖雪峰的教程转换成 PDF 电子书

    写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用的 library 分分钟就可以写出一个爬虫出来,今天就琢磨着写一个爬虫,将廖雪峰的 ...

  7. Python 爬虫:把廖雪峰教程转换成 PDF 电子书

    写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用的 library 分分钟就可以写出一个爬虫出来,今天尝试写一个爬虫,将廖雪峰老师的 ...

  8. 微信原始坐标转换成百度坐标 lat lng

    如有帮到你记得结合我这篇博客里的方法.... http://www.cnblogs.com/zc290987034/p/8294988.html {:wx_jssdk_config("fal ...

  9. Java-Runoob-高级教程-实例-时间处理:04. Java 实例 - 时间戳转换成时间

    ylbtech-Java-Runoob-高级教程-实例-时间处理:04. Java 实例 - 时间戳转换成时间 1.返回顶部 1. Java 实例 - 时间戳转换成时间  Java 实例 以下实例演示 ...

随机推荐

  1. 将sparkStreaming的结果保存到S3

    将spark解析的结果保存到S3 这个和保存到本地的区别在于,你需要配置aws的key和密码,以及它的region,代码如下 package com.alo7.spark import java.ut ...

  2. 2019-7-27-解决从旧格式的-csproj-迁移到新格式的-csproj-格式-AssemblyInfo-文件值重复问题...

    title author date CreateTime categories 解决从旧格式的 csproj 迁移到新格式的 csproj 格式 AssemblyInfo 文件值重复问题 lindex ...

  3. split的用法

    split用法返回的是数组 使用split('')根据空格返回数组 使用split()返回一个完整的数组 使用split("",3)返回前三项,是单个的字母 不过要注意: 使用sp ...

  4. mysql 数据库 内容的增删改查

    /*所有字段插入值*//*注意插入值数目要与字段值一致*/INSERT INTO student VALUES(1,'熊大','123','2019-10-18',1200);INSERT INTO ...

  5. kaptcha 实现验证码

    依赖 <dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha< ...

  6. JavaScript工作原理

    HTML代码所表示的文档是一种静态文档,几乎没有交互功能,很难使页面成为动态页面.增加脚本语言,可使数据发送到服务器之前先进行处理和校验,动态地创建新的Web内容,更重要的是,引入脚本语言使我们有了事 ...

  7. Flink on YARN(下):常见问题与排查思路

    Flink 支持 Standalone 独立部署和 YARN.Kubernetes.Mesos 等集群部署模式,其中 YARN 集群部署模式在国内的应用越来越广泛.Flink 社区将推出 Flink ...

  8. vue知识点汇总

    一.学习vue必须了解的几个知识点  1.node.js介绍 node是一个让JavaScript运行在服务端的开发平台,使用JavaScript也可以开发后台服务.说明白些它仅仅是一个平台,我们使用 ...

  9. LUOGU P3048 [USACO12FEB]牛的IDCow IDs(组合数)

    传送门 解题思路 组合数学.首先肯定是要先枚举位数,假如枚举到第\(i\)位.我们可以把第一位固定,然后那么后面的随意放\(1\),个数就为\(C_{i-1}^{k-1}\).然后每次枚举时如果方案\ ...

  10. Linux课程---12、linux中内存指令(top命令的作用是什么)

    Linux课程---12.linux中内存指令(top命令的作用是什么) 一.总结 一句话总结: top实时观察进程.内存和CPU情况 1.电脑出现反应慢情况,最先想到的是什么? 内存 2.linux ...