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

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. Ajax.BeginForm 在 Chrome下的问题

    项目背景:MVC4 代码: @using (Ajax.BeginForm("Index", "GoingMeter", new AjaxOptions { On ...

  2. LinkedHashMap+Spring Aop实现简易的缓存系统

    之前介绍说要做在线文库的系统,当数据量大的时候,根据标签tag的对文档信息的查询将是一个很耗时的工作,原来分析LinkedHashMap源码的时候了解到它有一个双向链表的结构,可以通过将刚被访问的元素 ...

  3. Ubuntu18.04安装RTX2080Ti+NVIDIA驱动+CUDA

    Ubuntu18.04安装RTX 2080Ti 与 Cuda10 ==========血泪更新========= 如果可以使用ppa安装最方便了 具体参考:https://www.cnblogs.co ...

  4. C++: string copy-on-write

    https://blog.csdn.net/haoel/article/details/24058 https://www.cnblogs.com/promise6522/archive/2012/0 ...

  5. H5点击拨打电话,发短信

    phone(){ window.location.href = 'tel:123123'// 拨打电话 window.location.href = 'sms:123123'// 发短信 }

  6. Java 基础 - Exception和Error

    综述 Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基 ...

  7. Java 基础 - java序列化 & serialVersionUID

    ref: https://www.cnblogs.com/duanxz/p/3511695.html ------------------- SerialVersionUID概述 SerialVers ...

  8. 【JZOJ4905】【BZOJ4720】【luoguP1850】换教室

    description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节课程安排在n个时间段上.在第i(1≤i≤n)个时间段上,两节内容相同的课 ...

  9. [kuangbin带你飞]专题一 简单搜索 - A - 棋盘问题

    #include<iostream> #include<cstdio> #include<string> #include<vector> #inclu ...

  10. POJ 1696 /// 凸包

    题目大意: 不能向左拐 不能重复走 就是求一个螺旋凸包 把已经是凸包内的点标记一下就行 因为凸包的性质 所有点都能走到 注意起点的选择 还有 反复求凸包的过程中边界的改变 #include <c ...