Stefan Steiniger a écrit : >on 2: > >i think you both know transformations but just for completeness: >in: BC Albers x,y + (h) = height over geoid) >=> inverse-project x,y (+ h) to lat,lon + dh (dh = height over ellipsoid) >(note: don't know how we will handle geoids) >=> convert latlon+dh(NAD83) to geocentric x,y,z(NAD83) >=> transform from xyz(NAD83) to xyz(WGS84/ETRS89 in europe?) >=> convert xyz(WGS84) to latlon+dh (WGS84) >=> project latlon+dh(WGS84) to UTM(zone) x,y,h > > Good description Stefan, It shows that for such transformation (with two different datum), the central transformation is the one from datum1 - geocentric coordinates to datum2 - geocentric coordinates. Handling geoids is not easy. It appears that even for transformations from system1 + altitude to system2 + altitude (same altitude system but 2 geographic datums), one may need to convert altitudes to ellipsoidal height (based on the geoid description) as the height variation may change the result for lat and lon..(only needed for a precision of mm or cm).
Michael >i think it was that way? Was it? > >notes: >a) as first or final transformation may be added a local adjustment >(e.g. this is for instance possible in Finland. They introduced such >adjustment by a helmert transformation to let coordinate differences not >to be too large) >b) there may be speific formulas (as for the Swiss Projection) that work >differently than the standard formulas to convert between x,y and lat/lon > >stefan > >Paul Austin schrieb: > > >>Landon, >> >>1. For your point 3, I think defining a simple interface is essential >>for what we are trying to do. This will allow us to do things such as >>chaining of operations together which I'll cover in response to your >>point 4. The key is to make the interfaces as simple as possible so as >>to make it easy for people to use and re-use them. I would also not use >>abstract base classes, instead I would have concrete classes that can be >>parameterized for different implementations of that Projection (e.g. >>there would be a say UTM class that would be parameterized on the UTM >>zone rather than a UTM11, UTM10 classes). I would at a higher level have >>some kind of factory that given a SRID would return the appropriate >>implementation for end users to use. >> >>2. For your point 4 regarding the intermediate format, I do agree on >>this in principal but not necessarily using the same approach. My vision >>would be to support this via Chained operations. For example to go from >>BC Albers (srid 3005, NAD83) to UTM Zone 10(srid 26910. NAD83) I would >>have a chained operation consisting of BcAlbersToGeographics and >>GeographicsToUTM(10). Now if you wanted to change between Ellipsoid then >>you may have in the middle say a WGS84ToNAD83 operation in the middle. >> >>Paul >> >> >>Sunburned Surveyor wrote: >> >> >>>I want to add some comments to this conversation. I hope that I don't >>>really confuse things. I think Paul is heading in a great direction >>>with his interface, and I believe Michael is adding some important >>>things to the conversation. >>> >>>First, I agree with Paul on avoiding the JTS Coordinate object at a >>>low level. We really need to work on primitive values like doubles, >>>and not JTS Coordinate objects. This will allow for wider adoption of >>>our library. Work with doubles and provide wrappers or utility methods >>>for JTS. I'd prefer to see all of our low-level coordinate >>>transformation code packaged in a single JAR, without a dependency on >>>JTS. We can this have a separate JAR that depends on JTS. >>> >>>Secondly, I agree with Michael on using z values. I think we should >>>carefully consider methods that accept the Z value as a ordinate. As >>>Michael pointed out this is an important parameter in some >>>transformations. >>> >>>Thirdly, I think it may be a mistake to create a separate >>>CoordinateOperation interface. I believe this will lead us down the >>>GeoTools path. A path with many interfaces and classes. What we want >>>to do is pretty simple, provide ordinate values in one system and get >>>ordinate values back in some other system. Let's do that with just one >>>interface. This will make things incredibly simple for users of the >>>library, and will place the burden of the details on the interface >>>implementers, where I think it should be. We can always provide all >>>sorts of helper classes and abstract classes that can be used by >>>implementers. (I was thinking about this last night. It really work >>>great. For example: I'm working on a Gnomic map projection between the >>>equator and the north pole. Once this projection is finished I can >>>create an abstract class. Once the abstract class is complete all >>>someone else needs to do is change the parameters. The algorithm's >>>remain the same.) >>> >>>Finally, I want to address the issue raised in this question of Michael's: >>> >>>"I'm not sure how getX, getY avoid the confusion. >>>IMHO, coordinate order is relative to the coordinate system definition >>>(source crs and target crs may have different order), and should not be >>>fixed in the coordinate operation interface (how do you use setX, setY, >>>getX, getY to convert, say a geo lat/lon coordinate system to a geo >>>lon/lat coordinate system ?)" >>> >>>This is why I think it is really important to define a generic >>>"in-between" spatial reference system. This really simplifies things. >>>Let's use another analogy that may help: >>> >>>We want to write a simple interface that transforms monetary amounts >>>in different currencies. Would you try to create a group of classes >>>and interfaces that transform directly from any one currency to any >>>other currency? Absolutely not! A much simpler system would result if >>>you chose an "in-between" currency. You would want to choose a common >>>currency like US Dollars or the Euro. Then your interface would look >>>something like this: >>> >>>public interface transformCurrency >>>{ >>> >>>public double getAmountInUSDollars(double argAmountInLocalCurrency); >>> >>>public doube getAmountInLocalCurrency(double argAmountInUSDollars); >>> >>>} >>> >>>I think this "in-between" coordinate system should be a spherical >>>coordinate system that doesn't involve projections and uses an >>>ellipsoid that fits the Earth's overall surface well. To me this >>>spatial reference system would be WGS-84, but there might be others >>>that work. >>> >>>I have attached the interface I am currently using. I think we can >>>merge it with Paul's interface to come up with something simple that >>>meets all of our needs. >>> >>>The Sunburned Surveyor >>> >>> >>> >>> >>> >>>On 9/8/07, Stefan Steiniger <[EMAIL PROTECTED]> wrote: >>> >>> >>> >>>>I got used to use North and East (instead x,y which is turned in geodesy >>>> and math and latlon which is purely geographic) >>>> >>>>so what about getNorthCoord and getEastCoord? >>>>Usually one speakes also from False Easting (and Northing) for the bias >>>>of the origin point. >>>> >>>>i will read the rest of your emails later >>>> >>>>stefan >>>> >>>>Michaël Michaud schrieb: >>>> >>>> >>>> >>>>>Hi Paul >>>>> >>>>> >>>>> >>>>> >>>>>>1. The reason I chose not to use an array of doubles as a parameter as >>>>>>an argument or return type is that what order do you pass in the >>>>>>parameters is it lon, lat or lat, lon for geographics. >>>>>> >>>>>> >>>>>> >>>>>> >>>>>I'm not sure how getX, getY avoid the confusion. >>>>>IMHO, coordinate order is relative to the coordinate system definition >>>>>(source crs and target crs may have different order), and should not be >>>>>fixed in the coordinate operation interface (how do you use setX, setY, >>>>>getX, getY to convert, say a geo lat/lon coordinate system to a geo >>>>>lon/lat coordinate system ?) >>>>> >>>>> >>>>> >>>>> >>>>>>I did consider >>>>>>having getLat/getLon but that would be even more confusing. >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>Agree. These methods are ok for classes implementing coordinate >>>>>operation and expressing transformations from any coord ref sys to a >>>>>geographic coodinate reference system, but not in the general case. >>>>> >>>>> >>>>> >>>>> >>>>>>In respect to using Coordinate this is a low level API not intended to >>>>>>be use by mere mortals so I went with memory efficiency over ease of >>>>>>use. I guess I just negated my argument to using double[] as that fits >>>>>>the mold of a low level API. >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>Sorry, I'm not sure I understood this point. Do you mean that for a low >>>>>level API, you should have considered double[] as well as getX, getY ? >>>>> >>>>> >>>>> >>>>> >>>>>>2. I'm flexible with the name CoordinateOperation could be fine. >>>>>> >>>>>>3. 3D coordinates are supported, just at a higher level than the actual >>>>>>projection, as the z value is not projected the projection does not need >>>>>>to know about it. The library to do JTS conversions would need to make >>>>>>sure the z and any other ordinate values are copied to the resulting >>>>>>geometry. >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>That's right for projection (mathematical transformation from geographic >>>>>coordinates to projected coordinates), but not for general coordinate >>>>>transformations like lat/lon/height to easting/northing/altitude where >>>>>altitude is determined using lat, lon and a geoid model. Coordinate >>>>>transformations include also transformation from geographic >>>>>(lat/lon/height) to 3D geocentric system and geocentric to geographic. >>>>> >>>>> >>>>> >>>>> >>>>>>Landon brought up a good point about forward v.s. reverse >>>>>>transformations, I have it setup so that I support a forward and reverse >>>>>>methods, their could be an argument that there would only be one >>>>>>double[] transform(double[]) operation and have separate Classes for the >>>>>>forward v.s. reverse transformation. >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>Yes, I'm not sure what is the better way for inverse transformation. >>>>>Inverse transformation may use : >>>>>- the same parameters as the direct transformation but with opposite signs >>>>>- the same algorithm but with different parameters >>>>>- a different algorithm (ex. geographic 2 projected, projected 2 >>>>>geographic) >>>>> >>>>>May be direct and inverse operations must be implemented in separate >>>>>classes in the genarl case as you suggest, and eventually, some special >>>>>implementation of coordinate operation may have a "invertible" property >>>>>to be able to do the inverse transformation without creating a new >>>>>coordinate operation instance (for ex, prime meridian change). >>>>> >>>>>Michael >>>>> >>>>> >>>>> >>>>> >>>>>>Paul >>>>>> >>>>>>Michaël Michaud wrote: >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>>>Hi Paul, >>>>>>> >>>>>>>I have some questions and remarks about your proposition : >>>>>>> >>>>>>>1 - why do you use a setX setY method in the interface instead of >>>>>>>something like >>>>>>>Coordinate transform(Coordinate) >>>>>>>Coordinate inverseTransform(Coordinate) >>>>>>>or >>>>>>>double[] transform(double[]) >>>>>>>double[] inverseTransform(double[]) >>>>>>>I you don't want to be Coordinate implementation dependant >>>>>>>I also think that having separate setX, forward() and getX method may >>>>>>>not be very safe from a programmer point of view, because if you do >>>>>>>those operations in different places in the code, it may be hard to know >>>>>>>if the transformation has been done when comes the time to use the >>>>>>>getX/getY method. >>>>>>>I'm curious to know why you separated set, transform and get methods >>>>>>> >>>>>>>2 - second point is about semantic >>>>>>>Projection is not appropriate as it is reserved to mathematical >>>>>>>transformation from the geographic coordinates to a plane. >>>>>>>In GeoAPI (geotools, epsg...), things are generally named as follows : >>>>>>> >>>>>>>CoordinateOperation : any operation on coordinates (it should be the >>>>>>>name of your interface) >>>>>>> >>>>>>> * Coordinate transformation (involving a Datum cahnge - >>>>>>> transformation is based on estimated parameters) : many useful >>>>>>> transformations involve a datum change (transformations from old >>>>>>> local datums to new international datum) >>>>>>> * Coordinate conversion (not involving any Datum change - conversion >>>>>>> is a mathematic transformation) >>>>>>> o Projection : most conversion operations are projections >>>>>>> >>>>>>>3 - JTS and OpenJUMP can use 3D coordinates, and I think that the >>>>>>>coordinate operation package must be able to deal with those 3D >>>>>>>coordinates (transform altitudes to ellpsoidal heights for example). >>>>>>> >>>>>>>my 2 cents >>>>>>> >>>>>>>Michael >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>------------------------------------------------------------------------- >>>>>>This SF.net email is sponsored by: Microsoft >>>>>>Defy all challenges. Microsoft(R) Visual Studio 2005. >>>>>>http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ >>>>>>_______________________________________________ >>>>>>Jump-pilot-devel mailing list >>>>>>Jump-pilot-devel@lists.sourceforge.net >>>>>>https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>------------------------------------------------------------------------- >>>>>This SF.net email is sponsored by: Microsoft >>>>>Defy all challenges. Microsoft(R) Visual Studio 2005. >>>>>http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ >>>>>_______________________________________________ >>>>>Jump-pilot-devel mailing list >>>>>Jump-pilot-devel@lists.sourceforge.net >>>>>https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel >>>>> >>>>> >>>>> >>>>> >>>>> >>>>------------------------------------------------------------------------- >>>>This SF.net email is sponsored by: Microsoft >>>>Defy all challenges. Microsoft(R) Visual Studio 2005. >>>>http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ >>>>_______________________________________________ >>>>Jump-pilot-devel mailing list >>>>Jump-pilot-devel@lists.sourceforge.net >>>>https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel >>>> >>>> >>>>------------------------------------------------------------------------ >>>> >>>>------------------------------------------------------------------------- >>>>This SF.net email is sponsored by: Microsoft >>>>Defy all challenges. Microsoft(R) Visual Studio 2005. >>>>http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ >>>>------------------------------------------------------------------------ >>>> >>>>_______________________________________________ >>>>Jump-pilot-devel mailing list >>>>Jump-pilot-devel@lists.sourceforge.net >>>>https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel >>>> >>>> >> >>------------------------------------------------------------------------- >>This SF.net email is sponsored by: Microsoft >>Defy all challenges. Microsoft(R) Visual Studio 2005. >>http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ >>_______________________________________________ >>Jump-pilot-devel mailing list >>Jump-pilot-devel@lists.sourceforge.net >>https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel >> >> >> >> > >------------------------------------------------------------------------- >This SF.net email is sponsored by: Microsoft >Defy all challenges. Microsoft(R) Visual Studio 2005. >http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ >_______________________________________________ >Jump-pilot-devel mailing list >Jump-pilot-devel@lists.sourceforge.net >https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel > > > > ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2005. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ Jump-pilot-devel mailing list Jump-pilot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel