现场服务和物流
技术人员和司机需要在信号差的地方使用地图。提前准备好一个区域的瓦片,用离线路由器在设备上计算汽车路线,并用离线地理编码器查找地址。回到办公室后,同样的代码会绘制计划的路线和配送区域,并为每条路线渲染一张 PNG 放到送货单上。
- 离线可用
- 离线路线规划
- 路线和区域
- 地图图像
无需浏览器控件,也无需一行 JavaScript,就能在您的应用程序中放入真正的地图。sgcMaps 自行绘制栅格和矢量瓦片,添加 WMS 和 WMTS 服务器的图层,显示数千个聚合标记、路线和区域,对地址进行地理编码,并借助本地瓦片和离线路由器在离线状态下继续工作。
十八项功能,每项都附有真实的 API 和对应的帮助主题。
地图控件自行绘制每一块瓦片,来源可以是瓦片服务器、WMS 或 WMTS 服务、矢量源或磁盘上的文件。
瓦片和地图数据
大多数地图组件封装的是 Web 视图和 JavaScript 库,因此您的桌面应用程序最终会带着一个浏览器发布。sgcMaps 不会。TsgcVCLMap 和 TsgcFMXMap 在自己的画布上下载、缓存并绘制瓦片,处理鼠标滚轮缩放和拖动平移,并引发普通的 Delphi 事件。您的地图和其他控件一样是原生控件:可以停靠,随窗体应用主题,调试方式也与代码的其余部分相同。没有需要部署或加固的额外进程,地图在您的应用程序运行的每台机器上表现都一样。
Layers 集合包含一个或多个 TsgcMapLayer 项,每个都有自己的 TileSourceTypeTsgcFMXMap 在 Windows 上自 Delphi XE6 起可运行,在 macOS、iOS 和 Android 上自 Delphi 10.4 起可运行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、mtpEsriWorldStreetmtpMapTilerStreets、mtpMapTilerSatellite、mtpThunderforestCycle、mtpThunderforestTransport、mtpStadiaAlidadeSmoothmtpCustom 配合 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 代码瓦片和地图数据
城市、公用事业和测绘机构通常以 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 据此设置图层OnTileErrorTileSourceType.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 让下载保持礼貌且可见社区版可读取 z/x/y 瓦片文件夹,并保留每个图层的 CacheFolder。瓦片下载器、MBTiles 和 PMTiles 文件属于离线包。
阅读帮助主题瓦片和地图数据 仅限注册版
PMTiles 归档把完整的瓦片金字塔放在单个文件中,您可以把它复制到笔记本电脑,或放在任何静态网络服务器上,无需运行瓦片服务器。sgcMaps 可以从本地文件读取归档,也可以通过 HTTP range 请求直接从网络服务器读取,并把已读取的目录保存在缓存中,因此只有视图内的瓦片会通过网络传输。
mtsPMTiles 用于 PNG 和 JPEG 栅格归档,mtsVectorPMTiles 用于 Mapbox Vector Tile 归档TileSourcePath 接受文件名或 http、https URLTsgcMapTileSource_PMTiles 会报告归档的缩放范围、边界、中心和元数据esegece.sgcMaps 包PMTiles 与 MBTiles 一样属于离线包,因此包含在注册版中,不包含在免费的社区版中。
阅读帮助主题把您自己的数据放到地图上,在每个缩放级别都保持可读,并完成背后的计算。
标记、形状和几何
车队、门店网络或传感器网格很快就会变成一团重叠的图钉。启用聚合后,相邻的标记会合并成一个带编号的气泡,用户放大时再次拆开,并在每个缩放级别重新计算。每个标记都带有自己的弹出框、提示和图标,点击、拖动和聚合点击都以事件形式送达,因此地图成为您工作流程的一部分,而不只是一张图片。标记可以根据您的数据在循环中添加,也可以从 GeoJSON、GPX 和 KML 文件导入,ClearMarkers 一次调用即可重置它们。
MarkerOptions.Clustering 配合 GridSize、MinClusterSize 和 ZoomOnClickPopupText、TooltipText 和 IconBitmapOnMarkerClick、OnClusterClick 和 OnMarkerDragEnd 事件BeginUpdate 和 EndUpdate 包住;FitToMarkers 让所有标记入框MarkerAtScreen 和 ClusterAtScreen 对任意像素进行命中测试
标记、形状和几何
大多数地图界面需要的不只是图钉:计划的配送路线、仓库的服务区域、客户周围的半径、订单来自哪里。sgcMaps 把它们都绘制为地图模型的项,坐标与您的标记相同。形状可以设为可编辑,用户可以用鼠标拖动区域的顶点,编辑结束时您的代码会收到通知。标签在某个坐标放置文字,带有自己的字体、颜色和背景,使区域名称和路线编号始终附着在地图上。
AddPolyline,支持 Dashed 和 Geodesic 线AddPolygon 配合 AddHole,以及 AddRectangle、AddCircle(RadiusMeters)和 AddLabelEditable 形状通过 OnShapeEdited 报告更改TsgcMapHeatmap 通过 AddPoint 接受加权点,并有 MaxIntensity标记、形状和几何
这辆车在区域内吗?最近的仓库有多远?路线上哪个点离客户最近?每个地图应用程序都会遇到这些问题,而且在极点附近或长距离时很容易算错。几何单元在 WGS84 球面上回答这些问题,使用的是普通函数,您也可以在没有地图的服务中调用。这些函数接受普通的 TsgcMapCoord 记录,当您绘制自己的叠加层时,sgcMapLatLonToPixel 和 sgcMapPixelToLatLon 可在屏幕坐标和世界坐标之间转换。
sgcMapDistance(单位为米)、sgcMapInitialBearing 和 sgcMapDestinationPointsgcMapPointInPolygon 和 sgcMapPointInPolygonWithHoles 用于地理围栏sgcMapNearestPointOnPolyline 把位置吸附到路线上sgcMapGeodesicInterpolate 和 sgcMapSimplify 让线条平滑而轻量使用在线提供商查找地址和规划路线,也可以完全离线,无需 API 密钥。
搜索和路线规划
每个地理编码和路线规划提供商都有自己的 REST 格式、密钥和怪癖。服务组件把它们隐藏起来:您选择提供商,需要时设置密钥,然后调用相同的方法,同步或异步均可。从一个提供商切换到另一个只需更改一个属性,而不必重写,结果会以 Delphi 对象的形式返回,可直接放到地图上。每个组件都共用 TsgcMapService 基类,因此 ApiKey、UserAgent 和 LastError 对每个提供商的工作方式都相同。
TsgcMapGeocoder:Nominatim、Google、HERE、Azure Maps、Mapbox、OpenRouteService 和 GeoapifyTsgcMapDirections:OSRM、OpenRouteService、Google Routes、HERE、Azure Maps、Mapbox 和 GeoapifyTsgcMapPlaces 用于地址自动补全,另有 TsgcMapElevation 和 TsgcMapTimeZoneGeocodeAsync、GetRouteAsync 和 SuggestAsync 让界面保持响应;错误通过 OnError 送达搜索和路线规划 仅限注册版
在线路线规划恰恰在现场应用使用的地方失效,而且每次请求都可能花钱。离线路由器在设备上计算汽车、自行车和步行路线,所用路线图由一份 OpenStreetMap 提取数据一次性构建。离线地理编码器根据 SQLite 中的 GeoNames 索引搜索地名,并对点击位置进行反向地理编码。两者都无需网络、账户和按请求收费。路由器和地理编码器是非可视组件,因此 Windows 服务或控制台工具无需在屏幕上显示地图就能回答路线和地址请求。
TsgcMapOfflineRouter 根据 TsgcMapRouteGraphBuilder 从 .osm.pbf 构建的图来响应 GetRoutesgcMapAddRouteToPolylines 把结果绘制到地图上TsgcMapOfflineGeocoder 配合 ReverseGeocode,使用由 TsgcMapGeoIndexBuilder 构建的索引社区版使用在线服务;离线路由器和地理编码器属于离线包。
阅读帮助主题与其他工具交换地理数据,在没有屏幕的地方渲染地图,并把地图带到手机、WPF 窗口或 Avalonia 窗口中。
文件、渲染和移动端
客户会发来 GPS 手表的轨迹、在 GIS 工具中绘制的区域,或来自其他系统的 KML。sgcMaps 把 GeoJSON、GPX 和 KML 直接读写到地图模型中,因此导入只需一次调用,导出也只需一次调用。GPX 轨迹附带统计数据,并可按海拔着色,流式读取器可以遍历大型 OpenStreetMap 提取数据而无需把它们载入内存。导出使用反向的相同函数,因此用户在地图上绘制的区域可以保存为 GeoJSON 或 KML,并在其他 GIS 工具中打开。
sgcMapLoadGeoJSONFile 和 sgcMapSaveGeoJSONFile,自 Delphi XE6 起支持TsgcMapGPX 配合 TrackStats(TotalAscent、TotalDescent)和 ColorByElevationsgcMapLoadKMLFile 和 sgcMapSaveKMLFilesgcMapGeoJSONAsText 以字符串形式返回地图的 GeoJSON文件、渲染和移动端
公开的地理数据仍然常以 Esri shapefile 发布,空间数据库则以 Well Known Text 交换几何数据。TsgcMapShapefile 会连同属性表一起导入 shapefile 的点、线和多边形,因此每个标记都可以显示它所对应的记录。WKT 以及 PostGIS 写出的 EWKT 都可以读写,这是在地图和数据库几何列之间移动区域的最简单方法。
LoadFromFile 读取 .shp 及其 .shx、.dbf、.prj 和 .cpg 文件;OnItem 接收每一行属性,LabelField 设置点的弹出文本OnTransform 处理程序转换了坐标sgcMapLoadWKT 和 TsgcMapWKT 读取 POINT、LINESTRING、POLYGON、它们的 MULTI 形式和 GEOMETRYCOLLECTION,单位为度或 Web Mercator 米,AsText 则把地图写回 WKTTransform 回调的 ShapefileFormat 和 WktFormat
文件、渲染和移动端
附有路线的送货单、含今日事件的每日报告、网页缩略图:许多地图从不显示在窗口中。同一个控件可以在不可见的情况下渲染为 PNG 或位图,可用于控制台应用程序或 Windows 服务。在发送图像之前,您可以检查每块瓦片是否都已到达,因此缓慢的瓦片服务器永远不会在客户文档中变成一块灰色方块。服务器端渲染使用与交互式控件相同的图层、标记和形状,所以在屏幕上设计的地图在 PNG 中看起来完全一样。
SaveToPNG 和 SaveToPNGFile,自 Delphi 2009 起支持RenderToBitmap 和 SaveToBMPFile 用于您自己的处理流程LastRenderMissingTiles 报告不可用的瓦片MapView.RenderToPng 也可在 Linux 上运行文件、渲染和移动端
调度员在 Windows 桌面上做计划,司机在手机上按计划行驶。TsgcFMXMap 把相同的模型、图层、标记、形状和服务带到 Windows、macOS、iOS 和 Android 上的 FireMonkey,因此您为 VCL 地图编写的代码可以沿用。TsgcMapLocation 读取设备的位置,地图可以以用户为中心并跟随用户。每个图层的瓦片缓存在移动端同样有效,所以手机会继续显示它已经加载过的区域。
TsgcFMXMap,自 Delphi 10.4 起在 macOS、iOS 和 Android 上提供(macOS ARM 自 Delphi 11 起),集合与 TsgcVCLMap 相同TsgcMapLocation 支持 Windows、Android、iOS 和 macOSsgcMaps(核心)、sgcMapsVCL 和 sgcMapsFMX,因此 FireMonkey 应用程序不再加载 VCL 包文件、渲染和移动端
TsgcWpfMap 和 TsgcAvaloniaMap 把 .NET 地图引擎带到 WPF 和 Avalonia 12,并具有 WinForms 控件的全部功能:通过鼠标、触摸和键盘平移与缩放、图层、标记、形状、打印、PDF 导出和 UI Automation。图层和标记在 XAML 中以 sgc 前缀声明,视图模型的集合通过 ItemsSource 变成标记,因此向集合添加一家门店就会把它放到地图上,拖动其标记会把新位置写回。
LatitudeMember、LongitudeMember、TooltipMember、PopupMember、ColorMember 和 DraggableMember 把您的属性映射到标记SelectedItem、Zoom、Bearing、CenterLatitude 和 CenterLongitude 支持双向绑定esegece.sgcMaps.Wpf(net8.0-windows 到 net10.0-windows)和 esegece.sgcMaps.Avalonia(net8.0 到 net10.0),都有免费的社区版包预览显示的内容与打印机和 PDF 得到的完全一致。
打印、预览和 PDF
地图以当前视图图片的形式打印在一页上:范围与控件相同,包含其中心、缩放级别、瓦片、图层、标记和形状。比例尺和版权归属会被打印,缩放按钮、图层切换器和指南针则不会,打印也绝不会移动视图。
Print 显示打印对话框或直接打印到默认打印机,ShowPrintPreview 打开带有翻页、缩放、页面设置、打印和 PDF 导出的预览PrintSettings 保存纸张、方向、页边距、缩放以及页眉和页脚文字,打印机、预览和 PDF 都使用它ExportToPDF 把页面写成一张带标签的图片(默认 192 dpi),并附上给出中心、缩放级别以及图层和标记数量的替代文本TsgcUIPDFOptions 的 PDFALevel 可为归档加上 PDF/A-2a 或 PDF/A-3a,可单独使用,也可与 PDF/UA 同时使用打印和预览包含在每个版本中,包括免费的社区版,可用于 VCL、FireMonkey、WinForms、WPF 和 Avalonia。在 FireMonkey 中,打印在 Windows 和 macOS 上可用,预览和 PDF 导出则适用于所有平台。PDF 导出需要 sgcUIPDF 桥接和已获许可的 sgcPDF(在 .NET 中为 NuGet 包 esegece.sgcUICore.sgcPDF),因此不包含在社区版中。
面向屏幕阅读器的 UI Automation 和键盘,无需任何设置。
无障碍
sgcMaps 将地图连同替代文本、作为列表的标记和作为列表的图层向 Microsoft 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 高对比度,因为地图图像是提供商的瓦片图像。
sgcUI 套件演示中的 sgcMaps:使用内置模拟数据、可离线运行的完整应用程序。
一张地图上的 48 辆车、它们的路线和一个封闭多边形。
Altamira Fleet →
街道级别的城市路线和送货站点。
Altamira Fleet →
四座工厂以状态标记显示,并标出各站点的产量。
Altamira Plant →
项目站点以按 RAG 状态着色的标记显示。
Altamira PMO →
技术人员和司机需要在信号差的地方使用地图。提前准备好一个区域的瓦片,用离线路由器在设备上计算汽车路线,并用离线地理编码器查找地址。回到办公室后,同样的代码会绘制计划的路线和配送区域,并为每条路线渲染一张 PNG 放到送货单上。
控制室同时监控数百辆车辆、机器或传感器。聚合让地图在国家级别保持可读,在街道级别则拆分为单个图钉。热力图显示事件集中在哪里,用点在多边形内进行地理围栏检查可触发警报,标记点击事件则在您自己的窗体中打开资产的记录。
规划工具、运动应用和测量软件都依赖 GPX 轨迹、KML 图层和 GeoJSON 区域。sgcMaps 可导入和导出这三种格式,显示轨迹统计和海拔颜色,并把结果放在地形底图上。FireMonkey 控件把相同的功能带到野外使用的平板电脑或手机上。轨迹统计让您一眼看到路线的总上升和总下降。
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.RenderingDelphi 中的 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;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.WpfsgcMaps 附带十一个 Delphi 演示和八个 .NET 演示。没有 C++ Builder 演示项目。
文件夹、MBTiles 和在线瓦片、标记和形状,以及 GeoJSON、GPX 和 KML 导入。
提供商和 API 密钥、标记聚合、形状编辑、热力图和图像导出。
使用在线提供商进行地点搜索、地理编码、导航、海拔、时区和设备定位。需要 Delphi XE8 及更高版本。
构建 GeoNames 索引和 OpenStreetMap 路线图,然后在没有网络的情况下搜索地点并规划汽车、自行车或步行路线。
不带窗口、把地图渲染为 PNG 或 BMP 文件的控制台程序。
FireMonkey 地图,含瓦片、标记和设备定位,适用于 Windows、macOS、iOS 和 Android。需要 Delphi XE6 及更高版本。
用内置样式或您自己的样式文件绘制的矢量瓦片服务器,在每个缩放级别都有清晰的标签。
专为手机和平板电脑设计的 FireMonkey 地图:单指平移、双指缩放、大号缩放按钮、带精度圆圈的当前位置以及地点列表。Delphi 10.4 及更高版本。
从 URL 或文件加载 WMS 或 WMTS capabilities 文档,列出图层,并把您选择的图层作为 OpenStreetMap 上的叠加层添加,带有不透明度滑块。Delphi 2009 及更高版本。
从文件或 URL 打开栅格或矢量 PMTiles 归档,显示其头信息和元数据,并将其作为以归档为中心的图层添加。Delphi XE2 及更高版本。
导入带属性表的 shapefile,显示所点击标记的记录,并导入和导出 WKT。
WinForms 窗口中的 .NET SgcMapControl,含提供商、标记和形状。
用 XAML 声明的 WPF 地图:标记语言中的底图图层和标记、用 ItemsSource 绑定为标记的门店、缩放和方位滑块、打印和 PDF 导出。
使用 Avalonia 12 地图控件和编译绑定的同一个窗口。
带有 OpenStreetMap 底图图层和一个来自 WMS 或 WMTS 服务的叠加层的 WinForms 地图控件:从 URL 或文件加载 capabilities 文档,列出图层,用不透明度滑块添加您选择的图层,并显示瓦片错误。
带有来自栅格或矢量 PMTiles 归档的图层的 WinForms 地图控件,可从文件或 URL 打开,显示其头信息和元数据,并让地图以归档为中心。
导入 shapefile 及其属性表并显示所点击标记的记录的 WinForms 地图控件,还支持叠加层的 WKT 导入和导出。
.NET 离线包:来自本地数据文件的离线瓦片、路线规划和地理编码。
用无界面 MapView 把地图渲染为 PNG 的 .NET 控制台程序,可在 Windows 或 Linux 上运行。
适用于 Delphi (VCL) 的五个 QuickStart 演示位于 Demos\Maps\00.QuickStart。PDF 指南逐步讲解这些演示:第一张带标记的地图、通过代码添加的标记和标签、形状、地图事件,以及门店定位器。
免费 .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 文件(栅格和矢量) | − | ✓ |
| 离线路由器和离线地理编码器 | − | ✓ |
适用于 VCL 和 FireMonkey 的地图控件,以及读取磁盘瓦片的 Lazarus LCL 控件。
Layers、Markers、Polylines、Polygons、Rectangles、Circles、Labels 和 Heatmaps,所有框架共用。
TsgcMapGeocoder, TsgcMapDirections, TsgcMapPlaces, TsgcMapElevation and TsgcMapTimeZone.
TsgcMapRouteCalculator, TsgcMapOfflineRouter, TsgcMapOfflineGeocoder, TsgcMapGeoIndexBuilder and TsgcMapTileDownloader.
TsgcMapShapefile、TsgcMapWKT、TsgcMapWMSCapabilities、TsgcMapWMTSCapabilities 和 TsgcMapTileSource_PMTiles。
设备定位,以及 sgcMapDistance、方位角、目标点、大地线插值、点在多边形内和线条简化。
用于 WinForms 的 SgcMapControl、用于 WPF 的 TsgcWpfMap、用于 Avalonia 12 的 TsgcAvaloniaMap,以及渲染为 PNG 的无界面引擎 MapView,也可在 Linux 上运行。
| 目标 | 组件 | 平台 |
|---|---|---|
| Delphi 7 至 13,VCL | TsgcVCLMap 和模型 | Win32,自 XE2 起的 Win64,以及 Delphi 13 中的 ARM64EC |
| Delphi XE6 至 13,FireMonkey | TsgcFMXMap | Windows 自 XE6 起;macOS、iOS 和 Android 自 Delphi 10.4 起(macOS ARM 自 Delphi 11 起);设备定位支持 Windows、Android、iOS 和 macOS |
| Delphi 10.4 至 13,Linux 64 位 | 与框架无关的核心,没有地图控件 | 控制台和服务器应用程序中的瓦片源、服务、文件格式和离线数据 |
| C++ Builder 2007 至 13 | TsgcVCLMap、自 XE6 起的 TsgcFMXMap 和模型 | 仅限 Windows:Win32、自 XE3 起的 Win64 以及 C++ Builder 13 中的 Win64x,带生成的 .hpp 头文件和静态库 |
| Lazarus | LCL 地图控件 | 仅支持磁盘上的瓦片,不能下载瓦片 |
| .NET 8、9 和 10 | SgcMapControl、TsgcWpfMap、TsgcAvaloniaMap、MapView | WinForms 和 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、瓦片下载器以及离线路由器和地理编码器属于注册版的离线包。
模型、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 或更高版本。
有。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 控件同样包含在社区版中。规模更大的组织需要注册版授权。
简介, 概述, VCL 快速入门, TsgcVCLMap, 瓦片和图层, 标记和聚合, 离线路线规划, 静态渲染, WMS, WMTS, PMTiles, Shapefile, WKT, 包, 平台, 演示.
.NET 概述, WinForms 快速入门, WPF 快速入门, Avalonia 快速入门, XAML, 数据绑定, 无界面渲染, 离线数据, WMS 和 WMTS, PMTiles, Shapefile 和 WKT.
Delphi、C++ Builder 和 .NET,涵盖每款 sgcUI 产品。