दिलचस्प पोस्ट
कमांड लाइन का उपयोग करते हुए NuGet पैकेज कैश को कैसे साफ़ करें? Groovy वर्ग गुणों को कॉपी करें मैं अपने सी # कार्यक्रम के एक पैनल के भीतर एक और अनुप्रयोग कैसे चला सकता हूँ? अल्पविराम से सीमांकित स्टड :: स्ट्रिंग को पार्स करना समर्पित एप्लिकेशन फ़ोल्डर के लिए जगह ढूंढें मैं क्रोम और फ़ायरफ़ॉक्स से खुले पृष्ठों के यूआरएल कैसे प्राप्त करूं? गैर-अवरुद्ध या अतुल्यकालिक I / O Node.js में क्या है? "पार्स त्रुटि: एंड्रॉइड एप्लिकेशन इंस्टॉल करते समय पैकेज को पार्स करने में कोई समस्या है" पायथन में GUID / UUID कैसे बनाएँ एक विंडो बनाने के बिना एक बिटमैप में WPF UserControl को रेंडर कैसे करें एनजी-बाइंड-एचटीएमएल-असुरक्षित हटा दिए जाने के साथ, मैं एचटीएमएल कैसे इंजेक्ट करूँ? क्या "glob" प्रकार पैटर्न के लिए java.util.regex का बराबर है? DeploymentItem विशेषता के साथ समस्याएं टैब बार पर अधिक मेनू को कस्टमाइज़ करना फॉर-लूप में सेट टाइमआउट सलग मानों को प्रिंट नहीं करता

किसी क्षेत्र से एक रेखा से लेकर एक रेखा के क्षेत्र तक दूरी की गणना कैसे करें?

मेरे पास धरती पर एक रेखा खंड (महान चक्र हिस्सा) है लाइन सेगमेंट को इसके समाप्त होने के निर्देशांक द्वारा परिभाषित किया गया है। जाहिर है, दो अंक दो लाइन क्षेत्रों को परिभाषित करते हैं, तो मान लें कि मुझे कम एक में दिलचस्पी है।

मुझे एक तीसरा बिंदु दिया गया है, और मैं लाइन और बिंदु के बीच (कम से कम) दूरी की तलाश कर रहा हूं

सभी निर्देशांक अक्षांश \ अक्षांश (डब्ल्यूजीएस 84) में दिए गए हैं।

मैं दूरी की गणना कैसे करूं?

किसी भी उचित प्रोग्रामिंग भाषा में एक समाधान होगा।

Solutions Collecting From Web of "किसी क्षेत्र से एक रेखा से लेकर एक रेखा के क्षेत्र तक दूरी की गणना कैसे करें?"

इस विचार के आधार पर डॉ। मठ पूछे जाने पर मेरा अपना समाधान है। मुझे आपकी प्रतिक्रिया देखने में खुशी होगी।

अस्वीकरण पहले। यह समाधान क्षेत्रों के लिए सही है। पृथ्वी एक गोलार्ध नहीं है, और निर्देशांक प्रणाली (डब्ल्यूजीएस 84) यह मान नहीं करती है कि यह एक गोलाकार है। तो यह सिर्फ एक सन्निकटन है, और मैं वास्तव में अनुमान नहीं लगा सकता त्रुटि है इसके अलावा, बहुत छोटी दूरी के लिए, यह संभवतः संभव है कि यह अनुमान लगाए जा सके कि सबकुछ सिर्फ एक कपाटदार है। फिर मुझे नहीं पता कि दूरी "छोटी" कैसे होनी चाहिए

अब व्यवसाय के लिए मैं ए, बी और तीसरे बिंदु सी की सीमाओं को कॉल करूंगा। मूलतः, एल्गोरिथ्म निम्न है:

  1. पहले कार्टेशियन निर्देशांक (पृथ्वी के केंद्र में उत्पत्ति के साथ) में निर्देशांक को परिवर्तित करें- जैसे यहाँ ।
  2. टी की गणना, रेखा AB पर बिंदु, जो निम्न 3 वेक्टर उत्पादों का उपयोग करते हुए सी के निकट है:

    जी = ए एक्स बी

    एफ = सी एक्स जी

    टी = जी एक्स एफ

  3. सामान्यीकृत टी और पृथ्वी के त्रिज्या से गुणा करें।

  4. टी वापस अक्षांश \ अक्षांश पर वापस कनवर्ट करें
  5. टी और सी के बीच की दूरी की गणना करें – उदाहरण के लिए यहां ।

ये कदम पर्याप्त हैं यदि आप सी के बीच की दूरी और ए और बी के द्वारा परिभाषित महान चक्र की दूरी की तलाश कर रहे हैं। यदि मेरे जैसे आप सी और छोटे रेखा सेगमेंट के बीच की दूरी में रुचि रखते हैं, तो आपको इसकी पुष्टि करने के अतिरिक्त कदम उठाने की ज़रूरत है टी वास्तव में इस खंड पर है यदि ऐसा नहीं है, तो जरूरी है कि नजदीकी बिंदु ए या बी के अंत में से एक है – सबसे आसान तरीका है यह जांचना कि कौन सा एक है

सामान्य शब्दों में, तीन वेक्टर उत्पादों के पीछे का विचार निम्न है: पहले एक (जी) हमें ए और बी के महान चक्र के विमान को देता है (इसलिए ए, बी और मूल वाला विमान)। दूसरा (एफ) हमें महान सर्कल सी के माध्यम से चला जाता है और जी को सीधा करता है। फिर टी, एफ और जी द्वारा परिभाषित महान मंडलों का प्रतिच्छेदन है, सामान्यीकरण और आर द्वारा गुणा करके सही लंबाई लाया जाता है।

ऐसा करने के लिए यहां कुछ आंशिक जावा कोड है

महान वृत्त पर निकटतम बिंदु ढूँढना इनपुट और आउटपुट लंबाई-2 एरेज़ हैं मध्यवर्ती arrays लंबाई 3 की हैं

double[] nearestPointGreatCircle(double[] a, double[] b, double c[]) { double[] a_ = toCartsian(a); double[] b_ = toCartsian(b); double[] c_ = toCartsian(c); double[] G = vectorProduct(a_, b_); double[] F = vectorProduct(c_, G); double[] t = vectorProduct(G, F); normalize(t); multiplyByScalar(t, R_EARTH); return fromCartsian(t); } 

खंड पर नजदीकी बिंदु ढूँढना:

 double[] nearestPointSegment (double[] a, double[] b, double[] c) { double[] t= nearestPointGreatCircle(a,b,c); if (onSegment(a,b,t)) return t; return (distance(a,c) < distance(b,c)) ? a : c; } 

यह परीक्षण का एक सरल तरीका है यदि बिंदु टी, जिसे हम जानते हैं, एक ही महान सर्कल पर ए और बी के रूप में है, इस महान वृत्त के छोटे खंड पर है हालांकि ऐसा करने के लिए अधिक प्रभावी तरीके हैं:

  boolean onSegment (double[] a, double[] b, double[] t) { // should be return distance(a,t)+distance(b,t)==distance(a,b), // but due to rounding errors, we use: return Math.abs(distance(a,b)-distance(a,t)-distance(b,t)) < PRECISION; } 

पूछो डॉ मठ से एक बिंदु से एक महान सर्कल तक दूरी की कोशिश करो। आपको अभी भी पृथ्वी के त्रिज्या के लिए गोलाकार निर्देशांक और पैमाने पर देशांतर / अक्षांश को बदलने की आवश्यकता है, लेकिन यह एक अच्छी दिशा की तरह लगता है।

यह विचारधारा बेला के रूप में स्वीकृत उत्तर के लिए पूर्ण कोड है ( यहां पाया गया है ):

 import java.util.*; import java.lang.*; import java.io.*; /* Name of the class has to be "Main" only if the class is public. */ class Ideone { private static final double _eQuatorialEarthRadius = 6378.1370D; private static final double _d2r = (Math.PI / 180D); private static double PRECISION = 0.1; // Haversine Algorithm // source: http://stackoverflow.com/questions/365826/calculate-distance-between-2-gps-coordinates private static double HaversineInM(double lat1, double long1, double lat2, double long2) { return (1000D * HaversineInKM(lat1, long1, lat2, long2)); } private static double HaversineInKM(double lat1, double long1, double lat2, double long2) { double dlong = (long2 - long1) * _d2r; double dlat = (lat2 - lat1) * _d2r; double a = Math.pow(Math.sin(dlat / 2D), 2D) + Math.cos(lat1 * _d2r) * Math.cos(lat2 * _d2r) * Math.pow(Math.sin(dlong / 2D), 2D); double c = 2D * Math.atan2(Math.sqrt(a), Math.sqrt(1D - a)); double d = _eQuatorialEarthRadius * c; return d; } // Distance between a point and a line public static void pointLineDistanceTest() { //line //double [] a = {50.174315,19.054743}; //double [] b = {50.176019,19.065042}; double [] a = {52.00118, 17.53933}; double [] b = {52.00278, 17.54008}; //point //double [] c = {50.184373,19.054657}; double [] c = {52.008308, 17.542927}; double[] nearestNode = nearestPointGreatCircle(a, b, c); System.out.println("nearest node: " + Double.toString(nearestNode[0]) + "," + Double.toString(nearestNode[1])); double result = HaversineInM(c[0], c[1], nearestNode[0], nearestNode[1]); System.out.println("result: " + Double.toString(result)); } // source: http://stackoverflow.com/questions/1299567/how-to-calculate-distance-from-a-point-to-a-line-segment-on-a-sphere private static double[] nearestPointGreatCircle(double[] a, double[] b, double c[]) { double[] a_ = toCartsian(a); double[] b_ = toCartsian(b); double[] c_ = toCartsian(c); double[] G = vectorProduct(a_, b_); double[] F = vectorProduct(c_, G); double[] t = vectorProduct(G, F); return fromCartsian(multiplyByScalar(normalize(t), _eQuatorialEarthRadius)); } @SuppressWarnings("unused") private static double[] nearestPointSegment (double[] a, double[] b, double[] c) { double[] t= nearestPointGreatCircle(a,b,c); if (onSegment(a,b,t)) return t; return (HaversineInKM(a[0], a[1], c[0], c[1]) < HaversineInKM(b[0], b[1], c[0], c[1])) ? a : b; } private static boolean onSegment (double[] a, double[] b, double[] t) { // should be return distance(a,t)+distance(b,t)==distance(a,b), // but due to rounding errors, we use: return Math.abs(HaversineInKM(a[0], a[1], b[0], b[1])-HaversineInKM(a[0], a[1], t[0], t[1])-HaversineInKM(b[0], b[1], t[0], t[1])) < PRECISION; } // source: http://stackoverflow.com/questions/1185408/converting-from-longitude-latitude-to-cartesian-coordinates private static double[] toCartsian(double[] coord) { double[] result = new double[3]; result[0] = _eQuatorialEarthRadius * Math.cos(Math.toRadians(coord[0])) * Math.cos(Math.toRadians(coord[1])); result[1] = _eQuatorialEarthRadius * Math.cos(Math.toRadians(coord[0])) * Math.sin(Math.toRadians(coord[1])); result[2] = _eQuatorialEarthRadius * Math.sin(Math.toRadians(coord[0])); return result; } private static double[] fromCartsian(double[] coord){ double[] result = new double[2]; result[0] = Math.toDegrees(Math.asin(coord[2] / _eQuatorialEarthRadius)); result[1] = Math.toDegrees(Math.atan2(coord[1], coord[0])); return result; } // Basic functions private static double[] vectorProduct (double[] a, double[] b){ double[] result = new double[3]; result[0] = a[1] * b[2] - a[2] * b[1]; result[1] = a[2] * b[0] - a[0] * b[2]; result[2] = a[0] * b[1] - a[1] * b[0]; return result; } private static double[] normalize(double[] t) { double length = Math.sqrt((t[0] * t[0]) + (t[1] * t[1]) + (t[2] * t[2])); double[] result = new double[3]; result[0] = t[0]/length; result[1] = t[1]/length; result[2] = t[2]/length; return result; } private static double[] multiplyByScalar(double[] normalize, double k) { double[] result = new double[3]; result[0] = normalize[0]*k; result[1] = normalize[1]*k; result[2] = normalize[2]*k; return result; } public static void main(String []args){ System.out.println("Hello World"); Ideone.pointLineDistanceTest(); } } 

यह टिप्पणी की गई डेटा के लिए ठीक काम करता है:

 //line double [] a = {50.174315,19.054743}; double [] b = {50.176019,19.065042}; //point double [] c = {50.184373,19.054657}; 

निकटतम नोड है: 50.17493121381319,19.05846668493702

लेकिन मुझे इस डेटा के साथ समस्या है:

 double [] a = {52.00118, 17.53933}; double [] b = {52.00278, 17.54008}; //point double [] c = {52.008308, 17.542927}; 

निकटतम नोड है: 52.00834987257176, 17.542691313436357 जो गलत है।

मुझे लगता है कि दो बिंदुओं द्वारा निर्दिष्ट लाइन बंद खंड नहीं है।

अगर किसी को इसकी ज़रूरत होती है तो यह लिलेक्सी के उत्तर को सी # पर रखी जाती है

  private static double _eQuatorialEarthRadius = 6378.1370D; private static double _d2r = (Math.PI / 180D); private static double PRECISION = 0.1; // Haversine Algorithm // source: http://stackoverflow.com/questions/365826/calculate-distance-between-2-gps-coordinates private static double HaversineInM(double lat1, double long1, double lat2, double long2) { return (1000D * HaversineInKM(lat1, long1, lat2, long2)); } private static double HaversineInKM(double lat1, double long1, double lat2, double long2) { double dlong = (long2 - long1) * _d2r; double dlat = (lat2 - lat1) * _d2r; double a = Math.Pow(Math.Sin(dlat / 2D), 2D) + Math.Cos(lat1 * _d2r) * Math.Cos(lat2 * _d2r) * Math.Pow(Math.Sin(dlong / 2D), 2D); double c = 2D * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1D - a)); double d = _eQuatorialEarthRadius * c; return d; } // Distance between a point and a line static double pointLineDistanceGEO(double[] a, double[] b, double[] c) { double[] nearestNode = nearestPointGreatCircle(a, b, c); double result = HaversineInKM(c[0], c[1], nearestNode[0], nearestNode[1]); return result; } // source: http://stackoverflow.com/questions/1299567/how-to-calculate-distance-from-a-point-to-a-line-segment-on-a-sphere private static double[] nearestPointGreatCircle(double[] a, double[] b, double [] c) { double[] a_ = toCartsian(a); double[] b_ = toCartsian(b); double[] c_ = toCartsian(c); double[] G = vectorProduct(a_, b_); double[] F = vectorProduct(c_, G); double[] t = vectorProduct(G, F); return fromCartsian(multiplyByScalar(normalize(t), _eQuatorialEarthRadius)); } private static double[] nearestPointSegment (double[] a, double[] b, double[] c) { double[] t= nearestPointGreatCircle(a,b,c); if (onSegment(a,b,t)) return t; return (HaversineInKM(a[0], a[1], c[0], c[1]) < HaversineInKM(b[0], b[1], c[0], c[1])) ? a : b; } private static bool onSegment (double[] a, double[] b, double[] t) { // should be return distance(a,t)+distance(b,t)==distance(a,b), // but due to rounding errors, we use: return Math.Abs(HaversineInKM(a[0], a[1], b[0], b[1])-HaversineInKM(a[0], a[1], t[0], t[1])-HaversineInKM(b[0], b[1], t[0], t[1])) < PRECISION; } // source: http://stackoverflow.com/questions/1185408/converting-from-longitude-latitude-to-cartesian-coordinates private static double[] toCartsian(double[] coord) { double[] result = new double[3]; result[0] = _eQuatorialEarthRadius * Math.Cos(deg2rad(coord[0])) * Math.Cos(deg2rad(coord[1])); result[1] = _eQuatorialEarthRadius * Math.Cos(deg2rad(coord[0])) * Math.Sin(deg2rad(coord[1])); result[2] = _eQuatorialEarthRadius * Math.Sin(deg2rad(coord[0])); return result; } private static double[] fromCartsian(double[] coord){ double[] result = new double[2]; result[0] = rad2deg(Math.Asin(coord[2] / _eQuatorialEarthRadius)); result[1] = rad2deg(Math.Atan2(coord[1], coord[0])); return result; } // Basic functions private static double[] vectorProduct (double[] a, double[] b){ double[] result = new double[3]; result[0] = a[1] * b[2] - a[2] * b[1]; result[1] = a[2] * b[0] - a[0] * b[2]; result[2] = a[0] * b[1] - a[1] * b[0]; return result; } private static double[] normalize(double[] t) { double length = Math.Sqrt((t[0] * t[0]) + (t[1] * t[1]) + (t[2] * t[2])); double[] result = new double[3]; result[0] = t[0]/length; result[1] = t[1]/length; result[2] = t[2]/length; return result; } private static double[] multiplyByScalar(double[] normalize, double k) { double[] result = new double[3]; result[0] = normalize[0]*k; result[1] = normalize[1]*k; result[2] = normalize[2]*k; return result; } 

कुछ हज़ारों मीटर तक दूरी के लिए मैं इस मुद्दे को क्षेत्र से लेकर विमान तक आसान बना देता हूं। फिर, यह मुद्दा बहुत आसान है क्योंकि एक आसान त्रिकोण गणना का उपयोग किया जा सकता है:

हमारे पास अंक ए और बी हैं और एक्स के लिए एक्स की दूरी तय करने के लिए एक्स की तलाश करें। फिर:

 Location a; Location b; Location x; double ax = a.distanceTo(x); double alfa = (Math.abs(a.bearingTo(b) - a.bearingTo(x))) / 180 * Math.PI; double distance = Math.sin(alfa) * ax; 

एक गोल पर दो बिंदुओं के बीच की सबसे छोटी दूरी दो बिंदुओं से गुजरने वाले महान चक्र की छोटी तरफ है। मुझे यकीन है कि आप पहले से ही यह जानते हैं यहां एक समान प्रश्न यहां है http://www.physicsforums.com/archive/index.php/t-178252.html जो आपको गणितीय रूप से मॉडल बनाते हैं।

मुझे यकीन नहीं है कि ईमानदार होने के लिए आपको इस के एक कोडित उदाहरण प्राप्त करने की कितनी संभावना है।

मैं मूल रूप से एक ही चीज़ की तलाश कर रहा हूं, सिवाय इसके कि मैं सख्ती से बोलना एक महान वृत्त का एक खंड होने की परवाह नहीं करता, बल्कि पूर्ण चक्र पर किसी भी बिंदु की दूरी चाहता हूं।

दो लिंक मैं वर्तमान में जांच कर रहा हूं:

यह पृष्ठ "क्रॉस-ट्रैक दूरी" का उल्लेख करता है, जो मूल रूप से आपके लिए क्या देख रहे हैं।

इसके अलावा, पोस्टजीआईएस मेलिंग सूची पर निम्नलिखित धागे में, प्रयास (1) एक 2D-plane (PostGIS 'line_locate_point के साथ) पर रेखा-दूरी के लिए उपयोग किए गए समान सूत्र के साथ महान वृत्त पर सबसे निकटतम बिंदु का निर्धारण करते हैं, और तब (2) उस गोल के बीच की दूरी और तीसरे बिंदु के बीच की दूरी की गणना करते हुए मुझे नहीं पता है कि गणितीय कदम (1) सही है, लेकिन मुझे आश्चर्य होगा।

http://postgis.refractions.net/pipermail/postgis-users/2009-July/023903.html

अंत में, मैंने देखा कि निम्नलिखित "संबंधित" के अंतर्गत लिंक किया गया है:

प्वाइंट टू लाइन से दूरी महान चक्र फ़ंक्शन ठीक काम नहीं कर रहा है।