ما نوع البيانات للاستخدام عند تخزين بيانات خطوط الطول والعرض في قواعد بيانات SQL؟ [مكرر

StackOverflow https://stackoverflow.com/questions/1196415

سؤال

عند تخزين بيانات خطوط الطول أو خط الطول في قاعدة بيانات متوافقة مع ANSI SQL، ما هو نوع Datatype الأكثر ملاءمة؟ ينبغي float أن تستخدم، أو decimal, ، أو ...؟

أنا أدرك أن Oracle و MySQL و SQL Server أضف بعض أنواع البيانات الخاصة خصيصا للتعامل مع بيانات GEO، لكنني مهتم بكيفية تخزين المعلومات في قاعدة بيانات SQL "Pill Vanilla".

هل كانت مفيدة؟

المحلول

Decimal(9,6)

إذا لم تكن معتادا على الدقة والمعلمات النطاق، فإليك سلسلة تنسيق مرئية:

###.######

نصائح أخرى

نستخدم تعويم، لكن أي نكهة رقيقة مع 6 منازل عشرية يجب أن تعمل أيضا.

حسنا، لقد طرحت كيفية تخزين خط العرض / الطول وإجابتي هي: لا تنظر في استخدام WGS 84. ( في أوروبا ETRS 89. ) كما هو المعيار لمراجع الجغرافية.

ولكن هذا التفاصيل جانبا استخدمت نوعا يعرف المستخدم في الأيام السابقة SQL 2008 يشمل أخيرا الدعم الجغرافي.

في الفانيليا أوراكل، تتطلب الميزة المسماة تحديد المواقع (إصدار شلل من المكاني) تخزين بيانات الإحداثيات باستخدام نوع البيانات للرقم (بدون دقة). عند محاولة إنشاء فهارس قائمة على الوظائف لدعم الاستفسارات المكانية فسوف تقوم بخلاف ذلك.

يمكنك بسهولة تخزين رقم عشري عشري Lat / Lon في حقل عدد صحيح غير موقعة، بدلا من تقسيمها في جزء صحيح وعشري وتخزين الأشخاص بشكل منفصلين كما اقترحوا إلى حد ما هنا باستخدام خوارزمية التحويل التالية:

كدالة mysql المخزنة:

CREATE DEFINER=`r`@`l` FUNCTION `PositionSmallToFloat`(s INT) 
RETURNS decimal(10,7)
DETERMINISTIC
RETURN if( ((s > 0) && (s >> 31)) , (-(0x7FFFFFFF - 
(s & 0x7FFFFFFF))) / 600000, s / 600000)

والعودة

CREATE DEFINER=`r`@`l` FUNCTION `PositionFloatToSmall`(s DECIMAL(10,7)) 
RETURNS int(10)
DETERMINISTIC
RETURN s * 600000

التي يجب تخزينها في غير موقعة الدولية (10), ، يعمل هذا في MySQL وكذلك في SQLite وهو ملء.

من خلال التجربة، أجد أن هذا يعمل بسرعة كبيرة، إذا كان كل ما تحتاج إليه هو تخزين إحداثيات واسترجاع أولئك للقيام ببعض الرياضيات.

في PHP تلك الوظائف 2 تبدو وكأنها

function LatitudeSmallToFloat($LatitudeSmall){
   if(($LatitudeSmall>0)&&($LatitudeSmall>>31)) 
     $LatitudeSmall=-(0x7FFFFFFF-($LatitudeSmall&0x7FFFFFFF))-1;
   return (float)$LatitudeSmall/(float)600000;
}

والعودة مرة أخرى:

function LatitudeFloatToSmall($LatitudeFloat){
   $Latitude=round((float)$LatitudeFloat*(float)600000);
   if($Latitude<0) $Latitude+=0xFFFFFFFF;
   return $Latitude;
}

هذا لديه بعض ميزة إضافية بالإضافة إلى إنشاء على سبيل المثال مفاتيح فريدة من نوعها مع الأعداد الصحيحة. (على سبيل المثال: لذاكرة التخزين المؤقت نتيجة Geocode). نأمل أن يضيف هذا قيمة إلى المناقشة.

يمكن أن يكون تطبيق آخر عندما تكون بدون ملحقات GIS، وتريد ببساطة الاحتفاظ بضعة ملايين من أزواج Lat / Lat، يمكنك استخدام الأقسام الموجودة على تلك الحقول في MySQL للاستفادة من حقيقة أنها أعداد صحيحة:

Create Table: CREATE TABLE `Locations` (
  `lat` int(10) unsigned NOT NULL,
  `lon` int(10) unsigned NOT NULL,
  `location` text,
  PRIMARY KEY (`lat`,`lon`) USING BTREE,
  KEY `index_location` (`locationText`(30))
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*!50100 PARTITION BY KEY ()
PARTITIONS 100 */

أود استخدام عشري بدقة مناسبة لبياناتك.

أعتقد أنه يعتمد ذلك على العمليات التي ستحتاج إليها في كثير من الأحيان.

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

إذا كنت ستتعطل من / من Degºmin'Sec "تدويج الكسر في كثير من الأحيان، فستفكر في تخزين كل قيمة كوعي عدد صحيح (Smallint أو Tinyint أو Tinyint أو Smallint؟).

يجب أن نلقي نظرة على أنواع البيانات المكانية الجديدة التي تم تقديمها في SQL Server 2008. وهي مصممة خصيصا هذا النوع من المهمة وإجراء الفهرسة والاستعلام عن البيانات أسهل وأكثر كفاءة.

http://msdn.microsoft.com/en-us/library/bb933876(V=SQL.105).aspx.

http://blogs.technet.com/andrew/archive/2007/11/26/sql-server-2008-spatial-data-types.aspx.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top