Converter dados espaciais do Sql Server em GeoJSON e plotar no mapa


8

Eu tenho uma tabela de servidor sql com dados espaciais geográficos. Um exemplo de linha seria (com nomes de colunas):

type: streetline
code: 231001
geog: 0xE6100000011 ........
Centroid 0xE61000000C.......
geom: 0xE6100000011 ........

Estou usando o C # com MVC3 para desenhar as formas acima no mapa do folheto. Estou buscando os dados sql acima em uma tabela de dados. Usando a função sql "ToString ()" na coluna "geom", obtenho o seguinte:

"LINESTRING (-1.131510412 52.65531, -1.13286 52.65559)",
"POLYGON ((-1.1116360 52.6409953, -1.1116683 52.6413, -1.11146723 52.641317, -1.11133263 52.6413572, -1.1113059))",

A questão é como converter os itens acima em GeoJSON para poder plotar no mapa do folheto. Aqui está um exemplo da saída esperada (GeoJSON) que eu quero:

var geojsonFeature = {
    "type": "Feature",
    "properties": {
        "name": "Coors Field",
        "amenity": "Baseball Stadium",
        "popupContent": "This is where the Rockies play!"
    },
    "geometry": {
        "type": "Point",
        "coordinates": [-104.99404, 39.75621]
    }
};

Respostas:


3

ogr2ogr deve fazer isso por você. Parece que você tem vários tipos de geometria no conjunto de dados, sem saber como isso funcionará. Pode ser necessário filtrar por tipo de geometria. Abaixo não testado. Veja os documentos vinculados acima para entradas e sinalizadores.

ogr2ogr -f "GeoJSON" "sqlexport.geojson"
"MSSQL:server=localhost\sqlexpress;database=tempdb;trusted_connection=yes;"
-sql "SELECT * FROM tbl"

Você conhece um código de exemplo para fazer isso com a API .Net da GDAL?
Harlan Wescott

@HarlanWescott - Não, desculpe, não.
Chad Cooper #

1

Você pode usar o GeoJSON.Net . Estou planejando trabalhar com isso. Vou informá-lo quando for útil.


2
Você pode atualizar a resposta então? Já faz mais de um ano.
JP Hellemons

0

Você pode resolver isso facilmente com algo como (código Javascript)

    var dataRows = [{
        id: 1,
        geom: "LINESTRING(-1.131510412 52.65531, -1.13286 52.65559)"
    }];
    features = [];
    dataRows.forEach(function (row) {
        var coords = row.geom.replace("(", "[").replace(")", "]").substring(row.geom.indexOf("("), row.geom.length);
        features.push({
            "type": "Feature",
                "properties": {
                "id": row.id
            },
            "geometry": {
                "type": row.geom.substring(0, row.geom.indexOf("(")),
                "coordinates": coords
            }
        });
    });

    console.log(JSON.stringify(features[0]));
/* OUTPUT:
// {"type":"Feature","properties":{"id":1},"geometry":{"type":"LINESTRING","coordinates":"[-1.131510412 52.65531, -1.13286 52.65559]"}}
*/

Tentei manter isso o mais simples possível, para que você pudesse migrá-lo facilmente para o idioma desejado. Observe que, mesmo que isso seja difícil, o problema é resolvido. Não é recomendável fazer a análise dessa maneira.

jsfiddle: https://jsfiddle.net/e78cgogo/32/


A questão foi etiquetado como sendo para C #, não JavaScript
SteveC

@SteveC - concordou, a tradução deve ser fácil o suficiente para o OP. É melhor ter uma solução que mostre como isso poderia ser feito e não ter nenhuma.
Dementic

0

Se você estiver usando o Entity Framework, poderá tentar GeoJSON4EntityFramework . Eu apenas comecei a usá-lo, e é bem legal. Aqui está um exemplo, usando um DbGeometrycampo chamado Boundaries:

var feature = new Feature(Boundaries);
var geoJSON = feature.Serialize();

Bem simples.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.