سؤال

ولقد حصلت مشكلة يلي: لدي جدول مع القيم طويلة / خطوط الطول وجدول آخر مع مشروع الهوية وطويلة / خطوط الطول / دائرة نصف قطرها (دائرة).

والآن أنا بحاجة لمعرفة أي مشروع مباريات القيم طويلة / خطوط الطول من الجدول الأول.

هل هناك طريقة سهلة للقيام بذلك؟

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

المحلول

وهناك خوارزميات متعددة لمسافة حساب في المجال، ولكن نستخدم التالية:

create function GetDistance(
    @latitudeFrom decimal(30,10), 
    @longitudeFrom decimal(30,10),
    @latitudeTo decimal(30,10), 
    @longitudeTo decimal(30,10)
)
RETURNS float
AS
BEGIN

DECLARE @distance float

    SET @distance = ROUND(6378.137 * ACOS(
            convert(decimal(30,10), 
            (SIN(RADIANS(@latitudeFrom)) * SIN(RADIANS(@latitudeTo))) +
            (COS(RADIANS(@latitudeFrom)) * COS(RADIANS(@latitudeTo)) *
             COS(RADIANS(@longitudeTo) - RADIANS(@longitudeFrom))))), 15)

 RETURN @distance
 END
 go

و(حيث 6378.137 - هو نصف قطر الأرض)

وحتى الآن عندما يمكنك حساب المسافة بين 2 نقطة على الأرض يمكنك بناء الاستعلام

 select * 
     from Table1, Project 
     where dbo.GetDistance(
           Table1.lat, Table1.lon, 
           Project.lat, Project.lon) < @YouRadius

وحيثYouRadius - دائرة نصف قطرها معلمات من دائرة الخاص بك

نصائح أخرى

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

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

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