C# postgis 计算两点距离(米)

实际误差不到1米


 public const string _4326 = @"GEOGCS[""WGS 84"",
    DATUM[""WGS_1984"",
    SPHEROID[""WGS 84"",6378137,298.257223563,
    AUTHORITY[""EPSG"",""7030""]],
    AUTHORITY[""EPSG"",""6326""]],
    PRIMEM[""Greenwich"",0,
    AUTHORITY[""EPSG"",""8901""]],
    UNIT[""degree"",0.01745329251994328,
    AUTHORITY[""EPSG"",""9122""]],
    AUTHORITY[""EPSG"",""4326""]]";

    public const string WGS84UTM49N = @"PROJCS[""WGS 84 / UTM zone 49N"",
    GEOGCS[""WGS 84"",
    DATUM[""WGS_1984"",
    SPHEROID[""WGS 84"",6378137,298.257223563,
    AUTHORITY[""EPSG"",""7030""]],
    AUTHORITY[""EPSG"",""6326""]],
    PRIMEM[""Greenwich"",0,
    AUTHORITY[""EPSG"",""8901""]],
    UNIT[""degree"",0.01745329251994328,
    AUTHORITY[""EPSG"",""9122""]],
    AUTHORITY[""EPSG"",""4326""]],
    UNIT[""metre"",1,
    AUTHORITY[""EPSG"",""9001""]],
    PROJECTION[""Transverse_Mercator""],
    PARAMETER[""latitude_of_origin"",0],
    PARAMETER[""central_meridian"",111],
    PARAMETER[""scale_factor"",0.9996],
    PARAMETER[""false_easting"",500000],
    PARAMETER[""false_northing"",0],
    AUTHORITY[""EPSG"",""32649""],
    AXIS[""Easting"",EAST],
    AXIS[""Northing"",NORTH]]";

    public static NetTopologySuite.Geometries.Geometry ProjectGeometry(NetTopologySuite.Geometries.Geometry geom,
        string fromWkt, string toWkt)
    {
        var sourceCoordSystem = new CoordinateSystemFactory().CreateFromWkt(fromWkt);
        var targetCoordSystem = new CoordinateSystemFactory().CreateFromWkt(toWkt);

        var trans = new CoordinateTransformationFactory().CreateFromCoordinateSystems(sourceCoordSystem,
            targetCoordSystem);

        var projGeom = Transform(geom, transform: trans.MathTransform);

        return projGeom;
    }

    private static NetTopologySuite.Geometries.Geometry Transform(NetTopologySuite.Geometries.Geometry geom,
        MathTransform transform)
    {
        geom = geom.Copy();
        geom.Apply(new MTF(transform));
        return geom;
    }


    private sealed class MTF : NetTopologySuite.Geometries.ICoordinateSequenceFilter
    {
        private readonly MathTransform _mathTransform;

        public MTF(MathTransform mathTransform) => _mathTransform = mathTransform;

        public bool Done => false;
        public bool GeometryChanged => true;

        public void Filter(NetTopologySuite.Geometries.CoordinateSequence seq, int i)
        {
            var x = seq.GetX(i);
            var y = seq.GetY(i);
            var z = seq.GetZ(i);
            _mathTransform.Transform(ref x, ref y, ref z);
            seq.SetX(i, x);
            seq.SetY(i, y);
            seq.SetZ(i, z);
        }
    }
  • usage
 var hca = new WKTReader().Read(
            $"SRID=4326;{hcaShape}");
        hca = GeometryExtensions.ProjectGeometry(hca, GeometryExtensions._4326, GeometryExtensions.WGS84UTM49N);

var point = new GeometryFactory().CreatePoint(new Coordinate(pipeLine[i].X, pipeLine[i].Y));
            point.SRID = 4326;
var transPoint =
                GeometryExtensions.ProjectGeometry(point, GeometryExtensions._4326, GeometryExtensions.WGS84UTM49N);

var distance = hca.Distance(transPoint)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值