Thứ Ba, 13 tháng 8, 2024

Code c# chuyển tọa độ Vn2000 sang Gmap | VN2000 sang Lat long Vĩ độ, kinh độ và ngược lại

Ứng dụng được phát triển bởi đội ngũ AutoLISP Thật là đơn giản


Thông tin thêm: 👉👉👉

Chia sẻ ứng dụng chuyển đổi tọa độ

Trước đây khi làm việc với hệ tọa độ VN2000, AJS khá vất vả tìm cách chuyển đổi từ tọa độ Gmap sang VN2000

Do đó, chúng tôi quyết định chia sẻ mã nguồn chuyển đổi.

Mã nguồn chuyển đổi có trên website www.lisp.vn hoặc Github

Lưu ý: mã nguồn chuyển đổi chỉ mang tính tham khảo, không tối ưu về thuật toán. Mục đích chia sẻ là để những người mới dễ dàng tiếp cận với hệ tọa độ hơn.

Nếu có điều kiện, hãy chia sẻ mã nguồn chuyển đổi tối ưu hơn.

Cộng đồng AutoLISP Trắc địa


Link tham gia: http://gkz.lisp.vn

Các class tham chiếu


1 Danh sách tỉnh và Kinh tuyến trục VNProvinces.cs

(Copy nội dung sau)
Code:
using System;
using System.Collections.Generic;
using System.Linq;

namespace VN2000Transfer
{
    public static class VNProvinces
    {
        public static string FindProvinceByLong(double lon)
            => Datas.OrderBy(x => Math.Abs(x.Split(spls, StringSplitOptions.RemoveEmptyEntries).LastOrDefault().ToDouble() - lon))
                    .FirstOrDefault();

        public static double GetNaturalLong(string VNProvs)
        {
            if (string.IsNullOrEmpty(VNProvs) || !VNProvinces.Datas.Contains(VNProvs)) VNProvs = "auto";
            var mcs = (VNProvs == "" ? Datas.FirstOrDefault() : VNProvs).Split(spls, StringSplitOptions.RemoveEmptyEntries);
            if (mcs.Length > 1 && mcs.LastOrDefault().ToDouble() > 10) return mcs.LastOrDefault().ToDouble();
            return 107.5;
        }

        private static string[] spls = new List<string>() { "\t", " ", "," }.ToArray();

        public static List<string> Datas = new List<string>()
        {
            "1. An Giang  104.75",
            "2. Bà Rịa - Vũng Tàu 107.75",
            "3. Bắc Giang 107",
            "4. Bắc Kạn 106.5",
            "5. Bạc Liêu  105",
            "6. Bắc Ninh 105.5",
            "7. Bến Tre 105.75",
            "8. Bình Định 108.25",
            "9. Bình Dương  105.75",
            "10. Bình Phước 106.25",
            "11. Bình Thuận 108.5",
            "12. Cà Mau  104.5",
            "13. Cần Thơ 105",
            "14. Cao Bằng 105.75",
            "15. Đà Nẵng 107.75",
            "16. Đắc Lắc 108.5",
            "17. Đắc Nông 108.5",
            "18. Điện Biên 103",
            "19. Đồng Nai 107.75",
            "20. Đồng Tháp 105",
            "21. Gia Lai 108.5",
            "22. Hà Giang  105.5",
            "23. Hà Nam 105",
            "24. Hà Nội  105",
            "25. Hà Tĩnh 105.5",
            "26. Hải Dương  105.5",
            "27. Hải Phòng 105.75",
            "28. Hậu Giang 105",
            "29. Hòa Bình 106",
            "30. Hưng Yên 105.5",
            "31. Khánh Hòa 108.25",
            "32. Kiên Giang  104.5",
            "33. Kon Tum 107.5",
            "34. Lai Châu 103",
            "35. Lâm Đồng 107.75",
            "36. Lạng Sơn 107.25",
            "37. Lào Cai  104.75",
            "38. Long An 105.75",
            "39. Nam Định 105.5",
            "40. Nghệ An  104.75",
            "41. Ninh Bình 105",
            "42. Ninh Thuận 108.25",
            "43. Phú Thọ 104.75",
            "44. Phú Yên 108.5",
            "45. Quảng Bình 106",
            "46. Quảng Nam 107.75",
            "47. Quảng Ngãi 108",
            "48. Quảng Ninh 107.75",
            "49. Quảng Trị 106.25",
            "50. Sóc Trăng  105.5",
            "51. Sơn La  104",
            "52. Tây Ninh 105.5",
            "53. Thái Bình 105.5",
            "54. Thái Nguyên 106.5",
            "55. Thanh Hóa 105",
            "56. TP Hồ Chí Minh 105.75",
            "57. Thừa Thiên Huế  107",
            "58. Tiền Giang 105.75",
            "59. Trà Vinh 105.5",
            "60. Tuyên Quang  106",
            "61. Vĩnh Long 105.5",
            "62. Vĩnh Phúc  105",
            "63. Yên Bái  104.75"
        };
    }
}


2 Công thức chuyển đổi VN2000Datum.cs

(Copy nội dung sau)
Code:
using System;
using System.Diagnostics;

namespace VN2000Transfer
{
    public enum TransDatum
    { VN2000ToWGSLatlong, WGS2LatlongToVN20000 };

    public static class TransExts
    {
        public static void TransformDatum(double from_lat_longX, double from_lat_longY, ref double result_lat_longX, ref double result_lat_longY, ref string VNProvs, TransDatum trans = TransDatum.VN2000ToWGSLatlong, double overwride_natural_long = -1, string MuiChieu = "3")
        {
            //"www.lisp.vn"
            if (overwride_natural_long < 0)
            {
                if (VNProvs.ToUpper().Contains("AUTO") && trans == TransDatum.WGS2LatlongToVN20000)
                {
                    VNProvs = VNProvinces.FindProvinceByLong(from_lat_longY);
                }
            }

            var naturallong = overwride_natural_long > 1 ? overwride_natural_long : VNProvinces.GetNaturalLong(VNProvs);
            if (naturallong > 1)
                TransformDatum(from_lat_longX, from_lat_longY, ref result_lat_longX, ref result_lat_longY, trans, naturallong, MuiChieu);

            //"www.lisp.vn"
        }

        public static void TransformDatum(double from_lat_longX, double from_lat_longY, ref double result_lat_longX, ref double result_lat_longY, TransDatum trans = TransDatum.VN2000ToWGSLatlong, double overwride_natural_long = 105.5, string MuiChieu = "3")
        {
            //"www.lisp.vn"
            var naturallong = overwride_natural_long.ToRadian();
            if (naturallong > 1)
            {
                if (trans == TransDatum.VN2000ToWGSLatlong)
                {
                    var naturallat = 0.0;             //D7

                    var D7 = naturallat;
                    var D8 = naturallong;

                    var C10 = 500000.0;
                    var C11 = 0.0;
                    var scalefactor = MuiChieu.Contains("3") ? 0.9999 : 0.9996;
                    var C12 = scalefactor;

                    double a = 6378137;             //C15
                    var C15 = a;
                    double b = 6356752.31424496;
                    double _1f = 298.25722356;      //C16

                    //VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO
                    //VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO
                    //VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO//VN2000_GEO
                    double e2 = 2 * (1 / _1f) - (1 / _1f) * (1 / _1f);      //C17
                    var C17 = e2;
                    double e22 = e2 / ((1 - (1 / _1f)) * (1 - (1 / _1f)));  //C18
                    var C18 = e22;

                    Debug.Print("e2=" + e2);
                    Debug.Print("e22=" + e22);

                    double e1 = (1 - Math.Sqrt(1 - e2)) / (1 + Math.Sqrt(1 - e2));
                    Debug.Print("e1=" + e1);
                    var C21 = e1;

                    double i25 = C17 / 4.0;
                    double i26 = 3.0 * C17 * C17 / 64.0;
                    double i27 = 5 * C17 * C17 * C17 / 256.0;
                    double i28 = 3.0 * C17 / 8.0;
                    double i29 = 3.0 * C17 * C17 / 32.0;
                    double i30 = 45 * C17 * C17 * C17 / 1024.0;
                    double i31 = 15 * C17 * C17 / 256.0;
                    double i32 = 45 * C17 * C17 * C17 / 1024.0;
                    double i33 = 35 * C17 * C17 * C17 / 3072.0;

                    Debug.Print("i25-33=" + i25 + "/" + i26 + "/" + i27 + "/" + i28 + "/" + i29 + "/" + i30 + "/" + i31 + "/" + i32 + "/" + i33);

                    double M0 = a * ((1 - i25 - i26 - i27) * naturallat - (i28 + i29 + i30) * Math.Sin(2.0 * naturallat) + (i31 + i32) * Math.Sin(4.0 * naturallat) - i33 * Math.Sin(6.0 * D7));
                    var C22 = M0;

                    var M1 = C22 + (from_lat_longY - C11) / C12;
                    var C23 = M1;

                    var u1 = C23 / (C15 * (1.0 - (C17 / 4.0) - 3.0 * (C17 * C17 / 64.0) - 5.0 * (C17 * C17 * C17 / 256.0)));
                    var C24 = u1;

                    var F1 = C24 + ((3.0 * C21 / 2.0) - 27.0 * C21 * C21 * C21 / 32.0) * Math.Sin(2.0 * C24)
                        + (21.0 * (C21 * C21) / 16.0 - 55.0 * (C21 * C21 * C21 * C21) / 32.0) * Math.Sin(4 * C24) + (151.0 * (C21 * C21 * C21) / 96.0) * Math.Sin(6.0 * C24)
                        + (1097.0 * (C21 * C21 * C21 * C21) / 512.0) * Math.Sin(8.0 * C24);
                    var C25 = F1;

                    var T1 = Math.Tan(C25) * Math.Tan(C25);
                    var C26 = T1;

                    var v1 = C15 / Math.Sqrt(1 - C17 * (Math.Sin(C25) * Math.Sin(C25)));
                    var C27 = v1;

                    var p1 = C15 * (1.0 - C17) / Math.Pow((1.0 - C17 * (Math.Sin(C25) * Math.Sin(C25))), 1.5);
                    var C28 = p1;

                    var c1 = C18 * (Math.Cos(C25) * Math.Cos(C25));
                    var C29 = c1;

                    var D = (from_lat_longX - C10) / (C12 * C27);
                    var C30 = D;

                    double lat = C25 - (C27 * Math.Tan(C25) / C28) * (C30 * C30 / 2.0 - (5.0 + 3.0 * C26 + 10.0 * C29 - 4.0 * (C29 * C29) - 9.0 * C18)
                        * (C30 * C30 * C30 * C30) / 24.0 + (61.0 + 90.0 * C26 + 298.0 * C29 + 45.0 * (C26 * C26) - 252.0 * C18 - 3.0 * C29 * C29) * Math.Pow(C30, 6.0) / 720.0);
                    //lat = C25;

                    double lon = D8 + (C30 - (1.0 + 2.0 * C26 + C29) * (Math.Pow(C30, 3.0)) / 6.0 + (5.0 - 2.0 * C29 + 28.0 * C26 - 3.0 * (C29 * C29)
                        + 8.0 * C18 + 24.0 * C26 * C26) * (Math.Pow(C30, 5.0)) / 120.0) / Math.Cos(C25);

                    //GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC
                    //GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC
                    //GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC

                    double H = 0;
                    var v = a / Math.Sqrt(1.0 - e2 * (Math.Sin(lat)) * (Math.Sin(lat)));
                    Debug.Print("C17=v=" + v);

                    var X = (H + v) * Math.Cos(lat) * Math.Cos(lon);
                    Debug.Print("X=" + X);

                    var Y = (H + v) * Math.Cos(lat) * Math.Sin(lon);
                    Debug.Print("Y=" + Y);

                    var Z = ((1.0 - e2) * v + H) * Math.Sin(lat);
                    Debug.Print("Z=" + Z);

                    double Xgeo = X, Ygeo = Y, Zgeo = Z;
                    Trans7Params(X, Y, Z, ref Xgeo, ref Ygeo, ref Zgeo, trans);

                    //GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO
                    //GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO
                    //GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO
                    var p = Math.Sqrt(Xgeo * Xgeo + Ygeo * Ygeo);
                    var F = Math.Atan(Zgeo * a / (p * b));
                    Debug.Print("v/p/F=" + v + "/" + p + "/" + F);

                    var newlat = Math.Atan((Zgeo + e22 * b * Math.Pow(Math.Sin(F), 3.0)) / (p - e2 * a * Math.Pow(Math.Cos(F), 3.0))).ToDegree();
                    var newlon = Math.Atan(Ygeo / Xgeo);
                    var d27 = newlon > 0 ? -(180.0 - newlon.ToDegree()) : newlon.ToDegree();
                    var d28 = newlon > 0 ? newlon.ToDegree() : (180.0 + newlon.ToDegree());
                    var d29 = naturallong < 0 ? d27 : d28;

                    newlon = d29;

                    Debug.Print("newlat/newlon=" + newlat + "/" + newlon);

                    //retpt = new Point2d(newlat, newlon);
                    result_lat_longX = newlat;
                    result_lat_longY = newlon;
                }
                else if (trans == TransDatum.WGS2LatlongToVN20000)
                {
                    var naturallat = 0.0;             //D7

                    //naturallong = 107.5.ToRadian();

                    var D7 = naturallat;

                    var C10 = 500000.0;
                    var C11 = 0.0;
                    //var scalefactor = MuiChieu.Contains("3") ? 0.9999 : 0.9996;
                    //var C12 = scalefactor;

                    double a = 6378137;             //C15
                    var C15 = a;
                    double b = 6356752.31424496;
                    double _1f = 298.25722356;      //C16

                    //UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO
                    //UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO
                    //UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO//UTM_GEO
                    double e2 = 2 * (1 / _1f) - (1 / _1f) * (1 / _1f);      //C17
                    double e22 = e2 / ((1 - (1 / _1f)) * (1 - (1 / _1f)));  //C18

                    double lat = from_lat_longX.ToRadian();
                    double lon = from_lat_longY.ToRadian();
                    //lat = 0.203635817;
                    //lon = 1.89344633;

                    Debug.Print("lat=" + lat + "\nlong=" + lon + " D7=" + D7);

                    //GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC
                    //GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC
                    //GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC//GEO_GEOCENTRIC

                    double H = 0;
                    var v = a / Math.Sqrt(1.0 - e2 * Math.Sin(lat) * (Math.Sin(lat)));
                    Debug.Print("C17=v=" + v);

                    var X = (H + v) * Math.Cos(lat) * Math.Cos(lon);
                    Debug.Print("X=" + X);

                    var Y = (H + v) * Math.Cos(lat) * Math.Sin(lon);
                    Debug.Print("Y=" + Y);

                    var Z = ((1.0 - e2) * v + H) * Math.Sin(lat);
                    Debug.Print("Z=" + Z);

                    //Transfer7params//Transfer7params//Transfer7params//Transfer7params//Transfer7params//Transfer7params//Transfer7params//Transfer7params
                    //Transfer7params//Transfer7params//Transfer7params//Transfer7params//Transfer7params//Transfer7params//Transfer7params//Transfer7params
                    //Transfer7params//Transfer7params//Transfer7params//Transfer7params//Transfer7params//Transfer7params//Transfer7params//Transfer7params

                    double Xgeo = X, Ygeo = Y, Zgeo = Z;
                    Trans7Params(X, Y, Z, ref Xgeo, ref Ygeo, ref Zgeo, trans);

                    //GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO
                    //GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO
                    //GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO//GEOCENTRIC_GEO
                    var p = Math.Sqrt(Xgeo * Xgeo + Ygeo * Ygeo);
                    var F = Math.Atan(Zgeo * a / (p * b));
                    Debug.Print("v/p/F=" + v + "/" + p + "/" + F);

                    var newlat = Math.Atan((Zgeo + e22 * b * Math.Pow(Math.Sin(F), 3.0)) / (p - e2 * a * Math.Pow(Math.Cos(F), 3.0))).ToDegree();
                    var newlon = Math.Atan(Ygeo / Xgeo);
                    var d27 = newlon > 0 ? -(180.0 - newlon.ToDegree()) : newlon.ToDegree();
                    var d28 = newlon > 0 ? newlon.ToDegree() : (180.0 + newlon.ToDegree());
                    var d29 = naturallong < 0 ? d27 : d28;

                    newlon = d29;

                    //GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000
                    //GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000
                    //GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000//GEO_VN2000
                    var d4 = newlat.ToRadian();
                    var d5 = newlon.ToRadian();

                    var d6 = naturallat;
                    var d7 = naturallong;

                    var C17 = e2;
                    double I25 = C17 / 4.0;
                    double I26 = 3.0 * C17 * C17 / 64.0;
                    double I27 = 5 * C17 * C17 * C17 / 256.0;
                    double I28 = 3.0 * C17 / 8.0;
                    double I29 = 3.0 * C17 * C17 / 32.0;
                    double I30 = 45 * C17 * C17 * C17 / 1024.0;
                    double I31 = 15 * C17 * C17 / 256.0;
                    double I32 = 45 * C17 * C17 * C17 / 1024.0;
                    double I33 = 35 * C17 * C17 * C17 / 3072.0;

                    var C12 = 0.9999;

                    var C21 = (d5 - d7) * Math.Cos(d4);
                    var C22 = Math.Tan(d4) * Math.Tan(d4);
                    var C23 = C15 / Math.Sqrt(1 - e2 * Math.Sin(d4) * Math.Sin(d4));
                    var C24 = e2 * Math.Cos(d4) * Math.Cos(d4) / (1 - e2);
                    var C25 = C15 * ((1 - I25 - I26 - I27) * d4 - (I28 + I29 + I30) * Math.Sin(2 * d4) + (I31 + I32) * Math.Sin(4 * d4) - I33 * Math.Sin(6 * d4));
                    var C26 = C15 * ((1 - I25 - I26 - I27) * d6 - (I28 + I29 + I30) * Math.Sin(2 * d6) + (I31 + I32) * Math.Sin(4 * d6) - I33 * Math.Sin(6 * d6));
                    var newX = C10 + C12 * C23 * (C21 + ((1 - C22 + C24) * Math.Pow(C21, 3) / 6) + ((5 - 18 * C22 + Math.Pow(C22, 2) + 72 * C24 - 58 * e22) * Math.Pow(C21, 5) / 120));
                    var newY = C11 + C12 * (C25 - C26 + (C23 * Math.Tan(d4) * ((((C21 * C21) / 2) + (5 - C22 + 9 * C24 + 4 * Math.Pow(C24, 2)) * Math.Pow(C21, 4) / 24) + ((61 - 58 * C22 + C22 * C22 + 600 * C24 - 330 * e22) * Math.Pow(C21, 6) / 720))));

                    result_lat_longX = newX;
                    result_lat_longY = newY;
                }
            }
            //"www.lisp.vn"
            return;
        }

        public const double DELTA_X = -191.90441429;
        public const double DELTA_Y = -39.30318279;
        public const double DELTA_Z = -111.45032830;
        public const double ROT_X = -0.00928836;
        public const double ROT_Y = 0.01975479;
        public const double ROT_Z = -0.00427372;
        public const double BWSCALE = 0.000000252906277 / 1000000.0;

        private static void Trans7Params(double X, double Y, double Z, ref double Xgeo, ref double Ygeo, ref double Zgeo, TransDatum trans = TransDatum.VN2000ToWGSLatlong)
        {
            double k = trans == TransDatum.VN2000ToWGSLatlong ? 1 : -1;
            Xgeo = k * DELTA_X + ((1.0 + k * BWSCALE) * (X + Y * (k * ROT_Z / 3600.0).ToRadian() - Z * (k * ROT_Y / 3600.0).ToRadian()));
            Ygeo = k * DELTA_Y + ((1.0 + k * BWSCALE) * (-X * (k * ROT_Z / 3600.0).ToRadian() + Y + Z * (k * ROT_X / 3600.0).ToRadian()));
            Zgeo = k * DELTA_Z + ((1.0 + k * BWSCALE) * (X * (k * ROT_Y / 3600.0).ToRadian() - Y * (k * ROT_X / 3600.0).ToRadian() + Z));
        }

        public static double ToDegree(this double radian)
            => radian * 180.0 / Math.PI;

        public static double ToRadian(this double degree)
            => degree * Math.PI / 180.0;

        public static double ToDouble(this string obj, double def = 0.0)
        {
            double retval = def;
            try
            {
                double.TryParse(obj.ToString(), out retval);
            }
            catch { }
            return retval;
        }
    }
}



Cách sử dụng (Áp dụng với AutoCAD)


3 ImporVn2000Transfer.cs

(Copy nội dung sau)
Code:
using Autodesk.AutoCAD.Geometry;
using VN2000Transfer;

namespace AutoCAD_VN2000
{
    internal static class ImporVn2000Transfer
    {
        public static Point3d TransformDatum(this Point3d from_lat_long, TransDatum trans = TransDatum.VN2000ToWGSLatlong, double overwride_natural_long = -1, string MuiChieu = "3")
        {
            double result_lat_longX = 0;
            double result_lat_longY = 0;
            TransExts.TransformDatum(from_lat_long.X, from_lat_long.Y, ref result_lat_longX, ref result_lat_longY, trans, overwride_natural_long, MuiChieu);
            return new Point3d(result_lat_longX, result_lat_longY, 0);
        }

        public static Point3d TransformDatum(this Point3d from_lat_long, ref string VNProvs, TransDatum trans = TransDatum.VN2000ToWGSLatlong, double overwride_natural_long = -1, string MuiChieu = "3")
        {
            double result_lat_longX = 0;
            double result_lat_longY = 0;
            TransExts.TransformDatum(from_lat_long.X, from_lat_long.Y, ref result_lat_longX, ref result_lat_longY, ref VNProvs, trans, overwride_natural_long, MuiChieu);
            return new Point3d(result_lat_longX, result_lat_longY, 0);
        }
    }
}


4 MyCommands.cs

(Copy nội dung sau)
Code:
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;

// This line is not mandatory, but improves loading performances
[assembly: CommandClass(typeof(AutoCAD_VN2000.MyCommands))]

namespace AutoCAD_VN2000
{
    // This class is instantiated by AutoCAD for each document when
    // a command is called by the user the first time in the context
    // of a given document. In other words, non static data in this class
    // is implicitly per-document!
    public class MyCommands
    {
        // Modal Command with localized name
        [CommandMethod("ToLatLong")]
        public void ChuyenDoiVN2000_sang_LatLong() // This method can have any name
        {
            // Put your command code here
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Editor ed;
            if (doc != null)
            {
                ed = doc.Editor;

                var psr = ed.GetPoint("\nXác định điểm trên bản vẽ: ");
                if (psr.Status != PromptStatus.OK) return;

                foreach (var prov in VN2000Transfer.VNProvinces.Datas)
                    ed.WriteMessage("\n" + prov + " => " + VN2000Transfer.VNProvinces.GetNaturalLong(prov));

                var per = ed.GetDouble("\nChọn kinh tuyến tương ứng với Tỉnh/TP");
                if (per.Status != PromptStatus.OK || per.Value < 80) return;

                var point = psr.Value.TransformDatum(VN2000Transfer.TransDatum.VN2000ToWGSLatlong, per.Value);
                ed.WriteMessage("\nTọa độ Lat/Long chuyển đổi: " + point.X + "," + point.Y);
                ed.WriteMessage("\nwww.lisp.vn");
            }
        }

        [CommandMethod("ToVN2000")]
        public void ChuyenDoiveVN2000() // This method can have any name
        {
            // Put your command code here
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Editor ed;
            if (doc != null)
            {
                ed = doc.Editor;

                var psr = ed.GetPoint("\nXác định tọa độ Lat,Long (VD: 11.3495405,108.8745916): ");
                if (psr.Status != PromptStatus.OK) return;

                foreach (var prov in VN2000Transfer.VNProvinces.Datas)
                    ed.WriteMessage("\n" + prov + " => " + VN2000Transfer.VNProvinces.GetNaturalLong(prov));

                var per = ed.GetDouble("\nChọn kinh tuyến tương ứng với Tỉnh/TP");
                if (per.Status != PromptStatus.OK || per.Value < 80) return;

                var point = psr.Value.TransformDatum(VN2000Transfer.TransDatum.WGS2LatlongToVN20000, per.Value);
                ed.WriteMessage("\nTọa độ Lat/Long chuyển đổi: " + point.X + "," + point.Y);
                ed.WriteMessage("\nwww.lisp.vn");
            }
        }
    }
}


Link GitHub



Link file dll đã build cho AutoCAD






Cảm ơn các bạn đã theo dõi!

---------------------------------------------------------------------------------------------
Ứng dụng được phát triển bởi đội ngũ AutoLISP Thật là đơn giản - Tác giả ứng dụng in D2P

    

Mọi thông tin xin liên hệ Fanpage AutoLISP Thật là đơn giản!
Cảm ơn bạn đã theo dõi!

Không có nhận xét nào:

Đăng nhận xét

Rải block theo Polyline trong AutoCAD | Dim block theo Polyline | Insert block along selected polylines

Ứng dụng được phát triển bởi đội ngũ AutoLISP Thật là đơn giản      Thông tin thêm: 👉👉👉