1

This is the follow up question from here.

Given: A geojson file with 3 different geometry types (Point, Polygon, Line) and multiple properties (AssetType, GeoID, etc.), write each geometry type and its corresponding properties to a single Azure SQL record which uses a Geography-type column.

Work so far: I have separate SQL statements that will push the properties alone, then push the Polygon alone into a Geography-type column. But this results in the properties in one record and the geography in another (the graphic doesn't exactly match the script below, illustrative purposes only).

Questions: How should the scripts be combined to write both properties and geometry to the same record? How should the script account for Point, Polygon and Line geometry types as they are encountered in the geojson file?

Any help would be greatly appreciated.

enter image description here

-- Create the table

IF OBJECT_ID('dbo.fixedAssets', 'U') IS NOT NULL
DROP TABLE dbo.fixedAssets
GO

CREATE TABLE dbo.fixedAssets
(
    Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
    GeoId [NVARCHAR] (50),
    AssetType [NVARCHAR](255),
    Status [NVARCHAR](255),
    Desc [NVARCHAR](255),
    GeoType [NVARCHAR](255),
    GeoCoord [GEOGRAPHY]
)
GO

-- Create sample geojson

DECLARE @JsonSample nvarchar(max) = 
'{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {
                "geoID": "001",
                "geoType": "Residential",
                "geoStatus": "Active",
                "geoDesc" : "Cool place"
            },
      "geometry": {
        "type": "Point",
        "coordinates": [
          -122.38563537597656,
          47.57368844862113
        ]
      }
    },
    {
      "type": "Feature",
      "properties": {
                "geoID": "004",
                "geoType": "Commercial Prod",
                "geoStatus": "Active",
                "geoDesc" : "Don't go here"
            },
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [
              -122.33181953430176,
              47.57808903904011
            ],
            [
              -122.32658386230469,
              47.57808903904011
            ],
            [
              -122.32658386230469,
              47.58214188724162
            ],
            [
              -122.33181953430176,
              47.58214188724162
            ],
            [
              -122.33181953430176,
              47.57808903904011
            ]
          ]
        ]
      }
    },
    {
      "type": "Feature",
      "properties": {
                "geoID": "007",
                "geoType": "Road",
                "geoStatus": "Active",
                "geoDesc" : "To nowhere"
            },
      "geometry": {
        "type": "LineString",
        "coordinates": [
          [
            -122.39275932312012,
            47.583994513354966
          ],
          [
            -122.40022659301758,
            47.57889963377935
          ],
          [
            -122.39275932312012,
            47.57768373696443
          ],
          [
            -122.40031242370604,
            47.57473072714337
          ]
        ]
      }
    }
  ]
}';

--This works for inserting properties into their own records

INSERT INTO dbo.fixedAssets_DEV (GeoId, AssetType, Status, Desc, GeoType)
SELECT
  GeoId,
    AssetType,
    Status,
    Desc, 
    GeoType
FROM
OPENJSON(@JsonSample, '$.features')
    WITH (
        GeoId [NVARCHAR] (50) '$.properties.geoId',
        AssetType [NVARCHAR](300) '$.properties.Type',
        Status [NVARCHAR](300) '$.properties.Status',
        Desc [NVARCHAR](300) '$.properties.Desc',
        GeoType [NVARCHAR](300) '$.geometry.type'
    )

GO

-- This works for inserting Polygon into Geography column, but its writing all features to one record instead of each record.

INSERT INTO dbo.fixedAssets (GeoCoord)
SELECT
  geography::STPolyFromText('POLYGON ((' + STRING_AGG(CAST(Long + ' ' + Lat as varchar(max)), ',') + '))',4326).ReorientObject() AS fGeofenceCoord
FROM
    (
    SELECT 
        Long,
        Lat
    FROM
        OPENJSON(@JsonSample, '$.features[0].geometry.coordinates[0]')
        WITH
            (
                Long varchar(100) '$[0]',
                Lat varchar(100) '$[1]'
            )
)d

-- Need SQL for inserting Point and Line features into the GEOGRAPHY column. 
-- Need to combine these statements into a single script that can parse a geojson file and store data accordingly
SeaDude
  • 3,725
  • 6
  • 31
  • 68

0 Answers0