1

У меня есть процедура хранения Я хочу проверить расстояние от моей долготы на широте, которое ближе всего к геометрии, если расстояние в метрах меньше, чем 500 показать геозонность id, геодезический идентификатор ближайший автомобиль широта долгота.if автомобиль широта долгота ближайший многоугольник шоу ID многоугольника и если прямоугольник показать прямоугольник ID я новичок в SQL Server, именно поэтому я нахожусь здесь, пожалуйста, помогите мне профессионал я очень благодарен вам, демонстрационный стол находится в общей ссылке,Как получить расстояние в метрах

question and demo table is here

CREATE TABLE CarDistance 
(
ID int IDENTITY(1,1) PRIMARY KEY, 
car_id int, 
latitude float, 
longitude float 

) 
insert into CarDistance values(1234, '52.582191','-2.878418') 

CREATE TABLE tblgeofencing2 
(
ID int IDENTITY(1,1) PRIMARY KEY, 
car_id int, 
ShapeType varchar(255), 
PolygonLatLng varchar(max), 
minlatitude [float] NULL, 
    [minlongitude] [float] NULL, 
    [maxlatitude] [float] NULL, 
    [maxlongitude] [float] NULL, 
) 

insert into tblgeofencing2 values(123, 'polygon','24.835300590037598 67.06858277320862,24.835933468801272 67.06929624080658,24.83532979989791 67.07035303115845,24.83454113125045 67.0697683095932,24.835300590037598 67.06858277320862',NULL,NULL,NULL,NULL) 
insert into tblgeofencing2 values(1234, 'rectangle','NULL','52.582191','-2.878418','52.233687','-2.702637') 

Alter PROCEDURE [dbo].[Sp_CheckCarStatusMeter] 
DECLARE @g GEOGRAPHY, 
     @ID INT, 
    @curVal  INT, 
     @preVal  INT , 
    @CarSuggested INT, 
    @carlatprevious VARCHAR(10), 
     @carlongprevious VARCHAR(10), 
    @AllLatitudeLongitude VARCHAR(255),  
     @pprevious GEOGRAPHY 

DECLARE SuggestCursor CURSOR FOR 
     SELECT TOP 100 rtha.car_id , rtha.latitude, 
      rtha.longitude 
    FROM CarDistance rtha WHERE rtha.car_id = 123; 
    OPEN SuggestCursor; 
    FETCH NEXT FROM SuggestCursor INTO @CarSuggestedID , @carlatprevious , @carlongprevious; 

    WHILE (@@FETCH_STATUS = 0)  
BEGIN  

    DECLARE ShapeCursor CURSOR FOR 
    SELECT g.ID, @CarSuggestedID, g.ShapeType FROM tblgeofencing AS g 
     WHERE car_id [email protected] 
    FETCH NEXT FROM ShapeCursor INTO @ID , @CarIdx , @ShapeType; 

    WHILE (@@FETCH_STATUS = 0) 
    BEGIN 
    IF (@ShapeType = 'polygon') 
     BEGIN --Polygon IF 
      PRINT 'polygon if'; 
      SELECT @GeofenceIDnew = g.GeoFenceId, @minY = g.PolygonLatLng ROM tblgeofencing AS g 
      WHERE g.ID = [email protected] 
      SET @g = geography ::STPolyFromText('POLYGON((' + @AllLatitudeLongitude + '))', 4326);   
      SET @pprevious = geography ::STPointFromText(
        'POINT(' + @carlatprevious + ' ' + @carlongprevious + ')', 4326 ); 
      SELECT @preVal = @g.STIntersects(@pprevious) 
      PRINT @preVal 
      IF @curVal = 1 AND @preVal = 0 
      BEGIN 
       PRINT 'Enter In GEOFENCE'; 
       SELECT @geofencename = geofenceName, 
         @geofenceidforresult = ID 
       FROM tblgeofencing where ID = @CarSuggestedID; 
       INSERT INTO tblGeofenceCarStatus 
       VALUES 
        ( 
        @CarSuggestedID, @geofenceidforresult,@geofencename, 
        @gpstime, @g.STDistance(@pprevious), 'Enter'); 

      END 
     ELSE 
BEGIN 
Print Not in Geofence 
END 

     END; --- END POLYGON IF 
    FETCH NEXT FROM ShapeCursor INTO @ID , @CarIdx , @ShapeType; 



    END; --- END CHECK GEOFENCING RECTANGLE OR CIRCLE OR PLYGON 


     FETCH NEXT FROM SuggestCursor INTO @CarSuggestedID , @carlatprevious , @carlongprevious; 



     END; 
    CLOSE ShapeCursor; 
     DEALLOCATE ShapeCursor; 
     CLOSE SuggestCursor; 
     DEALLOCATE SuggestCursor; 
    SELECT * FROM tblGeofenceCarStatus;  

END; 

END; --- END SP BEGIN STATEMENT 

ответ

1

Следующее решение будет:

  • определить самую последнюю позицию каждого автомобиля
  • определить предыдущее положение каждого автомобиля
  • конструкт GeoFence многоугольники на основе многоугольника строки или прямоугольника координаты
  • идентифицировать автомобили, которые в настоящее время находятся в пределах 500 метров от гео- забор (с внешней стороны) или находятся внутри гео-ограды
  • показать расстояние от гео-ограды, как в предыдущей позиции
; 
WITH car_location_seq AS (
     SELECT car_id 
       ,ID 
       ,latitude 
       ,longitude 
       ,ROW_NUMBER() OVER (PARTITION BY car_id ORDER BY ID DESC) AS Pos_Sequence 
     FROM #CarDistance 
), 
car_location AS (
     SELECT c1.car_id 
       ,geography::Point(c1.longitude, c1.latitude, 4326) AS Geo_Point_Current 
       ,CASE WHEN c2.car_id IS NOT NULL THEN geography::Point(c2.longitude, c2.latitude, 4326) END AS Geo_Point_Previous 
     FROM car_location_seq c1 -- Most recent position 
      LEFT JOIN car_location_seq c2 -- Previous position 
       ON c1.car_id = c2.car_id 
       AND c2.Pos_Sequence = 2 
     WHERE c1.Pos_Sequence = 1 
), 
fences AS (
     SELECT ID 
       ,Car_ID 
       ,CASE WHEN ShapeType = 'polygon' THEN geography::STPolyFromText('POLYGON((' + PolygonLatLng + '))', 4326) 
         WHEN ShapeType = 'rectangle' THEN geography::STPolyFromText('POLYGON((' + 
           CAST(maxlatitude AS VARCHAR(100)) + ' ' + CAST(minlongitude AS VARCHAR(100)) + ', ' + 
           CAST(minlatitude AS VARCHAR(100)) + ' ' + CAST(minlongitude AS VARCHAR(100)) + ', ' + 
           CAST(minlatitude AS VARCHAR(100)) + ' ' + CAST(maxlongitude AS VARCHAR(100)) + ', ' + 
           CAST(maxlatitude AS VARCHAR(100)) + ' ' + CAST(maxlongitude AS VARCHAR(100)) + ', ' + 
           CAST(maxlatitude AS VARCHAR(100)) + ' ' + CAST(minlongitude AS VARCHAR(100)) + 
           '))', 4326) 
       END AS Geo_Polygon 
     FROM #tblgeofencing2 
) 

SELECT f.ID AS Fence_ID 
     ,c.car_id 
     ,c.Geo_Point_Current 
     --,c.Geo_Point_Current.STAsText() 
     ,f.Geo_Polygon 
     --,f.Geo_Polygon.STAsText() 
     ,f.Geo_Polygon.STIntersects(c.Geo_Point_Current) AS Is_Inside_Fence_Current 
     ,f.Geo_Polygon.STIntersects(c.Geo_Point_Previous) AS Is_Inside_Fence_Previous 
     ,f.Geo_Polygon.STDistance(c.Geo_Point_Current) AS Distance_Current 
     ,f.Geo_Polygon.STDistance(c.Geo_Point_Previous) AS Distance_Previous 
--INTO #Relevant_Car_Positions 
FROM fences f 
    INNER JOIN car_location c 
     ON f.car_id = c.car_id 

WHERE f.Geo_Polygon.STDistance(c.Geo_Point_Current) < 500 
; 

Пример вывода:

Sample query result

Вы должны быть в состоянии адаптировать этот код, чтобы удовлетворить ваши потребности. Например, вы можете сначала сохранить вывод запроса во временную таблицу, раскомментируя INTO #Relevant_Car_Positions.

Смежные вопросы