Adding features to new layerObj (Re: [Mapserver-users] mapscript - strange behavior)

Sean Gillies sgillies at frii.com
Wed Jan 14 12:32:21 EST 2004


Cristoph,

I haven't been using inline features of a layer like you are doing,
so I don't know yet if there are any problems with it.  I have changed
the subject line of the message to see if we can attract other users
with experience.

The method I have used is to define a layer like your acetate layer,
and then used the draw method of point or shape objects.  Here's an
example of how I do this using an acetate layer named 'copyright':

     # Draw copyright label
     layerobj = mapobj.getLayerByName('copyright')
     layerobj.status = MS_ON
     layerobj.getClass(0).label.position = MS_UR
     p = pointObj()
     p.x, p.y = (1, mapobj.height-1)
     p.draw(mapobj, layerobj, imgobj, 0, copyright_text)

I still think that you could predefine acetate layers in your map file
for each of point, line, and polygons.  In my opinion, your application  
may
benefit from having as many as possible of the map element styles  
defined
in the map file.  Try to seperate the logic (your Python code) from
the presentation (the classes and styles defined in the map file) as
much as possible.

OK, enough advice from me :)  Let's see if anyone with experience using
a layerObj's addFeature will join in and help you.

cheers,
Sean

On Jan 14, 2004, at 9:50 AM, Christoph Spoerri wrote:

> One thing I wanted to add: the reason I need to create the 'acetate'  
> layer on
> the fly is that I'm mapping different layer types (point, line,  
> polygon) and
> therefore the classes change. I'm using a pin as point marker, and red  
> lines
> for lines/polygons.
>
> BTW, when mapping lines, the first feature (line) does not display  
> with the
> correct class either (at least it shows though). So does anybody know  
> what
> the problem actually is with not showing the first feature correctly  
> or not
> at all?
>
> Thanks, Christoph
>
> On Tuesday 13 January 2004 02:28 pm, Sean Gillies wrote:
>> On Jan 13, 2004, at 10:38 AM, Christoph Spoerri wrote:
>>> Hi there,
>>>
>>> I'm writing an application that let's user add point features to the
>>> map by
>>> clicking on any location of the map. For this purpose I'm using the
>>> attached
>>> code (Note: each click on the map results in a request to the server
>>> for a
>>> new image).
>>>
>>> The problem is that the first point (to be mapped) is not displayed  
>>> on
>>> the
>>> map. Yet when the user clicks on the map for the second time (to add  
>>> a
>>> new
>>> point) both points show up. When checking the .map files everything
>>> looks
>>> fine: acetate layer is there, class definition looks fine and point
>>> coordinates are there.
>>>
>>> In case a predefine the acetate layer (w/ class def) in the base .map
>>> file,
>>> the first point shows up just fine. Note: this solution is not an
>>> option
>>> thought :(
>>>
>>> any ideas? Thanks in advance,
>>> Christoph
>>>
>>>
>>> *********** code ********************
>>>
>>> 	x = atof(param['x'])
>>> 	y = atof(param['y'])
>>> 	# create point object
>>>  	ptCoord = getMapPoint([x,y],self._map)
>>>  	ptObj = pointObj()
>>>  	ptObj.x=ptCoord[0]
>>>  	ptObj.y=ptCoord[1]
>>> 	lnObj = lineObj()
>>> 	lnObj.add(ptObj)
>>>
>>> 	# create new point layer with class and add shape
>>> 	mapImg=self._map.prepareImage()
>>> 		lyrAcetate = self._map.getLayerByName('acetate')
>>> 	if (not isinstance(lyrAcetate,layerObj)):
>>> 		color = colorObj()
>>> 		color.red = 255
>>> 		color.green = 255
>>> 		color.blue = 255
>>> 		lyrAcetate = layerObj(self._map)
>>> 		lyrAcetate.name = "acetate"
>>> 		lyrAcetate.type = MS_LAYER_POINT
>>> 		classTemp = classObj(lyrAcetate)
>>> 		styl = styleObj()
>>> 		styl.symbolname = "pin"
>>> 		styl.size = 1
>>> 		styl.maxsize = 1
>>> 		styl.minsize = 1
>>> 		styl.color = color
>>> 		styl.backgroundcolor = color
>>> 		styl.outlinecolor = color
>>> 		classTemp.numstyles=1
>>> 		classTemp.styles = styl
>>>
>>> 	# create shape object and add point to shape object
>>> 	shpObj = shapeObj(MS_SHAPE_POINT)
>>> 	shpObj.add(lnObj)
>>> 	shpObj.setBounds();
>>> 	shpObj.index = 1
>>>
>>> 	lyrAcetate.status = MS_ON
>>> 	lyrAcetate.addFeature(shpObj)
>>> 	lyrAcetate.draw(self._map,mapImg)
>>>
>>> 	imagename =   \
>>> self._map.name+mapSession.id()+"_"+str(int(time()))+"."+mapImg.format 
>>> .e
>>> xtension
>>> 	mapImg.save(mapImg.imagepath+imagename)
>>
>> Christoph,
>>
>> Do I remember correctly that you are using mod_python?  Is this a  
>> reason
>> why you say that you cannot predefine your acetate layer?  I hope you
>> are
>> not trying to persist a mapObj in the same way that mod_python users  
>> use
>> persistent database connections.  MapServer is not fully thread-safe
>> (yet)
>> and so you will certainly encounter some trouble with a persistent
>> mapObj.
>>
>> I don't see _anything_ in your code that would prevent the acetate  
>> layer
>> from being predefined in your map file.  If it is only a matter of
>> colors and styles, I strongly recommend that you predefine the acetate
>> layer and then modify its classes and styles during the script
>> execution.
>>
>> cheers,
>> Sean
>>
>> --
>> Sean Gillies
>> sgillies at frii dot com
>> http://users.frii.com/sgillies
>




More information about the mapserver-users mailing list