أكثر

ST_Distance مقابل ST_DistanceSpheroid؟

ST_Distance مقابل ST_DistanceSpheroid؟


نظرًا لأن برنامج عميلي يستخدم إحداثيات خطوط الطول / العرض عند الاتصال بقاعدة بيانات postgis (التجارية الكروية) ، فقد قررت ST_T تحويل كل هندسة إلى WGS-84.

ومع ذلك ، لاحظت أن ST_Distance لـ WGS-84 ترجع الوحدات كدرجات (أحتاج إلى متر). لذلك قررت استخدام ST_DistanceSpheroid (geom1، geom2، 'SPHEROID ["WGS 84"، 6378137،298.257223563]') ولكن يبدو أن هذه الطريقة بطيئة للغاية.

لذلك عدت مرة أخرى إلى استخدام Mercator الكروية مرة أخرى وتحويل مدخلاتي ومخرجاتي من وإلى wgs-84 لأن ذلك يؤدي بشكل أفضل كثيرًا.

هل أستخدم الطريقة الصحيحة أم أن هذه مشكلة معروفة؟


WGS-84 هي بيانات غير متوقعة. يستخدم نظام الإحداثيات الجيوديسية ، مما يعني أن النقاط تقع على نموذج كروي (على وجه التحديد بيضاوي الشكل) للأرض.

نتيجة لذلك ، فإن الهندسة الإقليدية غير صالحة لهذا النوع من البيانات. نوع بيانات PostGIS "الهندسة" والوظائف المرتبطة بها تعمل مع الإحداثيات المستوية وحسابات الهندسة الإقليدية. إذا كنت ترغب في استخدامها ، فيجب عليك عرض بياناتك على نظام إحداثي محدد ، والذي بحكم التعريف يكون دقيقًا محليًا فقط.

سيكون حساب الهندسة غير المستوية دائمًا أبطأ بكثير من حساب الهندسة المستوية. شاهد الفرق بين حساب المسافة على مستوى وصيغ Harversine على كرة كمثال:

http://en.wikipedia.org/wiki/Euclidean_distance

http://en.wikipedia.org/wiki/Haversine_formula

ومع ذلك ، يحتوي الإصدار الأخير من PostGIS على نوع بيانات "جغرافي" وبعض الوظائف المرتبطة بهؤلاء الذين يجب عليهم استخدام البيانات الجغرافية غير المتوقعة.

كيف تختار بين الاثنين؟

إذا قمت فقط بتخزين واسترداد البيانات الخاصة بك من قاعدة البيانات ، فسيكون استخدام لاتلون (الجغرافيا أو wgs84 srid) أمرًا جيدًا.

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

إذا كنت تقوم بمعالجة بياناتك ، وتحتاج إلى أن تكون سريعًا وتريد استخدام مجموعة وظائف PostGIS الكبيرة ، فيجب عليك عرض بياناتك ، وإجراء تحويل تنسيق ديناميكي على الإدخال / الإخراج باستخدام st_transform ، تمامًا كما تفعل.

لذا نعم ، أنت على حق ، ولكن لا يزال القرار الصحيح الحقيقي يعتمد على حالة الاستخدام المحددة.


قياسات المسافة في EPSG: 900913 ليست فكرة جيدة لأن المسافات مشوهة للغاية في هذا الإسقاط. ستكون ST_Distance_Spherical () أكثر دقة.