كيفية الحصول على أقرب نقطة على كائن قياس sqlgeometry من كائن sqlgeometry آخر؟

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

  •  21-09-2019
  •  | 
  •  

سؤال

لدي مجموعة من الخط والكائن المضلع (نوع sqlgeometry) وكائن نقطة (نوع sqlgeometry). كيف يمكننا العثور على أقرب نقطة على كل سطر من كائن نقطة معين؟ هل هناك أي واجهة برمجة تطبيقات للقيام بهذه العملية؟

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

المحلول

لست متأكدًا مما إذا كان هذا ممكنًا مباشرة في SQL Server 2008:

http://social.msdn.microsoft.com/forums/en/sqlspatial/thread/cb094fb8-07ba-4219-8d3d-572874c271b5

الحل المقترح في هذا الموضوع هو:

declare @g geometry = 'LINESTRING(0 0, 10 10)' 
declare @h geometry = 'POINT(0 10)' 

select @h.STBuffer(@h.STDistance(@g)).STIntersection(@g).ToString()

وإلا ، فسيتعين عليك كتابة برنامج نصي لقراءة الهندسة من قاعدة البيانات الخاصة بك واستخدام مكتبات مكانية منفصلة.

نصائح أخرى

هنا عينة تقدم حلًا ممكنًا باستخدام SQLgeometry و C#، لا يلزم وجود خادم SQL:

using System;
using Microsoft.SqlServer.Types;
namespace MySqlGeometryTest
{
    class ReportNearestPointTest
    {
        static void ReportNearestPoint(string wktPoint, string wktGeom)
        {
            SqlGeometry point = SqlGeometry.Parse(wktPoint);
            SqlGeometry geom = SqlGeometry.Parse(wktGeom);
            double distance = point.STDistance(geom).Value;
            SqlGeometry pointBuffer = point.STBuffer(distance);
            SqlGeometry pointResult = pointBuffer.STIntersection(geom);
            string wktResult = new string(pointResult.STAsText().Value);
            Console.WriteLine(wktResult);
        }

        static void Main(string[] args)
        {
            ReportNearestPoint("POINT(10 10)", "MULTIPOINT (80 70, 20 20, 200 170, 140 120)");
            ReportNearestPoint("POINT(110 200)", "LINESTRING (90 80, 160 150, 300 150, 340 150, 340 240)");
            ReportNearestPoint("POINT(0 0)", "POLYGON((10 20, 10 10, 20 10, 20 20, 10 20))");
            ReportNearestPoint("POINT(70 170)", "POLYGON ((110 230, 80 160, 20 160, 20 20, 200 20, 200 160, 140 160, 110 230))");
        }
    }
}

إخراج البرنامج:

POINT (20 20)
POINT (160 150)
POINT (10 10)
POINT (70 160)

إذا كنت مهتمًا بالفعل بإيجاد أقرب نقطة على السطر (تسمى على خلاف ذلك العقدة) ، فيمكنك تحويل كل سطر إلى مجموعة من النقاط مع نفس LineId. ثم الاستعلام عن الأقرب والحساب المسافة.

إذا كنت بدلاً من ذلك تحاول حساب المسافة من نقطة إلى أقرب سطر - stdistancehttp://msdn.microsoft.com/en-us/library/bb933808.aspxأظن أن المشكلة التي تعالجها الإجابة الأخرى هي ما يجب وضعه في جملة مكانك على الرغم من أنه يمكنك استخدام stdistance لتحديد مسافة لا تهتم بها مثل

حيث pointgeom.stistance (linegeom) <"المسافة التي تهتم بها"

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