Mais

Passe GeoJSON de .NET para Javascript

Passe GeoJSON de .NET para Javascript


Meu aplicativo .NET / OpenLayers / GeoServer / PostGres-PostGIS permite aos usuários criar consultas personalizadas para obter dados de minhas tabelas PostGIS.

As consultas são chamadas em .NET (não em javascript) usando um método da web usando a seguinte consulta SQL:

SELECT "trato_nome", ST_AsGeoJSON ("geom") DE a_postgis_table;

A consulta funciona bem quando eu a executo na janela PostGres SQL.

Como posso passar os resultados do PostGIS, incluindo a coluna GeoJSON, de volta para javascript / openlayers do método da web .NET para que o OpenLayers possa renderizar a camada vetorial no mapa? Tem que haver algo realmente simples que estou perdendo aqui. Parece que isso deve ser algo extremamente comum que as pessoas precisam fazer.


Acho que há três partes para obter sua solução.

  1. Criação de um GeoJSON FeatureArray
  2. Retirando o FeatureArray do .NET
  3. Consumir isso no cliente

1) GeoJSON FeatureArray. A maneira mais fácil (IMHO) é escrever uma consulta Postgresql para fazer isso. Há um guia aqui sobre como fazer isso, mas, assumindo que trato_nome seja único, sua consulta poderia ser algo assim:

SELECT row_to_json (fc) FROM (SELECT 'FeatureCollection' As type, array_to_json (array_agg (f)) As features FROM (SELECT 'Feature' As type, ST_AsGeoJSON (lg.geom) :: json As geometry, row_to_json (lp) As properties FROM a_postgis_table As lg INNER JOIN (SELECT trato_nome FROM a_postgis_table) As lp ON lg.tract_name = lp.tract_name) As f) As fc;

2) Serviço .NET Existem várias maneiras de fazer isso, mas já fiz isso no passado usando WCF / svc se entendi minha terminologia correta. Aqui está um pequeno esboço do VB:

 _  _ Public Function GetTracts () As Stream 'Código para obter seu Postgresql Feature definido em uma string dim json as String = ""' A saída sql WebOperationContext.Current.OutgoingResponse.ContentType = "application / json; charset = utf-8" Dim ms As MemoryStream = Novo MemoryStream (Encoding.UTF8.GetBytes (json)) Retorna ms End Function

3) Coloque-o no OpenLayers (funciona para a v 2)

Presumo que você tenha criado uma camada vetorial vazia no OpenLayers chamada "myTracts". Você pode fazer algo assim:

var request = OpenLayers.Request.POST ({url: serviceUrl, data: '{}', headers: {// contentType: "text / plain" "Content-Type": "application / json; charset = utf-8" }, retorno de chamada: onGeoJsonLoadSuccess}); function onGeoJsonLoadSuccess (data) {// Supondo que os dados do servidor estejam em lon / lat var geojson_format = new OpenLayers.Format.GeoJSON ({'internalProjection': map.baseLayer.projection, 'externalProjection': new OpenLayers.Projection ("EPSG: 4326 ")}); // Você pode querer esvaziar os recursos primeiro… myTracts.addFeatures (geojson_format.read (data);}

Não estou familiarizado com o .NET, mas se você for capaz de modificar o DOM do método .NET, poderá gravar os dados em um div oculto no qual um ouvinte de alteração está registrado. por exemplo, usando jQuery:

$. ("# dados"). bind ('contentchanged', function () {// fazer algo com os dados)};

Quando o evento é disparado, a função é disparada e você pode manipular os dados. Outra forma seria gravar os dados em um arquivo e carregá-lo usando AJAX. Para ambos os métodos, você precisa modificar o DOM, já que precisa deixar o JavaScript agora o que deve ser carregado.


Você pode usar JavascriptSerializer para converter sua lista .Net em JSON ou GeoJson.

GeoJsonList refere-se à lista nos dados

var serializer = new JavaScriptSerializer (); var serializedResult = serializer.Serialize (GeoJsonList);