2012-07-30 19 views
8

Utilizzo di ASP.NET MVC 3 con C# Ho una pagina Web per visualizzare una mappa su cui voglio aggiungere una polilinea composta da più coordinate di latitudine e longitudine. Con la libreria JavaScript Leaflet è possibile aggiungere strati GeoJson. Voglio ottenere le coordinate di longitudine e latitudine da un database in C# e passare l'elenco di coordinate al JavaScript per creare GeoJson o come GeoJson.Chiamata Ajax per ottenere dati GeoJson da ASP.NET MVC Controller

Ecco un esempio del GeoJSON desidero creare:

var polyline = { 
     "type": "Feature", 
     "geometry": { 
     "type": "LineString", 
        "coordinates": [ 
         [-105.00341892242432, 39.75383843460583], 
         [-105.0008225440979, 39.751891803969535] … 
        ] 
       }, 
     "properties": { 
     "popupContent": "This is a polyline of many coordinates.", 
     "underConstruction": false 
     } 
}; 

Come posso creare GeoJSON simile a quello mostrato in precedenza e aggiungere dati di localizzazione al “coordinate” sezione dal C# o JavaScript e quindi utilizzarlo in JavaScript per aggiungere un livello come ad esempio:

var myLayer = L.geoJson().addTo(map); 
myLayer.addData(polyline); 

ho iniziato a utilizzare GeoJSON.net e sono venuti su con questo codice:

01.235.164,106174 millions
foreach (Position point in Positions) 
{ 
    coordinates.Add(point); 
} 

GeoJSON.Net.Geometry.LineString line = new GeoJSON.Net.Geometry.LineString(coordinates); 

JavaScriptSerializer serializer = new JavaScriptSerializer(); 

var data = serializer.Serialize(lineString); 

Ma non so come passare questo oggetto LinseString GeoJSON dal C# al JavaScript. Non sono riuscito a passarlo con JSON in quanto tale:

return Json(data, JsonRequestBehavior.AllowGet); 
+0

Si dovrebbe provare a utilizzare il serializzatore JSON.NET invece di JavaScriptSerializer. Inoltre, se si esegue la serializzazione all'interno del controller come sopra, è necessario restituire ContentResult, poiché JsonResult esegue anche la serializzazione. Un codice aggiunto alla mia risposta qui sotto spiega come. –

risposta

3

Basta guardare brevemente GeoJSON.NET e utilizza JSON.NET, quindi è necessario utilizzare il serializzatore JSON.NET quando si restituisce il risultato (il serializzatore JSON in .NET non conosce gli attributi JSON.NET). fare questo si può solo serializzare e restituire un ContentResult come questo (non hanno testato questo):

var line = new GeoJSON.Net.Geometry.LineString(coordinates); 
string json = JsonConvert.SerializeObject(line); 
return Content(json, "application/json"); 

o meglio si potrebbe usare a custom JSON.NET ActionResult.

Su una nota a margine, sembra esserci an issue with serialization of polygons not complying with the GeoJSON specification - non è sicuro se questo influenzi anche le polilinee. Ma il fatto che questo non sia stato risolto un anno dopo, non promette bene per una libreria GeoJSON. Il progetto sembra essere abbandonato.

Abbiamo optato per l'utilizzo della serializzazione GeoJSON in nettopologysuite, che ha funzionato immediatamente fuori dalla scatola, come ricordo.

+0

Come seguito, la libreria ora supporta la piena serializzazione poligonale/deserializzazione. Se trovi qualche problema, crea un problema su GitHub e cercherò di risolverlo al più presto. –

1

Io in realtà non ho una bacchetta magica per questo, ma credo che posso almeno punto nella giusta direzione.

Se si utilizza PostGres/PostGIS, è possibile utilizzare la funzione ST_AsGeoJson per restituire GeoJson direttamente dal database, il che è utile. Altrimenti ti consigliamo di iniziare esaminando JSON.NET, che è la libreria di serializzazione JSON defacto standard per ASP MVC. L'ho trovato un po 'pieno e non l'ho approfondito abbastanza a fondo da suggerire come procedere oltre a guadagnare un po' di familiarità.

Inoltre, sembra che ci sia un plug-in di GeoJson per JSON.NET che ha un Nuget Package e il corrispondente GitHub repo. Non l'ho usato personalmente quindi non posso garantire esattamente la sua stabilità/set di funzionalità, ecc., Ma in ogni caso potrebbe essere un buon punto di partenza.

Spero che questo sia utile, e sarei interessato a sentire con cosa finisci!

+0

GeoJson ha una classe di geometrie e feature, quindi il solo passaggio di ResponseJson deve restituire l'oggetto FeatureCollection con tutti i dati compilati. Sto cercando di ottenere l'oggetto featureCollection compilato da GeoJosn – Mohit

Problemi correlati