У меня есть этот код, он принимает геометрию стран, а также множество точек, а затем возвращает только точки в этих странах:Как ускорить преобразование lat-long в SqlGeometry?
public static IEnumerable<Point> RemovePointsOutsideBorders(IEnumerable<Point> points, IEnumerable<Country> countries)
{
var cc = new List<Point>();
var SPAT_REF_ID = 4326;
foreach (var p in points)
{
var validText = new SqlChars(new SqlString(string.Format("POINT({0} {1})", p.Longitude, p.Latitude)));
var geoPoint = SqlGeometry.STPointFromText(validText, SPAT_REF_ID);
foreach (var c in countries)
{
if(c.Polygon.STIntersects(geoPoint))
{
cc.Add(p);
break;
}
}
}
return cc;
}
Текущий его довольно медленно, Есть около 4000 точек, с двойные LAT/длинные значений, преобразование, что в SqlGeometry медленно (занимает около 25 секунд, - мне нужно, чтобы это было возможно, вплоть до второго или два):
var s = new SqlChars(new SqlString(string.Format("POINT({0} {1})", p.Longitude, p.Latitude)));
var pGeo = SqlGeometry.STPointFromText(s, SPAT_REF_ID);
Это сделано только потому, что SqlGeometry .Point принимает x, y вместо lat, long ... любые подсказки о том, как я могу ускорить это?
Я уже знаю, что SqlGeometry (c.Polygon)
может быть уменьшен, чтобы ускорить работу, однако я не могу это контролировать. То, что я получаю, это способ ускорить преобразование с lat/long в точку SqlGeometry.
Вы уверены, что вы хотите иметь дело с 'SqlGeometry' и не' SqlGeorgaphy'? Эти два существенно отличаются в некоторых важных аспектах, особенно при работе с точками, которые находятся далеко (например, две страны). –
@MatthewHaugen Я ограничен Geometry, так как это то, что у нас есть в базе данных, любая операция, чтобы превратить это в SqlGeography в C#, была бы еще одной потерей IMO. – sprocket12
@Muhammad преобразует БД в SqlGeography. Любое другое решение только отложит неизбежное, БД ошибочно и нуждается в изменении. –