网上有个工具可以做到,可惜导入的中文是乱码,搜索了一圈好像没什么解决办法,于是想自己搞一个,哎,一搞才知道麻烦重重啊~
首先查资料,了解了一下SQLServer中的空间数据分两种,Geometry和Geography,一种是平面一种球面,比如在做距离计算时结果是不一样的啊
所以我必须先Geography球面坐标系,但这玩意儿有限制啊,比如多边形外环方向必须是逆时针,内环方向必须是顺时针,不能超过一个半球等等
不管了先做,加载GDAL和ORG,打开MapInfo图层,遍历之,取字段正常,取几何个数正确,下一步将几何数据导出,方法很多,支持OpenGIS的系统
都支持WKT和WKB,为了方便选ExportToWkt,然后生成 INSERT语句,差不多了,执行之,问题来了:Sqlserver报错,说什么
消息 6522,级别 16,状态 1,第 1 行
在执行用户定义例程或聚合 "geography" 期间出现 .NET Framework 错误:
Microsoft.SqlServer.Types.GLArgumentException: 24205: 因为指定的输入超过了一个半球,所以它不代表有效的地理实例。每个地理实例必须能容纳在一个半球内。此错误的常见原因是某个多边形的环方向错误。
Microsoft.SqlServer.Types.GLArgumentException:
在 Microsoft.SqlServer.Types.GLNativeMethods.ThrowExceptionForHr(GL_HResult errorCode)
在 Microsoft.SqlServer.Types.GLNativeMethods.GeodeticIsValid(GeoData g)
在 Microsoft.SqlServer.Types.SqlGeography.IsValidExpensive()
在 Microsoft.SqlServer.Types.SqlGeography.ConstructGeographyFromUserInput(GeoData g, Int32 srid)
在 Microsoft.SqlServer.Types.SqlGeography.GeographyFromText(OpenGisType type, SqlChars taggedText, Int32 srid)
在 Microsoft.SqlServer.Types.SqlGeography.STGeomFromText(SqlChars geometryTaggedText, Int32 srid)
将geography::STGeomFromText换成geometry::STGeomFromText,没问题可以正常生成几何,哎,说明真的环方向有问题,改吧,于是有了以后代码
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace SqlSpatialTools
{
public class Point
{
public double X { get; set; }
public double Y { get; set; }
public Point(double x, double y)
{
X = x;
Y = y;
}
public static Point Parse(string pt)
{
var p = pt.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);
return p.Length == 2 ? new Point(Convert.ToDouble(p[0]), Convert.ToDouble(p[1])) : null;
}
public override string ToString()
{
return string.Format("{0:F8} {1:F8}", X, Y);
}
}
public static class Wkt
{
///
/// 判断环的是否为顺时针方向
///
///
/// True顺时针,False逆时针
private static bool IsRingClockwise(IList pp)
{
double t = 0;
for (var i = 1; i < pp.Count; i++)
t += pp[i - 1].X * pp[i].Y - pp[i].X * pp[i - 1].Y;
t += pp[pp.Count - 1].X * pp[0].Y - pp[0].X * pp[pp.Count - 1].Y;
return t < 0;
}
新闻热点
疑难解答