GeoGraphics
自 Wolfram 语言 10.0 版以来,GeoGraphics 允许你使用简单和通俗的方法构建地球和其他天体的表面地图. GeoGraphics 组合了带有快速和高精度大地测量计算的强大的 Graphics 功能并可通过 Entity 框架直接访问 Wolfram 知识库.
GeoGraphics 中关于标准二维 Graphics 基础的新成分是地球表面是弯曲的这个事实,因此它们必须畸变(在纸上或计算机屏幕上)产生平面地图. 这就需要选择一个地图投影,一个函数来决定弯曲曲面上的点如何映射到平面地图上的点. GeoProjectionData 数据包提供了投影的大型集合.
GeoGraphics 还引入了新的图形基元,例如 GeoPath、GeoDisk 和 GeoHemisphere 以适应于地球的曲率,甚至还有依赖于时间的地理基元,诸如, DayHemisphere 和 DayNightTerminator.
GeoGraphics 完全集成了 Wolfram 语言中测地学的功能,版本 10.0 有了广泛的更新. 该功能现在更快并且精确到地球椭球表面的毫米级. GeoPosition 允许在任何 GeodesyData 椭球的大型集合上指定地球上任何的位置,例如,GPS 卫星使用的 WGS84 参考坐标系.
本教程提供 GeoGraphics 的简介以及其相关函数. 该教程先展示了如何方便地构建任意区域或地理图形实体的地图,让 GeoGraphics 选择合适的坐标范围、投影等. 然后解释如何选择所有这些选项细调你所需要的地图.
最简单和最重要的操作是获取给定感兴趣区域的地图. Entity 框架提供快速和均一的方法获取位置信息. GeoGraphics 会选择充足的投影,一般来说,"Mercator" 投影适用于小中型规模(对角线大约小于 2000 公里).
GeoGraphics[primitives,options] | 绘制地图 |
通过使用选项值 GeoRange"World" 获取整个世界的地图. 默认情况下是使用所谓的 "Equirectangular" 投影给出这种地图,其中,水平轴是经度,垂直轴是纬度. 同样, GeoRange"Country" 给出国家地图,GeoGraphics 会选择使地图具有最小失真的投影.
你所在国家的地图,由 $GeoLocation 决定:
给出的地图显示了地理背景图像对应于给定的区域. GeoGraphics 语言提供各种称之为地理基元的对象,它可以放在地图上. 这些地理基元可以点状(Point 或 GeoMarker)、线状(GeoPath、GeoCircle、Line ...)或区域状(GeoDisk、GeoHemisphere、Polygon ...).
GeoPosition 和地理实体
地球上的指定位置是以 GeoPosition[{lat,lon}] 对象给出的,其中经纬度坐标是按标准规定按度数给出. GeoPosition 可以把输入的其他形式转换为方便的符号,包括地理图形的 Entity 和 EntityClass 对象.
GeoPosition[{lat,lon}] | 地球表面的位置 |
Entity["type",name] | 给定类型的实体 |
EntityClass["type",name] | 给定类型的实体类,等价于实体列表 |
以任何单位的 Quantity 对象给出角度:
把地理图形 Entity 数据转换成数字坐标:
EntityClass 对象被诠释为作为成员列表的表示:
距离和方位(角度)
除了给定地点的坐标位置,知道两点间的距离也很重要,以及从一点到另一点所要遵循的罗盘方向. 距离是沿测地线计算的,也就是说两个位置间的最短曲线. 角度是按方向给定,也就是按顺时针从北到测地线的角度(以度为单位). 在 Wolfram 语言中,地球表面的距离是用 GeoDistance 测量,方向是用 GeoDirection 计算.
GeoDistance[loc1,loc2] | 俩位置间的测地距离 |
GeoDirection[loc1,loc2] | 距离测地线 loc1 北的角度,从 loc1 到 loc2 |
GeoDisplacement[loc1,loc2] | 测地线 loc1 的距离和角度,从 loc1 到 loc2 |
GeoDestination[loc1,displ] | 由 displ 给定的测地线终点位置,起始为 loc1 |
使用 UnitConvert 改变为任何其他单位:
你也可以在 GeoDistance 自己的调用中改变需要的单位系统:
用 GeoDirection 计算方位. 目前该函数不处理多边形信息,只处理位置信息. 适当情况下,系统会发出警示信息.
GeoDirection 总是使用中心位置;因此,前面的结果与下面的一样:
GeoDisplacement 给出距离(米)和方位(度):
关系定位
我们经常需要知道离给定位置最短距离处的特殊类型的实体. 这是函数 GeoNearest 的角色. 如果延伸位置或实体,你可能会对包含关系感兴趣.
GeoNearest[enttype,loc] | 离 loc 最近的 enttype 类型的实体 |
GeoIdentify[enttype,loc] | 包含 loc 的 enttype 类型的实体 |
GeoEntities[reg,enttype] | enttype 类型的尸体被包含在区域 reg |
GeoWithinQ[reg,loc] | 检验 loc 是否包含在区域 reg 中 |
反之亦然,GeoEntities 列出在给定的延伸实体中的列表.
函数 GeoWithinQ 检验地理图形的位置(延伸或未延伸的)是否在地理图形区域内.
所有这些计算会发送给 Wolfram 地理服务器,然后下载结果. 在某些情况,可以使用 Nearest 进行本地操作.
地理实体变种
有些时候,你只想要一个国家主要区域的地图,不包括很远的小岛或附属地. 或许你可能需要包括所有领地的地图. 对于这些情况,Wolfram 语言使用标头 GeoVariant 指定其他信息.
GeoVariant[entity,variant] | 一个实体的地理图形变种 |
$GeoLocation 和 FindGeoLocation
Wolfram 语言使用 GeoIP 信息确定你的近似位置. 这可用 FindGeoLocation 实现,结果存于全局变量 $GeoLocation. 变量 Here 是访问当前地理位置的其他方式. 如果没有提供位置信息,与 GeoGraphics 相关的许多函数会使用当前地理位置信息. 你可以手动设置 $GeoLocation 为任何你想要的其他位置,这样你的 Wolfram 语言会话会使用该信息. 设置 $GeoLocation 的值后,变量 $GeoLocationCity 和 $GeoLocationCountry 将自动分配给包含 $GeoLocation 的城市和国家/地区,或最近的可能城市和国家/地区. 注意,改变 $GeoLocation 不会自动改变 $TimeZone.
$GeoLocation | 包含你当前地理位置的可重置变量 |
Here | 获取当前地理位置的更简单的方式 |
$GeoLocationCity | 离您当前地理位置最近的城市 |
$GeoLocationCountry | 离您当前地理位置最近的国家/地区 |
FindGeoLocation[] | 使用 GeoIP 信息获取当前地理位置 |
当前 $GeoLocation:
因此,GeoGraphics[] 默认使用该位置:
把 $GeoLocation 改变为其他位置:
使用 FindGeoLocation 找到地址的近似位置:
纬度和经度:GeoRange
指定经纬度坐标地图覆盖的区域的最常用的方法是使用选项 GeoRange{{latmin,latmax},{lonmin,lonmax}}. 一如既往,角度是按标准规定,以度给出. 任何其他地理区域规范,在内部最终会转换成这种范围规范,或许延伸为由 GeoRangePadding 选项确定.
GeoRange | 指定地图范围的 GeoGraphics 选项 |
GeoBounds 计算任何地理图形区域的经纬度:
GeoCenter
提供地理范围的其他方法是给出中心点和距离半径,定义地球表面的地理圆盘. 地理范围是完全包围地理圆盘的在 {lat,lon} 坐标中的长方形. 这可以用选项 GeoCenter 和 GeoRange 实现,后者只含有距离半径.
GeoCenter | 指定地图中心的 GeoGraphics 选项 |
地图区域的其他规范
GeoGraphics 接受输入中的位置信息,而不是地理基元中的. 该信息有助于地图范围的规范,但没有在与之关联的地图上渲染. 当只有中心信息可用时,地图的默认半径标尺是大约 10 英里.
当使用一个 Entity 对象时,GeoGraphics 咨询 EntityValue 是否存在关于位置和多边形的信息. 如果可以获得地理多边形,那么就意味着有一个清晰的标尺概念. 如果不能获得多边形,可以用中心位置和前面的默认标尺进行处理.
投影坐标
对于大区域,默认的投影是 "Equirectangular",其中地图坐标直接是经纬度. 然而,对于小一些的区域,选择其他投影会更方便减小失真. 地图坐标不会有直接的角度意义. 例如,对于小尺度(对角线大约小于 2000 公里),默认投影为 "Mercator",它会保留形状. 在这种情况下,水平轴仍然代表经度,但是垂直轴不再是纬度.
墨卡托投影经常用于网络中的地图服务. 但是,它高度扭曲了地级附近的距离和面积. 事实上,地级沿着垂直轴进行无限远映射,因此,墨卡托投影无法在地图上显示整个世界. GeoGraphics 允许你选择需要的投影,数据包 GeoProjectionData 提供最广泛的可用投影集合之一. 当没有指明明确的投影时,GeoGraphics 会给予地图的尺度和中心为你选择合适的投影.
GeoProjection | GeoGraphics 的选项,指明制图投影 |
GeoGridPosition 将在所选的投影中给出确切的坐标:
地理投影简介
制图投影函数是把地球表面上的点投影到平面地图表面上的点,该过程总是包括某种程度上的畸变. 这种函数有很多选择,实际的选择取决于结果的实用性和美观效果,诸如在某种程度上的最小化失真. 这将导致投影的多种可能分类.
许多投影是用几何方法,例如把球面上的点映射到切平面(“方位”投影)、切柱面(“圆柱”投影)、或切线锥面(“圆锥”投影)进行定义. 对于相应的正割情况,可以很容易产生公式. 在基本情况中,圆柱和圆锥的轴是与球的极轴对齐的.
地理投影带有参数. GeoProjectionData[projname] 给出投影参数的默认值.
填充
带有明确数值的经纬度范围的 GeoRange 选项返回确切的所需区域地图. 如果不是圆柱投影,地图的边界会是曲线,对应于指定的纬线和经线.
GeoRangePadding | GeoGraphics 的选项,指定地理范围填充 |
使用 GeoRangePaddingNone 完成长方形地图:
由地理图形 Entity 或 EntityClass 对象指定的地图构建,首先是用 GeoBounds 计算对象的经纬度边界,然后添加小的填充,最后高效使用 GeoRangePadding->Full 完成长方形绘制范围.
这是由 GeoGraphics 选择的地理范围:
最后,获取原始地图,用 Full 组合填充规范:
GeoRangePadding 选项很灵活. 它允许你对地图的四条边指定独立的填充,并允许使用不同的方法指定实际的填充:整个地图的距离、角度或缩放比例. 点击其名字的链接探索所有的可能性.
GeoZoomLevel 和 ImageSize
另外一种提供地理范围的方法是通过选择点(例如,使用 GeoCenter 或给出 GeoGraphics 的第一个参数中的点似对象)和缩放级别. GeoGraphics 会选择地理范围半径,这样,地理背景图像用 256×256 像素的小数字图块(一般是 10 左右)进行构建. 通过增加地图的 ImageSize 选项可能获取更大的地理范围.
GeoZoomLevel | GeoGraphics 选项,指定缩放级别 |
ImageSize | 指定最终地图上的像素大小的选项 |
点和标记
用不同的颜色画更大的点. 注意,你也可以使用 Point,无需把它映射到位置列表:
甚至可以使用 EntityClass 对象本身,因为它代表其成员列表:
GeoMarker 基元添加了在给定位置放置任何对象的灵活性.
在每个位置使用. 你可以使用图像本身,而不是图标 Entity 对象:
路径
GeoPath 基元表示在投影到平面地图之前的地球表面上的任何线段. 也就是说,GeoPath 对象是一个在地球曲面上具有几何意义的轨迹. 目前,支持三种这样的线段类型:"Geodesic"(两个给定点间的最短路径)、 "Loxodrome"(穿越所有具有同样方位或角度的经线的曲线)和 "GreatCircle"(通过其中心平面切割地球获得的曲线). 经线总是斜航线和大图圈. 纬线总是斜航线,但不必是大图圈. 赤道是唯一的又是大图圈的纬线.
GeoPath[locs,pathtype] | 用 pathtype 类型路径连接给定位置的基元 |
在两个给定点间,比较 GeoPath 的三个类型:
地理路径的命名类型,包括:{"Parallel",lat}、{"Meridian",lon} 以及特殊情形,例如,"Equator"、"PrimeMeridian" 或 "DateLineMeridian".
绘制部分纬线,从西到东或从东到西. 使用 Arrow 在地理路径中添加箭头:
圆和圆盘
中心为 p 且半径为 r 的地理圆是一个围绕 p 的闭合线,所有点距离 p 的地理距离为 r. 由于地球的曲率,地理圆的总长会小于 2π r,事实上,如果 r 继续增长,地理圆会开始减小尺寸,聚焦于 p 的对跖点.
半球
半球正好覆盖地球表面的一半,被穿过地球中心的平面所分隔. 因此半球的边界是一一个大圆(实际上是大椭圆,因为我们使用了地球的椭圆体模型). Wolfram 语言为半球提供两种类型的地理基元:一方面是曲面 p 点周围的半球 GeoHemisphere[p],另一方面是尤其重要的半球 DayHemisphere[date] 和 NightHemisphere[date],由给定日期太阳的位置决定. GeoHemisphere[p] 的边界是线 GeoHemisphereBoundary[p]. 昼夜半球的边界是 DayNightTerminator[date].
GeoHemisphere[loc] | 中心在 loc 的半球 |
DayHemisphere[date] | 给定日期的昼半球 |
NightHemisphere[date] | 给定日期的夜半球 |
GeoHemisphereBoundary[loc] | 中心在 loc 的半球边界 |
DayNightTerminator[date] | date 的昼夜半球间的明暗界线 |
某个高度的可见区域
地理半球可以被考虑为沿着某个方向可见的很远(实际是无限距离)的地球部分. 该节将介绍当视点在椭圆地球的表面的有限高度时的概念. 所获得的区域总是小于半球. 但是,几何结构非常相似:可见性区域由正割平面决定,但是不穿过地球的中心.
GeoVisibleRegion[loc] | 隆起位置 loc 处的可见区域 |
GeoVisibleRegionBoundary[loc] | 隆起位置 loc 处可见区域的边界 |
线、多边形以及其他标准图形基元
标准的非地理图形基元,像 Line、Polygon、Circle 等可被用于 GeoGraphics, 但是,是在平面地图而不是地球的表面,它们被诠释为基元. 它们具有在 Graphics 中一样的标准属性,任何两个连贯点间的 Line 和 Polygon 的线段都是直线.
另外,测地线的点是唯一定义的,Line 点则不是. 对于某些投影,黑线通过巴西,其他的则不是:
在所有情况下,一条测地线线段通过莫桑比克和马达加斯加,但是对应的 Line 线段对于不同的投影会穿过非洲的不同国家:
可以在标准的非地理基元中直接使用投影坐标,但是需要考虑使用何种投影. 这对于在地图上添加其他图形元素有用,但并不与地球表面存在的元素直接相关.事实上,你甚至可以使用与地球表面上任何点都不相关的坐标. 当使用这些时,高度建议在输入中明确定义投影,以避免 GeoGraphics 在添加更多基元时选择不同的投影.
使用不同的投影会自动修改用 GeoGraphics 指定的位置,但不是由投影坐标给出的位置:
PlotRange 和 GeoRange 完全是独立的选项. 一般,是指定 GeoRange,允许 GeoGraphics 选择选择合适的 PlotRange,但是你总是可以选择两者. GridLines 和 GeoGridLines 也是独立的:
高级用法:GeoGraphics 结果的结构
GeoGraphics 输入表达式的输出也具有标头 GeoGraphics,但是其第一个自变量现在是 Graphics 对象,实际显示为地图的图形对象. 该输出 GeoGraphics 总是包含带有绝对值的选项序列,在输入中给定的选项以及由 GeoGraphics 决定的选项.
分析输出中 GeoGraphics 的结构:
输出仍然具有标头 GeoGraphics:
第一个自变量是 Graphics 对象,然后是选项序列:
高级用法:地理基元的地理计算
GeoGraphics`GeoEvaluate 的第二个自变量指定使用的球体的模型,要么是米数,要么是 Quantity 距离,表示一个球体的半径,或者是旋转椭圆的半轴 {a,b} 对,也以米数或 Quantity 长度给出. 现在的结果是不一样的.
地图样式
GeoGraphics 继承 Graphics 的大量指令,可制作风格化的地图,包括颜色、透明度、纹理等. 它还可以添加地图特征的新元素,自动响应所使用的投影. 其中最重要的新元素是 GeoStyling[mapstyle,directive],它指定如何样式化地图的任意区域;这可能是用在特定的地理背景中.
GeoStyling[mapstyle] | 使用 mapstyle 样式化二维地理基元的内部 |
GeoBackground | GeoGraphics 的选项,指定背景地图样式 |
GeoStyling 像 Texture 一样有效工作,指定把什么放在下面的二维基元中,像地理圆盘或多边形. 在这个意义上,GeoBackground 选项被认为是指定在整个地图上放置什么的特殊情况.
GeoStyling 可用于显示限制在给定区域边界的地图:
两种灵活的地图样式:{"Image",image} 或 {"GeoImage",image} 允许你在地图上放置任意图像和图形. 不同之处是,第一种情况,图像会无变化的(或许只是改变宽高比)放置在给定区域,后一种情况,图像会沿着地图区域投影. 因此 "GeoImage" 自适应地放置地图片于其他地图上.
使用 "Image" 地图样式,在任何投影中图像会保留其定向:
不透明度和颜色
Graphics 二维基元默认情况下是模糊的,因为一般情况下,背景是空的,因此可以被覆盖. 然而,GeoGraphics 一般包含地图图像作为地理背景,它不应该完全被基元覆盖. 因此,二维基元的默认不透明度很小:0.2. 这对于 GeoGraphics 中如何处理不透明度有些轻微的扭曲,二维基元的不透明度需要区别于其他基元(点和线)的不透明度,它们在默认情况下仍然是模糊的. 这可以通过再次使用 GeoStyling 来完成.
使用 GeoStyling[opacity] 改变圆盘的不透明度,它不会影响厚的地理圆:
但是放置在 GeoStyling 内的颜色优先于二维基元,甚至是这之后给出的颜色:
地理网格线和比例尺
GeoScaleBar | GeoGraphics 选项,开启用户的比例尺 |
GeoGridLines | GeoGraphics 选项,开启格子线的使用 |
GeoGridLinesStyle | GeoGraphics 选项,指定地理网格线的样式 |
以 Quantity 角度指定格子线细分尺寸:
可以使用 GeoScaleBar 选项读取地图中的比例. 对于大型地图,点到点的距离比例因子可能不一样,因此,比例尺只表示平均值.
GeoModel | GeoGraphics 的选项指定基面或天球仪 |