Highlights支持3种常见地理坐标(WGS84、GCJ02、BD09)互转;

不依赖GIS软件,工具本身即可独立运行;

共6个单独程序对应6种转换情况,可按需选择;

直接将完整的shp文件拖动到程序上进行转换;

按惯例开头先放链接,文中涉及的数据出处见末尾。

https://pan.baidu.com/s/194dVP4Y2LCP_QbFrwRVYWQ(提取码:asve)

嗨~多磨,好久(指公众号那边,B站还在开荒阶段)没什么拿得出手的成果,好烦躁啊,最近处理空间数据的时候碰到一些坐标转换的小麻烦,搞定之后顺手把解决方案写成工具,自觉还算好用就发出来吧。

目录:【起因】-【解决过程】-【成果】-【操作演示】-【后记】-【数据出处】

【起因】图1 WGS84坐标数据叠加底图存在偏差

在地理空间数据云使用高级检索时发现上传的WGS84坐标数据和底图存在偏差(图1河流部分的区划界线偏移比较明显),由于底图是高德地图提供的,所以其坐标应该是GCJ02。这个显然是地理空间数据云偷懒了啊,没有把上传的数据转换到正确的坐标上就直接叠加显示了,好吧,那我就自己转吧。

【解决过程】(相当于工作记录,可以不看)

使用Python 3.8.3官方安装包作为基础环境,打开cmd命令行,用pip install pyshp安装shapefile模块(版本2.1.0),坐标转换模块coordTransform_py来自GitHub(https://github.com/wandergis/coordTransform_py),以前下载的时候还是py2版本,自己手动改成了适合py3语法的代码,现在源网页上已经更新到py3了。

最初的思路是分别读取shp文件中的几何(geometry)和属性(record),几何部分将每个折点的坐标转换完毕再写入新的shp文件里,属性部分则照原样输出。实际操作发现,属性部分的写入命令不太好用,不方便写成按字段数量自动处理的形式(也可能是我对python理解还不到位,自学的确实不够系统啊,有时候都不知道自己该补什么),只好作罢。一怒之下决定采用更暴力更简洁的办法——直接复制源shp文件的dbf文件。

几何部分的麻烦更多,pyshp支持的shp要素类型除了基本的Point、Polyline、Polygon、Multipoint之外(4种),还有带有Z值(4种)、M值(4种)的情况,再加上MultiPatch共计13种。这里遇到的问题有二:其一是要保证输出shp要素类型与源shp一致(这个好办),麻烦出在不同类型的要素对应的写入命令不同,比如line命令只能写入Polyline,用linez才能写入Polylinez,同理还有linem,每种类型都适配的话,代码里需增加要不少if判断。根据以往的经验,规划圈子里常用的空间数据基本都是Point、Polyline、Polygon三种基本类型,最终决定这里偷个懒,1.0版就只做这三种的适配吧。

其二是要保证输出Polygon时可以正确处理带有孔洞的面要素,pyshp官方文档中说外轮廓的折点要按顺时针排列,内部孔洞的折点要按逆时针排列,测试发现其实只要内外顺序不同就行了,外部逆时针、内部顺时针也可以顺利写入。不过最后其实没有用到这个知识,其实只要在读取几何时将源要素的parts一模一样地写入新shp就行了,为了保证parts结构不变倒是花了点儿心思。

剩下的就是改善操作体验方面的问题了,输入方式决定采用拖动文件到程序上的形式,第一次接触工具的同学可能不太适应(正常人肯定是先双击运行程序嘛),但这个办法比较容易编写,直接用sys.argv即可。工具会对拖动进来的文件自动识别后缀名,即使拖拽了不必要的文件也不影响工具执行。输入输出为相同路径,防止找不到输出结果(很多初学GIS的同学使用工具从来不看输出路径)。对输出shp文件名增加输出坐标的后缀与源shp进行区分。输出采用覆盖方式,如果对同一个文件多次转换,比如D:\PG.shp,输出为D:\PG_WGS84.shp,只会保留最后一个PG_WGS84.shp,好处是减少了确认操作,对于初学者不太友好,刚接触工具的话需要谨慎操作。3种坐标共6种转换关系,我估计常用的也就其中1-2种,与其都整合起来再要求用户输入命令,还不如全都分开打包了(写各种判断好麻烦呀)。

【成果】图2 工具运行界面

软件运行起来是这个样子(图2),没什么需要特别说明的呢。图3 经过转换的数据可以正确叠加

经过处理的数据再上传到地理空间数据云就可以和底图正确对齐了(图3)。

【操作演示】图4 拖动文件到主程序上即可

将待转换的文件直接拖动到主程序上,等待提示文字出现,看一下是否检测到输入的文件,按回车即可开始转换(图4),转换后再按回车关闭窗口(直接点击右上角关闭窗口也可以)。如果通过双击运行程序,则可以按回车查看常见问题,这里也提前列出方便查阅。

Q.1:输入了shp但没有输出结果?

A.1:可能是源shp坐标不属于地理坐标系,请输入基于地理坐标的shp文件,也可能是源shp类型不受支持,本工具仅能转换Point、Polyline、Polygon。

Q.2:拖进来的shp含有8个文件,输出的shp为何只有5个文件?

A.2:本工具只处理shp中的geometry(几何对象),不处理record(属性条目)。输出结果会从源shp复制dbf、cpg、prj三个文件,加上shp和shx合计5个文件。dbf为源shp的属性表,cpg为源shp属性表的字符编码,prj为源shp的坐标属性,其余sbn、sbx、xml一般是ArcGIS操作过程中生成的文件,故此忽略。

Q.3:拖进来的shp含有3个文件,输出的shp为何却有4个文件?

A.3:除基本的3个文件外,默认必定会输出prj文件,以方便常见的各类GIS软件读取数据,也方便直接用于上传(如高级检索中的矢量文件功能)。由于BD09、GCJ02都是基于WGS84加偏的地理坐标,补充输出的prj将采用WGS84坐标。如果源shp已有prj文件,则优先采用源shp的prj文件所定义的坐标系

Q.4:输入文件按回车开始转换后,软件闪退?

A.4:本工具只有少量try/except用于处理异常情况,闪退说明所遇问题超出了设计框架。请检查源shp所在目录,尝试移至不含空格、不含中文、不含特殊字符的路径下再试,或使用GIS软件将源shp另存一份再试(墨菲定律)

Q.5:把数据从WGS84转到GCJ02,再从GCJ02转回WGS84,为什么与源shp不重合?

A.5:坐标转换算法是从GitHub上借鉴来的,我本身并未深入了解纠偏算法,爱莫能助。这里只能建议不要多次在不同坐标之间互相、来回转换,以避免不必要的偏差。本工具已经提供了3种坐标之间6种可能的转换情况,请尽量选用最恰当的转换方式。

Q.6:使用本工具需要注册账号、付费、或者联网么?

A.6:本工具无需注册账号,完全免费,不涉及任何网络访问。原本就是因为我遇到过又要注册、又要付费、还得联网的工具,实在感到使用不便所以才编写了本工具(正道的光)

Q.7:工具可以二次发布么?

A.7:本工具可以随便转载,甚至不注明出处也没关系,但希望转载时尽量不要设置门槛,包括但不限于要求读者转发、集赞、付费、回复等,请不要让获取工具变得太复杂。

Q.8:我的问题不在上述情况之中,怎样可以获得技术支持呢?

A.8:本工具仅为研究过程的副产物,包括以往发布的地图截获器都只有我一人维护开发,精力所限暂时不保证提供及时可靠的技术支持。如果确实有需要,可以到我的B站空间发私信,有可能得到回复(薛定谔的回复)

【后记】

互联网乍一看好像什么都有,真要找点儿好用的反而不怎么方便呢。之前转换坐标临时找了个工具,网页上根本没有任何需要付费的说明,但下载安装后又要求注册、又要求付费、软件还得联网。说实话不只是用起来不方便,而且不放心,偶尔处理一些暂时不能公开的数据,万一被转换工具泄露了就不好交代了,自己动手丰衣足食吧。

话说现在各平台的信息壁垒越来越高,移动端贴吧的帖子看不全、知乎的回答展不开,朋友圈一堆转发集赞的,Web端网易云音乐限制播放列表长度。要么得装APP、装程序,要么得注册、得登录,如果内容质量过硬我也认了,实际上……唉,本来是利用互联网的便捷性实现快速浏览信息、高效获取知识,结果现在找点儿什么都碰壁,真的累。

【数据出处】

行政边界数据出自【1:100万全国基础地理数据库(2017)】,该数据原始出处为http://www.webmap.cn/commres.do?method=dataDownload,数据是分幅的,需要自行拼接。文中使用的数据是由“GIS大师兄”公众号整理发布的版本,是完成了拼接的GeoDatabase,有需要的同学请自行搜索吧~

shp文件中polyline是什么_SHP文件坐标转换工具1.0版相关推荐

  1. shp文件中polyline是什么_shp文件的读取

    首先了解一下shp文件的一些简单知识 Shapefile文件是美国环境系统研究所(ESRI)所研制的GIS文件系统格式文件,是工业标准的矢量数据文件. Shapefile将空间特征表中的非拓扑几何对象 ...

  2. assert文件夹 设置android_android使用build.xml配置assert文件中不压缩的类型文件

    问题: 在做文本文件读取时,从assert文件中获取文件 getResources().getAssets().openFd("test.txt").getFileDescript ...

  3. cmd执行bat结果不回显_cmd - 如何在bat文件中调用另一个bat文件

    情景一:两个bat文件在同一个目录下 有时候我们需要在一个bat文件中调用另一个bat文件,比如我们想在a.bat中调用b.bat,如下. a.bat @echo off echo I am a.ba ...

  4. C++ 在一个cpp文件中使用另一个cpp文件中定义的函数

    C++ 在一个cpp文件中 使用另一个cpp文件中定义的函数 建立一个console项目 头文件 cpp文件 main.cpp 建立一个console项目 以dev为例,在[文件][新建][项目],新 ...

  5. 图片在xml文件中直接加载.9文件

    图片在xml文件中直接加载.9文件,可能会因为图片压缩的缘故产生锯齿,如果使用 ImageView imageview = (ImageView) view .findViewById(R.id.in ...

  6. windows 查找目录下文件中包含某个字符的文件

    一.可以使用windows自带的findstr来实现. 例子(1) findstr /s /i "string" . 上面的命令表示,当前目录以及当前目录的所有子目录下的所有文件中 ...

  7. 转:intellij idea如何右键新建文件中添加jsp格式的文件【初学者适用】

    转载:https://blog.csdn.net/weixin_43970743/article/details/84983066 版权声明:如果对您有所帮助,那就随手分享帮助更多人吧! https: ...

  8. cmd 如何在bat文件中调用另一个bat文件

    微信搜索:"二十同学" 公众号,欢迎关注一条不一样的成长之路 情景一:两个bat文件在同一个目录下 有时候我们需要在一个bat文件中调用另一个bat文件,比如我们想在a.bat中调 ...

  9. python 在一个py文件中调用另一个py文件中的变量以及一个有趣的问题

    python 在一个py文件中调用另一个py文件中的变量以及一个有趣的问题 1.在一个py文件中调用另一个py文件中的变量 新建一个py文件,记为t1.py # t1.py m = 2 n = 1 a ...

  10. html表格打印成pdf格式文件,使用html2pdf打印PDF格式文件中的数据作为PDF文件

    我想从表单文章中获取一些数据并将其输出到PDF2文件中,并在同一页面上使用html2pdf.但是,当试图将表单数据发布到同一页面时,它不会打开PDF文件,这可能是因为PHP文件的其余部分将出现在if( ...

最新文章

  1. 开课吧python好吗-如何选择python培训机构?开课吧python培训怎么样?
  2. python中的self描述符__set__和__get__简单总结
  3. Spring Boot配置文件有提示
  4. Bazel构建工具的安装
  5. 编程关键词介绍...
  6. 从入门到入土:Python爬虫学习|Selenium自动化模块学习|简单入门|轻松上手|自动操作浏览器进行处理|chrome|PART01
  7. 走美团特色的无人配送道路,王慧文:久久为功才能做成
  8. C语言中register类型变量
  9. oracle数据库双机热备原理,oracle数据库双机热备方案
  10. 智慧职教云答案在哪里找_智慧职教经济数学答案,智慧职教云答案在哪里找,智慧职教云答案去哪找...
  11. Unity-UI-实现文本框内容自动滚动
  12. 弘辽科技:直通车测款的必备技巧
  13. PDF 文件格式 基本结构
  14. 还在用git commit -m 吗?Git 提交规范和自动产生changelog手摸手教程。
  15. 在搜索框里添加放大镜的图标,且显示提示信息
  16. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之原型模式
  17. 国四网络工程笔记(究极错题)
  18. 找到一个不错的学习python的网站
  19. 顺口溜记23种设计模式
  20. python ddt mysql_40- 数据驱动(ddt)

热门文章

  1. java面试之反射机制
  2. M1 Repast Simphony打不开 无反应问题解决
  3. 与Snapchat死磕, Facebook推出AR滤镜应用
  4. vb adodc连接mysql_VB中用ADODC控件连接ACCESS数据库
  5. iPhone 11 820-01523 N104手机电路原理图+位号图
  6. Intel/Altera 系列FPGA简介
  7. HeadFirstJava 4,5,6
  8. 数据库设计(有实例)
  9. Linux:下载和安装
  10. CSND默认markdown样式