You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 19:33:29