2012-08-15 13 views
7

En la documentación para el folleto aquí: http://leafletjs.com/reference-1.2.0.html#circlemarker dice que CircleMaker extiende círculo, y que es lo mismo, excepto que el radio se especifica en píxeles en lugar de en metros, por lo que los círculos permanecen tamaño constante incluso si hace zoom en el mapa.Folleto: Círculo que se comporta diferente de CircleMarker

Sin embargo, necesito Círculos, porque estoy tratando de dibujar círculos de 100 m de radio en un mapa. Para ello, utilizo el siguiente código:

var geojsonLayer = new L.GeoJSON(null,{ 
pointToLayer: function (latlng){ 
    return new L.CircleMarker(latlng, { 
     radius: 5, 
     fillColor: "#ff7800", 
     color: "#000", 
     weight: 1, 
     opacity: 1, 
     fillOpacity: 0.8, 
    }); 
}}); 

map.addLayer(osm); 
map.addLayer(geojsonLayer); 
geojsonLayer.addGeoJSON(jsonExample); 

Esto funciona perfectamente, sin embargo, si cambio el código para utilizar "Círculo" en lugar de CircleMaker todo el mapa no se puede cargar, y me da un error de javascript:

Error: Error: Invalid LatLng object: (56.229917, NaN) 

puedo solucionar este problema mediante pre-filtración de la GeoJSON para eliminar esos puntos que carecen tanto de latitud y longitud, pero estoy confundido: Círculo y CircleMaker tanto especifican que toman un LatLng a objetos como la especificación de el punto central, no entiendo cómo un determinado objeto LatLng puede ser válido como punto central para un CircleMarker, pero no es válido si se utiliza como el punto central de un círculo.

¿Estoy pasando por alto algo obvio, o es solo una debilidad y/o error en Leaflet que tendré que solucionar?

Respuesta

4

Lo solucioné cambiando el método _getLngRadius() de leaflet.js en L.circle. En la versión 0.4.4, está alrededor de la línea 4913.

Este método difiere del que está en circleMarker, ya que calcula dinámicamente el radio del círculo. Si cambia la línea que tiene

this._mRadius/hLength

a

this._mRadius.radius/hLength

debería estar bien.

+0

¡Impresionante! Gracias. Esto parece que vale la pena en general, así que creo que ese parche también debería enviarse a los desarrolladores de Leaflet. – Agrajag

+0

¿Qué pasó con esto, de todos modos? –

+0

¿Alguna actualización sobre esto? – kuanb

1

Se pueden añadir si (latlng & & latlng.lat & & latlng.lng) en el comienzo de su función (latlng)

que ignorar los datos básicos defectuosos.

+0

Sí, lo sé, como escribí: soy consciente de que puedo filtrar qué puntos incluir para evitar el problema. No estaba tratando de evitarlo, sino de entenderlo. Nada en los documentos indica que debería haber alguna diferencia entre "Circle" y "CircleMarker" a este respecto. – Agrajag

4

Ya no hay ningún problema con el código. Aunque este mismo problema puede surgir fácilmente debido a los diferentes constructores:

L.CircleMarker(<LatLng> latlng, <Path options> options?) 

y

L.Circle(<LatLng> latlng, <Number> radius, <Path options> options?) 

Asegúrese de pasar el área para sus nuevos círculos.

Cuestiones relacionadas