أكثر

إنشاء شبكة نقطة محددة من قبل المستخدم

إنشاء شبكة نقطة محددة من قبل المستخدم


أحاول كتابة بعض التعليمات البرمجية (في C # ، ولكن أي لغة ستفعل) حيث يحدد المستخدم والمنطقة ، استنادًا إلى Min / Max Long / Lat ، ويحدد المسافة بين النقاط بالأمتار ، ويعيد الرمز جدولًا طويلًا / لاتس (WGS84 / ESPG: 4326) لإنشاء شبكة.

لقد كتبت بعض التعليمات البرمجية منذ فترة من الوقت بأنني كنت تحت الانطباع بأنني قمت بالمهمة ، ولكن بعد قليل من التحليل السريع ، لا تماما ترقى إلى مستوى الوظيفة. الرجاء مراجعة التعليمات البرمجية أدناه:

العشري minX = -74.002747535706M ؛ أقل عشري ص = 40.722282672831 م ؛ ماكس عشري = -73.98386478424 م ؛ العشرية maxY = 40.733470232685M ؛ المسافة العشرية = 100 ؛ عشري س = 0.0 م ؛ عشري y = 0.0M ؛ الطول العشري = 0.0 م ؛ الطول العشري الزيادة = 0.0 م ؛ الزيادة العشرية النسبة المئوية = 0.0 م ؛ كثافة العمليات أنا = 0 ؛ العدد العشري yIncrement = المسافة / (عشري) 111111.111111 ؛ DataTable dt = new DataTable () ؛ dt.Columns.Add ("Longitude"، Type.GetType ("System.Decimal")) ؛ dt.Columns.Add ("Latitude"، Type.GetType ("System.Decimal")) ؛ ص = دقيقة ؛ بينما (y 

ما سبق يعمل بشكل جيد. يتم إرجاع طويلة / لاتس مفصولة بـ 100 متر عرض ، ولكن بطول 90 مترًا. عندما أقوم بتغييرمسافه: بعدإلى 25 مترًا ، يفصل خط العرض بمقدار 25 مترًا ، لكن خط الطول بمقدار 22.3 مترًا.

تعديل: C Sharp Version Solution بناءً على إجابة yosukesabai:

نصف القطر الدولي = 6378137 ؛ pi مزدوج = Math.PI ؛ درجة مزدوجة 2Rad = باي / 180 ؛ مزدوج dst2Lat = 360 / (2 * pi * radius) ؛ DataTable dt = new DataTable () ؛ dt.Columns.Add ("ID"، typeof (int)) ؛ dt.Columns.Add ("Longitude"، Type.GetType ("System.Decimal")) ؛ dt.Columns.Add ("Latitude"، Type.GetType ("System.Decimal")) ؛ س = مينكس ؛ ص = دقيقة ؛ بينما (y 

أي مساعدة هنا ستكون مفيدة بشكل خيالي!

يعتبر

صباحا


اتخذت نهج ASPMapper ولكن بدلاً من القيام بالرياضيات بمفردي ، استخدمت الحزمة الجيوديسية من PROJ.4 (python رابط pyproj ، http://code.google.com/p/pyproj/).

من pyproj import Geod minX = -74.002747535706 # بالدرجات minY = 40.722282672831 maxX = -73.98386478424 maxY = 40.733470232685 المسافة = 100 # بالأمتار g = Geod (ellps = 'WGS84') coords = [] lon ، lat = minX ، minY while lat 

مراجع

من الرياضيات استيراد pi ، cos minX = -74.002747535706 # بالدرجات minY = 40.722282672831 maxX = -73.98386478424 maxY = 40.733470232685 مسافة = 100 # بالأمتار # نصف قطر الأرض ، لا تخبر أي شخص أنني لا أستخدم wgs84: pr = 6378137 deg2rad = pi / 180 # عامل لتحويل المتر إلى درجة خط العرض dst2lat = 360 / (2 * pi * r) coords = [] # البدء بـ LL corner lon ، lat = minX ، minY # march باتجاه الشمال بينما خط العرض 

تمت مراجعته مرة أخرى

حاولت الآن دمج الانحراف المركزي للأرض المحدد في WGS84 ، بدلاً من تقريب المجال. في الشمال / الجنوب ، حصلت على دقة جيدة جدًا (7 أرقام أو نحو ذلك) ولكن على خط العرض ، ما زلت أحصل على دقة 4 أرقام ...

من استيراد الرياضيات pi، cos، sin، sqrt minX = -74.002747535706 # بالدرجات minY = 40.722282672831 maxX = -73.98386478424 maxY = 40.733470232685 مسافة = 100 # بالمتر # المحور الرئيسي وعكس تسطيح الأرض ، الآن أنا أستخدم WGS a ، invf = 6378137.0، 298.257223563 # عامل التحويل بين الدرجة والراديان deg2rad = pi / 180 # انحراف الأرض f = 1 / invf e = sqrt (f * (2-f)) # cuvature الزوالي عند خط العرض الأوسط للمربع بأكمله midY =. 5 * (minY + maxY) r_meridional_mid = a * (1 - e * e) / ((1 - (e * sin (midY * deg2rad)) ** 2) ** 1.5) # عامل لتحويل المتر إلى درجة خط العرض ، عند خط العرض الأوسط dst2lat_mid = 360 / (2 * pi * r_meridional_mid) coords = [] # ابدأ بـ LL corner lon ، lat = minX ، minY # march شمالًا بينما lat 

منقح (إصلاح نصف قطر حساب الانحناء الطبيعي)

وجدت سبب ثمل في نصف قطر الانحناء الطبيعي (لقد قمت بنسخ الصيغة بشكل خاطئ). تم إصلاحه مع تطابق خط الطول مع النتائج مع Proj.4 من خلال 9 أرقام. كما أنني "حسنت" خط العرض عن طريق حساب نصف قطر انحناء الزوال عند خط العرض الأوسط للخلية ، وليس خط العرض المتوسط ​​للمربع بأكمله. لا يزال تقريبيًا ، الطريقة الصحيحة يجب أن تستخدم التكامل البيضاوي أو شيء من هذا القبيل. يتراكم الخطأ في الاتجاه الطولي أثناء مسيرتي شمالًا ، وتنتهي بدقة 6 أرقام في إدخال العينة ، في إشارة إلى المشروع.