我是靠谱客的博主 大胆抽屉,最近开发中收集的这篇文章主要介绍在ArcGIS Earth中自动化的绘制复杂图形,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

引言

在地图中精确的绘制一系列的图形一直是一个让人头疼的问题,一个个的输入坐标烦不胜烦,而且绘制完毕之后,如何保存分享也是问题。
这里我们将介绍一种简单的方法来解决这个问题:使用ArcGIS Earth 1.16版本AutomationAPI的drawings接口,可以在地图上精确的绘制一系列的图形。
效果如下:(原图审核不过,我就用这幅图片代替)

在这里插入图片描述

ArcGIS Earth

ArcGIS Earth作为一款免费的、轻量级的、易于使用的交互式三维地球平台,给非GIS专业的用户带来友好又便捷的使用体验。使用ArcGIS Earth不仅可以免费使用Esri提供的全球地形、影像服务,足不出户浏览探索地球;还可以添加自己数据,实现在三维空间内的数据展示,并满足用户绘制要素、量测、分享等需求。

今天ArcGIS Earth Desktop 1.16 版本正好发布啦,从这个页面就能看到它的新特性:

  • New templates for drawing lines and polygons have been added to support creating predefined shapes.
  • Filter is supported to define expressions for determining which features are shown on the map.
  • Remember certificate for PKI portal
  • No Basemap option
  • Summary tab for layer properties
  • Automation API:support drawings
  • Save/Save as in combination

这里就先暂时不翻译了,后面应该会有官方的介绍的。就先列一下相关的链接吧:

  • ArcGIS Earth 产品概览页面
  • 各版本新特性页面
  • 下载页面
  • Windows 英语版本下载链接

Drawings API

ArcGIS Earth Automation API就是在Earth运行的时候可以启动一个后台服务,用户可以以REST的方式和ArcGIS Earth Desktop通讯,在1.16版本里面新增了一个drawings功能,支持向ArcGIS Earth 发送POST DELETE等请求来绘制和删除图形。
然后通过软件原本的分享和保存功能,可以将图形以KML的形式保存到本地,并且可以将KML文件通过Arcgis online或其他形式分享给其他用户。

接口的详细说明在这个页面。添加图形的过程大致就是把一个json格式的点线面传给ArcGIS Earth。点图形的json格式示例如下:

{
  "id": "4b75ea4a-e10f-d676-307d-aa945e2a0712",
  "visible": true,
  "title": "addPoint",
  "geometry": {
      "x": -100,
      "y": 40,
      "spatialReference": {"wkid": 4326}
      },
   "symbol": {
       "type": "picture-marker",
       "url":"https://static.arcgis.com/images/Symbols/Shapes/BlackStarLargeB.png",
       "size": "64px"
      },
   "labelSymbol":{
        "type":"text",
        "color": [76,115,0,255],
        "size":12
    }
}

也是由geometrysymbol等字段组成的json。

开启autoamtion api

那么如何开启并使用drawings功能呢?这里简单介绍一下吧,需要打开ArcGIS Earth进行一下设置

在这里插入图片描述

  1. 从工具栏点击设置
  2. 从设置面板选择高级
  3. 滑动滚动条到Automation API区域,并勾选Enable Automation API
  4. 从Sample页面和Help页面获取更多信息

打开sample页面之后,可以用下面的方法进行绘制:

在这里插入图片描述

同样,打开helpe页面,可以使用swagger提供的功能了解API的详情或者Try it out。

官方还有一个repo来提供了.NET的客户端,可以使用这个客户端来调用API。

earth-api for python

通过上面的介绍,我们已经简单的了解了ArcGISEarth Desktop的相关功能, ArcGIS Earth Automation API的基本原理和使用方法。

但如果要高效的进行绘制,还是需要通过一些封装好的接口来实现的。这里介绍一下python的接口。

在这个页面可以看到arcgis-earth-automation-api for python的基本的介绍。

在我们完成了上面的步骤开启了automation api之后,我们可以使用earth-api for python来进行绘制。

首先进行安装

pip install earth-api

然后已获取相机位置为例:

from earth_api import EarthAPI
earth = EarthAPI()
status_code, camera = earth.get_camera()

通过上述三行代码就能获取相机的基本信息了,是不是非常简单呢?下面对这三行代码做一个简单地说明:

from earth_api import EarthAPI

这行代码是从earth_api这个库中引入了EarthAPI类,EarthAPI类中封装了所有的接口。

earth = EarthAPI()

这行代码创建了earth api的对象,传入参数还支持api的版本号等。

status_code, camera = earth.get_camera()

上面一行代码是通过api来获取相机位置,实际上是通过该PythonAPI向ArcGIS Earth发送了一个GET Camera的请求。然后返回了状态码和camera的对象,在此camera对象以dict的形式表现。

稍复杂的绘制

通过上面的介绍,想必大家已经对earth-api的使用有了基本的了解了。下面我们就以开头的图形为例来说明一下如何自动化的绘制图形。

首先,我们需要从文章中复制出区域的基本信息。

 a1 = "北纬25°15′26″、东经120°29′20″,北纬24°50′30″、东经120°05′45″,北纬25°04′32″、东经119°51′22″,北纬25°28′12″、东经120°14′30″四点连线。"
    a2 = "北纬26°07′00″、东经121°57′00″,北纬25°30′00″、东经121°57′00″,北纬25°30′00″、东经121°28′00″,北纬26°07′00″、东经121°28′00″四点连线。"
    a3 = "北纬25°34′00″、东经122°50′00″,北纬25°03′00″、东经122°50′00″,北纬25°03′00″、东经122°11′00″,北纬25°34′00″、东经122°11′00″四点连线。"
    a4 = "北纬22°56′00″、东经122°40′00″,北纬23°38′00″、东经122°51′00″,北纬23°38′00″、东经123°23′00″,北纬22°56′00″、东经123°09′00″四点连线。"
    a5 = "北纬21°14′00″、东经121°33′00″,北纬21°33′00″、东经121°18′00″,北纬21°07′00″、东经120°43′00″,北纬20°48′00″、东经120°59′00″四点连线。"
    a6 = "北纬22°43′00″、东经119°14′00″,北纬22°10′00″、东经119°06′00″,北纬21°33′00″、东经120°29′00″,北纬22°09′00″、东经120°32′00″四点连线。"

然后简单的提取出经纬度信息,由于上面的描述格式比较统一,我就用简单的方式来提取出经纬度信息吧。

# get degress, minutes, seconds from string
def get_degress_minutes_seconds(desc_string):
    # get degress
    degress = desc_string.split('°')[0][2:]
    # get minutes
    minutes = desc_string.split('°')[1].split('′')[0]
    # get seconds
    seconds = desc_string.split('°')[1].split('′')[1].split('″')[0]
    return degress, minutes, seconds

接着把经纬度信息构建为多边形的几何体,这里面我就以rings作为基本的几何单元吧。

首先将度分秒转换为度。

# convert degress, minutes, seconds to decimal degree
def convert_degress_minutes_seconds_to_decimal_degree(degress, minutes, seconds):
    decimal_degree = float(degress) + float(minutes) / 60 + float(seconds) / 3600
    return decimal_degree

然后构建ring,ring是首尾相连的线段。

def consturct_ring(lat_array, lon_array):
    ring = []
    for i in range(len(lat_array)):
        ring.append([lon_array[i], lat_array[i]])
    ring.append([lon_array[0], lat_array[0]])
    return ring 

最后我们把这些代码组合起来,实现从句子中获取了ring的信息。

# get location from string
def get_location_from_string(desc_string):
    # split string by '、' and ','
    sections = re.split(',|、', desc_string)

    lat_array = []
    lon_array = []

    for s in sections:
        if '北纬' in s:
            degress, minutes, seconds = get_degress_minutes_seconds(s)
            lat = convert_degress_minutes_seconds_to_decimal_degree(degress, minutes, seconds)
            lat_array.append(lat)
        if '东经' in s:
            degress, minutes, seconds = get_degress_minutes_seconds(s)
            lon = convert_degress_minutes_seconds_to_decimal_degree(degress, minutes, seconds) 
            lon_array.append(lon)
    return consturct_ring(lat_array, lon_array)

接着我们要创建一个arcgis earth automation api能识别的drawing对象,一会儿就把这个对象给传递给ArcGIS Earth。

def generate_drawings_from_string(name, desc_string):
    ring = get_location_from_string(desc_string)
    drawing = {
        "visible": True,
        "title":name,
        "geometry":{
            "rings":[
                    ring 
            ],
            "spatialReference":{
                "wkid":4326
            }
        }
    }
    return drawing

最后,我们需要调用earth-api将该对象添加到地图上。

earth_api = EarthAPI()
earth_api.add_drawing(drawing)

然后就实现了文章开头的效果。完整代码在这个链接,大概81行代码吧(含空行)

最后,使用earth-api给大家比个❤送给大家吧。

使用earth-api绘制爱心

今天就先到这里吧,更详细的介绍以后再慢慢展开。谢谢观看。

参考

十分钟玩转地球

十分钟学会在地球上恣意翱翔

十分钟学会在地球上寻踪觅迹

最后

以上就是大胆抽屉为你收集整理的在ArcGIS Earth中自动化的绘制复杂图形的全部内容,希望文章能够帮你解决在ArcGIS Earth中自动化的绘制复杂图形所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部