GeneXus 18升级10下KML导入、地图展示及坐标校验方案咨询
GeneXus 18 U10 (.NET+SQL) 下KML导入与地理校验解决方案
1. KML解析转换为SQL Geography类型
GeneXus无直接导入KML的原生工具,需通过.NET代码解析KML并转换为SQL Server支持的geography类型:
- 用
System.Xml.Linq读取KML内容,提取<coordinates>节点的坐标串(格式为经度,纬度[,海拔] 经度,纬度[,海拔]...)。 - 剔除海拔信息,将坐标串转换为WKT(Well-Known Text)格式,例如多边形的WKT为
POLYGON((lon1 lat1, lon2 lat2, ..., lon1 lat1))。 - 调用SQL Server的
SqlGeography.STGeomFromText()方法生成地理对象,指定SRID为4326(谷歌地图采用的空间参考系)。
示例.NET代码:
using System.Xml.Linq; using Microsoft.SqlServer.Types; using System.Linq; public SqlGeography ConvertKmlToGeography(string kmlContent) { var kmlDoc = XDocument.Parse(kmlContent); var ns = XNamespace.Get("http://www.opengis.net/kml/2.2"); var coordText = kmlDoc.Descendants(ns + "coordinates").First().Value.Trim(); var coordPairs = coordText.Split(' ', StringSplitOptions.RemoveEmptyEntries) .Select(coord => { var parts = coord.Split(','); return $"{parts[0]} {parts[1]}"; }); var wkt = $"POLYGON(({string.Join(", ", coordPairs)}))"; return SqlGeography.STGeomFromText(new SqlChars(wkt), 4326); }
2. 数据库存储配置
- 在GeneXus中创建实体(如
KmlArea),添加类型为Geography的属性,该属性会映射到SQL Server的geography字段。 - 调用上述转换方法得到
SqlGeography对象后,赋值给实体的Geography属性,执行保存逻辑即可将KML的地理数据存入数据库。
3. 地图展示实现
方案一:GeneXus地图控件直接绑定
使用GeneXus的Google Maps控件,将实体的Geography属性绑定到控件的Geography属性,控件会自动渲染对应的几何图形(多边形、线串等)。
方案二:转换为KML前端加载
- 从数据库取出Geography字段,调用
SqlGeography.AsKml()生成KML字符串,通过后端接口返回给前端。 - 前端使用谷歌地图的
KmlLayer加载该KML内容,示例代码:
const kmlString = '...'; // 后端返回的KML字符串 const kmlLayer = new google.maps.KmlLayer({ url: `data:application/vnd.google-earth.kml+xml;base64,${btoa(kmlString)}`, map: yourMapInstance });
4. 坐标区域校验
方案一:SQL Server内置校验(无需谷歌API)
直接利用SQL Server的STContains()方法判断坐标是否在存储的地理区域内,示例SQL:
SELECT Id, Name FROM KmlArea WHERE AreaGeography.STContains(SqlGeography::STPointFromText('POINT(目标经度 目标纬度)', 4326)) = 1
方案二:谷歌Maps API前端校验
- 前端解析KML得到多边形路径数组,使用谷歌地图的
google.maps.geometry.poly.containsLocation()方法判断坐标归属:
// 假设已解析KML得到多边形路径pathArray const targetLatLng = new google.maps.LatLng(目标纬度, 目标经度); const polygon = new google.maps.Polygon({ paths: pathArray }); const isInside = google.maps.geometry.poly.containsLocation(targetLatLng, polygon);
- 注意:需在前端引入谷歌Maps JS库并传入有效的API密钥。
内容的提问来源于stack exchange,提问作者Mauricio Lopez
相关产品推荐
相关产品推荐

