地理信息系统(GIS)系列——绪论

1、地理信息系统(GIS)简介

什么是地理信息系统

地理信息系统(Geographic Information System 或 Geo-Information system,GIS)有时又称为“地学信息系统”。它是一种特定的十分重要的空间信息系统。它是在计算机硬、软件系统支持下,对整个或部分地球表层(包括大气层)空间中的有关地理分布数据进行采集、存储、管理、运算、分析、显示和描述的技术系统。 可以简单点说,地理信息系统就是用地图信息描述数据的系统,他也不但是系统软件,可以说他是一门学科。因为他覆盖的范围非常广、应用的范围也非常广。

什么是地理信息系统二次开发

为了满足不同领域的用户地理信息系统的需要,“地理信息系统二次开发”是采用可视化语言,利用地理信息系统应用平台开发组件,重新组合功能应用,实现用户需求。例如:ArcGIS、百度地图API等等。例如:从地理信息系统基本操作、空间查询、空间分析、专题图制作以及三维场景浏览与分析等方面功能的实现,由浅入深地进行地理信息系统程序开发,地理信息系统二次开发又分为C/S和B/S两种开发模式,根据应用开发又分为企业级应用开发和大众级应用开发。

地理信息系统二次开发C/S

C/S开发,与我们的传统C/S开发概念一样,是桌面级应用开发,在地理信息系统C/S开发中,优点突出,比如:进行大量地理信息数据处理、编辑。缺点就是不能一次部署,共享应用。

地理信息系统二次开发B/S

B/S开发与C/S开发正好相反,使用浏览器进行使用操作,对大数据处理能力有限,但可以实现一次部署,共享应用。虽然近几年B/S方面大数据方面应用开发,有了很大进步,但还是很难满足需要。更适合应用与数据的浏览、查看、统计分析。

GIS企业级应用开发

GIS系统企业级应用开发,主要是使用专用的地理信息系统应用平台,进行二次开发,来实现地理信息的编辑、修改、规划、分析、各种算法应用。国内代表:SupMap、MapGIS、NewMap,国外代表:ArcGIS、MapInfo。

地理信息系统应用(企业级)

企业级地理信息系统应用,目前最流行的是,应用与智慧地球、智慧中国、智慧城市的应用中,使用与城市建设的各个领域。当前我们地理信息系统研发人员急缺,如:GIS毕业的学生缺少研发经验,有研发的人员缺少GIS经验。

GIS大众级应用开发

大众级应用开发,注意是实现一下大众化的搜索、查询、信息查看、定位等功能,不具备强大的分析、处理、规划功能。国内代表:百度地图、腾讯地图、高德地图,国外代表:Google地图。

当前最流行的地理信息系统应用(大众级)

LBS 位置信息,主要应用于手机、电脑的地理位置分析。
LBS是基于位置的服务,它是通过电信移动运营商的无线电通讯网络(如GSM网、CDMA网)或外部定位方式(如GPS)获取移动终端用户的位置信息(地理坐标,或大地坐标),在地理信息系统平台的支持下,为用户提供相应服务的一种增值业务。

GIS系统特点

  • 地理定位;
  • 具有采集、管理、分析和输出多种地理空间信息的能力;
  • 系统以分析模型驱动,具有极强的空间综合分析和动态预测能力,并能产生高层次的地理信息;
  • 以地理研究和地理决策为目的,是一个人机交互式的空间决策支持系统。

怎样学好地理信息系统研发

  • 熟悉地理系统相关知识
  • 学习一种GIS系统开发平台,国内推荐 Supmap,国外推荐 ArcGIS
  • 大众级别开发,国内推荐百度地图,国外推荐Google地图
  • 使用平台开发实战

2、ArcGIS简介

什么是ArcGIS

ArcGIS是美国Esri公司研发的构建于工业标准之上的无缝扩展的GIS产品家族。它整合了数据库、软件工程、人工智能、网络技术、云计算等主流的IT技术,宗旨在为用户提供一套完整的、开放的企业级GIS解决方案。

ArcGIS主要二次开发产品

  • ArcGIS Engine:基于桌面
  • ArcGIS Server:基于服务端
  • ArcGIS API:基于客户端

什么是ArcObjects

  • ArcObjects是ArcGIS底层的开发组件库。
  • ArcObjects包含了大量的可编程组件,为开发者集成了全面的GIS功能。
  • ArcObjects(简称AO)是ESRI公司ArcGIS 家族中基于Microsoft COM技术所构建的一系列COM组件集。

ArcGIS产品发展史

  • 1981年10月到1982年6月的9个月里,Esri开发出了ARC/INFO 1.0。
  • 1986年,PC ARC/INFO的出现是Esri软件发展史上的又一个里程碑,它是为基于PC的GIS工作站设计的。
  • 1992年,Esri推出了ArcView软件,它使人们用更少的投资就可以获得一套简单易用的桌面制图工具。
  • 1999年,发布 ArcInfo 8,同时也推出了ArcIMS,这是当时第一个只要运用简单的浏览器界面,就可以将本地数据和Internet网上的数据结合起来的GIS软件。
  • 2004年4月,Esri推出了新一代9版本ArcGIS软件,为构建完善的GIS系统,提供了一套完整的软件产品。
  • 2010年,Esri推出ArcGIS 10。这是全球首款支持云架构的GIS平台,在WEB2.0时代实现了GIS由共享向协同的飞跃;同时ArcGIS 10具备了真正的3D建模、编辑和分析能力,并实现了由三维空间向四维时空的飞跃;真正的遥感与GIS一体化让RS+GIS价值凸显。
  • 当前最高版本ArcGIS 10.8。

ArcGIS主要API

Web端:

  • ArcGIS for Silverlight
  • ArcGIS for Flex
  • ArcGIS for Javascript

手机端

  • ArcGIS for Android
  • ArcGIS for IOS
  • ArcGIS for Windows Phone

ArcGIS for JavaScript

ArcGIS for JavaScript(JavaScript API)是 ESRI 根据 JavaScript 技术实现的调用ArcGIS Server REST API接口的一组脚本。通过 ArcGIS for JavaScript 可以将ArcGIS Server提供的地图资源嵌入到Web应用中。ArcGIS for JavaScript API是基于Dojo框架的,使用了大量的Dojo技术,因此要想熟练掌握API用法,先要对javascript Dojo框架有个深入的了解。

3、GIS 相关技术

Web开发技术

Web开发技术总共有6个阶段:

  • 第一阶段:静态内容阶段
    Web由大量HTML文档组成。
  • 第二阶段:CGI程序阶段
    Web服务器增加了一些编程API,通过这些API编写的应用程序,可以向客户端提供一些动态变化的内容。Web服务器与应用程序之间的通讯通过CGI协议完成。
  • 第三阶段:脚本语言阶段
    服务器端出现了ASP/PHP/JSP/等支出Session的脚本技术,浏览器出现了java Applet/javascript等技术。
  • 第四阶段:瘦客户端阶段
    服务器出现了独立于Web服务器的应用服务器,同事出现了Web MVC开发模式,基于这些框架的应用,通常都是瘦客户端应用,因为他们是在服务器生产全部的动态内容。
  • 第五阶段:RIA应用阶段
    出现了多种RIA技术(富互联网应用)技术。如:DHTML+AJAX,flex,Silverlight等。
  • 第六阶段:HTML5
    HTML5 + 各种 JavaScript 框架。

Web服务技术

1998年开始发展XML技术,随后蓬勃发展的Web服务技术正式基于XML技术。Web服务技术主要目标是在现有的各种异构平台基础上构筑一个通用的与平台无关、语言无关的技术层,各种不同平台之上的应用依靠这种技术层来实施彼此的联通和集成。将Web服务用于GIS,实现了基于Web服务体系的GIS跨越。

WebGIS技术

WebGIS技术是基于Web的GIS技术,WebGIS1.0是基于早期网络环境提出的,WebGIS2.0主要是Web服务、REST与Ajax等技术,ArcGIS API For JavaScript正是一套构建WebGIS2.0应用的API。

4、WebGIS基础——基于OGC的WEB服务

什么是OGC

  • OGC一个是由多个企业、大学、政府部门组成的非盈利组织,最初目的是想提供一套综合的开放性接口规范,以便开发商可以根据这些规范来编写互操作组件,以满足GIS互操作的要求,后来就成为一个专门发展OpenGIS规范的机构,以制定和推进开放的空间数据互操作规范为目标。
  • 对于Web服务在空间信息领域的应用,OGC表现了极大的关注。2001年3月,OGC发出技术请求,启动了OWS标准的开发进程。
  • 在OGC制定的规范中,从规范的名称中也可以看出向Web服务的发展趋势,从原先用Server,后来用Service,这实际上体现了从传统的WebGIS向Web服务观念的转变。

OWS服务体系

在OWS服务体系中,主要的部分包括:

  • 地理数据服务(DateSercice)—提供对空间数据的服务,主要有WFS(Web FeatureService,矢量数据服务),WCS(WebCoverage Service,栅格数据服务)。地理数据服务返回的结果通常是带有空间参照系的数据。
  • 地理描述服务(PortrayalService)—提供对空间数据的描述,主要有WMS(Web Map Service,地图服务),其中地图可以由多个图层组合起来,每个地图可以用SLD(Styled Layer Descriptor)来对地图进行描述。地图服务的返回结果通常是矢量图形或栅格图形。
  • 过程处理服务(ProcessingService)—提供地理数据的查找、索引等服务,主要有Geocoder(地学编码范围)、 Gazetteer(地名索引服务)、 Coordinate Transfer Service (坐标转换服务等)。
  • 发布注册服务(Registry)—提供各种服务的注册服务,以便于服务的发现。其中包括数据类型、数据实例、服务类型、服务实例的注册服务。注册服务提供了各个注册项的登记服务、更新及查找服务。
  • 客户端应用(ClientApplication)—及客户端的基本应用,如地图的显示、地图浏览以及其他一些增值服务。

OWS常用服务类型

注册服务

注册服务提供了一个分类、注册、描述、搜索、维护和访问WEB资源信息的公共机制。注册中有不同的角色,如:数据类型目录(地理特征、覆盖、传感器等类型)、在线数据实例目录(数据集、数据仓库、符号库等)、服务类型目录(WFS,WCS,WMS等)、在线服务实例目录。

处理服务

处理服务提供对地理空间数据进行操作和增值服务,典型的处理服务包括:坐标转换服务(CTS)、地理编码服务、地名词典服务。

描述服务

提供对地理空间信息进行可视化的能力,如:WMS,CPS。

数据服务

数据服务提供对数据集和数据仓库的访问,如:WFS,WCS,SCS,IAS。

编码服务

所有OpenGIS框架的编码规范采用XML Schema来定义,如:GML,XIMA,SLD,LOF 等。

OpenGIS

OpenGIS(Open Geodata Interoperation Specification,OGIS,开放的地理数据互操作规范)由美国OGC(OpenGIS协会,Open Geospatial Consortium)提出。

服务的请求方式

服务的请求方式有两种,分别是Get和Post。

5、WebGIS基础——ArcGIS Server

什么是ArcGIS Server

  • ArcGIS Server 是一个基于Web的企业级GIS解决方案,它从ArcGIS 9.0版本开始加入Esri产品家族。
  • ArcGIS Server为创建和管理基于服务器的GIS应用提供了一个高效的框架平台。他充分利用了ArcGIS的核心组件库ArcObjects,并基于工业标准提供Web GIS服务。ArcGIS Server将两项功能强大的技术——GIS和网络技术结合在一起,GIS擅长与空间相关的分析和处理,网络技术则提供全球互联、促进信息共享。

ArcGIS Server的优势和特点

  • 集中式管理代来低成本。
  • 瘦客户端也可以享受到高级GIS服务。
  • 使WebGIS具备了灵魂的数据编辑和高级GIS分析功能。
  • 支持大量并发,具有负载均衡能力。
  • 可以根据工业标准很好的与其他企业系统整合,进行协调工作,为企业经营管理提供支持。
  • ArcGIS Server的出现使我们可以利用主流网络技术定制适合自身需要的网络GIS解决方案,具有更大的可伸缩性来满足多样化的企业需求。

ArcGIS Server站点的架构

ArcGIS Server站点组成

ArcGIS Server 发布的服务类型

ArcGIS Server有多种不同的服务,包括地图服务、要素服务、影像服务等。

地图服务
  • 切片地图:为快速显示地图,预先将地图切成一定规格的图片。
  • 动态地图:根据每个请求动态的绘制地图。
  • KML:生成Google Earth等支持的KML格式数据。
  • OGC返回遵循OGC相关标准的地图数据(包含:WCS/WFS/ WMS/ WMTS)。
要素服务

OGC 返回地图或图层中矢量要素的空间几何位置与信息属性信息,有应用程序的客户端而不是服务器负责绘制要素,OGC用户返回遵循OGC相关标准的数据(包含:WCS/WFS/WFS-T/WMS/WMTS)。

地理处理服务

OGC 将地理处理功能发布为WEB服务,如:WEB打印等。只有ArcMap成功执行的功能才能发布。

影像服务

提供栅格和影像服务。

网络分析服务

提供交通网络分析,例如:查找最近设施。

几何服务

将几何计算功能发布为服务。

Globe服务

将ArcGlobe文档发布为WEB服务。

Web REST 服务的URL

http://服务器名:端口/arcgis/rest/services

使用ArcGIS Server Rest服务的过程
  • 构建请求 URL
  • 提交请求到 ArcGIS Server
  • 接受 ArcGIS Server 响应
  • 解析和使用响应
支持输出的格式
  • Html
  • Json
  • Image
  • Help
  • Lyr
  • Nmf
  • jsapi

6、WebGIS基础——ArcGIS API for JavaScript

ArcGIS API for JavaScript 简介

ArcGIS API for JavaScript(JavaScript API)是基于浏览器的 API,用于开发高性能、易于使用的地图应用。API 允许您很容易地在web页面中嵌入地图。JavaScript API由 Esri ArcGIS online 托管,并且免费使用。
下载地址:https://developers.arcgis.com/javascript/jsapi/argument_aliases.html
学习地址:https://developers.arcgis.com/javascript/jsapi/argument_aliases.html

ArcGIS API for JavaScript 功能

  • Esri 提供的Javascript API除了ArcGIS API for JavaScript外,还有分别针对其他服务的扩展API,如:微软 Bing 地图扩展 API,Google 地图扩展 API。
  • 以自己的数据与服务器上的数据组合显示地图。
  • 在ArcGIS Online基础地图上叠加自己的数据。
  • 在GIS数据中查找要素或者属性。
  • 在服务上执行GIS模型并显示结果。

ArcGIS API for JavaScript 包含内容

  • 地图显示
  • 地图绘制
  • 地图任务
  • 使用Dojo与其他类库进行扩展

ArcGIS API for JavaScript 常用API库

  • esri:ArcGIS 常用API包
  • esri/arcgis:组件扩展包
  • esri/dijit:界面库包
  • esri/dijit/analysis:分析包
  • esri/dijit/editing:地图编辑包
  • esri/dijit/util:其他内容
  • esri/geometry:几何分析包
  • esri/layers:图层包
  • esri/plugins:插件包
  • esri/process:进程包
  • esri/renderers:渲染包
  • esri/styles:样式包
  • esri/symbols:符号包
  • esri/tasks:任务包
  • esri/toolbars:工具包

ArcGIS API for JavaScript 与 dojo

ArcGIS API for JavaScript构建在 dojo 之上,从而充分利用 dojo 来屏蔽各种浏览器的差异。
Dojo 是一个 JavaScript 实现的开源 DHTML 工具包。

开发环境

  • 开发工具:Visual Studio 2013
  • 数据库:Oracle 11G
  • Arcgis 10.1
  • Arcgis API for JavaScript 3.9

7、空间参考系统

什么是空间参考系统

确定地理目标平面位置和高程的平面坐标系和高程系的统称,包含地理坐标系统和投影坐标系统。

什么是地理坐标系统

地理坐标系,也可称为真实世界的坐标系,是用于确定地球物体,在地球上位置坐标系。
因为GIS描述的是位于地球表面的信息,所以根据地球建立的地理坐标系(经纬网)可以作为所有要素的参照系统。这类用经度纬度来决定坐标的系统,成为地理坐标系统。

什么是投影坐标系统

因为地球是一个不规则的球体,为了能够将其表面的内容显示在平面的显示器或纸面上,必须进行坐标变换。由于地球表面是不可展开的曲面,也就是说曲面上的各点不能直接表现在平面上,因此必须运用地图投影的方法,建立地球表面和平面上点的函数关系,使地球表面上任一点由地球坐标确定的点,在平面上必有一个与它相对应的点。这类经过投影变换后的坐标系统,称为投影坐标系统。

空间参考系统的类

  • esri/SpatialReference
构造函数
new SpatialReference(json)
var spatialReference = new SpatialReference({wkid:32662});

new SpatialReference(wkid)
var sr = new SpatialReference(4326);

new SpatialReference(wkt)
var sr = new SpatialReference(
	'GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",    	
	SPHEROID["WGS_1984",6378137.0,298.257223563]], 
	PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]');

WKT是一种文本标记语言,用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。

SpatialReference 属性
  • wkid:空间参考 ID
  • wkt:定义了一个空间引用的文本
SpatialReference 方法
  • isWebMercator():判断是否为墨卡托坐标系
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <!--The viewport meta tag is used to improve the presentation and behavior of the samples on iOS devices-->
    <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no">
    <title>Points in Extent</title>

    <link rel="stylesheet" href="http://js.arcgis.com/3.14/dijit/themes/claro/claro.css">
    <link rel="stylesheet" href="http://js.arcgis.com/3.14/esri/css/esri.css">
    <script src="http://js.arcgis.com/3.14/"></script>
    <script>
        dojo.require("esri.map");
        dojo.require("esri.toolbars.draw");
        dojo.require("esri.tasks.query");

        // global variables
        var map, defaultSymbol, highlightSymbol, resultTemplate;

        function init() {
            // 创建底图
            map = new esri.Map("map", {
                basemap: "streets",
                center: [-120.275, 47.485],
                zoom: 6,
                slider: false,
                showInfoWindowOnClick: false
            });
            // 加载地图,初始化工具
            dojo.connect(map, "onLoad", initToolbar);
            var sr = new esri.SpatialReference({ wkid: 102100 })
            map.SpatialReference = sr;
            // 创建符号
            defaultSymbol = new esri.symbol.SimpleMarkerSymbol().setColor(new dojo.Color([0, 0, 255]));
            highlightSymbol = new esri.symbol.SimpleMarkerSymbol().setColor(new dojo.Color([255, 0, 0]));

            // 数据查询
            var queryTask = new esri.tasks.QueryTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StatesCitiesRivers_USA/MapServer/0");
            var query = new esri.tasks.Query();
            query.where = "STATE_NAME = 'Washington'";
            query.outSpatialReference = map.SpatialReference;
            query.returnGeometry = true;
            query.outFields = ["CITY_NAME"];
            // 添加到地图中
            queryTask.execute(query, addPointsToMap);

            // 信息显示
            resultTemplate = new esri.InfoTemplate("City", "<tr><td>${CITY_NAME}</tr></td>");
        }

        // initialize drawing toolbar
        function initToolbar(map) {
            var tb = new esri.toolbars.Draw(map);

            // 绘图结束后
            dojo.connect(tb, "onDrawEnd", findPointsInExtent);

            // 设置绘图模式
            tb.activate(esri.toolbars.Draw.EXTENT);
        }

        // 添加点到地图
        function addPointsToMap(featureSet) {
            dojo.forEach(featureSet.features, function (feature) {
                map.graphics.add(feature.setSymbol(defaultSymbol).setInfoTemplate(resultTemplate));
            });
        }

        // 范围查询
        function findPointsInExtent(extent) {
            var results = [];
            dojo.forEach(map.graphics.graphics, function (graphic) {
                if (extent.contains(graphic.geometry)) {
                    graphic.setSymbol(highlightSymbol);
                    results.push(graphic.getContent());
                }
                    // else if point was previously highlighted, reset its symbology
                else if (graphic.symbol == highlightSymbol) {
                    graphic.setSymbol(defaultSymbol);
                }
            });

            // display number of points in extent
            // 查询数量
            dojo.byId("inextent").innerHTML = results.length;

            // display list of points in extent
            // 查询结果
            dojo.byId("results").innerHTML = "<table><tbody>" + results.join("") + "</tbody></table>";
        }

        dojo.addOnLoad(init);
    </script>

  </head>
  <body class="claro">
    Draw an Extent on the map to find all points within this extent
    <!-- map div -->
    <div id="map" style="width:800px; height:400px; border:1px solid #000;"></div>
    <br>

    <!-- display number of points in drawn extent -->
    <b># of points in extent = <span id="inextent">0</span></b>

    <!-- list points in extent -->
    <div id="results" style="width:400px; height:200px; border:1px solid #000; overflow:auto;"></div>
  </body>
</html>

8、参考系统转换

参考系统转换方法

对于简单的参考系统转换,直接使用 esri/geometry/webMercatorUtils 模块中的功能函数即可。对于复杂的系统转换,可以调用服务器的几何对象服务esri/tasks/GeometryService。 几何对象服务的 project 方法可用于实现投影或投影转换。

webMercatorUtils

  • esri/geometry/webMercatorUtils
Web 墨卡托投影坐标和地理坐标之间的转换
canProject(source, target)
  • 如果参数1与参数2的空间参考系统相同,返回true
var pt = Point(0, 0);
if (webMercatorUtils.canProject(pt, map)) {
  result = webMercatorUtils.project(pt, map);
}
geographicToWebMercator(geometry)
  • 从地理坐标转换为Web墨卡托投影
lngLatToXY(long, lat)
  • 将给定的经度和纬度值转换到 Web 墨卡托投影
require([
  "esri/geometry/webMercatorUtils", ... 
], function(webMercatorUtils, ... ) {
  webMercatorUtils.lngLatToXY(-120, 33);
  ...
});
project(geometry, target)
  • 转换为几何目标端的项目
var pt = Point(0, 0)
if (webMercatorUtils.canProject(pt, map)) {
  result = webMercatorUtils.project(pt, map);
}
webMercatorToGeographic(geometry)
  • 将从 Web 墨卡托投影几何单位转换为地理单元
require([
  "esri/geometry/webMercatorUtils", ... 
], function(webMercatorUtils, ... ) {
  query.geometry = webMercatorUtils.webMercatorToGeographic(geometries[0]);
  ...
});
xyToLngLat(x, y)
  • 将给定的 Web 墨卡托投影坐标转换为经度和纬度
require([
  "esri/geometry/webMercatorUtils", ... 
], function(webMercatorUtils, ... ) {
  var normalizedVal = webMercatorUtils.xyToLngLat(42215329, 1321748);
  console.log(normalizedVal); 			// returns 19.226, 11.789

  var value = webMercatorUtils.xyToLngLat(42215329, 1321748, true);
  console.log(value); 					// returns 379.22, 11.78
  ...
});

GeometryService

  • esri/tasks/GeometryService
  • 代表几何服务资源
<!DOCTYPE html>
<html> 
  <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
    <!--The viewport meta tag is used to improve the presentation and behavior of the samples on iOS devices-->
    <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"/>
    <title>OpenStreetMap</title> 
    <link rel="stylesheet" type="text/css" href="http://localhost:2686/arcgisjs/js/dojo/dijit/themes/tundra/tundra.css" />
    <script type="text/javascript" src="http://localhost:2686/arcgisjs/init.js"></script>
    <script type="text/javascript" src="http://localhost:2686/arcgisjs/jsapi_vsdoc12_v38.js"></script>
    <link rel="stylesheet" type="text/css" href="http://localhost:2686/arcgisjs/js/esri/css/esri.css" />
    <script>
        var map;
        require([
   			"esri/geometry/webMercatorUtils", 
   			"esri/map"
        ], function (
        	webMercatorUtils, 
        	Map
        ) {
        	// 经纬度转换为墨卡托
            var number = webMercatorUtils.lngLatToXY(-120, 33);
            // 墨卡托转换为经纬度
            var normalizedVal = webMercatorUtils.xyToLngLat(42215329, 1321748);
            alert("经纬度转换墨卡托:"+number[0] + "/" + number[1]);
            alert("墨卡托转经纬度:"+normalizedVal[0] + "/" + normalizedVal[1]);
        });

    </script> 
  </head> 
  
  <body class="claro" style="font-size: small; font-family: Arial Unicode MS,Arial,sans-serif;"> 
    <div id="map" style="position:relative;width:700px; height:500px; border:1px solid #000;"></div> 
  </body> 
</html>


已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页