نقطة على الدائرة (خط الطول / العرض) في. NET / SQL
-
20-09-2019 - |
سؤال
ولقد حصلت مشكلة يلي: لدي جدول مع القيم طويلة / خطوط الطول وجدول آخر مع مشروع الهوية وطويلة / خطوط الطول / دائرة نصف قطرها (دائرة).
والآن أنا بحاجة لمعرفة أي مشروع مباريات القيم طويلة / خطوط الطول من الجدول الأول.
هل هناك طريقة سهلة للقيام بذلك؟
المحلول
وهناك خوارزميات متعددة لمسافة حساب في المجال، ولكن نستخدم التالية:
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.