2017-02-06 3 views
0

J'ai une entité ponctuelle avec un rayon donné, disons 1000m. Je calcule le rayon intérieur de ma fonction de style comme:Comment calculer les coordonnées d'une bordure de cercle en utilisant Openlayers 3

 var givenRadius = 1000; 
     var coords = feature.getGeometry().getCoordinates(); 
     var projection = map.view.getProjection(); 
     var resolutionAtCoords = projection.getPointResolution(resolution, coords); 

     var featureStyleRadius = Math.round(radius/resolutionAtCoords); 

     style.getImage().setRadius(featureStyleRadius); 

cercle affiché semble correct - je l'ai vérifié en mesurant son rayon sur la carte.

Maintenant, je veux y mettre 2 marques - sur son centre et sur sa bordure. Je le fais comme ceci:

 var center = ol.proj.transform([lon,lat], 'EPSG:4326', 'EPSG:3857'); 

     // center point 

     map.previewLayer.getSource().addFeature(new ol.Feature({ 
       geometry: new ol.geom.Point(center), 
       type: "dragPoint" 
      }) 
     ); 

     // border point 

     center[0] += givenRadius; 

     map.previewLayer.getSource().addFeature(new ol.Feature({ 
       geometry: new ol.geom.Point(center), 
       type: "dragPoint" 
      }) 
     ); 

La marque centrale est correctement positionné, mais la marque frontière est toujours à l'intérieur du cercle (~ 2/3 de son rayon quelle que soit la taille du rayon ou carte zoom) - voir la photo. Quel est le problème avec le calcul?

enter image description here

Répondre

0

Au regard du code que vous calculez le rayon du cercle à l'aide givenRadius et resolutionAtCoords. Mais lors du calcul du point de limite, vous ajoutez givenRadius codé en dur à center. Donc, chaque fois qu'il ajoute 1000m au centre. A la place, vous devez ajouter featureStyleRadius à center.

center[0] += featureStyleRadius; 
+0

Je pense, c'est correct - la variable centrale contient des coordonnées - selon la projection c'est en mètres. C'est pourquoi j'ajoute le rayon donné de 1000m - que je m'attends à me donner des coordonnées géographiques de la frontière. En ce qui concerne le cercle, OpenLayers ne peut pas spécifier le rayon du cercle en mètres - vous devez utiliser des pixles d'écran. C'est pourquoi je recalcule le rayon du cercle à chaque fois dans la fonction de style. – user3523426

+0

Si la projection utilisée est en mètres alors l'option 'rayon' lors de la création de' ol.geom.Circle' sera également prise en mètres seulement. Donc vous calculez inutilement le rayon en utilisant 'resolutionAtCoords' –

+0

Sumanth - c'est une information intéressante pour moi. Je ne crée pas mes fonctionnalités "à la volée", j'ai geojson comme source, Le type geomerty est "Point" (pour autant que je comprends geojson n'a pas de type de géométrie de cercle) et je spécifie le rayon par style pour le point. Comme il s'agit d'un projet d'un an, le rayon du style a été considéré comme étant en pixels (il n'a pas changé pendant le zoom) et c'est pourquoi j'utilise le calcul. – user3523426

0

Il semble que le problème soit lié à la distorsion de carte liée à la projection EPSG: 3857. J'ai résolu le problème en convertissant les coordonnées du centre en EPSG: 4326, en calculant la position du point de bordure dans cette projection et en convertissant de nouveau en EPSG: 3857. Faire de cette façon place le point exactement sur la frontière.