David, That is what I am doing now.
With my suggestion there is no additional memory requirement over the existing model and only a small overhead on users of the existing user data. Paul David Zwiers wrote: > Paul, > > What's preventing you from placing a hashmap in each geometry as your user > object? -- thus your code could be of the form > > Object o = ((HashMap)g.getUserData()).get('X'); > ((HashMap)g.getUserData()).set('X',o); > > Although this isn't perfect, this avoids performance hits (memory/access > time) for apps which rely on quick access (aka. visual renderers). > > David > > -----Original Message----- > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Paul Austin > Sent: June 7, 2007 12:15 PM > To: JTS Topology Suite Development > Subject: Re: [jts-devel] Map for UserData > > Hi Michaël, > > As you might have guessed I have some interesting formats that don't fit > into the traditional flat model, so I'm having to come up with nice ways > to deal with these without automatically flattening them out too much. > Eventually we'll migrate this stuff to a database and then I can spend > some time to create a flatter model that works well. > > For the "attributes" on the geometry I agree that normally attribution > should go on a feature rather than a geometry, there are some cases > where having it on the geometry is useful for processing or display. The > assumption here is that if you want to convert to a flat model you will > either accept these attributes are thrown away or will have to define a > mapping. > > One of my cases is for Toponymy, I have a single feature that has > multiple text parts, each with their own orientation and styling. This > happens when you want to print a word on a curved line with control over > each letter but keep the items in the same feature. See below. By the > magic of UserData I can store the orientation, text height and text for > each point on a Point geometry and have the feature use a MultiPoint > geometry containing those points. I have this working with a custom > Style class. > > > W > o > r > d > > > The other case is where you want additional geometry types but don't > really need to create sub classes, e.g. AlignedPoint, OrientedLineString. > > Paul > > Michaël Michaud wrote: > >> Hi again Paul, >> >> The only use cases I can imagine are >> - having specific attributes on each part of a geometry collection >> - programming stuff (don't know, maybe caching geometric information >> to improve performance...) >> >> otherwise, why do you want to put attributes on geometry and not on >> features >> The main problem in doing that is compatibility with widely used >> standards as shapefile, wkb, wkt... >> >> Michaël >> >> Paul Austin a écrit : >> >> >>> The current JTS Geometries have a UserData property which developers can >>> store a custom attribute on each geometry. This is really useful if you >>> have a data set which has additional information such as orientation for >>> a point or a direction of travel for a line. >>> >>> The one problem is that you can only store one value so you have to use >>> a Map as the user data to store more than one value. What would be >>> useful is if the geometry used a Map for the user data thus allowing >>> more than one value and simplifying user code as you don't have to cast >>> the userdata to a map. >>> >>> The following code demonstrates my preferred implementation, note that >>> the existing user data can still be used as it's just an entry in the >>> map and my using an EMPTY_MAP there is no extra memory required over the >>> existing user data approach if there are no attributes defined. >>> >>> private static String USER_DATA_KEY = "jts.userData"; >>> >>> private Map attributes = Collections.EMPTY_MAP; >>> >>> public void setAttribute(String name, Object value) { >>> if (attributes == Collections.EMPTY_MAP) { >>> attributes = new HashMap(); >>> } >>> attributes.put(name, value); >>> } >>> >>> public Object getAttribute(String name) { >>> return attributes.get(name); >>> } >>> >>> public Map getAttributes() { >>> return Collections.unmodifyableMap(attributes); >>> } >>> >>> public void setAttribute(Map attributes) { >>> this.attributes.putAll(attributes); >>> } >>> >>> public Object getUserData() { >>> return getAttribute(USER_DATA_KEY); >>> } >>> >>> public void setUserData(Object data) { >>> setAttribute(USER_DATA_KEY, data); >>> } >>> >>> >>> Any comments? >>> >>> Paul >>> >>> _______________________________________________ >>> jts-devel mailing list >>> jts-devel@lists.jump-project.org >>> http://lists.refractions.net/mailman/listinfo/jts-devel >>> >>> >>> >>> >>> >> _______________________________________________ >> jts-devel mailing list >> jts-devel@lists.jump-project.org >> http://lists.refractions.net/mailman/listinfo/jts-devel >> > > > _______________________________________________ > jts-devel mailing list > jts-devel@lists.jump-project.org > http://lists.refractions.net/mailman/listinfo/jts-devel > > > _______________________________________________ > jts-devel mailing list > jts-devel@lists.jump-project.org > http://lists.refractions.net/mailman/listinfo/jts-devel > _______________________________________________ jts-devel mailing list jts-devel@lists.jump-project.org http://lists.refractions.net/mailman/listinfo/jts-devel