在进行数据操作的时候,需要注意坐标系要一致,这是前提。
文件地理数据库:gbd
个人地理数据库:mdb (Mircosoft Access)
矢量数据:shp
推荐使用gbd数据,效率会更高。
数据文件:dat
“.dat”中的“dat”是“Data”的简写。意为“数据”的意思
索引文件:idx
图形格式字幕由 idx 和 sub 文件组成,idx 相当于索引文件,里面包括了字幕出现的时间码和字幕显示的属性,sub 文件就是字幕数据本身,由于是图片格式,所以比较大
在ArcMap中,字段类型分为:短整型、长整型、浮点型、双精度型(默认为小数点后6位)、文本以及日期类型。
JPG(Joint Photographic Experts Group)是常见的 一种图像格式,是栅格形的数据(数据在众多的方格里),能够将文件压缩到最小的格式。
TIFF (Tag Image File Format)是一种广泛使用的图像格式,图像格式复杂,存储信息多。
标签图像文件格式(Tag Image File Format,TIFF)是一种灵活的位图格式,主要用来存储包括照片和艺术图在内的图像,最初由Aldus公司与微软公司一起为PostScript打印开发。TIFF与JPEG和PNG一起成为流行的高位彩色图像格式。TIFF格式在业界得到了广泛的支持,如Adobe公司的Photoshop、The GIMP Team的GIMP、Ulead PhotoImpact和Paint Shop Pro等图像处理应用、QuarkXPress和Adobe InDesign这样的桌面印刷和页面排版应用,扫描、传真、文字处理、光学字符识别和其它一些应用等都支持这种格式。
GeoTOFF(Geographically Registred Tagged Image File Format)是一种遥感数字影像格式。
HDF(Hierachical Data Format)是一种层次数据格式。
在Arcgis中,处理数据,主要用ArcToolBox中的“数据管理工具”(data management tools),该文件夹下的“常规”选项,涉及数据的删除、合并、复制、排序等等。

熟悉该文件夹下的工具功能,能为之后的研究带来便利。
通常,文件中只需要配准一幅地图。如果配准两幅,会发现前一幅配准的信息会丢失,白费一场。所以,配准的时候,记着配准一幅地图即可。如果还想配准,就去新建另外的mxd文件。
又通常,比例尺大的地图,配准后,显示会更加清晰。比例尺效地地图,配准后,因为多有放大,会有模糊现象。

配准的时候,选择“适应显示范围”,地图就会将显示为视图界面大小。这样去配准,相对来说会更加方便。
配准的时候,不用勾选“自动校正”。

配准的时候,红色的“十”字符号,表示配准正确。出现绿色“十”字,说明设置的经纬度数和配准的变换校正度数相差较大。可能史经纬度输入有问题,这个时候就需要调整。
对于配准的信息,需要及时保存。
如果第二次重新加载了新的配准图,则之前配准图的信息就会自动清除。
如果不加载新的配准图,但是准备增加新的点来配准,则之前配准图的信息也可能被清除。
所以,一定要记得保存。
如图,通过各个凸处的几何点,配准完毕土壤植被分布图。

然后,因为配准后,准备在图上增加新点,结果之前操作的信息没了。

所以一定要记着及时保存。
乌苏里江交汇处 百度坐标信息: 135.07443560806902 48.46108016155904 WGS坐标信息 135.05952887151201 48.45294384716383
新疆最北处东边点 百度坐标信息: 87.80229390845639 49.18389575281061 WGS坐标信息 87.79258188408424 49.176764793890584
海南最南端 百度坐标信息: 109.58009404460724 18.19492445728498 WGS坐标信息 109.56964273101045 18.19066542823655
台北最南端 百度坐标信息: 120.80244511595272 21.91892032950033 WGS坐标信息 120.79223997774 21.915895458871564
上海三角洲地区 百度坐标信息: 121.97798568941312 30.88542028545457 WGS坐标信息 121.96739998319777 30.8813447565161
黄河拐角潼关处 百度坐标信息: 110.27414286101236 34.612003951099894 WGS坐标信息 110.26243410777256 34.60697486883307
台湾最北端 百度坐标信息: 121.5861807409292 25.307271707232324 WGS坐标信息 121.57594459301785 25.304120225915295
东沙群岛 百度坐标信息: 116.7977093232429 20.66935451016298 WGS坐标信息 116.78675306256193 20.666141552106126
香港离岛 百度坐标信息: 113.93463000278693 22.281608118839024 WGS坐标信息 113.92333383044075 22.27828121423192
黑河黄河交汇处 111.15548836296193 40.24796083989081 WGS坐标信息 111.14217911760626 40.240992488833314
对于没有经纬格的,采用典型几何地理区域的点,来进行配准,一样可以达到很好的效果。
如图,可以精确配准《中国历史地图集》中的地图,然后绘制政区矢量面图,绘制河流矢量线图,城镇等矢量点图。

然后调整图层的透明度,可以形成如下效果。
如图,可以选择“地理配准”工具中的“更新显示”,更新配准后图的效果。

即可完成。
在配准的时候,注意勾选显示框,这样配准到的时候能够找到位置。

选择“更新显示”,就会按照新的配准数据,更新图片显示。

在配准的时候,注意选择经纬点。如下表格所示,选取了代表性的点。选点的时候,要注意选择经纬度明确的,这样误差较小,如天坛圆丘,几何圆形,圆心很容易确定,就是很好的经纬选点。
| 地点 | 经度 | 纬度 |
| 天安门 | 116.403963 | 39.915119 |
| 宣武门 | 116.38031 | 39.906091 |
| 正阳门 | 116.404199 | 39.906924 |
| 永定门 | 116.405784 | 39.878793 |
| 天坛回音壁 | 116.419624 | 39.884385 |
| 天坛圆丘 | 116.419657 | 39.883274 |
注意,在配准城市地图的时候,和配准历史地图不太一样。《中国历史地图》选择了经线和纬线的交差点,在确定配准点后,输入的是“经度和纬度的DMS”。而在配准城市地图的时候,如《北京1934年地图》选择的是某一个特殊点,在百度地图(huiyan.baidu.com)提取点信息的时候,提取出来具体的经纬度,如上表格所示,在确定配准点后,输入的是“X和Y”。

为了配准更为准确,于是选择更为精确的经纬度,更新数据如下所示:
| 地点 | 经度 | 纬度 |
| 宣武门 | 116.38031 | 39.906091 |
| 永定门 | 116.405784 | 39.878793 |
| 天坛回音壁 | 116.419624 | 39.884385 |
| 南海湖心岛中心 | 116.39226813003961 | 39.9170338210424 |
| 神武门中心 | 116.40320949115115 | 39.92864367319056 |
| 天安门中心 | 116.403838305008 | 39.91508654698406 |
| 正阳门中心 | 116.40424703401517 | 39.90695443177788 |
| 天坛圆丘圆心 | 116.41962602434599 | 39.883240873855364 |
这几个点,都选择了几何中心,小数点后位数也更多,相对来说更为精确。进一步配准。

如图所示,发现地图配准,仍然会合实际的卫星地图有偏差。
配准的时候,还需要注意,在Arcgis中采用的是WGS1984坐标,百度地图提取的经纬度点,也要是在WGS1984坐标中,配准才会吻合。
大的地点不会影响太多,但是一旦落实到小地方,坐标不同导致的误差,就会很明显。这是研究者需要注意的问题。

如图所示:天坛圆丘圆心,经纬度在Arcgis导入的天地卫星图中,经纬度坐标(116.407,39.872)。这个坐标和百度地图提取的经纬度坐标(116.41962602434599,39.883240873855364)并不一致,所以才会产生误差。
在地理配准过程中,会发现百度地图提取的经纬度点,放到Arcgis系统中的卫星图中,和实际的目标点并不一致。实际上,原因在于国家为了安全考虑,国家测量局(GCJ)规定百度地图、高德地图等,提供的经纬度要经过一道加密后的偏移算法。
所以,在各种web端平台,或者高德、腾讯、百度上取到的坐标,都不是GPS坐标,都是GCJ-02坐标,或者自己的偏移坐标系。
百度API:是BD-09坐标,适用于百度地图相关产品。
搜狗API:是搜狗坐标,适用于搜狗地图相关产品。
谷歌地球,google earth:是GPS坐标,而且是度分秒形式的经纬度坐标。在国内不能使用,须转换为GCJ-02坐标。
不同的坐标,是可以转换的。如网上一些程序朋友,写的python代码,将不同坐标进行转换。
火星坐标系(GCJ-02)转百度坐标系(BD-09) 百度坐标系(BD-09)转火星坐标系(GCJ-02) WGS84转GCJ02(火星坐标系), WGS84转换CGCS2000。 都涉及坐标数据转换。
一位网友(来自CSDN)代码如下:
- # -*- coding: utf-8 -*-
- import json
- import requests
- import math
- x_pi = 3.14159265358979324 * 3000.0 / 180.0
- pi = 3.1415926535897932384626 # π
- a = 6378245.0 # 长半轴
- ee = 0.00669342162296594323 # 偏心率平方
- class Geocoding:
- def __init__(self, api_key):
- self.api_key = api_key
- def geocode(self, address):
- """
- 利用高德geocoding服务解析地址获取位置坐标
- :param address:需要解析的地址
- :return:
- """
- geocoding = {'s': 'rsv3',
- 'key': self.api_key,
- 'city': '全国',
- 'address': address}
- # geocoding = urllib.urlencode(geocoding)
- # ret = urllib.urlopen("http://restapi.amap.com/v3/geocode/geo{}".format(geocoding))
- url = "http://restapi.amap.com/v3/geocode/geo?"
- ret = requests.get(url, params=geocoding)
- if ret.status_code == 200:
- # res = ret.json()
- # json_obj = json.loads(res)
- json_obj = ret.json()
- if json_obj['status'] == '1' and int(json_obj['count']) >= 1:
- geocodes = json_obj['geocodes'][0]
- lng = float(geocodes.get('location').split(',')[0])
- lat = float(geocodes.get('location').split(',')[1])
- return [lng, lat]
- else:
- return None
- else:
- return None
- def gcj02_to_bd09(lng, lat):
- """
- 火星坐标系(GCJ-02)转百度坐标系(BD-09)
- 谷歌、高德——>百度
- :param lng:火星坐标经度
- :param lat:火星坐标纬度
- :return:
- """
- z = math.sqrt(lng * lng + lat * lat) + 0.00002 * math.sin(lat * x_pi)
- theta = math.atan2(lat, lng) + 0.000003 * math.cos(lng * x_pi)
- bd_lng = z * math.cos(theta) + 0.0065
- bd_lat = z * math.sin(theta) + 0.006
- return [bd_lng, bd_lat]
- def bd09_to_gcj02(bd_lon, bd_lat):
- """
- 百度坐标系(BD-09)转火星坐标系(GCJ-02)
- 百度——>谷歌、高德
- :param bd_lat:百度坐标纬度
- :param bd_lon:百度坐标经度
- :return:转换后的坐标列表形式
- """
- x = bd_lon - 0.0065
- y = bd_lat - 0.006
- z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * x_pi)
- theta = math.atan2(y, x) - 0.000003 * math.cos(x * x_pi)
- gg_lng = z * math.cos(theta)
- gg_lat = z * math.sin(theta)
- return [gg_lng, gg_lat]
- def wgs84_to_gcj02(lng, lat):
- """
- WGS84转GCJ02(火星坐标系)
- :param lng:WGS84坐标系的经度
- :param lat:WGS84坐标系的纬度
- :return:
- """
- if out_of_china(lng, lat): # 判断是否在国内
- return [lng, lat]
- dlat = _transformlat(lng - 105.0, lat - 35.0)
- dlng = _transformlng(lng - 105.0, lat - 35.0)
- radlat = lat / 180.0 * pi
- magic = math.sin(radlat)
- magic = 1 - ee * magic * magic
- sqrtmagic = math.sqrt(magic)
- dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)
- dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi)
- mglat = lat + dlat
- mglng = lng + dlng
- return [mglng, mglat]
- def gcj02_to_wgs84(lng, lat):
- """
- GCJ02(火星坐标系)转GPS84
- :param lng:火星坐标系的经度
- :param lat:火星坐标系纬度
- :return:
- """
- if out_of_china(lng, lat):
- return [lng, lat]
- dlat = _transformlat(lng - 105.0, lat - 35.0)
- dlng = _transformlng(lng - 105.0, lat - 35.0)
- radlat = lat / 180.0 * pi
- magic = math.sin(radlat)
- magic = 1 - ee * magic * magic
- sqrtmagic = math.sqrt(magic)
- dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)
- dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi)
- mglat = lat + dlat
- mglng = lng + dlng
- return [lng * 2 - mglng, lat * 2 - mglat]
- def bd09_to_wgs84(bd_lon, bd_lat):
- lon, lat = bd09_to_gcj02(bd_lon, bd_lat)
- return gcj02_to_wgs84(lon, lat)
- def wgs84_to_bd09(lon, lat):
- lon, lat = wgs84_to_gcj02(lon, lat)
- return gcj02_to_bd09(lon, lat)
- def _transformlat(lng, lat):
- ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + \
- 0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng))
- ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 *
- math.sin(2.0 * lng * pi)) * 2.0 / 3.0
- ret += (20.0 * math.sin(lat * pi) + 40.0 *
- math.sin(lat / 3.0 * pi)) * 2.0 / 3.0
- ret += (160.0 * math.sin(lat / 12.0 * pi) + 320 *
- math.sin(lat * pi / 30.0)) * 2.0 / 3.0
- return ret
- def _transformlng(lng, lat):
- ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + \
- 0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng))
- ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 *
- math.sin(2.0 * lng * pi)) * 2.0 / 3.0
- ret += (20.0 * math.sin(lng * pi) + 40.0 *
- math.sin(lng / 3.0 * pi)) * 2.0 / 3.0
- ret += (150.0 * math.sin(lng / 12.0 * pi) + 300.0 *
- math.sin(lng / 30.0 * pi)) * 2.0 / 3.0
- return ret
- def out_of_china(lng, lat):
- """
- 判断是否在国内,不在国内不做偏移
- :param lng:
- :param lat:
- :return:
- """
- return not (lng > 73.66 and lng < 135.05 and lat > 3.86 and lat < 53.55)
- if __name__ == '__main__':
- lng = 116.382997
- lat = 39.915156
- result1 = gcj02_to_bd09(lng, lat)
- result2 = bd09_to_gcj02(lng, lat)
- result3 = wgs84_to_gcj02(lng, lat)
- result4 = gcj02_to_wgs84(lng, lat)
- result5 = bd09_to_wgs84(lng, lat)
- result6 = wgs84_to_bd09(lng, lat)
- g = Geocoding('apikey') # 这里填写你的高德api的key
- result7 = g.geocode('广东省深圳市南山区')
- print(result1, result2, result3, result4, result5, result6, result7)
另一位网友(来自codeleading )的代码如下:
- # -*- coding: utf-8 -*-
- # /**
- # * 各地图API坐标系统比较与转换;
- # * WGS84坐标系:即地球坐标系,国际上通用的坐标系。设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系,
- # * 谷歌地图采用的是WGS84地理坐标系(中国范围除外);
- # * GCJ02坐标系:即火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系。谷歌中国地图和搜搜中国地图采用的是GCJ02地理坐标系;
- # * 3BD09坐标系:即百度坐标系,GCJ02坐标系经加密后的坐标系;
- # */
- import math
- from decimal import *
-
- class transfer:
- def __init__(self,key=None):
- self.a=6378245.0
- self.ee=Decimal(0.00669342162296594323)
-
- def transformLng(self,x,y):
- ret=Decimal()
- ret = 300.0+x+2.0*y+0.1*x*x+0.1*x*y+0.1*math.sqrt(math.fabs(x))
- ret += (20.0 * math.sin(6.0 * x * math.pi) + 20.0 * math.sin(2.0 * x * math.pi)) * 2.0 / 3.0
- ret += (20.0 * math.sin(x * math.pi) + 40.0 * math.sin(x / 3.0 * math.pi)) * 2.0 / 3.0
- ret += (150.0 * math.sin(x / 12.0 * math.pi) + 300.0 * math.sin(x / 30.0* math.pi)) * 2.0 / 3.0
- return ret
-
- def transformLat(self,x,y):
- ret = Decimal()
- ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y+ 0.2 * math.sqrt(math.fabs(x))
- ret += (20.0 * math.sin(6.0 * x * math.pi) + 20.0 * math.sin(2.0 * x * math.pi)) * 2.0 / 3.0
- ret += (20.0 * math.sin(y * math.pi) + 40.0 * math.sin(y / 3.0 * math.pi)) * 2.0 / 3.0
- ret += (160.0 * math.sin(y / 12.0 * math.pi) + 320 * math.sin(y * math.pi / 30.0)) * 2.0 / 3.0
- return ret
-
- def transfrom(self,lng,lat):
- dLat = self.transformLat(lng - 105.0, lat - 35.0)
- dLng = self.transformLng(lng - 105.0, lat - 35.0)
- radLat = lat / 180.0 * math.pi
- magic = math.sin(radLat)
- magic = 1 - self.ee * Decimal(magic) * Decimal(magic)
- sqrtMagic = math.sqrt(magic)
- dLat = Decimal((dLat * 180.0)) / ((Decimal(self.a) * (1 - self.ee)) / (Decimal(magic) * Decimal(sqrtMagic)) * Decimal(math.pi))
- dLng = (dLng * 180.0) / (self.a / sqrtMagic * math.cos(radLat) * math.pi)
- mgLat = lat + float(dLat)
- mgLng = lng + dLng
- return mgLng,mgLat
-
-
- #gps坐标转换为gcj02坐标系
- def wg84_to_gcj02(self,wg84_lng,wg84_lat):
- dLat=self.transformLat(wg84_lng-105.0,wg84_lat-35.0)
- dLng=self.transformLng(wg84_lng-105.0,wg84_lat-35.0)
- radLat = wg84_lat / 180.0 * math.pi
- magic = math.sin(radLat)
- magic = 1 - self.ee * Decimal(magic) * Decimal(magic)
- sqrtMagic = math.sqrt(magic)
- dLat = Decimal((dLat * 180.0)) / ((Decimal(self.a) * (1 - self.ee)) / (Decimal(magic) * Decimal(sqrtMagic)) * Decimal(math.pi))
- dLng = (dLng * 180.0) / (self.a / sqrtMagic * math.cos(radLat) * math.pi)
- gcj02Lat = wg84_lat + float(dLat)
- gcj02Lng = wg84_lng + dLng
- return gcj02Lng,gcj02Lat
-
- #gcj02坐标转百度坐标
- def gcj02_to_bd09(self,gcj02_lng,gcj02_lat):
- x = gcj02_lng
- y = gcj02_lat
- z = math.sqrt(x * x + y * y) + 0.00002 * math.sin(y * math.pi)
- theta = math.atan2(y, x) + 0.000003 * math.cos(x * math.pi)
- bd09_Lng = z * math.cos(theta) + 0.0065
- bd09_Lat = z * math.sin(theta) + 0.006
- return bd09_Lng,bd09_Lat
-
- #wg84坐标转百度坐标
- def wg84_to_bd09(self,wg84_lng,wg84_lat):
- gcj02lng,gcj02lat=self.wg84_to_gcj02(wg84_lng,wg84_lat)
- return self.gcj02_to_bd09(gcj02lng,gcj02lat)
-
- #百度坐标转GCJ02坐标
- def bd09_to_gcj02(self,bd09_lng,bd09_lat):
- x = bd09_lng - 0.0065
- y = bd09_lat - 0.006
- z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * math.pi)
- theta = math.atan2(y, x) - 0.000003 * math.cos(x * math.pi)
- gcj02_lng = z * math.cos(theta)
- gcj02_lat = z * math.sin(theta)
- return gcj02_lng,gcj02_lat
-
- #GCJ坐标转WG84坐标
- def gcj02_to_wg84(self,gcj02_lng,gcj02_lat):
- mlng,mlat=self.transfrom(gcj02_lng,gcj02_lat)
- wg84_Lng=gcj02_lng*2-mlng
- wg84_Lat=gcj02_lat*2-mlat
- return wg84_Lng,wg84_Lat
-
- #将百度坐标转WG84坐标
- def bd09_to_wg84(self,bd09_lng,bd09_lat):
- gcj02_lng, gcj02_lat=self.bd09_to_gcj02(bd09_lng,bd09_lat)
- return self.gcj02_to_wg84(gcj02_lng,gcj02_lat)
-
-
- tr=transfer()
- #测试
-
- print(tr.bd09_to_gcj02(113.30764968,23.1200491)) #转换正确
-
- print(tr.bd09_to_wg84(113.30764968,23.1200491)) #转换正确
-
- print(tr.wg84_to_bd09(113.30764968,23.1200491)) #转换正确
代码如下:
- import math
- from decimal import *
-
- xyInfo=input("请输入百度坐标信息:")
- xyList=xyInfo.split(",")
- bd09_lng=float(xyList[0])
- bd09_lat=float(xyList[1])
- # -*- coding: utf-8 -*-
- # /**
- # * 各地图API坐标系统比较与转换;
- # * WGS84坐标系:即地球坐标系,国际上通用的坐标系。设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系,
- # * 谷歌地图采用的是WGS84地理坐标系(中国范围除外);
- # * GCJ02坐标系:即火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系。谷歌中国地图和搜搜中国地图采用的是GCJ02地理坐标系;
- # * 3BD09坐标系:即百度坐标系,GCJ02坐标系经加密后的坐标系;
- # */
- import math
- from decimal import *
-
- class transfer:
- def __init__(self,key=None):
- self.a=6378245.0
- self.ee=Decimal(0.00669342162296594323)
-
- def transformLng(self,x,y):
- ret=Decimal()
- ret = 300.0+x+2.0*y+0.1*x*x+0.1*x*y+0.1*math.sqrt(math.fabs(x))
- ret += (20.0 * math.sin(6.0 * x * math.pi) + 20.0 * math.sin(2.0 * x * math.pi)) * 2.0 / 3.0
- ret += (20.0 * math.sin(x * math.pi) + 40.0 * math.sin(x / 3.0 * math.pi)) * 2.0 / 3.0
- ret += (150.0 * math.sin(x / 12.0 * math.pi) + 300.0 * math.sin(x / 30.0* math.pi)) * 2.0 / 3.0
- return ret
-
- def transformLat(self,x,y):
- ret = Decimal()
- ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y+ 0.2 * math.sqrt(math.fabs(x))
- ret += (20.0 * math.sin(6.0 * x * math.pi) + 20.0 * math.sin(2.0 * x * math.pi)) * 2.0 / 3.0
- ret += (20.0 * math.sin(y * math.pi) + 40.0 * math.sin(y / 3.0 * math.pi)) * 2.0 / 3.0
- ret += (160.0 * math.sin(y / 12.0 * math.pi) + 320 * math.sin(y * math.pi / 30.0)) * 2.0 / 3.0
- return ret
-
- def transfrom(self,lng,lat):
- dLat = self.transformLat(lng - 105.0, lat - 35.0)
- dLng = self.transformLng(lng - 105.0, lat - 35.0)
- radLat = lat / 180.0 * math.pi
- magic = math.sin(radLat)
- magic = 1 - self.ee * Decimal(magic) * Decimal(magic)
- sqrtMagic = math.sqrt(magic)
- dLat = Decimal((dLat * 180.0)) / ((Decimal(self.a) * (1 - self.ee)) / (Decimal(magic) * Decimal(sqrtMagic)) * Decimal(math.pi))
- dLng = (dLng * 180.0) / (self.a / sqrtMagic * math.cos(radLat) * math.pi)
- mgLat = lat + float(dLat)
- mgLng = lng + dLng
- return mgLng,mgLat
-
-
- #gps坐标转换为gcj02坐标系
- def wg84_to_gcj02(self,wg84_lng,wg84_lat):
- dLat=self.transformLat(wg84_lng-105.0,wg84_lat-35.0)
- dLng=self.transformLng(wg84_lng-105.0,wg84_lat-35.0)
- radLat = wg84_lat / 180.0 * math.pi
- magic = math.sin(radLat)
- magic = 1 - self.ee * Decimal(magic) * Decimal(magic)
- sqrtMagic = math.sqrt(magic)
- dLat = Decimal((dLat * 180.0)) / ((Decimal(self.a) * (1 - self.ee)) / (Decimal(magic) * Decimal(sqrtMagic)) * Decimal(math.pi))
- dLng = (dLng * 180.0) / (self.a / sqrtMagic * math.cos(radLat) * math.pi)
- gcj02Lat = wg84_lat + float(dLat)
- gcj02Lng = wg84_lng + dLng
- return gcj02Lng,gcj02Lat
-
- #gcj02坐标转百度坐标
- def gcj02_to_bd09(self,gcj02_lng,gcj02_lat):
- x = gcj02_lng
- y = gcj02_lat
- z = math.sqrt(x * x + y * y) + 0.00002 * math.sin(y * math.pi)
- theta = math.atan2(y, x) + 0.000003 * math.cos(x * math.pi)
- bd09_Lng = z * math.cos(theta) + 0.0065
- bd09_Lat = z * math.sin(theta) + 0.006
- return bd09_Lng,bd09_Lat
-
- #wg84坐标转百度坐标
- def wg84_to_bd09(self,wg84_lng,wg84_lat):
- gcj02lng,gcj02lat=self.wg84_to_gcj02(wg84_lng,wg84_lat)
- return self.gcj02_to_bd09(gcj02lng,gcj02lat)
-
- #百度坐标转GCJ02坐标
- def bd09_to_gcj02(self,bd09_lng,bd09_lat):
- x = bd09_lng - 0.0065
- y = bd09_lat - 0.006
- z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * math.pi)
- theta = math.atan2(y, x) - 0.000003 * math.cos(x * math.pi)
- gcj02_lng = z * math.cos(theta)
- gcj02_lat = z * math.sin(theta)
- return gcj02_lng,gcj02_lat
-
- #GCJ坐标转WG84坐标
- def gcj02_to_wg84(self,gcj02_lng,gcj02_lat):
- mlng,mlat=self.transfrom(gcj02_lng,gcj02_lat)
- wg84_Lng=gcj02_lng*2-mlng
- wg84_Lat=gcj02_lat*2-mlat
- return wg84_Lng,wg84_Lat
-
- #将百度坐标转WG84坐标
- def bd09_to_wg84(self,bd09_lng,bd09_lat):
- gcj02_lng, gcj02_lat=self.bd09_to_gcj02(bd09_lng,bd09_lat)
- return self.gcj02_to_wg84(gcj02_lng,gcj02_lat)
-
-
- tr=transfer()
- #测试
-
- #输出 百度坐标转WG84坐标
- print(tr.bd09_to_wg84(bd09_lng,bd09_lat)) #转换正确
- print(tr.bd09_to_wg84(bd09_lng,bd09_lat)[0])
- print(tr.bd09_to_wg84(bd09_lng,bd09_lat)[1])
将代码命名为xytrans, 存入电脑,以备所需。
经过转换后的数据去所示
| 地点 | 百度经度 | 百度纬度 | WGS经度 | WGS纬度 |
| 南海湖心岛中心 | 116.39230855378756 | 39.91681938151833 | 116.3796178318332 | 39.909300375951034 |
| 天安门中心 | 116.40383381348057 | 39.91507271179996 | 116.3911335129542 | 39.90756037201067 |
| 天坛圆丘圆心 | 116.419626 | 39.88324087 | 116.40692951697332 | 39.87574908010831 |
| 北京古城西南角 | 116.35766989332281 | 39.874879994414485 | 116.34505083872165 | 39.867372800898664 |
然后,依据这个来定位,如图所示,这时候就地图就能正确投影到Arcgis中的天地图中。

即可完成既定目标。
根据配准后的古旧地图。进行绘制。

绘制过程中,注意分成两个不同部分。一个是总体的轮廓形状(北京古城),一个是古城内部的分区形状。这样操作的时候就不同意混淆。不过,简便的方法,就是将各个区域画好之后,拼合成为一个总的图形。这样节约时间。不过具体看研究者自己的需求。
每次可以点击“构造工具”中的“面”,来绘制不同区域。
如图,即可完成所有绘制。

然而,在实践中,发现绘制的矢量图有很多空隙。所以,为了之后修复,对矢量图各个面重新进行 了调整。需要把所有的空隙都覆盖住,不能有空白处。这样,意味着两个面之间可以有重合。有重合处,之后修正会方便。如果没有重合,之后修正的时候,系统可能会以为那里本来就是空白地,不需要修正。

如图,通过调整,矢量图覆盖了所有面。
选择“修复几何工具”

选择要修复的矢量图,系统会把面图转化为同一个方向。

紧接着,在目录中新建gdb文件。

在gdb文件中,兴建“要素数据集”

给它一个名称

命名之后,在界面中选择“导入”,将要修正的矢量图导入。

然后,出现如下界面。

不需要修改,直接点击“完成”。
然后,在新建的数据集中,鼠标右键,选择新建“拓扑”。

然后选择,在新建的要素数据集中,“导入”→“要素类(多个)”。

于是将数据导入了的gdb文件中的要素数据集中。

导入后,就可以兴建拓扑。

出现的界面指示。

按照界面进行下一步

全选所有要素。

选择添加规则。可以选择“不能重叠”,“不能有空隙”

添加后,点击下一页。

然后点击确定。这时候,将出现的拓扑文件拖动到“内容列表”中

将拓扑文件拖动到“内容列表”后,再点击“编辑器”中的开始编辑。

这个时候,勾选自定义工具栏中的“拓扑”,出现在页面中。

于是在出现的“拓扑工具条”中,打开“错误检查器”

可以看到一些重叠或者空隙的地方。这些对应的是前面输入的规则。
然后,将这些全部选中,选择“创建要素”。

这个时候,就会发现,不符合规则的一些交集区域,就会被分割产生新的区域。
在操作中,系统生成的是新的矢量图,一个是拓扑修正,一个是原图。
打开属性表,可以看到这些都是细小的面。

可以将这些面全部选中。

然后,搜索“消除”工具,将这些细小的面合邻近面来合并。

点击“消除”工具,在出现的界面中,输入属性表中所在的矢量图对象。

这个时候,系统会自动生成一个新的Eliminate的矢量图对象。

该新生成的矢量图,就把重叠的空间合并到旁边的面积中,重叠部分就得到消除。
如此,就可以得到理想的矢量图。
对于最后生成的图,可以将其保存为新的矢量图,以备之后使用。

紧接着,可以对这些区域进行合并组合。复制该矢量图,重新命名后,进行新的操作。如图所示,北京古城分为内城和外城。

键盘按键Ctrl,可以选择属性表中的区域,然后选择“编辑器”中的“合并”,就可以将区域组合起来。
也可以针对空隙处,绘制矩形图,然后与之前的矢量图合并,从而消除空隙。

即如图所示。
利用影像图片,进行配准、镶嵌、裁剪、矢量化操作。
在开始编辑前,需要创建图层(点图层、线图层、面图层)
如图所示,在“目录”中自己建立的文件夹(mypainting文件夹)中,右键单击该文件夹,然后选择“新建(N)”,然后可以选择“新建”后面的Shapefile。

然后在出现的界面中,可以选择创建的要素类型。包括点、线 、面等。可以修改名称。

接着,点击该界面中的“编辑”,选择相关的地理坐标,如WGS_1984墨卡托投影,点击确定。这个时候,该矢量图采用的坐标系就能够确定。之后导入到其它地理系统时候,因为坐标系确定,就会准确定位。

点击确定,新建矢量图层完成。
也可以在Arc目录中,鼠标左键双击shp矢量图,然后会出现“shapefile属性”,在属性中,补充坐标系、字段等 信息。

建立完图层后,在该图层上绘制。

选择工具条中的“编辑器”
点击“编辑器(R)▼”中的▼符号,然后选择“开始编辑(T)”。

在出现的界面中,选择“继续”,

选择“编辑器”条列中的“创建要素”,选择该图层,然后选中“构造工具”的选项,进行绘制。
如图所示,按照此方法,绘制了从天津到渤海的一条河流。

对于所绘制图,可以鼠标左键双击后,在“图层属性”界面中选择“符号系统”,然后在符号中,选择不同的形式和颜色。

如此,调整绘制图的粗细大小颜色,较为方便。
以西岳华山为例,绘制其点的矢量图。首先,要会借鉴已有的成果。如OSGEO中的数据,其属性表很值得借鉴。生成的新数据如果以后能接入已有的前人做过的数据,那么之后无疑会很方便。而且能够做到统一标准下的开源共享。

该表中,有五个栏目。可以把已有标准下的矢量图和自己新建的矢量图合并,这样属性表就能保持一致的格式。
以“黄河”线矢量图为例,利用ArcToolBox中“常规”中的“合并”选项,在下拉“▼”选项中,选择要合并的矢量图。然后点击确定。


经过合并后,出现了“华山_Merge”这个矢量图,它的属性表字头和其它属性表一致。之后操作会比较方便。
进入百度地图的坐标提取页面。
链接:https://huiyan.baidu.com/github/tools/coord/

选择一个定位,这个时候,就会出现该点的经纬度。

于是,我们知道了华山的经纬坐标。可以复制粘贴。
利用工具栏中的“转到XY”,可以定位具体点。

将经纬度信息复制粘贴到界面中

选择“添加点”,或者选择“闪烁”,就可以确定该点的位置。

这个时候,选择“开始编辑”,于是在精确的位置,鼠标点击,点上地理点位。

这时候会高亮显示。然后可以打开属性表,补充信息。

补充完属性表信息后,就可以展现出来该点的标注信息。

在“转到XY”中,可以添加注记,如点、经纬度、标签等。

可以用黑色箭头选中后,鼠标右键单击,选择“删除”,即可删除不必要的信息。

在ArcGis中,可以直接用鼠标,将右侧“目录”中的矢量图等文件,直接拖入到左侧“内容列表”中,这样操作起来更加迅速。

可以调整图层信息,比如将行政底图设置为无色,只保留轮廓,以获得更好的阅读效果。还可以把地形图和卫星图搭配在一起,地形图透明度设置为40%。效果如下所示:

打开属性表,进行编辑。如图所示,可以对删除不必要的信息。

选择“编辑器”中的“停止编辑”,就会停止编辑矢量图上的点线面,但是可以编辑“属性表”中的数据,然后就可以“添加字段”

添加完字段(如name字段)后,点击“编辑器”,选择“开始编辑”,就可以往字段中添加信息。

根据高亮所示,将信息通过属性表添加,比较快捷。
利用工具栏中的“转到XY”,可以定位具体点。

将经纬度信息复制粘贴到界面中

选择“添加点”,或者选择“闪烁”,就可以确定该点的位置。

这个时候,选择“开始编辑”,于是在精确的位置,鼠标点击,点上地理点位。

这时候会高亮显示。然后可以打开属性表,补充信息。

补充完属性表信息后,就可以展现出来该点的标注信息。

可以通过“编辑器”来编辑数据,进行点线面的操作。

如图所示,通过“编辑器”中的创建要素,在新建的矢量文件中,绘制所需的点线面。

最后点线面绘制的矢量图如下所示:

可以在原矢量图上进一步编辑绘制,使得地图更加完整。

在实践中,可以进一步优化所绘图。

鼠标左键双击所绘图,出现工具条“编辑折点”,可以对折点进行如下操作:添加,删除,延长等。
具体如下所示,可以编辑折点。鼠标点击该点,即可完成。

比如,在此处,可以选中端点,延长拉伸。

而使用下面这个符号工具,可以将一条线截为两段。

还可以选择,在编辑器工具条“▼”下拉符号中,同时选中两个线段,将其合并。

选择“开始编辑”,将不同线段选中后,可以在“▼”下拉符号中,选择“合并”。
如图,选择如下工具。通过该工具,可以将各个点连成线,再将线连成面。

也可以直接用“手绘”完成面的绘制。
鼠标左键,双击。即可完成绘制。
对于更加细微的古城墙,也可以进行面的绘制。如下图所示,类似于绘制行政区划,可以通过几何方法来绘制面。

注意,如果点击了红框所示的选项,就会旋转。再点击一下,就不会旋转。
因为使用的额是“构造工具”中的“面”,它是由众多折点围成的。所以可以选择“编辑折点”,对图形进行调整。如图所示:

如图所示,可以通过移动折点,完成图片的绘制。

鼠标点击线条,可以添加点。如果把鼠标移动到该点,就可以移动该点,调整面。

在绘制的时候,掌握这些技巧,可以提高绘制的效率。
这个时候,发现海岸线仍然不能够非常精确。这个时候,可以选择将已有矢量图中的精确海岸线图复制粘贴过来。如下图所示:

在图中,选择编辑器中的“裁剪面工具”,既可以选择用划线将被选择编辑的矢量图一分为二,也可以选择用多个点围成一个所需要的形状。然后选择复制。接着,“停止编辑”该图,选择“开始编辑”到要粘贴的矢量图中,鼠标右键点击,选中“粘贴”,即可复制粘贴过去。
对于该图层的所有面图形,选择合并。即可完成操作。
在“编辑器”工具条中,选择箭头,选中要编辑的图形。

然后,鼠标就可以拖动这个面的左右上下位置。
选中图形后,点击编辑器中的裁剪面工具。

然后再要裁剪的位置,划一道线,如图所示:

画完后,双击鼠标左键。就可以将图形切分分成两个。

单独选中一个面,就可以将其删除。
将多个面同时选中,在“编辑器”下拉选项中,选择“合并”,就可以将多个面合并。

如图所示,现在有两个矢量图,一个是现代黄河,一个是古代黄河。现代黄河源头的一段矢量图,如何粘贴到古代黄河处呢?

可以进行如下操作。选择“编辑器”,点击“开始编辑”,在出现的界面中,选择要取用对象的矢量图(即要复制的一部分)。

如果矢量图是整体,可以用“编辑器”中的“分割工具”,将它切割成不同部分。

选中后,鼠标右键单击,选择“复制”。然后点击“停止编辑”。
接着,选择“开始编辑”,选中要复制对象的矢量图,即要粘贴的部分。点击该图层。

在界面上鼠标右键单击,选择“粘贴”,出现粘贴界面,确认要粘贴的图层无误后,点击确定。

这个时候,就可以将对象粘贴到目标图层中。
如果想要找到北京周边的河流,这个时候,可以在全国的河流矢量图中,点击“编辑”,然后按住键盘的按键Ctrl,依次选择多个数据。选择完毕后,选择“停止编辑”。

在新的矢量图中,选择“编辑”,将复制的数据粘贴到新图层中。
但是还有更为直接的方法。如图,在工具栏中,选择箭头,然后画出方框范围。

接着,将数据可以直接复制到目标图层中。如下图所示:

这样的操作,更加节约时间,而且,还可以对区域做进一步的整体性分析。
这个时候,可以打开该图层的属性表。全部选中。

界面上就会出现该图。
然后选择“编辑器”中的“合并”,就会将改图属性表中的所有要素合并为一个。即如图所示。

如图所示为例,金沙江是一个线性矢量图,长江也是一个线性矢量图。

它们各自有各自的属性表。

如何将这两个矢量图合并为一个呢?
实际上,可以利用工具箱中的合并(数据管理),将多个数据集合并为一个数据集。

点击后,会出现“合并”界面,这个时候在下拉“▼”符号中,选择要合并的矢量图。

然后选择输出的位置

点击确定。

这个时候,就会出现新的矢量图,而这个矢量图就是之前矢量图合并后的形式。它的属性表中,汇聚了分表的内容。

注意:矢量图合并,会生成一个新的矢量图。
如图所示,需要将绿色的一个政区“雄州”,加到总的政区图中。本质是两个矢量图的合并,但是不希望生成新的矢量图。这个时候可以用“追加”。

追加工具在“常规”文件夹中。注意,使用追加的时候,要确定点、线、面数据各自对应的追加,不要把面数据追加到点数据那里。

追加后,在输入框中,下拉选项中选择要追加的数据,以及目标数据。

然后就会将输入数据加到目标数据中,而保持原来的矢量图。原来矢量图的各种属性设置不会变化。这样会给使用者带来很大便利。
镶嵌多份数据,可以合于一份数据。
如果有两个栅格数据,有重合部分,那么可以使用“系统工具箱”的“Data Management Tools”,选择”栅格“,通过其中的”镶嵌“将这两个栅格数据合并为一个。也可以通过“搜索”框功能,寻找相应工具。
对于DEM栅格数据,有时候,我们需要将它裁剪为所需要的形状。
这个时候,选择“按掩膜提取数据”。
按照出现的“按掩膜提取”界面,点击“▼”下拉选项,依次选择需要修正的栅格数据(如中国DEM数据),掩膜(如中国国界矢量图),选择输出的位置。

之后点击确定,就可以得到修正后的中国DEM数据图。如图所示。

实际研究中,需要的区域比较小。这时候,可以绘制几何矢量图。然后按照该几何图掩膜来提取数据。

注意,第一行“载入栅格”,选择DEM数据。第二行“要素掩膜数据”,才是其它图的框架外形。这个操作,很类似PS中的“蒙板”。原理一致。

这时候,就提取了该区域的DEM数据。

在此区域内,绘制了2.5米等高距的等高线图。因为选择的数据量少,计算机运行速度也会很块。如下图所示:

显然,真实世界的等高线图是复杂的。尤其到了研究某一个区域,数据增多后,就比较考验人的思维能力了。
对于DEM数据,可以选择合适的色带,以便达到良好的的视觉效果。如色带左边代表低海拔位置,色带右边代表高海拔位置。选择如下色带:

形成效果如图所示:

调整该图层透明度为60%,可得到如下效果:

进一步完善图形,可以形成如下效果:

热爱我们伟大的祖国,雄立东方,屹立世界。
如图,京津冀,其中天津的DEM数据,高程(-7,1012),河北(-17,2773),北京(-18,2273),色差颜色不一致。

这个时候需要调整。怎么调整呢?

进入“高级标注”,但是在调整“<值>”的具体数值时候,发现操作一直失败。
如图,在图层属性中,选择“符号系统”,点击“标注”,在出现的“高级标注”界面,可以调整色带的正反向、色带数量、色带颜色等等。

对于中国DEM高程数据,可以进一步操作,生成等值线图。通过搜索功能,可以快速选择”等值线”工具。

在出现的“等值线”界面中,输入相关的数据。起始等值线一般选择0或者50这样的整数,这样便于阅读和计算。

输入500米,则太稀疏。如图,生成等值间距为5m的北京等高线图。用了“等值线”这个工具后,系统会在右下角显示,正在运行“等值线”。

如下所示:

将间距值改为50米,效果如图所示:

可以看到,等高线作图,适合在区域面积比较小的时候绘制,等高线的数据本身很多,只有在比例尺大的时候,图上信息丰富,才能承载这些数据。
将上面生成的等值线图放大。如图,将“目录”中的北京50米等高线图移动到“内容列表”中。

虽然有些许的偏移,但是总体上等高线图和地形地貌是吻合的。


不过发现,二者不太吻合。这是因为,该DEM图并没有生成该等值线图,两者并不是一致的。所以,重新用DEM生成等值线图。
如下是北京市海淀区圆明园一带的的五米等高线图。

该地最低海拔,显示在30米以上。

往南一带,北京古城所在的海拔在40米到50米之间。古城所在地区,是一处平坦的冲击平原地带。

北京古城西侧的永定河

如图所示,该处等高线,朝着高值凸出,朝着低值凹进。则该处海拔比两侧的低,是沟谷地区。在这里有河流,即永定河。
当然,等高距为5米,有利于研究的是中等范围地区。如果要写一篇好文章,要分析一个特别具体的区域,等高距就得继续调小一些。像侯仁之先生,他提出了海淀高地和巴沟低地,他所使用的等高距是2.5米。

而在这次操作中,等高距为10米,海淀地区和巴沟地区,两者出在同样的等高线中,并不利于分析该区域的问题。
(侯仁之:《历史地理研究 侯仁之自选集》,北京:首都师范大学出版社,2010年,第146页。)
对于生成的等高线图,可以进一步将其导出为矢量图。到处的时候,可以选择所见区域内的视图。

这个时候就不会导出所有数据,而是到处视图区域内的数据。
缩小比例尺,就会看到其它地区的等高线被省略了。这样的话,便于节省运算空间,速度也会快一些。

当然,也可以选择将所有数据都导出。
选择简化线工具,移除相对多余的折点。

在出现的界面中,对于“简化容差”,可以实验进行调整。

然后,出现的"简化线"界面会进行运算。

除了简化线,还可以进行“平滑线”操作等等,以达到更加美观的效果。
等高间距选择为50米。
对于等高线数值,习惯上,标注在线上,调整颜色和等高线颜色适应,效果会更加好一些。
等高线图,同时配上DEM底色图,会更加美观。

如图所示,在“放置属性”中,选择“平行”、“在线上”,完成标注。

即可完成。
在检索工具中,寻找“平滑线”。

按照程序提示,完成操作。
而后,可以增加经纬线、比例尺,进一步完善地图。

即如图所示。
对空间数据可以进行拓扑处理。
对矢量数据可以进行空间分析。
本·福达:《SQL必知必会》,第5版,刘晓霞、 钟鸣译,北京:人民邮电出版社,2020年
可以选择“查询构建器”界面中的“帮助”。

然后弹出“使用软件手册”,告诉你具体怎么操作。面对此处问题,页面会自动跳到SQL的说明中。

SELECT * FROM 构成了 SQL 表达式的第一部分,系统会自动为您提供该语句。
查询表达式使用跟随在 Select * From <图层或数据集> Where 子句之后这样的一般格式

如图,属性表中的fclass字段中,有多个分类。

通过SQL语言,可以将山脉过滤出来。代码如下:
"fclass" = 'peak'
注意,"="后面,是单引号。

点击确定,即可过滤。
"age" LIKE '汉' OR "age" LIKE '%汉' OR "age" LIKE '汉%'
这个时候,就将各种情况都兼顾到了。如下:

- SELECT * FROM XXX WHERE:
- "BEG_YR" <= -210 AND "NAME_CH" LIKE '%郡';
SQL也可以写稍微复杂一些的语句,运用多种逻辑关系。如CHGIS的数据,找出西汉时期的郡,可以用下面的代码。
- ELECT * FROM XXX WHERE:
- ("BEG_YR" >=-204 AND "BEG_YR" <=6)
- OR ("BEG_YR" <= -204 AND "END_YR" >= 6)
在中国水系矢量图中,通过“图层属性”界面,输入SQL语句。

- ELECT * FROM XXX WHERE:
- "name" ='黄河'