.netcore + postgis 保存地图围栏数据
一、数据库字段
字段类型选择(Type)
设置对象类型为:geometry
二、前端传递的Json格式转换
前端传递围栏的各个坐标点数据如下:
{
"AreaRange": [
{
"lat": 30.123456,
"lng": 120.123456
},
{
"lat": 30.123456,
"lng": 120.654321
},
{
"lat": 30.654321,
"lng": 120.654321
},
{
"lat": 30.654321,
"lng": 120.123456
}
]
}
后端使用Geometry类型,ORM本项目使用了SqlSugar
/// <summary>
/// 区域围栏
/// </summary>
[SugarColumn(ColumnName= "arearange")]
public Geometry? AreaRange { get; set; }
public class MapProperty
{
/// <summary>
/// Latitude的简写,表示纬度
/// </summary>
public double lat { get; set; }
/// <summary>
/// Longtitude的简写,表示经度
/// </summary>
public double lng { get; set; }
}
后端Json转Geometry ( Polygon)多边形或者线
public static Polygon ConvertToPolygon(List<MapProperty> data)
{
if (data == null || data.Count < 3)
{
throw new ArgumentException("至少需要三个点才能创建多边形");
}
// 创建几何工厂
GeometryFactory factory = new GeometryFactory(new PrecisionModel(), 4326);
// 将 List<MapProperty> 转换为 List<Coordinate>
List<Coordinate> coordinates = data.Select(mp => new Coordinate(mp.lng, mp.lat)).ToList();
// 添加第一个点以闭合多边形
coordinates.Add(coordinates[0]);
// 创建线性环
LinearRing linearRing = factory.CreateLinearRing(coordinates.ToArray());
// 创建多边形
Polygon polygon = factory.CreatePolygon(linearRing);
return polygon;
}
public static LineString ConvertToLineString(List<MapProperty> data)
{
if (data == null || data.Count < 2)
{
throw new ArgumentException("至少需要两个点才能创建多段线");
}
// 创建几何工厂
GeometryFactory factory = new GeometryFactory();
// 将 List<MapProperty> 转换为 List<Coordinate>
List<Coordinate> coordinates = data.Select(mp => new Coordinate(mp.lng, mp.lat)).ToList();
// 创建多段线
LineString lineString = factory.CreateLineString(coordinates.ToArray());
return lineString;
}
保存入库
var area = GeoJsonHelper.ConvertToPolygon(request.AreaRange);
CommunityExtEntity ext = new CommunityExtEntity()
{
AreaRange = area,
};
await _app.Insertable(ext).ExecuteCommandAsync();