Suite

Passer GeoJSON de .NET à Javascript


Mon application .NET/OpenLayers/GeoServer/PostGres-PostGIS permet aux utilisateurs de créer des requêtes personnalisées pour obtenir des données de mes tables PostGIS.

Les requêtes sont appelées en .NET (pas en javascript) à l'aide d'une méthode Web utilisant la requête SQL suivante :

SELECT "tract_name", ST_AsGeoJSON ("geom") FROM a_postgis_table ;

La requête fonctionne bien lorsque je l'exécute dans la fenêtre PostGres SQL.

Comment puis-je transmettre les résultats PostGIS, y compris la colonne GeoJSON, à javascript/openlayers à partir de la méthode Web .NET afin qu'OpenLayers puisse restituer la couche vectorielle sur la carte ? Il doit y avoir quelque chose de vraiment simple qui me manque ici. On dirait que cela devrait être une chose extrêmement courante que les gens doivent faire.


Je pense qu'il y a trois parties pour obtenir votre solution.

  1. Création d'un FeatureArray GeoJSON
  2. Restauration du FeatureArray à partir de .NET
  3. Consommer ça sur le client

1) GeoJSON FeatureArray. Le moyen le plus simple (à mon humble avis) est d'écrire une requête Postgresql pour le faire. Il existe un guide ici sur la façon de procéder, mais, en supposant que tract_name est unique, votre requête pourrait ressembler à ceci :

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 tract_name FROM a_postgis_table) As lp ON lg.tract_name = lp.tract_name ) As f ) As fc;

2) Service .NET Il existe de nombreuses façons de le faire, mais je l'ai fait dans le passé en utilisant WCF / svc si ma terminologie est correcte. Voici un petit sketch VB :

 _  _ Public Function GetTracts() As Stream ' Code pour obtenir votre ensemble de fonctionnalités Postgresql dans une chaîne dim json as String = "" ' La sortie SQL WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8" Dim ms As MemoryStream = New MemoryStream(Encoding.UTF8.GetBytes(json)) Renvoyer la fonction de fin de ms

3) Mettez-le dans OpenLayers (fonctionne pour la v 2)

Je suppose que vous avez créé une couche vectorielle vide dans OpenLayers appelée "myTracts". Vous pouvez faire quelque chose comme ceci :

var request = OpenLayers.Request.POST({ url: serviceUrl, data: '{}', headers: { // contentType: "text/plain" "Content-Type": "application/json; charset=utf-8" }, rappel : onGeoJsonLoadSuccess }); function onGeoJsonLoadSuccess(data) { // En supposant que les données de votre serveur soient au format lon/lat var geojson_format = new OpenLayers.Format.GeoJSON({ 'internalProjection': map.baseLayer.projection, 'externalProjection': new OpenLayers.Projection("EPSG: 4326") }); // Vous voudrez peut-être d'abord vider les entités… myTracts.addFeatures(geojson_format.read(data); }

Je ne connais pas .NET, mais si vous êtes capable de modifier le DOM à partir de la méthode .NET, vous pouvez écrire les données dans un div caché sur lequel un écouteur de changement est enregistré. par exemple en utilisant jQuery :

$.("#data").bind('contentchanged', function() { //faire quelque chose avec les données )} ;

Lorsque l'événement se déclenche, la fonction est déclenchée et vous pouvez gérer les données. Une autre façon serait d'écrire les données dans un fichier et de les charger en utilisant AJAX. Pour les deux méthodes, vous devez cependant modifier le DOM, car vous devez maintenant laisser à JavaScript ce qu'il faut charger.


Vous pouvez utiliser JavascriptSérialiseur pour convertir votre liste .Net en JSON ou GeoJson.

Liste GeoJson fait référence à la liste dans les données

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


Voir la vidéo: Visual GeoJSON editor in Maps (Octobre 2021).