1 votos

Renderización de puntos y polígonos con Mapnik

He intentado renderizar algunos mapas en Mapnik y tengo un pequeño problema. Quiero renderizar un mapa que contiene dos capas: punto y polígono. He utilizado este script:

import mapnik
rule = mapnik.Rule()
rule.symbols.append(mapnik.PolygonSymbolizer(mapnik.Color("darkgreen")))
rule.symbols.append(mapnik.PointSymbolizer())
style = mapnik.Style()
style.rules.append(rule)
layer = mapnik.Layer("mapLayer")
layer.datasource = mapnik.Shapefile(file="polska.shp")
layer.styles.append("mapStyle")
map = mapnik.Map(640, 480)
map.background = mapnik.Color("white")
map.append_style("mapStyle", style)
map.layers.append(layer)
map.zoom_all()
mapnik.render_to_file(map, "map.png", "png")

Sólo hay un shapefile para renderizar, pero ese es mi problema. Cuando estoy añadiendo la 4ª línea rule.symbols.append(mapnik.PointSymbolizer()) Siempre obtengo polígonos renderizados con puntos adicionales (supongo que los centroides de cada objeto): enter image description here

¿Por qué hay puntos negros? ¿Hay alguna posibilidad de renderizar dos capas (polígonos y puntos) al mismo tiempo, sin estos centroides? ¿Qué estoy haciendo mal?

1voto

JohannesH Puntos 3817

Me doy cuenta de que esta es una pregunta muy antigua, pero tal vez alguien más se enfrenta a un problema similar y se está rascando la cabeza al respecto.

El problema parece ser que tu shapefile contiene 2 capas, pero sólo añades una capa de mapnik; mapnik no va a ser capaz de estilizar dos conjuntos de datos independientes si sólo tiene una capa.

A continuación, se introduce todo el shapefile como fuente de datos de la capa - creo que mapnik.Shapefile() asume que el shapefile sólo tiene una capa (¿así que tal vez sólo saca la primera capa?).

Si hay dos capas en su shapefile, y no puede acceder a ellas de forma independiente utilizando mapnik.Shapefile() , entonces cada una podría cargarse en una capa separada utilizando mapnik.Ogr() .

Supongamos que polska.shp tiene dos capas:

  • una capa de polígonos llamada " nombre de usuario " y
  • una capa de puntos llamada " ptlayername ".

A continuación, se muestran dos capas de mapnik a partir de los datos...

poly_lyr = mapnik.layer('polygons')
poly_lyr.datasource= mapnik.Ogr(file="polska.shp",layer="*polylayername*") 
pt_lyr = mapnik.layer('points')
pt_lyr.datasource= mapnik.Ogr(file="polska.shp",layer="*ptlayername*") 

A continuación, sigue con el peinado como de costumbre: cada capa se puede peinar por separado.

Si el shapefile no lo hace tienen dos capas, estás un poco deshuesado. Pero debería ser posible dividir los datos de los puntos (en QGIS, o usando mapnik.Ogr() con layer_by_sql (consultando los puntos por sus características espaciales).

0voto

Otaj Puntos 33

Debe crear un estilo separado para los puntos.

s = mapnik.Style() 
r = mapnik.Rule() 
point_sym = mapnik.PointSymbolizer()
point_sym.filename = './symbols/airport.png' 
r.symbols.append(point_sym) # add the PointSymbolizer to the rule object
s.rules.append(r) 
m.append_style('airport point', s)

Ahora en lugar de puntos negros los puntos serán la imagen que se encuentra en './symbols/airport.png'. Para mover los puntos tendría que añadir una capa diferente con una fuente de datos que contenga las geometrías de los puntos. Si quieres añadir puntos dinámicamente en tu script consulta mapnik.MemoryDatasource

Tengo que asumir que la razón por la que tus puntos están centrados es porque tu archivo de forma contiene tanto polígonos como puntos. Podrías añadir los puntos adecuados a tu archivo shape para que mapnik los renderice automáticamente. Si no he respondido a tu pregunta, por favor, publica tu archivo shape y podremos llegar al fondo de la cuestión.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X