Delphi、C++ Builder & .NET sgcUI 的一部分

sgcMaps,适用于 Delphi、C++ Builder & .NET 的原生地图

无需浏览器控件,也无需一行 JavaScript,就能在您的应用程序中放入真正的地图。sgcMaps 自行绘制栅格和矢量瓦片,添加 WMS 和 WMTS 服务器的图层,显示数千个聚合标记、路线和区域,对地址进行地理编码,并借助本地瓦片和离线路由器在离线状态下继续工作。

VCL、FireMonkey、Lazarus、WinForms、WPF、Avalonia无浏览器控件,无 JavaScript免费 .NET 社区版包含在 sgcUI Enterprise 中
TsgcVCLMap 用矢量瓦片显示马德里市中心,带有红色和蓝色位置标记

地图应用所需的一切

十八项功能,每项都附有真实的 API 和对应的帮助主题。

瓦片和地图数据

地图控件自行绘制每一块瓦片,来源可以是瓦片服务器、WMS 或 WMTS 服务、矢量源或磁盘上的文件。

窗体中的真正地图,内部没有浏览器

瓦片和地图数据

窗体中的真正地图,内部没有浏览器

大多数地图组件封装的是 Web 视图和 JavaScript 库,因此您的桌面应用程序最终会带着一个浏览器发布。sgcMaps 不会。TsgcVCLMap 和 TsgcFMXMap 在自己的画布上下载、缓存并绘制瓦片,处理鼠标滚轮缩放和拖动平移,并引发普通的 Delphi 事件。您的地图和其他控件一样是原生控件:可以停靠,随窗体应用主题,调试方式也与代码的其余部分相同。没有需要部署或加固的额外进程,地图在您的应用程序运行的每台机器上表现都一样。

  • Layers 集合包含一个或多个 TsgcMapLayer 项,每个都有自己的 TileSourceType
  • TsgcFMXMap 在 Windows 上自 Delphi XE6 起可运行,在 macOS、iOS 和 Android 上自 Delphi 10.4 起可运行
  • Lazarus LCL 控件显示磁盘上的瓦片
  • 在 .NET 中,用于 WinForms 的 SgcMapControl、用于 WPF 的 TsgcWpfMap、用于 Avalonia 12 的 TsgcAvaloniaMap 和无界面的 MapView 共用一个引擎
  • 支持阿拉伯语和希伯来语的从右到左:缩放按钮、图层切换器、指南针、比例尺和版权归属移到相反一侧,而地图保持其地理方位
阅读帮助主题
用一个属性选择瓦片提供商

瓦片和地图数据

用一个属性选择瓦片提供商

选择底图不应该意味着去阅读瓦片服务器文档。在图层上设置 Provider 并调用 sgcMapApplyProvider:图层就会获得该提供商的 URL 模板、最大缩放级别和署名文字。OpenStreetMap、OpenTopoMap、Esri World Imagery 和 Esri World Street 无需密钥即可使用。MapTiler、Thunderforest 和 Stadia 需要您自己的 API 密钥。您自己的瓦片服务器只需一个 URL 模板。每个图层都有自己的提供商,因此卫星图层和街道图层可以同处一张地图,用户直接在地图上切换。

  • 无需密钥:mtpOpenStreetMap、mtpOpenTopoMap、mtpEsriWorldImagery、mtpEsriWorldStreet
  • 使用您的密钥:mtpMapTilerStreets、mtpMapTilerSatellite、mtpThunderforestCycle、mtpThunderforestTransport、mtpStadiaAlidadeSmooth
  • mtpCustom 配合 URLTemplate 可读取任意 {z}/{x}/{y} 服务器
  • 提供商的署名会自动绘制在地图上
  • ShowLayerSwitcher 在地图上放置一个图层按钮
阅读帮助主题
任何尺寸下都保持清晰的矢量瓦片

瓦片和地图数据

任何尺寸下都保持清晰的矢量瓦片

栅格瓦片缩放时会变模糊,而且每次样式更改都意味着要从服务器获取新图像。使用矢量瓦片时,控件接收几何数据,自行绘制道路、水系、建筑和标签,因此文字在高 DPI 屏幕和导出的图像中都保持清晰。让图层指向 Mapbox Vector Tile 服务器,并将 VectorStyleFile 留空即可使用内置样式,也可以加载 MapLibre 或 Mapbox GL 样式文件来匹配您的品牌。矢量图层在 VCL 和 FireMonkey 控件中都可使用。

  • mtsVectorHTTP 读取矢量瓦片服务器,自 Delphi XE2 起支持
  • mtsVectorMBTiles 读取本地矢量 MBTiles 文件(离线包)
  • mtsVectorPMTiles 从 PMTiles 归档(本地文件或 URL)读取矢量瓦片(离线包)
  • TsgcMapVectorStyle 通过 LoadFromFile 或 LoadFromJSON 加载样式
  • 解码和绘制位于 TsgcMapTileSource_MVT 中,使用纯 Delphi 代码
阅读帮助主题

瓦片和地图数据

来自您的 WMS 和 WMTS 服务器的图层

城市、公用事业和测绘机构通常以 OGC 网络服务而不是 z/x/y 瓦片的形式发布土地利用、地籍和正射影像。将 TileSourceType 设置为 mtsWMS 或 mtsWMTS,图层就会从服务请求图像,既可以作为底图上的透明叠加层,也可以直接作为底图。capabilities 读取器会列出服务提供的图层并为您配置图层,因此用户按标题选择图层,而不必输入请求参数。

  • mtsWMS 发送 WMS 1.3.0 或 1.1.1 的 GetMap 请求,Layers、Styles、ImageFormat 和 Transparent 在图层的 WMS 选项中设置
  • mtsWMTS 通过图层的 WMTS 选项读取 KVP 和 REST 服务
  • TsgcMapWMSCapabilities 和 TsgcMapWMTSCapabilities 加载 capabilities 文档,ApplyToLayer 据此设置图层
  • 服务器返回的异常文档会连同其文本传给 OnTileError
  • 在 .NET 中为 TileSourceType.Wms 和 TileSourceType.Wmts,以及 WmsCapabilities 和 WmtsCapabilities

所有版本均可使用,包括免费的社区版,自 Delphi 2009 起。地图保持 Web Mercator 投影:WMS 图层以 EPSG:3857 请求,WMTS 图层需要 Web Mercator 瓦片矩阵集(如 GoogleMapsCompatible),不支持 GetFeatureInfo。

阅读帮助主题

瓦片和地图数据 仅限注册版

网络断开时继续工作

地下室里的现场技术人员、海上的船只或工厂车间的网络,都不能依赖瓦片服务器。sgcMaps 读取磁盘上的瓦片,与读取网络瓦片完全一样。给图层设置 CacheFolder,它获取的每块瓦片都会保留到下次运行。要获得完整的离线包,TsgcMapTileDownloader 会提前把一个区域和缩放范围下载到文件夹或 MBTiles 文件中。

  • mtsFolder 读取 PNG 或 JPEG 瓦片的 z/x/y 文件夹
  • mtsMBTiles 读取栅格 MBTiles 文件,自 Delphi XE7 起支持(FireDAC SQLite)
  • CountTiles 在开始下载前告诉您下载的大小;DelayMS 和 OnProgress 让下载保持礼貌且可见
  • 批量下载必须遵守提供商的条款:OpenStreetMap 瓦片仅供交互式查看

社区版可读取 z/x/y 瓦片文件夹,并保留每个图层的 CacheFolder。瓦片下载器、MBTiles 和 PMTiles 文件属于离线包。

阅读帮助主题

瓦片和地图数据 仅限注册版

整个区域放进一个 PMTiles 文件

PMTiles 归档把完整的瓦片金字塔放在单个文件中,您可以把它复制到笔记本电脑,或放在任何静态网络服务器上,无需运行瓦片服务器。sgcMaps 可以从本地文件读取归档,也可以通过 HTTP range 请求直接从网络服务器读取,并把已读取的目录保存在缓存中,因此只有视图内的瓦片会通过网络传输。

  • mtsPMTiles 用于 PNG 和 JPEG 栅格归档,mtsVectorPMTiles 用于 Mapbox Vector Tile 归档
  • TileSourcePath 接受文件名或 http、https URL
  • TsgcMapTileSource_PMTiles 会报告归档的缩放范围、边界、中心和元数据
  • 支持 PMTiles 版本 3;包含 WebP 瓦片的归档会被报告为不受支持
  • 自 Delphi XE2 起,在 .NET 中位于注册版 esegece.sgcMaps 包

PMTiles 与 MBTiles 一样属于离线包,因此包含在注册版中,不包含在免费的社区版中。

阅读帮助主题

标记、形状和几何

把您自己的数据放到地图上,在每个缩放级别都保持可读,并完成背后的计算。

标记、形状和几何

数千个标记,依然清晰可读

车队、门店网络或传感器网格很快就会变成一团重叠的图钉。启用聚合后,相邻的标记会合并成一个带编号的气泡,用户放大时再次拆开,并在每个缩放级别重新计算。每个标记都带有自己的弹出框、提示和图标,点击、拖动和聚合点击都以事件形式送达,因此地图成为您工作流程的一部分,而不只是一张图片。标记可以根据您的数据在循环中添加,也可以从 GeoJSON、GPX 和 KML 文件导入,ClearMarkers 一次调用即可重置它们。

  • MarkerOptions.Clustering 配合 GridSize、MinClusterSize 和 ZoomOnClick
  • 每个标记都有 PopupText、TooltipText 和 IconBitmap
  • OnMarkerClick、OnClusterClick 和 OnMarkerDragEnd 事件
  • 批量加载时用 BeginUpdate 和 EndUpdate 包住;FitToMarkers 让所有标记入框
  • MarkerAtScreen 和 ClusterAtScreen 对任意像素进行命中测试
阅读帮助主题
一张地图上的路线、区域和热力图

标记、形状和几何

一张地图上的路线、区域和热力图

大多数地图界面需要的不只是图钉:计划的配送路线、仓库的服务区域、客户周围的半径、订单来自哪里。sgcMaps 把它们都绘制为地图模型的项,坐标与您的标记相同。形状可以设为可编辑,用户可以用鼠标拖动区域的顶点,编辑结束时您的代码会收到通知。标签在某个坐标放置文字,带有自己的字体、颜色和背景,使区域名称和路线编号始终附着在地图上。

  • AddPolyline,支持 Dashed 和 Geodesic 线
  • AddPolygon 配合 AddHole,以及 AddRectangle、AddCircle(RadiusMeters)和 AddLabel
  • Editable 形状通过 OnShapeEdited 报告更改
  • TsgcMapHeatmap 通过 AddPoint 接受加权点,并有 MaxIntensity
阅读帮助主题

标记、形状和几何

地理计算已经写好

这辆车在区域内吗?最近的仓库有多远?路线上哪个点离客户最近?每个地图应用程序都会遇到这些问题,而且在极点附近或长距离时很容易算错。几何单元在 WGS84 球面上回答这些问题,使用的是普通函数,您也可以在没有地图的服务中调用。这些函数接受普通的 TsgcMapCoord 记录,当您绘制自己的叠加层时,sgcMapLatLonToPixel 和 sgcMapPixelToLatLon 可在屏幕坐标和世界坐标之间转换。

  • sgcMapDistance(单位为米)、sgcMapInitialBearing 和 sgcMapDestinationPoint
  • sgcMapPointInPolygon 和 sgcMapPointInPolygonWithHoles 用于地理围栏
  • sgcMapNearestPointOnPolyline 把位置吸附到路线上
  • sgcMapGeodesicInterpolate 和 sgcMapSimplify 让线条平滑而轻量
阅读帮助主题

搜索和路线规划

使用在线提供商查找地址和规划路线,也可以完全离线,无需 API 密钥。

搜索和路线规划

地理编码、导航和地点,统一在一套 API 之后

每个地理编码和路线规划提供商都有自己的 REST 格式、密钥和怪癖。服务组件把它们隐藏起来:您选择提供商,需要时设置密钥,然后调用相同的方法,同步或异步均可。从一个提供商切换到另一个只需更改一个属性,而不必重写,结果会以 Delphi 对象的形式返回,可直接放到地图上。每个组件都共用 TsgcMapService 基类,因此 ApiKey、UserAgent 和 LastError 对每个提供商的工作方式都相同。

  • TsgcMapGeocoder:Nominatim、Google、HERE、Azure Maps、Mapbox、OpenRouteService 和 Geoapify
  • TsgcMapDirections:OSRM、OpenRouteService、Google Routes、HERE、Azure Maps、Mapbox 和 Geoapify
  • TsgcMapPlaces 用于地址自动补全,另有 TsgcMapElevation 和 TsgcMapTimeZone
  • GeocodeAsync、GetRouteAsync 和 SuggestAsync 让界面保持响应;错误通过 OnError 送达
阅读帮助主题

搜索和路线规划 仅限注册版

无需互联网和密钥的路线与地址搜索

在线路线规划恰恰在现场应用使用的地方失效,而且每次请求都可能花钱。离线路由器在设备上计算汽车、自行车和步行路线,所用路线图由一份 OpenStreetMap 提取数据一次性构建。离线地理编码器根据 SQLite 中的 GeoNames 索引搜索地名,并对点击位置进行反向地理编码。两者都无需网络、账户和按请求收费。路由器和地理编码器是非可视组件,因此 Windows 服务或控制台工具无需在屏幕上显示地图就能回答路线和地址请求。

  • TsgcMapOfflineRouter 根据 TsgcMapRouteGraphBuilder 从 .osm.pbf 构建的图来响应 GetRoute
  • sgcMapAddRouteToPolylines 把结果绘制到地图上
  • TsgcMapOfflineGeocoder 配合 ReverseGeocode,使用由 TsgcMapGeoIndexBuilder 构建的索引
  • 用于构建路线图和索引的命令行工具位于 Tools 文件夹中

社区版使用在线服务;离线路由器和地理编码器属于离线包。

阅读帮助主题

文件、渲染和移动端

与其他工具交换地理数据,在没有屏幕的地方渲染地图,并把地图带到手机、WPF 窗口或 Avalonia 窗口中。

文件、渲染和移动端

打开用户已有的文件

客户会发来 GPS 手表的轨迹、在 GIS 工具中绘制的区域,或来自其他系统的 KML。sgcMaps 把 GeoJSON、GPX 和 KML 直接读写到地图模型中,因此导入只需一次调用,导出也只需一次调用。GPX 轨迹附带统计数据,并可按海拔着色,流式读取器可以遍历大型 OpenStreetMap 提取数据而无需把它们载入内存。导出使用反向的相同函数,因此用户在地图上绘制的区域可以保存为 GeoJSON 或 KML,并在其他 GIS 工具中打开。

  • sgcMapLoadGeoJSONFile 和 sgcMapSaveGeoJSONFile,自 Delphi XE6 起支持
  • TsgcMapGPX 配合 TrackStats(TotalAscent、TotalDescent)和 ColorByElevation
  • sgcMapLoadKMLFile 和 sgcMapSaveKMLFile
  • OpenStreetMap 读取器通过事件以流方式处理 .osm.pbf 和 XML 文件
  • sgcMapGeoJSONAsText 以字符串形式返回地图的 GeoJSON
阅读帮助主题

文件、渲染和移动端

来自任何 GIS 的 Shapefile 和 WKT

公开的地理数据仍然常以 Esri shapefile 发布,空间数据库则以 Well Known Text 交换几何数据。TsgcMapShapefile 会连同属性表一起导入 shapefile 的点、线和多边形,因此每个标记都可以显示它所对应的记录。WKT 以及 PostGIS 写出的 EWKT 都可以读写,这是在地图和数据库几何列之间移动区域的最简单方法。

  • LoadFromFile 读取 .shp 及其 .shx、.dbf、.prj 和 .cpg 文件;OnItem 接收每一行属性,LabelField 设置点的弹出文本
  • 采用 WGS84、ETRS89 或 NAD83 度数,或 Web Mercator 的 .prj 可直接加载,没有 .prj 的文件按 WGS84 读取
  • 任何其他投影都会引发明确的错误,除非您的 OnTransform 处理程序转换了坐标
  • sgcMapLoadWKT 和 TsgcMapWKT 读取 POINT、LINESTRING、POLYGON、它们的 MULTI 形式和 GEOMETRYCOLLECTION,单位为度或 Web Mercator 米,AsText 则把地图写回 WKT
  • 所有版本均可使用,自 Delphi 7 起;在 .NET 中为带 Transform 回调的 ShapefileFormat 和 WktFormat
阅读帮助主题
在服务器上渲染地图图像

文件、渲染和移动端

在服务器上渲染地图图像

附有路线的送货单、含今日事件的每日报告、网页缩略图:许多地图从不显示在窗口中。同一个控件可以在不可见的情况下渲染为 PNG 或位图,可用于控制台应用程序或 Windows 服务。在发送图像之前,您可以检查每块瓦片是否都已到达,因此缓慢的瓦片服务器永远不会在客户文档中变成一块灰色方块。服务器端渲染使用与交互式控件相同的图层、标记和形状,所以在屏幕上设计的地图在 PNG 中看起来完全一样。

  • SaveToPNG 和 SaveToPNGFile,自 Delphi 2009 起支持
  • RenderToBitmap 和 SaveToBMPFile 用于您自己的处理流程
  • LastRenderMissingTiles 报告不可用的瓦片
  • 在 .NET 中,MapView.RenderToPng 也可在 Linux 上运行
阅读帮助主题

文件、渲染和移动端

桌面和移动端相同的地图

调度员在 Windows 桌面上做计划,司机在手机上按计划行驶。TsgcFMXMap 把相同的模型、图层、标记、形状和服务带到 Windows、macOS、iOS 和 Android 上的 FireMonkey,因此您为 VCL 地图编写的代码可以沿用。TsgcMapLocation 读取设备的位置,地图可以以用户为中心并跟随用户。每个图层的瓦片缓存在移动端同样有效,所以手机会继续显示它已经加载过的区域。

  • 自 Delphi XE6 起在 Windows 上提供 TsgcFMXMap,自 Delphi 10.4 起在 macOS、iOS 和 Android 上提供(macOS ARM 自 Delphi 11 起),集合与 TsgcVCLMap 相同
  • TsgcMapLocation 支持 Windows、Android、iOS 和 macOS
  • FMX 演示在一个窗体中展示瓦片、标记和位置,FMX Mobile 演示则为手机和平板电脑设计了布局
  • 与框架无关的核心也可在 Delphi 10.4 起的 Linux 64 位上编译,供使用瓦片源、文件格式和离线数据的控制台和服务器应用程序使用
  • 三个运行时包:sgcMaps(核心)、sgcMapsVCL 和 sgcMapsFMX,因此 FireMonkey 应用程序不再加载 VCL 包
  • 各功能所需的最低 Delphi 版本列在安装主题中
阅读帮助主题

文件、渲染和移动端

WPF 和 Avalonia 中的地图,用 XAML 声明

TsgcWpfMap 和 TsgcAvaloniaMap 把 .NET 地图引擎带到 WPF 和 Avalonia 12,并具有 WinForms 控件的全部功能:通过鼠标、触摸和键盘平移与缩放、图层、标记、形状、打印、PDF 导出和 UI Automation。图层和标记在 XAML 中以 sgc 前缀声明,视图模型的集合通过 ItemsSource 变成标记,因此向集合添加一家门店就会把它放到地图上,拖动其标记会把新位置写回。

  • LatitudeMember、LongitudeMember、TooltipMember、PopupMember、ColorMember 和 DraggableMember 把您的属性映射到标记
  • SelectedItem、Zoom、Bearing、CenterLatitude 和 CenterLongitude 支持双向绑定
  • 颜色在 XAML 中以 #AARRGGBB 或 #RRGGBB 文本书写
  • NuGet 包 esegece.sgcMaps.Wpf(net8.0-windows 到 net10.0-windows)和 esegece.sgcMaps.Avalonia(net8.0 到 net10.0),都有免费的社区版包
  • WpfDemo 和 AvaloniaDemo 项目在两个框架中展示相同的窗口
阅读帮助主题

无障碍

面向屏幕阅读器的 UI Automation 和键盘,无需任何设置。

无障碍

键盘可以到达、UI Automation 可以公开的地图

sgcMaps 将地图连同替代文本、作为列表的标记和作为列表的图层向 Microsoft UI Automation 公开,每个图层会报告自己是否可见。标记可以用键盘到达。

  • 方向键平移地图,加号和减号键缩放,Home 返回起始视图
  • Page Up 和 Page Down 移到上一个或下一个标记,Enter 激活焦点标记,Esc 清除标记焦点
  • 地图获得焦点时显示可见的焦点环
  • 在 .NET 中,WinForms、WPF 和 Avalonia 地图控件公开相同的 UI Automation 结构和键盘操作

无障碍功能在每个版本中默认开启,包括免费的社区版,可用于 VCL(Delphi 和 C++Builder 从 Delphi 7 到 Delphi 13 的每个版本)、Windows 上的 FireMonkey,以及 WinForms、WPF 和 Avalonia。在 Delphi 和 C++Builder 中,AccessibleName 和 AccessibleDescription 设置向 UI Automation 公开的名称和说明,在 .NET 中,各框架标准的无障碍名称和帮助文本起同样的作用。请参见无障碍符合性报告(尚未涵盖新的 WPF 和 Avalonia 地图控件)。地图图像仅用其中心和缩放级别来描述,并且地图渲染器不遵循 Windows 高对比度,因为地图图像是提供商的瓦片图像。

阅读帮助主题

查看 sgcMaps 的实际效果

sgcUI 套件演示中的 sgcMaps:使用内置模拟数据、可离线运行的完整应用程序。

谁在用 sgcMaps 构建应用

现场服务和物流

技术人员和司机需要在信号差的地方使用地图。提前准备好一个区域的瓦片,用离线路由器在设备上计算汽车路线,并用离线地理编码器查找地址。回到办公室后,同样的代码会绘制计划的路线和配送区域,并为每条路线渲染一张 PNG 放到送货单上。

  • 离线可用
  • 离线路线规划
  • 路线和区域
  • 地图图像
运行 OfflineServices 演示

资产和车队跟踪

控制室同时监控数百辆车辆、机器或传感器。聚合让地图在国家级别保持可读,在街道级别则拆分为单个图钉。热力图显示事件集中在哪里,用点在多边形内进行地理围栏检查可触发警报,标记点击事件则在您自己的窗体中打开资产的记录。

  • 聚合
  • 热力图
  • 几何
  • 事件
运行 MapFeatures 演示

轻量 GIS 和户外应用

规划工具、运动应用和测量软件都依赖 GPX 轨迹、KML 图层和 GeoJSON 区域。sgcMaps 可导入和导出这三种格式,显示轨迹统计和海拔颜色,并把结果放在地形底图上。FireMonkey 控件把相同的功能带到野外使用的平板电脑或手机上。轨迹统计让您一眼看到路线的总上升和总下降。

  • GeoJSON、GPX、KML 和 shapefile
  • 地形瓦片
  • FireMonkey
运行 OfflineMap 演示

几行代码实现地图

Delphi、C++ Builder 和 C# 中的同一套 API:OpenStreetMap 瓦片、三个标记、一条大地线和一个半径,适应标记范围并保存为 PNG。

在代码中构建的 VCL 地图:带缓存的 OpenStreetMap 图层、标记、一条大地线和一个圆,然后输出结果的 PNG。

uses
  SysUtils, Controls, Graphics, sgcMaps_Classes, sgcMaps_Providers,
  sgcMaps_Geometry, sgcMaps_VCL;

// OpenStreetMap with cached tiles, three capitals, a geodesic flight line
// and a 300 km radius, fitted to the markers and saved as PNG.
procedure BuildMap(aOwner: TWinControl);
var
  oMap: TsgcVCLMap;
  oLayer: TsgcMapLayer;
  oLine: TsgcMapPolyline;
begin
  oMap := TsgcVCLMap.Create(aOwner);
  oMap.Parent := aOwner;
  oMap.Align := alClient;

  oLayer := oMap.Layers.Add;
  oLayer.Name := 'OpenStreetMap';
  oLayer.Provider := mtpOpenStreetMap;
  sgcMapApplyProvider(oLayer);
  oLayer.CacheFolder := ExtractFilePath(ParamStr(0)) + 'tile_cache';

  oMap.AddMarker(48.8566, 2.3522, 'Paris', 'France');
  oMap.AddMarker(52.5200, 13.4050, 'Berlin', 'Germany');
  oMap.AddMarker(41.9028, 12.4964, 'Rome', 'Italy');
  oMap.MarkerOptions.Clustering.Enabled := True;

  oLine := oMap.AddPolyline;
  oLine.Geodesic := True;
  oLine.Dashed := True;
  oLine.Color := clRed;
  oLine.AddPoint(48.8566, 2.3522);
  oLine.AddPoint(52.5200, 13.4050);

  oMap.AddCircle(48.8566, 2.3522, 300000).FillOpacity := 0.15;
  oMap.FitToMarkers(40);
  oMap.AddLabel(50.7, 8, Format('Paris to Berlin: %.0f km',
    [sgcMapDistance(48.8566, 2.3522, 52.52, 13.405) / 1000]));
  oMap.SaveToPNG('europe.png', 1200, 800);
end;

阅读帮助主题 →

C++ Builder 中使用生成的 sgcMaps 头文件构建的同一张地图。

#include <vcl.h>
#include "sgcMaps_Classes.hpp"
#include "sgcMaps_Providers.hpp"
#include "sgcMaps_Geometry.hpp"
#include "sgcMaps_VCL.hpp"

// OpenStreetMap with cached tiles, three capitals, a geodesic flight line
// and a 300 km radius, fitted to the markers and saved as PNG.
void BuildMap(TWinControl *aOwner)
{
  TsgcVCLMap *oMap = new TsgcVCLMap(aOwner);
  oMap->Parent = aOwner;
  oMap->Align = alClient;

  TsgcMapLayer *oLayer = oMap->Layers->Add();
  oLayer->Name = "OpenStreetMap";
  oLayer->Provider = mtpOpenStreetMap;
  sgcMapApplyProvider(oLayer);
  oLayer->CacheFolder = ExtractFilePath(ParamStr(0)) + "tile_cache";

  oMap->AddMarker(48.8566, 2.3522, "Paris", "France");
  oMap->AddMarker(52.5200, 13.4050, "Berlin", "Germany");
  oMap->AddMarker(41.9028, 12.4964, "Rome", "Italy");
  oMap->MarkerOptions->Clustering->Enabled = true;

  TsgcMapPolyline *oLine = oMap->AddPolyline();
  oLine->Geodesic = true;
  oLine->Dashed = true;
  oLine->Color = clRed;
  oLine->AddPoint(48.8566, 2.3522);
  oLine->AddPoint(52.5200, 13.4050);

  oMap->AddCircle(48.8566, 2.3522, 300000)->FillOpacity = 0.15;
  oMap->FitToMarkers(40);
  int iKm = (int)(sgcMapDistance(48.8566, 2.3522, 52.52, 13.405) / 1000);
  oMap->AddLabel(50.7, 8, "Paris to Berlin: " + IntToStr(iKm) + " km");
  oMap->SaveToPNG("europe.png", 1200, 800, false);
}

阅读帮助主题 →

无界面的 MapView 在 Windows 或 Linux 上把同一张地图渲染为 PNG 文件。

using System;
using System.IO;
using esegece.sgcMaps;
using esegece.sgcMaps.Rendering;

// OpenStreetMap with cached tiles, three capitals, a geodesic flight line
// and a 300 km radius, fitted to the markers and saved as PNG (no window).
public static class EuropeMap
{
    public static void Render()
    {
        var oMap = new MapView();

        Layer oLayer = oMap.Layers.Add();
        oLayer.Name = "OpenStreetMap";
        oLayer.Provider = TileProvider.OpenStreetMap;
        MapProviders.ApplyProvider(oLayer);
        oLayer.CacheFolder = Path.Combine(AppContext.BaseDirectory, "tile_cache");

        oMap.AddMarker(48.8566, 2.3522, "Paris", "France");
        oMap.AddMarker(52.5200, 13.4050, "Berlin", "Germany");
        oMap.AddMarker(41.9028, 12.4964, "Rome", "Italy");
        oMap.MarkerOptions.Clustering.Enabled = true;

        Polyline oLine = oMap.AddPolyline();
        oLine.Geodesic = true;
        oLine.Dashed = true;
        oLine.Color = MapColors.Red;
        oLine.AddPoint(48.8566, 2.3522);
        oLine.AddPoint(52.5200, 13.4050);

        oMap.AddCircle(48.8566, 2.3522, 300000).FillOpacity = 0.15;
        oMap.FitToMarkers(40);
        double vKm = MapGeometry.Distance(48.8566, 2.3522, 52.52, 13.405) / 1000;
        oMap.AddLabel(50.7, 8, $"Paris to Berlin: {vKm:F0} km");
        oMap.RenderToPng("europe.png", 1200, 800);
    }
}
dotnet add package esegece.sgcMaps.Rendering

阅读帮助主题 →

WMS 图层、Shapefile 和 WPF 中的地图

Delphi 中的 WMS 叠加层和带属性的 shapefile 导入,以及一个用 XAML 声明地图、图层和标记的 WPF 窗口。

一个带有自己瓦片缓存的透明 WMS 叠加层,以及一个根据属性表把公园填充为绿色的 shapefile。两者在所有版本中都可使用。

uses
  Classes, SysUtils, Graphics, sgcMaps_Classes, sgcMaps_VCL, sgcMaps_Shapefile;

procedure TForm2.AddWMSLayer;
var
  oLayer: TsgcMapLayer;
begin
  // an overlay drawn by a WMS server
  oLayer := sgcVCLMap1.Layers.Add;
  oLayer.Name := 'Land use';
  oLayer.TileSourceType := mtsWMS;
  oLayer.URLTemplate := 'https://maps.example.com/geoserver/wms';
  oLayer.WMS.Layers := 'landuse,rivers';
  oLayer.WMS.Version := mwv130;
  oLayer.WMS.ImageFormat := 'image/png';
  oLayer.WMS.Transparent := True;
  oLayer.IsBaseLayer := False;
  oLayer.Opacity := 0.7;
  oLayer.CacheFolder := ExtractFilePath(ParamStr(0)) + 'cache\landuse';
end;

procedure TForm2.ImportLandUse;
var
  oShp: TsgcMapShapefile;
begin
  oShp := TsgcMapShapefile.Create;
  try
    // points get the NAME field as popup text (the field must exist)
    oShp.LabelField := 'NAME';
    oShp.OnItem := ShapefileItem;
    // reads landuse.shx, .dbf, .prj and .cpg next to the .shp
    oShp.LoadFromFile('C:\Data\landuse.shp', sgcVCLMap1.Markers,
      sgcVCLMap1.Polylines, sgcVCLMap1.Polygons);
    memoLog.Lines.Add(Format('%d records, %d skipped, fields: %s',
      [oShp.RecordCount, oShp.SkippedCount, oShp.Fields.CommaText]));
  finally
    oShp.Free;
  end;
end;

procedure TForm2.ShapefileItem(Sender: TObject; aRecord: Integer;
  aAttributes: TStrings; aItem: TCollectionItem);
begin
  // aAttributes holds the .dbf row as Name=Value lines
  if (aItem is TsgcMapPolygon) and (aAttributes.Values['USE'] = 'PARK') then
    TsgcMapPolygon(aItem).FillColor := clGreen;
end;

阅读 WMS 主题 → 阅读 shapefile 主题 →

TsgcWpfMap 的图层和标记在 XAML 中以 sgc 前缀声明。代码隐藏添加瓦片缓存、一条线和三个事件。

<Window x:Class="MapQuickStartWpf.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sgc="https://www.esegece.com/sgcui"
        Title="sgcMaps WPF Quick Start" Width="1000" Height="700">
  <sgc:TsgcWpfMap x:Name="MainMap" CenterLatitude="40.4168" CenterLongitude="-3.7038" Zoom="14">
    <sgc:TsgcWpfMap.Layers>
      <sgc:Layer Name="OpenStreetMap" Provider="OpenStreetMap" />
    </sgc:TsgcWpfMap.Layers>
    <sgc:TsgcWpfMap.Markers>
      <sgc:Marker Latitude="40.4168" Longitude="-3.7038" PopupText="Puerta del Sol"
                  TooltipText="Drag me" Draggable="True" Color="#FFE53935" />
    </sgc:TsgcWpfMap.Markers>
  </sgc:TsgcWpfMap>
</Window>
using System;
using System.IO;
using System.Windows;
using esegece.sgcMaps;

namespace MapQuickStartWpf
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            // cache the tiles of the layer declared in XAML
            MainMap.Layers[0].CacheFolder = Path.Combine(AppContext.BaseDirectory, "tile_cache");

            // a line from Puerta del Sol to Retiro Park
            Polyline line = MainMap.Map.AddPolyline();
            line.AddPoint(40.4168, -3.7038);
            line.AddPoint(40.4153, -3.6844);
            line.Color = MapColors.Blue;
            line.Width = 4;

            MainMap.MapClick += (s, e) => Title = $"Click at {e.Latitude:F5}, {e.Longitude:F5}";
            MainMap.MarkerDragEnd += (s, e) => Title = $"Dropped at {e.Item.Latitude:F5}, {e.Item.Longitude:F5}";
            MainMap.TileError += (s, e) => Title = $"Tile {e.Zoom}/{e.X}/{e.Y}: {e.Error}";
        }
    }
}
dotnet add package esegece.sgcMaps.Wpf

阅读帮助主题 →

运行 sgcMaps 演示

sgcMaps 附带十一个 Delphi 演示和八个 .NET 演示。没有 C++ Builder 演示项目。

仅限注册版 OfflineMap

文件夹、MBTiles 和在线瓦片、标记和形状,以及 GeoJSON、GPX 和 KML 导入。

MapFeatures

提供商和 API 密钥、标记聚合、形状编辑、热力图和图像导出。

Services

使用在线提供商进行地点搜索、地理编码、导航、海拔、时区和设备定位。需要 Delphi XE8 及更高版本。

仅限注册版 OfflineServices

构建 GeoNames 索引和 OpenStreetMap 路线图,然后在没有网络的情况下搜索地点并规划汽车、自行车或步行路线。

StaticRender

StaticRender

不带窗口、把地图渲染为 PNG 或 BMP 文件的控制台程序。

FMX

FireMonkey 地图,含瓦片、标记和设备定位,适用于 Windows、macOS、iOS 和 Android。需要 Delphi XE6 及更高版本。

VectorTiles

VectorTiles

用内置样式或您自己的样式文件绘制的矢量瓦片服务器,在每个缩放级别都有清晰的标签。

FMXMobile

专为手机和平板电脑设计的 FireMonkey 地图:单指平移、双指缩放、大号缩放按钮、带精度圆圈的当前位置以及地点列表。Delphi 10.4 及更高版本。

OGCServices

从 URL 或文件加载 WMS 或 WMTS capabilities 文档,列出图层,并把您选择的图层作为 OpenStreetMap 上的叠加层添加,带有不透明度滑块。Delphi 2009 及更高版本。

仅限注册版 PMTiles

从文件或 URL 打开栅格或矢量 PMTiles 归档,显示其头信息和元数据,并将其作为以归档为中心的图层添加。Delphi XE2 及更高版本。

ShapefileWKT

导入带属性表的 shapefile,显示所点击标记的记录,并导入和导出 WKT。

WinFormsDemo

WinForms 窗口中的 .NET SgcMapControl,含提供商、标记和形状。

WpfDemo

用 XAML 声明的 WPF 地图:标记语言中的底图图层和标记、用 ItemsSource 绑定为标记的门店、缩放和方位滑块、打印和 PDF 导出。

AvaloniaDemo

使用 Avalonia 12 地图控件和编译绑定的同一个窗口。

OgcServicesDemo

带有 OpenStreetMap 底图图层和一个来自 WMS 或 WMTS 服务的叠加层的 WinForms 地图控件:从 URL 或文件加载 capabilities 文档,列出图层,用不透明度滑块添加您选择的图层,并显示瓦片错误。

仅限注册版 PMTilesDemo

带有来自栅格或矢量 PMTiles 归档的图层的 WinForms 地图控件,可从文件或 URL 打开,显示其头信息和元数据,并让地图以归档为中心。

ShapefileWktDemo

导入 shapefile 及其属性表并显示所点击标记的记录的 WinForms 地图控件,还支持叠加层的 WKT 导入和导出。

仅限注册版 OfflineDemo

.NET 离线包:来自本地数据文件的离线瓦片、路线规划和地理编码。

ConsoleRenderDemo

ConsoleRenderDemo

用无界面 MapView 把地图渲染为 PNG 的 .NET 控制台程序,可在 Windows 或 Linux 上运行。

预编译演示

每款 sgcUI 产品的可直接运行的可执行文件,无需安装。

下载 sgcUI_bin.zip →

入门指南

适用于 Delphi (VCL) 的五个 QuickStart 演示位于 Demos\Maps\00.QuickStart。PDF 指南逐步讲解这些演示:第一张带标记的地图、通过代码添加的标记和标签、形状、地图事件,以及门店定位器。

下载指南(PDF,英文) →

sgcMaps 包含在哪些版本中

sgcMaps 是 sgcUI Enterprise 的一部分,也可单独购买。sgcMaps 同样包含在 All-Access 中。

sgcMaps 单品包

€149 / 开发者,含完整源代码,1 年更新。

购买 sgcMaps → 查看价格 →

sgcUI Enterprise

全部 17 款 sgcUI 产品,起价 €699。

查看 Enterprise →

免费 .NET 社区版(NuGet 上的 esegece.sgcMaps.Community、esegece.sgcMaps.Rendering.Community、esegece.sgcMaps.WinForms.Community、esegece.sgcMaps.Wpf.Community、esegece.sgcMaps.Avalonia.Community)拥有除离线包之外的所有功能。esegece.sgcMaps.Offline 包仅限注册版。一个项目引用社区版或注册版的包,不能同时引用两者。

功能社区版(免费)注册版
VCL、FireMonkey、WinForms、WPF 和 Avalonia 地图控件✓✓
瓦片提供商、HTTP 和矢量瓦片服务器✓✓
WMS 和 WMTS 图层✓✓
z/x/y 瓦片文件夹和每个图层的瓦片缓存✓✓
标记、聚合、形状、标签和热力图✓✓
几何函数✓✓
GeoJSON、GPX 和 KML 导入与导出✓✓
Shapefile 导入,WKT 导入和导出✓✓
在线地理编码、导航、地点、海拔和时区✓✓
静态渲染为 PNG✓✓
用于离线包的瓦片下载器−✓
MBTiles 和 PMTiles 文件(栅格和矢量)−✓
离线路由器和离线地理编码器−✓

支持的框架与平台

sgcMaps 中的组件

TsgcVCLMap and TsgcFMXMap

适用于 VCL 和 FireMonkey 的地图控件,以及读取磁盘瓦片的 Lazarus LCL 控件。

模型集合

Layers、Markers、Polylines、Polygons、Rectangles、Circles、Labels 和 Heatmaps,所有框架共用。

在线服务

TsgcMapGeocoder, TsgcMapDirections, TsgcMapPlaces, TsgcMapElevation and TsgcMapTimeZone.

离线工具

TsgcMapRouteCalculator, TsgcMapOfflineRouter, TsgcMapOfflineGeocoder, TsgcMapGeoIndexBuilder and TsgcMapTileDownloader.

GIS 格式和 OGC 服务

TsgcMapShapefile、TsgcMapWKT、TsgcMapWMSCapabilities、TsgcMapWMTSCapabilities 和 TsgcMapTileSource_PMTiles。

TsgcMapLocation 和几何辅助函数

设备定位,以及 sgcMapDistance、方位角、目标点、大地线插值、点在多边形内和线条简化。

.NET 地图

用于 WinForms 的 SgcMapControl、用于 WPF 的 TsgcWpfMap、用于 Avalonia 12 的 TsgcAvaloniaMap,以及渲染为 PNG 的无界面引擎 MapView,也可在 Linux 上运行。

目标组件平台
Delphi 7 至 13,VCLTsgcVCLMap 和模型Win32,自 XE2 起的 Win64,以及 Delphi 13 中的 ARM64EC
Delphi XE6 至 13,FireMonkeyTsgcFMXMapWindows 自 XE6 起;macOS、iOS 和 Android 自 Delphi 10.4 起(macOS ARM 自 Delphi 11 起);设备定位支持 Windows、Android、iOS 和 macOS
Delphi 10.4 至 13,Linux 64 位与框架无关的核心,没有地图控件控制台和服务器应用程序中的瓦片源、服务、文件格式和离线数据
C++ Builder 2007 至 13TsgcVCLMap、自 XE6 起的 TsgcFMXMap 和模型仅限 Windows:Win32、自 XE3 起的 Win64 以及 C++ Builder 13 中的 Win64x,带生成的 .hpp 头文件和静态库
LazarusLCL 地图控件仅支持磁盘上的瓦片,不能下载瓦片
.NET 8、9 和 10SgcMapControl、TsgcWpfMap、TsgcAvaloniaMap、MapViewWinForms 和 WPF(net8.0-windows、net9.0-windows、net10.0-windows),Avalonia 12(net8.0、net9.0、net10.0),在 Windows 和 Linux 上输出无界面 PNG

Delphi 包:sgcMaps 包含与框架无关的核心,sgcMapsVCL 包含 VCL 地图,sgcMapsFMX 包含 FireMonkey 地图,设计时包为 dclsgcMaps 和 dclsgcMapsFMX。使用运行时包构建并列出 sgcMaps 的项目需要添加 sgcMapsVCL 或 sgcMapsFMX。请参阅包和平台。

常见问题解答

不需要。瓦片、标记和形状都由控件原生绘制,因此没有 Web 视图,没有 JavaScript 库,也没有需要部署的浏览器运行时。

OpenStreetMap、OpenTopoMap 和 Esri 瓦片不需要,离线路由器和地理编码器也不需要。MapTiler、Thunderforest 和 Stadia 瓦片,以及商业地理编码和路线规划提供商,需要使用您自己的密钥。每个提供商都有自己的使用条款,您的应用程序必须遵守。

可以。瓦片可以来自 z/x/y 文件夹、每个图层的缓存、MBTiles 文件或 PMTiles 归档,路线来自 TsgcMapOfflineRouter,地址搜索来自 TsgcMapOfflineGeocoder。MBTiles、PMTiles、瓦片下载器以及离线路由器和地理编码器属于注册版的离线包。

GeoJSON、GPX、KML,以及含 EWKT 的 WKT,均可导入和导出;Esri shapefile 可连同属性一起导入;还带有 GPX 轨迹统计和海拔颜色。流式读取器还可处理 OpenStreetMap .osm.pbf 和 XML 文件,离线路线图就是这样构建的。请参阅文件格式、Shapefile和WKT。

模型、VCL 控件、shapefile 和 WKT 自 Delphi 7 和 C++ Builder 2007 起可用。某些功能的最低版本更高:PNG 输出、瓦片服务器、WMS 和 WMTS 需要 Delphi 2009,矢量瓦片、PMTiles 和离线路由器需要 XE2,Windows 上的 FireMonkey 和 GeoJSON 需要 XE6,MBTiles 和离线地理编码器需要 XE7,在线服务需要 XE8。macOS、iOS 和 Android 上的 FireMonkey,以及 Linux 64 位上的核心单元,需要 Delphi 10.4 或更高版本。

可以。TileSourceType 为 mtsWMS 或 mtsWMTS 的图层会从 WMS 1.1.1 或 1.3.0 服务,或 KVP、REST 编码的 WMTS 服务请求图像,capabilities 读取器会根据服务描述设置图层。地图采用 Web Mercator,因此 WMS 图层以 EPSG:3857 请求,WMTS 服务需要 Web Mercator 瓦片矩阵集。WMS 和 WMTS 在所有版本中都可使用,包括社区版。请参阅 WMS 和 WMTS。

有。TsgcWpfMap(NuGet 包 esegece.sgcMaps.Wpf)和 TsgcAvaloniaMap(esegece.sgcMaps.Avalonia,Avalonia 12)与 WinForms 的 SgcMapControl 承载同一个引擎。图层和标记可以在 XAML 中声明,标记可以通过 ItemsSource 绑定到集合,视图也支持双向绑定。两者同样包含在免费的社区版中。请参阅 WPF 快速入门和 Avalonia 快速入门。

演示项目仅有 Delphi 版本,但组件可以安装到 C++ Builder 2007 至 13 中,工作方式相同。上面代码部分的 C++ Builder 选项卡展示了用生成的头文件构建的同一张地图。

有。社区版对个人以及年总收入低于 100 万欧元且开发人员不超过 5 人的组织免费。它拥有除离线包之外的所有功能。在 .NET 上,软件包为 esegece.sgcMaps.Community、esegece.sgcMaps.Rendering.Community、esegece.sgcMaps.WinForms.Community、esegece.sgcMaps.Wpf.Community 和 esegece.sgcMaps.Avalonia.Community。WMS、WMTS、shapefile、WKT 以及 WPF 和 Avalonia 控件同样包含在社区版中。规模更大的组织需要注册版授权。

sgcMaps 帮助

3,000+开发者
20+年
761+组件
30+API 集成
5平台
30 天退款保证不满意?可在购买后 30 天内申请全额退款。 查看退款政策

立即试用 sgcMaps

sgcUI 试用版包含带离线包的 sgcMaps 和所有其他 sgcUI 产品。.NET 社区版在 NuGet 上免费提供。