2016-03-20 7 views
0

Ich versuche, ein GeoJSON Polygon auf einer Karte anzuzeigen. Ich habe das Beispiel von Openlayers mit den folgenden Daten zur Verfügung gestellt verwendet, aber nur das zweite Polygon angezeigt:GeoJSON Feature-Koordinaten, die nicht auf OpenLayers-Karte angezeigt werden

var geojsonObject = { 
    "type": "FeatureCollection", 
    "crs": { 
     "type": "name", 
    }, 
    "features": [ 
     { 
      "type": "Feature", 
      "geometry": { 
       "type": "Polygon", 
       "coordinates": [[[103.92240800000013,21.69931],[100.93664,21.66959500000013],[108.031899,18.67076]]]     
      } 
     }, 
     { 
      "type": "Feature", 
      "geometry": { 
       "type": "Polygon", 
       "coordinates": [[[-5e6, -1e6], [-4e6, 1e6], [-3e6, -1e6]]]     
      } 
     } 
    ] 
}; 

Der Code Ich bin mit dem GeoJSON zu analysieren und fügen Sie die Karte ist als folgt:

var vectorSource = new ol.source.Vector({ 
    features: (new ol.format.GeoJSON()).readFeatures(geojsonObject) 
}); 

var vectorLayer = new ol.layer.Vector({ 
    source: vectorSource, 
    style: styleFunction 
}); 

Ich bemerkte verschiedene Arten von Koordinaten. Im zweiten Satz werden die Koordinaten wie [-5e6, -1e6] mit dem e dargestellt, was ich nicht verstehe und im ersten Satz - die nicht funktionieren - sehen sie aus wie [103.92240800000013, 21.69931].

Ist dies ein möglicher Grund, warum mein Polygon nicht angezeigt wird?

+1

5e6 steht für 5 x 10^6 - oder 5000000. Siehe https://en.wikipedia.org/wiki/Scientific_notation – Sander

+0

Sicher, gute Idee muss das sein. Ich werde meinen ersten Beitrag aktualisieren – Kamzz

+0

Der zweite Bereich ist etwa 2.000.000 x 2.000.000 Einheiten - der erste 4 x 8 Einheiten. Wenn beide Funktionen auf derselben Karte angezeigt werden, erscheint die erste im besten Fall sehr klein (und möglicherweise durch die große versteckt). Was passiert, wenn Sie den großen Bereich aus dem Code entfernen? – Sander

Antwort

1

Das Problem ist, dass Ihre zwei Polygone mit verschiedenen Koordinatenräumen angegeben werden und Sie bestimmen müssen, welche Kartenprojektion Sie verwenden möchten. Standardmäßig verwendet OpenLayers etwas, das sie "spherical mercator" nennen, und ohne in das Detail einzugehen, werden die Geometriekoordinaten durch Pixel auf einer 2D-Ebene dargestellt.

Im Idealfall würden Sie Ihren GeoJSON so einstellen, dass alle Koordinaten in derselben Projektion angezeigt werden. Wenn Sie das nicht können, hier ist eine funktionierende Lösung:

Das Set, das Sie sagen, funktionieren nicht wie Längen- und Breitengrad (GIS) Koordinaten und müssen transformiert werden, wenn sie angezeigt werden sollen die gleiche Schicht - im folgenden Beispiel habe ich die Funktionen mit Tags versehen haben, die die GeoJSONproperties wie so mit Transformation erfordern:

var geojsonObject = { 
    type: 'FeatureCollection', 
    // ... 
    features: [ 
     { 
      type: 'Feature', 
      geometry: { 
       type: 'Polygon', 
       coordinates: [/* ... */], 
       properties: { 
        requiresTransform: true // <- custom property 
       } 
      } 
     }, 
     // ... 
    ] 
}; 

Bevor Funktionen zur Schichtquelle Hinzufügen könnte man dann etwas tun, wie folgt aus :

var features = (new ol.format.GeoJSON()).readFeatures(geojsonObject); 

features.forEach(function(feature){ 
    if(!feature.get('requiresTransform')) 
     return; // ignore 

    var geometry = feature.getGeometry(), 
     coords = geometry.getCoordinates(); 

    if(geometry instanceof ol.geom.Polygon) 
     geometry.setCoordinates(transformPolyCoords(coords)); 
}); 

function transformPolyCoords(/* Array */ a){ 
    return a.map(function(aa){ 
     return aa.map(function(coords){ 
      return ol.proj.transform(coords, 'EPSG:4326', 'EPSG:3857'); 
     }); 
    }); 
} 

Es kann eine sauberere Möglichkeit der Verwaltung dieses sein, und ich kann mir vorstellen, es beinhaltet die einzelnen Formate in separaten GeoJSON Objekte zu halten, und ich weiß nicht, wie nah es ist, was Sie erwartet hatten, aber das ist, was ich mit dem, was Sie zur Verfügung gestellt » working example.

+0

Vielen Dank für diese detaillierte Antwort. – Kamzz

+0

Während mit dem obigen Code nichts falsch ist, ist es viel komplizierter als es sein muss. Siehe meine Antwort für eine einfachere Lösung. – ahocevar

+0

@ahocevar hast du deine alternative getestet bevor du mich gewählt hast? Der Parser arbeitet nicht konsistent, wenn der gleiche * GeoJSON * -Datensatz, wie er im OP vorgeschrieben ist, Merkmale enthält, die in verschiedenen Projektionen/Formaten definiert sind. – Emissary