GISarabia.org
PostGIS › الدليل الرسمي › 7. مرجع PostGIS › 7.7. دوال النظام المرجعي المكاني
PostGIS 3.6 · Official Manual · ترجمة عربية

ST_Transform

الصفحة الأصلية بالإنجليزية postgis.net ↗

الاسم

ST_Transform — تُعيد شكلًا هندسيًا جديدًا بإحداثيات محوّلة إلى نظام مرجعي مكاني مختلف.

المختصر

geometry ST_Transform(geometry g1, integer srid);

geometry ST_Transform(geometry geom, text to_proj);

geometry ST_Transform(geometry geom, text from_proj, text to_proj);

geometry ST_Transform(geometry geom, text from_proj, integer to_srid);

الوصف

تُعيد شكلًا هندسيًا جديدًا بعد تحويل إحداثياته إلى نظام مرجعي مكاني مختلف. يمكن تحديد النظام المرجعي المكاني الهدف to_srid بمعامل SRID عددي صالح (أي يجب أن يكون موجودًا في الجدول spatial_ref_sys). وبدلًا من ذلك، يمكن استخدام نظام مرجعي مكاني معرّف كسلسلة PROJ.4 للمعاملين to_proj و/أو from_proj، إلا أن هذه الطرق غير مُحسَّنة الأداء. إذا عُبِّر عن النظام المرجعي المكاني الهدف بسلسلة PROJ.4 بدلًا من SRID، فسيُضبط SRID الشكل الناتج على صفر. باستثناء الدوال التي تأخذ from_proj، يجب أن يكون للأشكال الهندسية المُدخَلة SRID معرّف.

كثيرًا ما يُخلط بين ST_Transform وST_SetSRID. فـ ST_Transform تغيّر فعليًا إحداثيات الشكل الهندسي من نظام مرجعي مكاني إلى آخر، بينما تغيّر ST_SetSRID() معرّف SRID للشكل الهندسي فقط.

تختار ST_Transform تلقائيًا خط تحويل مناسبًا بحسب النظامين المرجعيين المكانيين المصدر والهدف. لاستخدام طريقة تحويل محددة، استخدم ST_TransformPipeline.

[ملاحظة]

تتطلب أن تكون PostGIS مُجمَّعة مع دعم PROJ. استخدم PostGIS_Full_Version للتأكد من أن دعم PROJ مُضمَّن.

[ملاحظة]

إذا كنت تستخدم أكثر من تحويل واحد، فمن المفيد إنشاء فهرس دالّي (functional index) على التحويلات الشائعة الاستخدام للاستفادة من الفهرس.

[ملاحظة]

قبل الإصدار 1.3.4، كانت هذه الدالة تتعطل إذا استُخدمت مع أشكال هندسية تحتوي على منحنيات (CURVES). وقد أُصلح ذلك في 1.3.4 وما بعده

حُسّنت في: 2.0.0 أُضيف دعم الأسطح متعددة الوجوه.

حُسّنت في: 2.3.0 أُضيف دعم نص PROJ.4 المباشر.

تطبّق هذه الدالة مواصفة SQL/MM. SQL-MM 3: 5.1.6

تدعم هذه الدالة الأقواس الدائرية (Circular Strings) والمنحنيات.

تدعم هذه الدالة الأسطح متعددة الوجوه (Polyhedral surfaces).

أمثلة

تحويل شكل هندسي بنظام Massachusetts state plane بالأقدام الأمريكية إلى خط طول/عرض في WGS 84

SELECT ST_AsText(ST_Transform(ST_GeomFromText('POLYGON((743238 2967416,743238 2967450,
  743265 2967450,743265.625 2967416,743238 2967416))',2249),4326)) As wgs_geom;

 wgs_geom
---------------------------
 POLYGON((-71.1776848522251 42.3902896512902,-71.1776843766326 42.3903829478009,
-71.1775844305465 42.3903826677917,-71.1775825927231 42.3902893647987,-71.177684
8522251 42.3902896512902));
(1 row)

--3D Circular String example
SELECT ST_AsEWKT(ST_Transform(ST_GeomFromEWKT('SRID=2249;CIRCULARSTRING(743238 2967416 1,743238 2967450 2,743265 2967450 3,743265.625 2967416 3,743238 2967416 4)'),4326));

         st_asewkt
--------------------------------------------------------------------------------------
 SRID=4326;CIRCULARSTRING(-71.1776848522251 42.3902896512902 1,-71.1776843766326 42.3903829478009 2,
 -71.1775844305465 42.3903826677917 3,
 -71.1775825927231 42.3902893647987 3,-71.1776848522251 42.3902896512902 4)

    

مثال على إنشاء فهرس دالّي جزئي. في الجداول التي لست متأكدًا فيها من أن جميع الأشكال الهندسية ستكون مملوءة، من الأفضل استخدام فهرس جزئي يستبعد الأشكال الهندسية الفارغة (null)، مما يوفّر المساحة ويجعل الفهرس أصغر وأكثر كفاءة.

CREATE INDEX idx_geom_26986_parcels
  ON parcels
  USING gist
  (ST_Transform(geom, 26986))
  WHERE geom IS NOT NULL;
    

أمثلة على استخدام نص PROJ.4 للتحويل باستخدام أنظمة مرجعية مكانية مخصصة.

-- Find intersection of two polygons near the North pole, using a custom Gnomic projection
-- See http://boundlessgeo.com/2012/02/flattening-the-peel/
 WITH data AS (
   SELECT
     ST_GeomFromText('POLYGON((170 50,170 72,-130 72,-130 50,170 50))', 4326) AS p1,
     ST_GeomFromText('POLYGON((-170 68,-170 90,-141 90,-141 68,-170 68))', 4326) AS p2,
     '+proj=gnom +ellps=WGS84 +lat_0=70 +lon_0=-160 +no_defs'::text AS gnom
 )
 SELECT ST_AsText(
   ST_Transform(
     ST_Intersection(ST_Transform(p1, gnom), ST_Transform(p2, gnom)),
   gnom, 4326))
 FROM data;
                                          st_astext
 --------------------------------------------------------------------------------
  POLYGON((-170 74.053793645338,-141 73.4268621378904,-141 68,-170 68,-170 74.053793645338))
    

ضبط سلوك التحويل

قد يفشل أحيانًا تحويل الإحداثيات الذي يتضمن إزاحة شبكية (grid-shift)، مثلًا إذا لم تُبنَ PROJ.4 مع ملفات الإزاحة الشبكية أو إذا لم يقع الإحداثي ضمن النطاق الذي عُرّفت له الإزاحة الشبكية. افتراضيًا، تُطلق PostGIS خطأً إذا لم يكن ملف الإزاحة الشبكية موجودًا، لكن يمكن ضبط هذا السلوك لكل SRID على حدة، إما باختبار قيم مختلفة لـ to_proj من نص PROJ.4، أو بتعديل قيمة proj4text في الجدول spatial_ref_sys.

على سبيل المثال، معامل proj4text ‏+datum=NAD87 صيغة مختصرة لمعامل +nadgrids التالي:

+nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat

تعني البادئة @ أنه لا يُبلَّغ عن أي خطأ إذا لم تكن الملفات موجودة، لكن إذا بُلغت نهاية القائمة دون أن يكون أي ملف مناسبًا (أي موجودًا ومتداخلًا) فسيصدر خطأ.

وإذا أردت على العكس التأكد من وجود الملفات القياسية على الأقل، مع تطبيق تحويل صفري إذا فُحصت جميع الملفات دون تطابق، فيمكنك استخدام:

+nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat,null

ملف الإزاحة الشبكية الصفري (null) ملف إزاحة شبكية صالح يغطي العالم كله ولا يطبّق أي إزاحة. فكمثال كامل، إذا أردت تعديل PostGIS بحيث لا تُطلق التحويلات إلى SRID 4267 الواقعة خارج النطاق الصحيح خطأ ERROR، فستستخدم ما يلي:

UPDATE spatial_ref_sys SET proj4text = '+proj=longlat +ellps=clrk66 +nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat,null +no_defs' WHERE srid = 4267;