网友投稿 | 设为首页 | 加入收藏
1/4页1234 跳转到查看:18153
回复该主题 发新话题
键盘左右键可以进行前后翻页操作
帮助

Garmin mp文件到kml文件转换工具: pymp2kml V1.0.2(2009.1.6更新)

Garmin mp文件到kml文件转换工具: pymp2kml V1.0.2(2009.1.6更新)

【一】pymp2kml是什么?
pymp2kml是一个将mp文件(又称为Polish文件,一般用于编译Garmin地图)转换为Google Earth
kml/kmz地标文件的工具。这样就可以将mp文件内的点、线、面资料搬到GE上,叠加卫图显示,或
抓屏制作带丰富地标的OZI地图。

【二】版本历史
pymp2kml V1.0.0参考了Jose Olcese用Perl语言编写的类似工具:mp2kml V0.9,在此表示强烈感谢。
也感谢liyang588在国内首发介绍了mp2kml V0.9。
Jose Olcese写的mp2kml V0.9在:http://jolcese.googlepages.com/home2

根据mp2kml V0.9的不足,笔者进行了修改,增强功能,修改不规范之处,先后发布了mp2kml V0.9a、
V0.9b、V0.9c,均为Perl命令行程序。
mp2kml V0.9c见:http://bbs.godeyes.cn/showtopic-352429.aspx

Perl的命令行程序较难使用,而且Perl的安装包不带图形库,需用户自己下载。因此在升级mp2kml过
程中转为Python语言编写,称为pymp2kml。

从mp2kml V0.9c到pymp2kml V1.0.0不仅改变了语言运行环境,功能也有很大提升,为避免帖子上下楼不
一致而导致的混乱,开新贴发布。

V1.0.0  2008.12.25
    pymp2kml初始版本

V1.0.1  2008.12.30 
    解决与Python2.6.1的兼容性
    在选择行政区划筛选时,排除因mp中相邻市县Type=0x1/0x3的Polygon轻微交叠导致的误转换
    信息显示窗口自动滚屏

V1.0.2  2009.1.6
    解决临时文件路径中含中文导致的问题
    解决mp文件中Copyright属性含扩展ASCII码导致的问题
    修正经纬度限定的bug
    附带的可DIY图标从100个增加到576个


【三】pymp2kml V1.0.0的特点
◆ 可一次转换多个mp文件及多个目录下的所有mp文件(不递归子目录)
◆ 每个mp文件对应kml文件内的一个Folder,也可将多个mp文件混合
◆ 每一类mp对象有一个Folder
◆ kml自动为UTF-8编码,避免乱码
◆ kml内的document名可为mp Map名、mp基本文件名、指定名,可选附加当前时间
◆ 可选输出为kml,kmz或zip文件

◆ Python编写,源码开放,程序本身可DIY
◆ GUI主界面及选项界面,但点、线、面的.csv样式文件需要用Excel或文本编辑器修改
◆ 点、线、面的.csv样式文件所在目录可指定

◆ 可选各种mp对象(点、线、面)分别有最高、最低显示高度值,可分层显示,避免在GE内糊在一起的
  现象,并提高了GE的显示速度
◆ 为各种mp对象(点、线、面)设置GE首次调入时是否默认显示选项
◆ 自动忽略mp文件中Level0之外的次要层次
◆ 行政区划筛选(可以轻松从一至多个mp中筛选出一至多个县、市)
◆ 经纬度筛选(矩形框)
◆ POI、道路、多边形的类型/名称筛选(使用功能强大的正则表达式!只要不是太变态的筛选要求,大都能满足)
◆ 各类POI可有不同的正常图标及可选的高亮图标。可分别设置其:图标图形、图标混合颜色、图标角度、
  图标缩放比例

◆ POI名称可有正常名称及高亮名称两种样式。可分别设置其:文字大小、文字颜色
◆ 正常图标及高亮图标可分别选择显示或不显示
◆ POI正常名称及高亮名称可分别选则显示或不显示
◆ 中国大陆固话长途区号分离
◆ 生成kmz/zip时可自动打包进所引用的本地磁盘图标文件

◆ 道路等线状目标可选双线化,也就是先用较粗的线条A画一次,再用较细的另一种颜色的线条B在同一位
  置画一次,从而为马路镶嵌上马路牙子
◆ 线条A、B的宽度及颜色分别设定
◆ 路名可选是否显示,文字大小及颜色可设定
◆ 可选只转换路名,而不转换道路本身
◆ 道路名显示拥挤控制,算法强度可控

◆ 面状目标的三个部分可分别选择是否转换:填充体、 边缘线、名称
◆ 可分别设定:填充色,边缘线宽度及颜色,名称的字体大小及颜色
◆ 正确处理带空洞的面状目标

pymp2kml使用临时文件进行转换,占内存不大,因此对mp/kml的文件大小无限制,但太大的kml文件无法
在GE中打开或显示迟钝。

尽管pymp2kml可以转如云南全景全部点线面对象的kml,其实转全国的也没问题,但除了少数几个小省,大
点的GE无法打开。当然可以通过选项或配置三个.csv文件或预处理mp文件的方法,有选择性地转换一部分
对象,比如只转换水库+江河湖泊,这样生成的kml文件就小多了。

下载 pymp2kml V1.0.2

附件: pymp2kml102.rar (2009/1/6 19:31:19, 2218.10 K)
该附件被下载次数 1762



内含程序,三个csv文件,用于测试演示特殊效果的的mp文件一个,576个用于DIY的Icon。程序运行后又进行
了选项改变的话,会在本目录生成选项配置文件pymp2kml.ini。删除pymp2kml.ini将恢复默认选项。
本帖被评分 1 次
最后编辑ace919 最后编辑于 2009-01-06 19:31:19

TOP

 

使用方法

先安装Python环境,在此下载最新版本:http://www.python.org/download/
目前版本是: Python 2.6.1 Windows installer (Windows binary -- does not include source)
下来的是一个.msi安装文件,双击安装,按缺省安装即可。
安装完Python后,双击pymp2kml.pyw即可运行pymp2kml。

主界面:


MP选项:


KML选项:

视Python的版本不同,KML选项也可能显示成:


线选项:


POI筛选:
最后编辑ace919 最后编辑于 2008-12-30 10:26:27

TOP

 

点线面.csv样式文件的设置方法

POIStyles.csv、PolylineStyles.csv、PolygonStyles.csv分别是点、线、面三类对象的样式配置文件,
以#开始的行是注释,其余行每行代表一种Type的对象。若mp中的某个对象的Type在csv文件中未找到,
则用Default那一行的参数转换。

所有Color为aabbggrr格式的8位16进制数,其中aa=00表示完全透明, aa=FF表示完全不透明

最高、最低显示值在三个.csv文件中修改,单位为km。注意GE的显示高度与地球视窗的水平像素数有关,
还与视角与地面的夹角等有关,因此高度值只是近似值,并非很准确。pymp2kml有不同显示器分辨率的
选项。


.csv文件中各列含义

点、线、面共同:
Type        类型,就是gpsmapedit中的Type(又叫code)
Name        显示在GE位置窗口内的文件夹名称
Visibility  调入GE时是否默认可见,0不可见,1可见
Max alt:  最高显示高度,超过此高度自动隐藏,单位为km,0表示无穷高(从无穷高开始显示)
Min alt:  最低显示高度,低于此高度自动隐藏,单位为km,0表示无穷低(接近地面时仍不隐藏)

点:
Convert  16进制值,下列位的组合(5个bit均为1时为1F)
    Bit0 - 1表示显示Icon1(正常图标)
    Bit1 - 1表示显示POI正常名称Text1
    Bit2 - 1表示显示Icon2(鼠标停留时的高亮图标)
    Bit3 - 1表示按高度自动显隐
    Bit4 - 1表示显示POI高亮名称Text2
Text1 scale        正常文字大小,可带小数,kml单位
Text1 color        正常文字颜色
Icon1(Normal)      正常图标
Icon1 scale        正常图标缩放比例
Icon1 heading      正常图标旋转角度
Icon1 color blend  正常图标混合颜色(rr gg bb分量分别与图标像素颜色中的对应分量相乘)
Text2 scale        高亮文字大小(所谓高亮,是指鼠标停留时的显示样式)
Text2 color        高亮文字颜色
Icon2(Highlight)  高亮图标
Icon2 scale        高亮图标缩放比例
Icon2 heading      高亮图标旋转角度
Icon2 color blend  高亮图标混合颜色

线:
Convert  16进制值,下列位的组合(4个bit均为1时为F)
    Bit0 - 1表示显示Polyline1
    Bit1 - 1表示显示名称
    Bit2 - 1表示显示Polyline2
    Bit3 - 1表示按高度自动显隐
Line1 width    Polyline1线宽
Line1 color    Polyline1颜色
Line2 width    Polyline2线宽(通常比Polyline1宽, 且颜色不同)
Line2 color2  Polyline2颜色
Text scale    名称文字大小
Text color    名称文字颜色

面:
Convert  16进制值,下列位的组合(4个bit均为1时为F)
    Bit0 - 1表示显示Polygon(Fill)
    Bit1 - 1表示显示名称
    Bit2 - 1表示显示边缘线
    Bit3 - 1表示按高度自动显隐
Fill color    Polygon填充色
Text scale    名称文字大小
Text color    名称文字颜色
Line width    Polygon边缘线线宽
Line Color    Polygon边缘线颜色

.csv文件可使用Excel或文本编辑器编辑。
1楼下载包中的三个.csv样式文件只是提供一个演示范例,而非比较理想的配置,大家各有不同的配色及图标
喜好,可根据需要DIY。

TOP

 

图标的设置及DIY

暂缺(计划:http://图标,GE保留图标,kmz中的DIY图标)

TOP

 

数据筛选

【一】行政区划筛选---仅转宁夏的西吉县
1. 西吉在宁夏-甘肃边界,西吉的少部分会在甘肃的mp文件内,因此在主界面调入宁夏与甘肃两个mp文件
2. “选项-MP”中勾选“启用行政区划限定”
3. “限定省,自治区...”中空白,或输入宁夏
4. “不转换地级及以上市市区”
5. “选择县级市及县”,并在右侧输入框内键入“西吉”(不带引号)
6. 不勾选“每个MP文件对应KML中的一个Folder”,否则西吉在甘肃的部分将处于单独的一个Folder内
     
【二】行政区划筛选---仅转宁夏的银川市、石嘴山市、西吉县、海原县、盐池县
1. 主界面调入宁夏、甘肃、内蒙古、陕西4个mp文件(选择文件时按住Ctrl再点击,可一次选多个文件)
2. “选项-MP”中的设置见2楼MP的截图,其中已输入“宁夏”的那个框空白也可,不影响结果,因为甘肃等省并没
  有叫“银川、西吉”等的市县。中间竖线是英文的管道线|,在正则表达式中表示“或”

【三】行政区划筛选---完整宁夏全区,含位于邻居省mp内的宁夏部分
1. 主界面调入宁夏及其邻居甘肃、内蒙古、陕西4个mp文件
2. “选项-MP”中勾选“启用行政区划限定”
3. “限定省,自治区...”中输入宁夏
4. “选择地级及以上市市区”,右侧输入框空
5. “选择县级市及县”,右侧输入框空
6. 不勾选“每个MP文件对应KML中的一个Folder”

【四】经纬度筛选
方法1:“选项-MP”中勾选“启用经纬度限定”,东西南北4个框内输入数值即可
方法2:gpsmapedit中Trim。方法2的优点是在切割边界处gpsmapedit会自动打断线、面对象,因此更整齐。而
      pymp2kml切割的,只要线、面对象的一个点在经纬度矩形框内,就选择整个对象,而不会切割对象本身

【五】如何不转面对象
方法1:面有三部分:Polygon、Polygon名、Polygon边缘线,在“选项-面”中将这三部分均选“全部不显示”即可。推荐
方法2:Excel打开PolygonStyles.csv,把所有行的Convert列全置为0即可。不推荐
方法3:“选项-面筛选”中选择“不转换满足下列正则表达式之一的”,不勾选“但...除外”,Type1及Label1均填入
      .*(英文点及*)。.表示任意单个字符,.*表示任意个(包括0个)任意字符,其他框空。不推荐
方法4:gpsmapedit打开mp,edit->select->by type,选中所有Polygon类型,确认,del,再转换即可。不推荐
     
【六】如何仅转换市、县、镇、乡、村的POI
先按【五】的方法关闭线、面对象
方法1:“选项-点筛选”中选择“仅转换满足下列正则表达式之一的”,不勾选“但...除外”,Type1填入0x[5-9ab]00$
      Label1填入.*  其余空白。这将转换Type为0x500到0xb00的POI,Label任意,即各市、县等等。推荐
方法2:Excel打开POIStyles.csv,将Type为0x500-0xb00行的Convert列值置为1F(或根据需要的其他值),其余
      行的Convert列均为0。不推荐
方法3:gpsmapedit打开mp,edit->select->by type,选中Code为0x0500-0x0b00的Point类,确认后edit->invert selection,
      del,再转。不推荐
     
     
【七】市县镇乡村POI,村名不能以“庄”结尾(但“宋庄村”等是可以的);加中餐POI且名字中有“酒店”,但不能有“大酒店”、“分店”或“海鲜”;再加任意类型的无名POI
见2楼POI筛选的截图

【八】如何将mp中Type=0xb00,Label以“庄”结尾的POI转为相同Label的Type=0xc00的POI,再用pymp2kml转换
用UltraEdit打开mp,根据不同版本首先确保在“高级-配置-查找”中,或替换对话框中选中“Unix形式的正则表达式”。

然后“搜索-替换”,勾选“正则表达式”, “查找内容”内输入下行内容:
(\[POI\]\pType)=0xb00(\pLabel=.+庄\p(.*\p)*))\[END\]\p

“替换为”输入:
\1=0xc00\2\[END\]\p

按“全部替换”按钮即可

【九】以路为例,说明正则表达式匹配
假设用search法
Type      Label      说明
              阳光        不起作用,Type为空的正则表达式对不参与匹配
.+                          任意Type的无名路
0x14$                    Type=0x14的无名路
.+          阳光          任意Type,路名含有“阳光”
0x1$      阳光          Type=0x1,路名含有“阳光”
0x3$      路$          Type=0x3,路名以“路”结尾
0x3$      ^迎宾        Type=0x3,路名以“迎宾”开始
0x3$      ^迎宾路$  Type=0x3,路名=迎宾路
0x3$      .+              Type=0x3,任意路名(但不含无名路)
0x3$      .*              Type=0x3,任意路名(包含无名路)
0x[1-5]$  阳光|迎宾 Type=0x1~0x5,路名含有“阳光”或“迎宾”
最后编辑ace919 最后编辑于 2008-12-26 12:53:25

TOP

 

举例

截图举例

POI的16种组合(正常图标+正常文字+高亮图标+高亮文字,2的4次方 = 16)

上图POI的15种组合的gif动画由菲梦友情提供,致谢!

其中4部分均不显示的POI是隐藏的,但点击能显示其信息:



道路的7种组合(细线+粗线+路名,8种组合,但全都不显示的无意义)


面状物的7种组合(填充体+边缘线+名称,8种组合,但全都不显示的无意义)


3.8km截图


1.11km截图


480km截图
最后编辑ace919 最后编辑于 2008-12-25 09:30:58

TOP

 

好东西就要支持啊

TOP

 

终于发布了,大力支持

TOP

 

衷心祝贺,虚心学习.

TOP

 

收录在GE使用技巧和辅助软件汇总链接http://bbs.godeyes.cn/showtopic-202125.aspx
                      幸福的闲人

TOP

 

这哥们难道是俺们宁夏的?

TOP

 

呵呵,偶不是宁夏的,但在虚拟世界里对宁夏还算有些熟悉

TOP

 

更新

V1.0.1  2008.12.30 
        解决与Python2.6.1的兼容性
    在选择行政区划筛选时,排除因mp中相邻市县Type=0x1/0x3的Polygon轻微交叠导致的误转换
    信息显示窗口自动滚屏
本帖被评分 1 次

TOP

 

试了一下,感觉很好用。谢谢ace919。

TOP

 

在地图中,乡、镇、村-自然村都是长期固定不变的,也是最重要的信息点。
点筛选页面中下方的排除条件里面可否再多几行,在V65版本的MP中,相当大部分的自然村是Type=0x2900,而这个类型里面又包含了好多的企业信息,那名称五花八门的,例如:XX工业园、XX集团、XX营业部、XX中心、XX研究所、XX局、XX厂、XX科技园.......。我把三个排除条件都用了还远不够。哈
最后编辑黑猫 最后编辑于 2009-01-01 00:13:42

TOP

 
1/4页1234 跳转到
回复该主题 发表新主题
  <<上一主题 | 下一主题>>