दिलचस्प पोस्ट
Windows PowerShell पथ चर सेट करना POM.xml में गुणों के रूप में मेवेन से कमांड लाइन तर्क पास करना जावा में स्क्रीनशॉट तेज कैसे लें? मैं सी में एक हेक्साडेसिमल स्ट्रिंग में एक पूर्णांक को कैसे परिवर्तित कर सकता / सकती हूं? क्या कोई एपीके फ़ाइल से स्रोत कोड प्राप्त करने का कोई तरीका है? स्टेटमेंट और तैयार स्थिति में अंतर बड़े (विशाल, विशाल, बड़ी) पाठ फ़ाइलों को खोलने के लिए पाठ संपादक जांचते हुए कि कोई चर एक पूर्णांक है या नहीं बैच के सभी आदेशों में क्या मतलब है और क्या करते हैं? मैं MSB3245 (संदर्भ का समाधान नहीं कर सका) चेतावनी एक त्रुटि के रूप में कैसे कर सकता हूं? Magento उत्पादों श्रेणी में नहीं दिखाया जाएगा कस्टम एडाप्टर के साथ getfilter () को कैसे कार्यान्वित करें, जो बेसएडैप्टर को फैलता है एसक्यूएल सर्वर में एक स्ट्रिंग से बचें, ताकि यह अभिव्यक्ति की तरह इस्तेमाल करने के लिए सुरक्षित हो एमएस एक्सेस (जेट / एसीई) में तालिका-कम यूनियन क्वेरी सेलेनियम आरसी के साथ Google क्रोम को कैसे चलाएं?

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

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

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

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

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

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

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

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

अस्वीकरण पहले। यह समाधान क्षेत्रों के लिए सही है। पृथ्वी एक गोलार्ध नहीं है, और निर्देशांक प्रणाली (डब्ल्यूजीएस 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

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

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