Попытка создать тепловую карту в SQL, но что-то не так с моими пространственными данными - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь создать тепловую карту заказов клиентов по штатам

Я следую этому уроку:

https://www.mssqltips.com/sqlservertip/3550/sql-server-reporting-services-analytical-marker-maps-including-bing-maps/

Однако по какой-то причине очки не попадают в правильное место.

enter image description here

У меня есть стол, полный клиентов, их города и штата. Чтобы узнать долготу и широту каждого города, я скачал базу данных отсюда https://simplemaps.com/data/us-cities

Затем я присоединил эту базу данных к своей информации о клиенте, чтобы получить долготу и широту для каждого клиента. Затем я сопоставил это с пространственным расположением.

Вот моя керея:

SELECT top 100
    --*
    --,CAST('POINT( ' + right(left(LAT, len(LAT) -1),len(LAT) -2) + ' ' + right(left(LNG, len(LNG) -1),len(LNG) -2) + ' )' as geometry) AS SpatialLocation 
    CSS.City
    ,CSS.State
    ,CSS.TotalCustomerValue
    ,CSS.TotalOrders
    ,CSS.OrderDensityPercent
    ,geography::STPointFromText('POINT(' + CAST(right(left(LAT, len(LAT) -1),len(LAT) -2) AS VARCHAR(20)) + ' ' + CAST(right(left(LAT, len(LAT) -1),len(LAT) -2) AS VARCHAR(20)) + ')', 4326) SpatialLocation2
    ,CSS.BrandNewCustomers
    ,CSS.RecurringCustomers
    ,CSS.ReactivatedCustomers
    FROM
    (
        SELECT DISTINCT
        --*
        LTRIM(RTRIM(cs.City)) City
        ,LTRIM(RTRIM(cs.State)) State

        ,right(left(lat, len(lat) -1),len(lat) -2) lat -- the lat and long are wrapped in quotes
        ,right(left(lng, len(lng) -1),len(lng) -2) lng -- so i have to do the left right to get rid of them. 

        ,SUM(cs.TotalCustomerValueOverBase) over (partition by  cs.City, cs.State) TotalCustomerValue
        ,SUM(cs.TotalOrdersBase) over (partition by  cs.City, cs.State) TotalOrders
        --,SUM(cs.TotalQuantityOverBase) over (partition by  cs.City, cs.State) TotalQuantity

        ,right(left(population_proper, len(population_proper) -1),len(population_proper) -2) population_proper

        ,CAST(
            SUM(cs.TotalOrdersBase) over (partition by  cs.City, cs.State) 
            /
            NULLIF(convert(float, right(left(population_proper, len(population_proper) -1),len(population_proper) -2)),0)*100 
        as decimal(10,2)) AS OrderDensityPercent

        ,SUM(cs.BrandNewCustomer) over (partition by     cs.City, cs.State) BrandNewCustomers
        ,SUM(cs.RecurringCustomer) over (partition by    cs.City, cs.State) RecurringCustomers
        ,SUM(cs.ReactivatedCustomer) over (partition by  cs.City, cs.State) ReactivatedCustomers

        FROM Customers -- This table gives full customer information per customer.

        LEFT JOIN [A1Warehouse].[dbo].[uscities] Ci ON cs.City = right(left(ci.city_ascii, len(ci.city_ascii) -1),len(ci.city_ascii) -2) and cs.State = right(left(ci.state_id, len(ci.state_id) -1),len(ci.state_id) -2)

        WHERE LAT IS NOT NULL AND LNG IS NOT NULL
    )CSS
    ORDER BY TotalCustomerValue DESC

Вот пример результата:

City    State    Amount    Orders    PopDensity    SpatialLocation
Brooklyn    NY  $663    8535    0.32    0xE6100000010CCDCCCCCCCCCCE43FCDCCCCCCCCCCE43F
MIAMI   FL  $529    7042    1.52    0xE6100000010C894160E5D0221740894160E5D0221740
Bronx   NY  $443    5901    0.41    0xE6100000010C333333333333EB3F333333333333EB3F

Откуда я знаю, где это идет не так? Неправильно ли пространственное расположение или ssrs отображает их неправильно? Я проверил несколько координат долготы и широты клиента, и они показались правильными, я не уверен, как проверить пространственное расположение.

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Представление Общеизвестного текста (WKT) Открытого геопространственного консорциума (OGC), формат (x, y). Географические координаты обычно задаются широтой / долготой, но между этими двумя значениями X - это долгота, а Y - широта. http://www.sql -server-helper.com / SQL-сервер-2008 / преобразование-широты долготы к географии-point.aspx

Таким образом, долгота должна быть указана первой перед широтой и правильной географией :: Порядок аргументов STPointFromText:

...
    ,geography::STPointFromText('POINT(' + CAST(right(left(Lng, len(Lng) -1),len(Lng) -2) AS VARCHAR(20)) + ' ' + CAST(right(left(LAT, len(LAT) -1),len(LAT) -2) AS VARCHAR(20)) + ')', 4326) SpatialLocation2
...
0 голосов
/ 26 июня 2019

Проблема заключалась в том, что я делал левую, правую вещь по широте и долготе, из-за чего она была полностью испорчена. Когда-то это было правильно, так как мне нужно было удалить кавычки, которые окружали его, но я сделал это во второй раз, когда создавал поле географии, которое удаляло первый и последний символ правильно отформатированной точки местоположения.

...