如何使用 GEOJson 文件和数据库中已存在的表进行连接?

Posted

技术标签:

【中文标题】如何使用 GEOJson 文件和数据库中已存在的表进行连接?【英文标题】:How can i do a join with a GEOJson file and a table that exists already in the database? 【发布时间】:2018-11-29 17:35:11 【问题描述】:

我有一个包含 GEOJson 数据的文件,如下所示:


  "type": "FeatureCollection",
  "features": [
    
      "type": "Feature",
      "geometry": 
        "type": "Polygon",
        "coordinates": [
          [
            [-73.759739, 42.61379],
            [-73.759565, 42.614179],
            [-73.752172, 42.614284999999995],
            [-73.744867, 42.617281],
            [-73.743042, 42.628958999999995],
            [-73.74260799999999, 42.631581999999995],
            [-73.734443, 42.631879999999995],
            [-73.733936, 42.632020999999995],
            [-73.73479499999999, 42.636396],
            [-73.73097299999999, 42.643890999999996],
            [-73.759739, 42.61379]
          ],
          [[-73.72579, 42.650059], [-73.725143, 42.649788], [-73.725071, 42.649817], [-73.724823, 42.650282999999995], [-73.72552499999999, 42.650486], [-73.72579, 42.650059]]
        ]
      ,
      "properties":  "STATEFP": "36", "UNSDLEA": "09630", "AFFGEOID": "9700000US3609630", "GEOID": "3609630", "NAME": "East Greenbush Central School District", "LSAD": "00", "ALAND": 195779723, "AWATER": 2721773 
    ,
    
      "type": "Feature",
      "geometry": 
        "type": "MultiPolygon",
        "coordinates": [
          [[[-73.64970199999999, 42.351976], [-73.647074, 42.352069], [-73.647874, 42.353819], [-73.644886, 42.353538], [-73.640999, 42.354502], [-73.640935, 42.350439], [-73.64918399999999, 42.350263], [-73.64970199999999, 42.351976]]],
          [
            [
              [-73.65831, 42.392008],
              [-73.656461, 42.394642],
              [-73.656983, 42.398876],
              [-73.653469, 42.398039999999995],
              [-73.65123799999999, 42.396592],
              [-73.647519, 42.395765],
              [-73.64356599999999, 42.392081],
              [-73.649436, 42.392233],
              [-73.652639, 42.393062],
              [-73.65522, 42.39261],
              [-73.655879, 42.390594],
              [-73.658508, 42.391143],
              [-73.65831, 42.392008]
            ]
          ],
          [
            [
              [-73.77776399999999, 42.424766999999996],
              [-73.775817, 42.429938],
              [-73.774451, 42.435269],
              [-73.77367, 42.44404],
              [-73.773833, 42.449467999999996],
              [-73.77420099999999, 42.451465999999996],
              [-73.77553499999999, 42.451522999999995],
              [-73.776663, 42.452602999999996],
              [-73.77599, 42.454141],
              [-73.777172, 42.455293999999995],
              [-73.77776399999999, 42.424766999999996]
            ]
          ]
        ]
      ,
      "properties":  "STATEFP": "36", "UNSDLEA": "15210", "AFFGEOID": "9700000US3615210", "GEOID": "3615210", "NAME": "Kinderhook Central School District (Ichabod Crane)", "LSAD": "00", "ALAND": 202445671, "AWATER": 9611722 
    
  ]

如何进行可以选择整条记录的连接,例如


      "type": "Feature",
      "geometry": 
        "type": "Polygon",
        "coordinates": [
          [
            [-73.759739, 42.61379],
            [-73.759565, 42.614179],
            [-73.752172, 42.614284999999995],
            [-73.744867, 42.617281],
            [-73.743042, 42.628958999999995],
            [-73.74260799999999, 42.631581999999995],
            [-73.734443, 42.631879999999995],
            [-73.733936, 42.632020999999995],
            [-73.73479499999999, 42.636396],
            [-73.73097299999999, 42.643890999999996],
            [-73.759739, 42.61379]
          ],
          [[-73.72579, 42.650059], [-73.725143, 42.649788], [-73.725071, 42.649817], [-73.724823, 42.650282999999995], [-73.72552499999999, 42.650486], [-73.72579, 42.650059]]
        ]
      ,
      "properties":  "STATEFP": "36", "UNSDLEA": "09630", "AFFGEOID": "9700000US3609630", "GEOID": "3609630", "NAME": "East Greenbush Central School District", "LSAD": "00", "ALAND": 195779723, "AWATER": 2721773 
    

文件中的 name 属性与我的表中的 name 列匹配??

我的桌子是这样的:

CREATE TABLE SCHOOL_INFO (
    [id] [int] IDENTITY(1,1) NOT NULL,
    [name] [varchar](128) NOT NULL,
    [address] [varchar](128) NOT NULL,
    [city] [varchar](128) NOT NULL,
    [state] [varchar](128) NOT NULL,
    [zip] [varchar](16) NOT NULL,
    [jsondata] [varchar](MAX) NOT NULL
)

我要做的就是将匹配的 json 数据作为字符串插入到 jsondata 列中。我不需要使用任何 SQL 空间功能。

我想出了以下SQL:

Declare @JSON varchar(max)

SELECT @JSON = BulkColumn
 FROM OPENROWSET (BULK 'C:\temp\nyusd.json', SINGLE_CLOB) as j

SELECT * FROM OPENJSON (@JSON, '$.features')

我尝试使用以下 SQL 查询一条记录,但我认为我的语法错误:

Declare @JSON varchar(max)

SELECT @JSON = BulkColumn
 FROM OPENROWSET (BULK 'C:\temp\nyusd.json', SINGLE_CLOB) as j

SELECT * FROM OPENJSON (@JSON, '$.features') where JSON_VALUE(@JSON, '$.features.properties.Name') = 'East Greenbush Central School District';

有人能指出正确的方向吗?

谢谢!

【问题讨论】:

【参考方案1】:

请尝试:

Declare @JSON nvarchar(max)

SELECT @JSON = BulkColumn
 FROM OPENROWSET (BULK 'C:\temp\nyusd.json', SINGLE_CLOB) as j


 select *
 From
 (
SELECT * FROM OPENJSON (@JSON, '$.features')
)x
WHERE  JSON_VALUE(x.[value], '$.properties.NAME')  = 'East Greenbush Central School District'

【讨论】:

这里有两点:第一是SELECT * FROM OPENJSON(@JSON, '$.features')会返回table有三列key,value,type哪一列value是json,第二点是 properties.Name 必须是 '$.properties.NAME'

以上是关于如何使用 GEOJson 文件和数据库中已存在的表进行连接?的主要内容,如果未能解决你的问题,请参考以下文章

出现:“数据库中已存在名为 'Assembles' 的对象。”问题,无法更新数据库,请问知道如何处理吗??

使用 Python 将 Csv 文件写入 SQL Server 数据库中已有的表

如何防止从表中已有的值派生的表中的某些值组合?

如何将颜色和存储变体添加到数据库中已存在的产品?

光标检索在 plpgsql 函数中创建的表中已删除的行

如何恢复 Big Query 中已删除的行?