【问题标题】:All Lat Lng of a sql table within 15 Km to each Lat lng of a different table-sql 200815 Km 内的 sql 表的所有 Lat Lng 到不同 table-sql 2008 的每个 Lat lng
【发布时间】:2016-08-18 11:20:21
【问题描述】:

SQL 2008

我有两张桌子。一张表 (A) 有大约 4000 个位置和 lat lng。另一个表 (B) 有 800 个位置和 lat lng。

我需要表 B 的每个纬度 lng 以及半径 15 公里范围内的所有相应纬度 lng。

我正在使用 sql 2008 并且对地理查询非常陌生。

【问题讨论】:

  • 欢迎来到 Stackoverflow。这是一个询问“我所拥有的东西有什么问题”的网站(您提供Minimal, Complete, and Verifiable Example)...它不是代码编写服务,当您提供自己的证据时,您会得到更好的回应工作。请阅读帮助中的How to Ask 部分,以及此excellent article
  • 同意你的观点。我不需要任何代码,只是一点点提示如何去做。
  • ===alter table OD_LNT_LNG add [p] as geography::Point(Latitude, Longitude, 4326) 持续存在;在 OD_LNT_LNG ([p])=== 上创建空间索引 LNT_LNG 我试图添加地理列,但它显示一些错误“表 'LNT_LNG' 中的计算列 'p' 无法持久化,因为列类型 'geography' 是非字节排序的 CLR 类型”请帮助
  • 有没有人可以帮助解决这个问题

标签: sql-server-2008 geolocation


【解决方案1】:
        /*
            Assuming Your tables are like so
        */
        IF OBJECT_ID('#xLocation1') IS NOT NULL
            DROP TABLE #xLocation1
        CREATE TABLE #xLocation1 (
             Id         INT IDENTITY(1,1) CONSTRAINT PK_Location_1 PRIMARY KEY--Reqire this for Geog Spatial Index
            ,LocationId INT
            ,Latitude   FLOAT   NULL
            ,Longitude  FLOAT   NULL
            ,Radius     INT     NULL
            ,GeogPoint  GEOGRAPHY   NULL
        )


        IF OBJECT_ID('#xLocation2') IS NOT NULL
            DROP TABLE #xLocation2
        CREATE TABLE #xLocation2 (
             Id         INT IDENTITY(1,1) CONSTRAINT PK_Location_2 PRIMARY KEY--Reqire this for Geog Spatial Index
            ,LocationId INT
            ,Latitude   FLOAT   NULL
            ,Longitude  FLOAT   NULL
            ,Radius     INT     NULL
            ,GeogPoint  GEOGRAPHY   NULL
        )


        DECLARE @Radius INT = 15 --KM

        /*
            Create GEOGRAPHY POINT datatypes
        */

        UPDATE #xLocation1
        SET
            GeogPoint   = GEOGRAPHY::STGeomFromText('POINT(' + CAST(ISNULL(Longitude,'') AS VARCHAR(20)) + ' ' + CAST(ISNULL(Latitude,'') AS VARCHAR(20)) + ')', 4326)

        UPDATE #xLocation2
        SET
            GeogPoint   = GEOGRAPHY::STGeomFromText('POINT(' + CAST(ISNULL(Longitude,'') AS VARCHAR(20)) + ' ' + CAST(ISNULL(Latitude,'') AS VARCHAR(20)) + ')', 4326)


        /*
            CREATE SPATIAL INDEXes
        */
        CREATE SPATIAL INDEX [SDX_Location1_GeogPoint_x1] ON #xLocation1 ( [GeogPoint] ) 
        USING GEOGRAPHY_GRID 
        WITH 
        (     GRIDS=(LEVEL_1 = HIGH,LEVEL_2 = HIGH,LEVEL_3 = HIGH,LEVEL_4 = HIGH) 
                , CELLS_PER_OBJECT = 64 
                , PAD_INDEX = OFF 
                , SORT_IN_TEMPDB = OFF 
                , DROP_EXISTING = OFF 
                , ALLOW_ROW_LOCKS = ON 
                , ALLOW_PAGE_LOCKS = ON 
        ) 

        CREATE SPATIAL INDEX [SDX_Location2_GeogPoint_x2] ON #xLocation2 ( [GeogPoint] ) 
        USING GEOGRAPHY_GRID 
        WITH 
        (     GRIDS=(LEVEL_1 = HIGH,LEVEL_2 = HIGH,LEVEL_3 = HIGH,LEVEL_4 = HIGH) 
                , CELLS_PER_OBJECT = 64 
                , PAD_INDEX = OFF 
                , SORT_IN_TEMPDB = OFF 
                , DROP_EXISTING = OFF 
                , ALLOW_ROW_LOCKS = ON 
                , ALLOW_PAGE_LOCKS = ON 
        ) 

        /*
            Find where locations from each table are within @Radius of each other
        */
        SELECT *
        FROM 
            #xLocation1 X
        INNER JOIN
            #xLocation2 P ON X.GeogPoint.STDistance(P.GeogPoint) <= @Radius

【讨论】:

  • 谢谢...这里的 locationid 是什么?半径也是空白
  • 您没有为您的表提供架构,所以我模拟了几个表。半径声明如下 DECLARE @Radius INT = 15
猜你喜欢
  • 2016-02-01
  • 1970-01-01
  • 2013-04-13
  • 2018-05-20
  • 2018-10-22
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多