Notez que la bibliothèque "Core" avec l'API et le code général de l'adaptateur est publié avec la licence MIT.
Cependant, les bibliothèques d'implémentations d'adaptateur sont sous licence de la même manière que les bibliothèques adaptées qui sont spécifiées dans des fichiers distincts "Licence_notice" (dans les répertoires de base de l'adaptateur) pour chacune de ces implémentations.
Ce projet F # / C # /. Net est destiné à transformer les coordonnées entre différents systèmes de référence de coordonnées (CRS).
Les adaptateurs utilisent des bibliothèques .NET en troisième partie comme Adaptee.
Le code a été implémenté avec F # mais les tests (et les constantes générées dans le sous-projet "programmerare.crstransformations.constants") sont implémentées avec C #.
Ces versions ci-dessous s'appliquent à la v3.0.0 de la libération NuGet, par exemple programmerare.crstransformations.core:
La version cible .NET est .NET Standard 2.0 (par exemple .NET Framework 4.6.1 ou version ultérieure), mais la version 10.36 de la bibliothèque avec des constantes (programmerare.crstransformations.constants) peut être utilisée avec .NET Framework 2.0 ou ultérieure.
La version F # est 6.0.1 (c'est-à-dire pour la référence du package à "fsharp.core")
Les cinq bibliothèques suivantes de ce projet de code ont été publiées / distribuées à NuGet:
Les trois bibliothèques ci-dessus qui incluent " l'adaptateur " dans le nom sont les implémentations adaptateur de la bibliothèque " Core " ci-dessus.
Ces trois adaptateurs utilisent les trois bibliothèques adaptaires pour les transformations de coordonnées.
La bibliothèque ci-dessus `` MostyLittleGeodesy '' n'est utile que pour la transformation entre WGS84 (qui est un CRS global très courant) et les systèmes de référence de coordonnées suédois (CRS) Sweref99 (13 versions par exemple "Sweref99 TM") et RT90 (6 versions EG "RT90 2.5 GON V").
La bibliothèque ci-dessus "programmerare.cstransformations. Constantes " est en fait totalement indépendante des autres.
Cela ne dépend de rien et rien n'en dépend.
C'est une bibliothèque C # (c'est-à-dire ne pas dépendre de F # comme les autres) avec une seule classe avec beaucoup de constantes C #.
(Les quatre autres bibliothèques Core / Adapter sont implémentées avec F #)
La classe constante C # a été générée à partir de l'ensemble de données EPSG version 10.036, ce qui est la raison de son numéro de version.
La bibliothèque "Core" n'est pas nécessaire pour inclure car il existe une dépendance implicite / transitive de toutes les bibliothèques "adaptateur" au "noyau".
La bibliothèque "Constantes" n'est pas nécessaire, mais peut être intéressante si vous souhaitez utiliser des constantes pour les numéros EPSG plutôt que de les coder en dur avec des littéraux entiers ou de définir vos propres constantes entières.
<!-- Use one, two or three of the below three Adapters -->
< PackageReference Include = " Programmerare.CrsTransformations.Adapter.DotSpatial " Version = " 3.0.0 " />
< PackageReference Include = " Programmerare.CrsTransformations.Adapter.ProjNet " Version = " 3.0.0 " />
< PackageReference Include = " Programmerare.CrsTransformations.Adapter.MightyLittleGeodesy " Version = " 3.0.0 " />
<!-- The Core should not be necessary to include explicitly as below (since it should be implicitly included when using one of the others above ) -->
< PackageReference Include = " Programmerare.CrsTransformations.Core " Version = " 3.0.0 " />
<!-- Optional (and totally independent) library with only one class with lots of integer constants -->
< PackageReference Include = " Programmerare.CrsTransformations.Constants " Version = " 10.36.0 " />Les bibliothèques ci-dessus se trouvent sur ma page NuGet.
Le code (IE Core and Adapter Libraries) a été implémenté avec F # mais le code de test est écrit avec C # dans "programmerare.crStransformations.test".
Il existe également quelques exemples de projets de code pour les trois langues .NET C #, F # et VB.NET.
Ces trois projets utilisent le même type de code (c'est-à-dire faire la même chose) mais avec une syntaxe différente pour les différentes langues.
En plus du code C # mentionné ci-dessus (c'est-à-dire le projet de test C # et le projet C # NuGet Exemple), cette page GitHub ci-dessous illustre également comment utiliser la bibliothèque avec C # Code.
Les méthodes de transformation des coordonnées sont définies dans l'interface ICRStRansformationAdapter .
Il y a actuellement sept classes implémentant l'interface. Trois «feuilles» et quatre «composites».
Chaque adaptateur de feuilles utilise une bibliothèque adaptée pour l'implémentation.
Les quatre «composites» utilisent les Leafs comme ceci:
Deux autres types de base sont CRSIDENTIFICATEUR et CRSCOORDINate. Les deux sont illustrés dans les sections ci-dessous.
using System . Collections . Generic ; // IList
using Programmerare . CrsTransformations ; // ICrsTransformationAdapter
using Programmerare . CrsTransformations . CompositeTransformations ; // CrsTransformationAdapterCompositeFactory
using Programmerare . CrsTransformations . Adapter . DotSpatial ;
using Programmerare . CrsTransformations . Adapter . ProjNet ;
using Programmerare . CrsTransformations . Adapter . MightyLittleGeodesy ;
// ...
// The interface with seven implementations as illustrated below
ICrsTransformationAdapter crsTransformationAdapter ;
// The interface is defined in the library "Programmerare.CrsTransformations.Core" with this full name:
// Programmerare.CrsTransformations.ICrsTransformationAdapter
// The three 'Leaf' implementations:
// Library "Programmerare.CrsTransformations.Adapter.DotSpatial", class:
// Programmerare.CrsTransformations.Adapter.DotSpatial.CrsTransformationAdapterDotSpatial
crsTransformationAdapter = new CrsTransformationAdapterDotSpatial ( ) ;
// Library "Programmerare.CrsTransformations.Adapter.ProjNet", class:
// Programmerare.CrsTransformations.Adapter.ProjNet.CrsTransformationAdapterProjNet
crsTransformationAdapter = new CrsTransformationAdapterProjNet ( ) ;
// Library "Programmerare.CrsTransformations.Adapter.MightyLittleGeodesy", class:
// Programmerare.CrsTransformations.Adapter.MightyLittleGeodesy.CrsTransformationAdapterMightyLittleGeodesy
crsTransformationAdapter = new CrsTransformationAdapterMightyLittleGeodesy ( ) ;
// - - - - - - - - - - - -
// The four 'Composite' implementations below are all located in the library
// "Programmerare.CrsTransformations.Core" and the factory class is:
// Programmerare.CrsTransformations.CompositeTransformations.CrsTransformationAdapterCompositeFactory
var crsTransformationAdapterCompositeFactory = CrsTransformationAdapterCompositeFactory . Create ( ) ;
crsTransformationAdapter = crsTransformationAdapterCompositeFactory . CreateCrsTransformationMedian ( ) ;
crsTransformationAdapter = crsTransformationAdapterCompositeFactory . CreateCrsTransformationAverage ( ) ;
crsTransformationAdapter = crsTransformationAdapterCompositeFactory . CreateCrsTransformationFirstSuccess ( ) ;
// All of the above three factory methods without any parameter will try to use as many of
// the three (currently) 'leaf' implementations as are available in runtime
// (e.g. are included as NuGet dependencies).
// If you want to specify explicitly which ones to be used, you can provide
// a parameter 'IList<ICrsTransformationAdapter>' to the Create method like this:
crsTransformationAdapterCompositeFactory = CrsTransformationAdapterCompositeFactory . Create (
new List < ICrsTransformationAdapter > {
new CrsTransformationAdapterDotSpatial ( ) ,
new CrsTransformationAdapterProjNet ( ) ,
new CrsTransformationAdapterMightyLittleGeodesy ( ) ,
}
) ;
// The fourth 'Composite' below does not use any implicit implementations
// but if you want to use a result created as a weighted average then the weights need
// to be specified explicitly per leaf implementation as in the example below.
var weightFactory = CrsTransformationAdapterWeightFactory . Create ( ) ;
crsTransformationAdapter = crsTransformationAdapterCompositeFactory . CreateCrsTransformationWeightedAverage (
new List < CrsTransformationAdapterWeight > {
weightFactory . CreateFromInstance ( new CrsTransformationAdapterDotSpatial ( ) , 1.0 ) ,
weightFactory . CreateFromInstance ( new CrsTransformationAdapterProjNet ( ) , 1.0 ) ,
weightFactory . CreateFromInstance ( new CrsTransformationAdapterMightyLittleGeodesy ( ) , 2.0 ) ,
}
) ;
// The weight values above illustrates a situation where you (for some reason) want to consider
// the transformation results from 'MightyLittleGeodesy' as being 'two times better' than the others.Toutes les méthodes de transformation (définies dans l'interface ci-dessus ICRStRansformationAdapter ) ont besoin de deux paramètres, d'une coordonnée d'entrée et d'un paramètre spécifiant le système cible, c'est-à-dire au système de référence de coordonnées, la coordonnée d'entrée sera transformée.
Le système cible peut être spécifié avec trois types de données (c'est-à-dire avec des méthodes surchargées), soit un entier ou une chaîne, soit un «CRSIDENTIFICATEUR».
Si un entier ou une chaîne est utilisé, alors un «CRSidentifier» sera créé, pour l'envoyer sous forme de paramètre aux implémentations de l'adaptateur.
Par conséquent, si vous avez l'intention de faire de nombreuses transformations de ou vers un système de référence de coordonnées, vous pouvez choisir de créer vous-même un Instace de CRSIdentifier, mais pour plus de commodité, vous voudrez peut-être utiliser les méthodes surchargées avec entier comme paramètre (ou peut-être la chaîne si vous avez déjà un access à certains "EPSG:" - String, voir l'exemple ci-dessous).
Une coordonnée (type CRSCOORDINate) comprend des informations sur le système de référence de coordonnées, c'est-à-dire un «CRSIDENTIFIER», mais il existe également des méthodes d'usine (création d'instances de coordonnées) qui sont surchargées de paramètres entiers ou de chaîne.
Il existe de nombreuses méthodes d'usine avec des noms différents et un ordre différent pour les deux valeurs de position (x / y) comme illustrée dans l'exemple ci-dessous.
Selon le sémantique souhaité dans votre contexte, vous voudrez peut-être utiliser les différentes méthodes (ou les accessoires nommés de manière similaire dans CRSCOORDINate ) comme ceci:
using Programmerare . CrsTransformations . Identifier ; // CrsIdentifier
using Programmerare . CrsTransformations . Coordinate ; // CrsCoordinate
using static Programmerare . CrsTransformations . Coordinate . CrsCoordinateFactory ;
// The above row with "using static" enables many factory methods:
// LatLon , LonLat , YX , XY , ... and so on (see the example code below)
// ...
int epsgNumber = 4326 ;
string crsCode = "EPSG:" + epsgNumber ;
CrsIdentifier crsIdentifier ; // namespace Programmerare.CrsTransformations.Identifier
crsIdentifier = CrsIdentifierFactory . CreateFromEpsgNumber ( epsgNumber ) ;
// Alternative:
crsIdentifier = CrsIdentifierFactory . CreateFromCrsCode ( crsCode ) ;
double latitude = 59.330231 ;
double longitude = 18.059196 ;
CrsCoordinate crsCoordinate ; // namespace Programmerare.CrsTransformations.Coordinate
// All the below methods are alternatives for creating the same coordinate
// with the above latitude/longitude and coordinate reference system.
// No class or object is used for the methods below because of the following static import:
// using static Programmerare.CrsTransformations.Coordinate.CrsCoordinateFactory;
crsCoordinate = LatLon ( latitude , longitude , epsgNumber ) ;
crsCoordinate = LatLon ( latitude , longitude , crsCode ) ;
crsCoordinate = LatLon ( latitude , longitude , crsIdentifier ) ;
crsCoordinate = LonLat ( longitude , latitude , epsgNumber ) ;
crsCoordinate = LonLat ( longitude , latitude , crsCode ) ;
crsCoordinate = LonLat ( longitude , latitude , crsIdentifier ) ;
crsCoordinate = YX ( latitude , longitude , epsgNumber ) ;
crsCoordinate = YX ( latitude , longitude , crsCode ) ;
crsCoordinate = YX ( latitude , longitude , crsIdentifier ) ;
crsCoordinate = XY ( longitude , latitude , epsgNumber ) ;
crsCoordinate = XY ( longitude , latitude , crsCode ) ;
crsCoordinate = XY ( longitude , latitude , crsIdentifier ) ;
crsCoordinate = NorthingEasting ( latitude , longitude , epsgNumber ) ;
crsCoordinate = NorthingEasting ( latitude , longitude , crsCode ) ;
crsCoordinate = NorthingEasting ( latitude , longitude , crsIdentifier ) ;
crsCoordinate = EastingNorthing ( longitude , latitude , epsgNumber ) ;
crsCoordinate = EastingNorthing ( longitude , latitude , crsCode ) ;
crsCoordinate = EastingNorthing ( longitude , latitude , crsIdentifier ) ;
crsCoordinate = CreateFromYNorthingLatitudeAndXEastingLongitude ( latitude , longitude , epsgNumber ) ;
crsCoordinate = CreateFromYNorthingLatitudeAndXEastingLongitude ( latitude , longitude , crsCode ) ;
crsCoordinate = CreateFromYNorthingLatitudeAndXEastingLongitude ( latitude , longitude , crsIdentifier ) ;
crsCoordinate = CreateFromXEastingLongitudeAndYNorthingLatitude ( longitude , latitude , epsgNumber ) ;
crsCoordinate = CreateFromXEastingLongitudeAndYNorthingLatitude ( longitude , latitude , crsCode ) ;
crsCoordinate = CreateFromXEastingLongitudeAndYNorthingLatitude ( longitude , latitude , crsIdentifier ) ;
CrsIdentifier targetCrs = CrsIdentifierFactory . CreateFromEpsgNumber ( 3006 ) ;
ICrsTransformationAdapter crsTransformationAdapter = CrsTransformationAdapterCompositeFactory . Create ( ) . CreateCrsTransformationAverage ( ) ;
CrsTransformationResult crsTransformationResult = crsTransformationAdapter . Transform ( crsCoordinate , targetCrs ) ;
// see more example code further down in this webpage Vous trouverez ci-dessous un petit exemple C # fonctionnant avec la version 1.0.0 actuelle.
L'exemple de code transforme une coordonnée d'un CRS mondial WGS84 (code EPSG 4326) latitude / longitude en Swedish CRS Sweref99TM (Code EPSG 3006).
using Programmerare . CrsTransformations ;
using Programmerare . CrsTransformations . Coordinate ;
using Programmerare . CrsTransformations . CompositeTransformations ;
using System ; // Console
class SmallCSharpeExample {
static void Main ( string [ ] args ) {
int epsgWgs84 = 4326 ;
int epsgSweRef = 3006 ;
// alternative to the above two hardcodings: use the library "Programmerare.CrsTransformations.Constants"
// and constants EpsgNumber.WORLD__WGS_84__4326 and EpsgNumber.SWEDEN__SWEREF99_TM__3006
// from the class Programmerare.CrsConstants.ConstantsByAreaNameNumber.v9_5_4.EpsgNumber
CrsCoordinate centralStockholmWgs84 = CrsCoordinateFactory . LatLon ( 59.330231 , 18.059196 , epsgWgs84 ) ;
ICrsTransformationAdapter crsTransformationAdapter = CrsTransformationAdapterCompositeFactory . Create ( ) . CreateCrsTransformationMedian ( ) ;
// If the NuGet configuration includes all (currently three) adapter implementations, then the
// above created 'Composite' implementation will below use all three 'leaf' implementations
// and return a coordinate with a median longitude and a median latitude
CrsTransformationResult centralStockholmResultSweRef = crsTransformationAdapter . Transform ( centralStockholmWgs84 , epsgSweRef ) ;
if ( centralStockholmResultSweRef . IsSuccess ) {
Console . WriteLine ( centralStockholmResultSweRef . OutputCoordinate ) ;
// Console output from the above code row:
// CrsCoordinate(xEastingLongitude=674032.357177155, yNorthingLatitude=6580821.99121561, crsIdentifier=CrsIdentifier(crsCode='EPSG:3006', isEpsgCode=True, epsgNumber=3006))
}
}
} using Programmerare . CrsConstants . ConstantsByAreaNameNumber . v10_036 ;
using Programmerare . CrsTransformations ;
using Programmerare . CrsTransformations . CompositeTransformations ;
using Programmerare . CrsTransformations . Coordinate ;
using System ;
using System . Collections . Generic ;
.. .
// Some terminology regarding the names used in the below code example:
// "CRS" = Coordinate Reference System
// "WGS84" is the most frequently used coordinate system (e.g. the coordinates usually used in a GPS)
// "SWEREF99TM" is the official coordinate system used by authorities in Sweden
// "EPSG" = "European Petroleum Survey Group" was (but the EPSG name is still often used)
// an organization defining CRS with integer numbers e.g. 4326 for WGS84 or 3006 for SWEREF99TM
int epsgWgs84 = EpsgNumber . WORLD__WGS_84__4326 ;
int epsgSweRef = EpsgNumber . SWEDEN__SWEREF99_TM__3006 ;
// The above "EpsgNumber" class with LOTS OF constants (and more constants classes) have been generated,
// using "FreeMarker" and database downloaded from EPSG ( http://www.epsg.org or http://www.epsg-registry.org )
// from "crs-transformation-code-generation" in the project https://github.com/TomasJohansson/crsTransformations
CrsCoordinate centralStockholmWgs84 = CrsCoordinateFactory . LatLon ( 59.330231 , 18.059196 , epsgWgs84 ) ;
// https://kartor.eniro.se/m/03Yxp
// SWEREF99TM coordinates (for WGS84 59.330231, 18.059196)
// according to Eniro (above URL): 6580822, 674032 (northing, easting)
ICrsTransformationAdapter crsTransformationAdapter ; // interface with concrete "leaf" implementation or "composite" implementations
// This code example is using a "composite" which will use multiple libraries to do the same transformation and then
// return a coordinate with the median values (median of the northing values and median of the easting values)
crsTransformationAdapter = CrsTransformationAdapterCompositeFactory . Create ( ) . CreateCrsTransformationMedian ( ) ;
// The above factory will try to use those known objects which implements the interface i.e. the number
// of "leaf" objects will depend on how many you included as for example NuGet dependencies (three in the above NuGet example)
Console . WriteLine ( "Number of 'leafs' : " + crsTransformationAdapter . TransformationAdapterChildren . Count ) ;
// Console output from the above row:
// Number of 'leafs' : 3
// Transform the WGS84 coordinate to a SWEREF99TM coordinate:
CrsCoordinate centralStockholmSweRef = crsTransformationAdapter . TransformToCoordinate ( centralStockholmWgs84 , epsgSweRef ) ;
Console . WriteLine ( "Median Composite Northing: " + centralStockholmSweRef . Northing ) ;
Console . WriteLine ( "Median Composite Easting: " + centralStockholmSweRef . Easting ) ;
// Console output from the above two rows:
// Median Composite Northing: 6580821.99121561
// Median Composite Easting: 674032.357177155
// (and these can be compared with the 'Eniro' values above i.e. '6580822, 674032 (northing, easting)' )
// The coordinate class provides four properties with different names for the same east-west value and
// four properties for the same name each north-south value, as below:
// Four EQUIVALENT properties: Easting , X , Longitude , XEastingLongitude
// Four EQUIVALENT properties: Northing , Y , Latitude , YNorthingLatitude
// Regarding the above alternative methods, depending on the desired semantic in your context, you may want to use:
// X/Y for a geocentric or cartesian system
// Longitude/Latitude for a geodetic or geographic system
// Easting/Northing for a cartographic or projected system
// xEastingLongitude/yNorthingLatitude for general code handling different types of system
// If you want more details for the result you can use the following 'Transform' method:
// (instead of the method 'TransformToCoordinate' used above)
CrsTransformationResult centralStockholmResultSweRef = crsTransformationAdapter . Transform ( centralStockholmWgs84 , epsgSweRef ) ;
if ( ! centralStockholmResultSweRef . IsSuccess ) {
Console . WriteLine ( "No coordinate result" ) ;
}
else {
if ( centralStockholmResultSweRef . IsReliable (
2 , // minimumNumberOfSuccesfulResults
0.01 // maxDeltaValueForXLongitudeAndYLatitude
) ) {
// at least 2 succesful results and the maximal difference in northing or easting is less than 0.01
// (and if you want to know the exact difference you can find it in this code example further down the page)
Console . WriteLine ( "Reliable result" ) ; // according to your chosen parameters to the method 'isReliable'
}
else {
Console . WriteLine ( "Not reliable result" ) ;
}
Console . WriteLine ( centralStockholmResultSweRef . OutputCoordinate ) ;
// Console output from the above code row:
// CrsCoordinate(xEastingLongitude=674032.357177155, yNorthingLatitude=6580821.99121561, crsIdentifier=CrsIdentifier(crsCode='EPSG:3006', isEpsgCode=True, epsgNumber=3006))
// When your code is in a context where you only have the result (but not the adapter object)
// (e.g. in a method receiving the result as a parameter)
// you can get back the object which created the result as below:
ICrsTransformationAdapter crsTransformationAdapterResultSource = centralStockholmResultSweRef . CrsTransformationAdapterResultSource ;
CrsTransformationAdapteeType adapteeType = crsTransformationAdapterResultSource . AdapteeType ;
Console . WriteLine ( "adapteeType: " + adapteeType ) ; // console output: COMPOSITE_MEDIAN
// The above code row returned an enum which is not really a true adaptee just like the 'composite' is not a true adapter.
// However, when iterating (as below) the "leaf" results,
// it might be more interesting to keep track of from where the different values originated
IList < CrsTransformationResult > transformationResultChildren = centralStockholmResultSweRef . TransformationResultChildren ;
foreach ( CrsTransformationResult crsTransformationResultLeaf in transformationResultChildren ) {
if ( ! crsTransformationResultLeaf . IsSuccess ) continue ; // continue with the next 'leaf'
ICrsTransformationAdapter resultAdapter = crsTransformationResultLeaf . CrsTransformationAdapterResultSource ;
Console . WriteLine ( resultAdapter . AdapteeType ) ;
// The above code row will output rows like this:
// "LEAF_PROJ_NET_4_GEO_API_1_4_1" or "LEAF_MIGHTY_LITTLE_GEODESY_1_0_1" and so on
if ( ! crsTransformationResultLeaf . IsReliable (
2 , // minimumNumberOfSuccesfulResults
1000 // maxDeltaValueForXLongitudeAndYLatitude
) ) {
// The above constraint "at least 2 implementations" will always fail because now we are dealing with "leafs"
// The above delta value constraint has very high tolerance but it does not matter since
// the constraint about the number of implementations will fail
Console . WriteLine ( "Only 'composites' can have more than one result and this is a 'leaf' and thus does not have at least two results" ) ;
}
Console . WriteLine ( "Adapter long name: " + resultAdapter . LongNameOfImplementation ) ; // full class name including package
Console . WriteLine ( "Adapter short name: " + resultAdapter . ShortNameOfImplementation ) ; // class name suffix i.e. the unique part
// The above "long" names will be for example:
// Programmerare.CrsTransformations.Adapter.DotSpatial.CrsTransformationAdapterDotSpatial
// Programmerare.CrsTransformations.Adapter.MightyLittleGeodesy.CrsTransformationAdapterMightyLittleGeodesy
// The above "short" names will be for example:
// DotSpatial
// MightyLittleGeodesy
Console . WriteLine ( "adaptee: " + resultAdapter . AdapteeType ) ;
// The above row will output for example:
// LEAF_DOT_SPATIAL_2_0_0_RC1
// LEAF_MIGHTY_LITTLE_GEODESY_1_0_1
// (note that the version number is included for the adaptees)
Console . WriteLine ( "isComposite: " + resultAdapter . IsComposite ) ; // "False" since we are iterating "leaf" results
Console . WriteLine ( "Coordinate result for " + resultAdapter . AdapteeType + " : " + crsTransformationResultLeaf . OutputCoordinate ) ;
// The above row will output these rows when doing the iteration:
// Coordinate result for LEAF_DOT_SPATIAL_2_0_0_RC1 : CrsCoordinate(xEastingLongitude=674032.357322213, yNorthingLatitude=6580821.99121561, crsIdentifier=CrsIdentifier(crsCode='EPSG:3006', isEpsgCode=True, epsgNumber=3006))
// Coordinate result for LEAF_PROJ_NET_4_GEO_API_1_4_1 : CrsCoordinate(xEastingLongitude=674032.357177155, yNorthingLatitude=6580821.99437121, crsIdentifier=CrsIdentifier(crsCode='EPSG:3006', isEpsgCode=True, epsgNumber=3006))
// Coordinate result for LEAF_MIGHTY_LITTLE_GEODESY_1_0_1 : CrsCoordinate(xEastingLongitude=674032.357, yNorthingLatitude=6580821.991, crsIdentifier=CrsIdentifier(crsCode='EPSG:3006', isEpsgCode=True, epsgNumber=3006))
// Note that the median value for "x" is 674032.357177155 for the above
// three values 674032.357 , 674032.357177155 , 674032.357322213 .
// That is the same value as was displayed before the iteration of the children/leafs for the median composite.
// The same applies for the above "y" i.e. the median is 6580821.99121561
// for the three y values 6580821.991 , 6580821.99121561 , 6580821.99437121
}
// The result object also provides convenience methods for the results (which you of course otherwise might calculate by iterating the above results)
CrsTransformationResultStatistic crsTransformationResultStatistic = centralStockholmResultSweRef . CrsTransformationResultStatistic ;
// Note that the initially created composite was a "median composite" returning the median as the main value,
// but you can also create an average composite and regardless you can access both the median and the average with the aggregated statistics object:
Console . WriteLine ( "average coordinate: " + crsTransformationResultStatistic . CoordinateAverage ) ;
Console . WriteLine ( "median coordinate: " + crsTransformationResultStatistic . CoordinateMedian ) ;
// Console output from the above two rows:
// average coordinate: CrsCoordinate(xEastingLongitude=674032.357166456, yNorthingLatitude=6580821.99219561, crsIdentifier=CrsIdentifier(crsCode='EPSG:3006', isEpsgCode=True, epsgNumber=3006))
// median coordinate: CrsCoordinate(xEastingLongitude=674032.357177155, yNorthingLatitude=6580821.99121561, crsIdentifier=CrsIdentifier(crsCode='EPSG:3006', isEpsgCode=True, epsgNumber=3006))
Console . WriteLine ( "MaxDifferenceForXEastingLongitude: " + crsTransformationResultStatistic . MaxDifferenceForXEastingLongitude ) ;
Console . WriteLine ( "MaxDifferenceForYNorthingLatitude: " + crsTransformationResultStatistic . MaxDifferenceForYNorthingLatitude ) ;
// Output from the above two rows:
// MaxDifferenceForXEastingLongitude: 0.000322213280014694
// MaxDifferenceForYNorthingLatitude: 0.00337121076881886
// As you can see in the above iteration, the min and max x values are 674032.357 and 674032.357322213 (and the difference is 0.000322213).
// Similarly the min and max y values are 6580821.991 and 6580821.99437121 (and the difference is 0.00337121).
// The above two "MaxDifference" methods are used within the implementation of the convenience method 'isReliable'
// (also illustrated in this example further above)
}Version 3.0.0 Ajout de la prise en charge de WKT-CRS, mais veuillez noter que la chaîne WKT-CRS est transmise aux implémentations sans essayer de déterminer si la chaîne fournie est "WKT OGC" ou "WKT ESRI"
Exemple de code, à l'aide d'un adaptateur composite (avec implémentations de feuilles dotspatial et projnet):
CRSTRANSformationAdapterCompositewkTest.cs
Les constantes entières sont générées en utilisant la base de données EPSG
et la bibliothèque Java Freemarker dans "CRS-Transformation-Code-Generation" dans le projet https://github.com/tomasjohansson/crstransformations
Chaque constante est utilisée pour définir un système de référence de coordonnées (CRS).
Le nom d'une constante est une concaténation des trois parties suivantes:
Notez que les captures d'écran ci-dessous et le texte de cette section sont destinées à une ancienne version 9.5.4 mais il y a maintenant une version ultérieure . Vous pouvez trouver la dernière version de 'programme de programme.cransformations.constants' dans son référentiel NuGet.
Exemple de résultat SQL Lors de la sélection des trois colonnes ci-dessus:
Les trois parties ci-dessus sont concaténées (dans l'ordre ci-dessus, c'est-à-dire Areaname + CRSNAME + EPSGNumber) avec deux soulignements comme séparateur entre les pièces.
Les espaces et autres caractères spéciaux sont remplacés par des soulignements.
Les noms constants sont également upperés comme illustré ci-dessous.
Captures d'écran de Visual Studio 2017 lorsque vous utilisez Intellisense / AutoCletion avec la classe EpsGgnumber: 

Quelques autres exemples de noms constants dans la classe C # programmerare.crsconstants.constantsByareanameNumber.v9_5_4.epsGnumber:
(et vous pouvez comparer ces noms constants ci-dessous avec les trois colonnes de résultats de la capture d'écran SQL ci-dessus)
WORLD__WGS_84__4326
WORLD__85_S_TO_85_N__WGS_84__PSEUDO_MERCATOR__3857
NORTH_AMERICA__NAD83__NAD83__4269
USA__US_NATIONAL_ATLAS_EQUAL_AREA__2163
CANADA__NAD83__CANADA_ATLAS_LAMBERT__3978
UK__GREAT_BRITAIN_MAINLAND_ONSHORE__OSGB_1936__BRITISH_NATIONAL_GRID__ODN_HEIGHT__7405
IRELAND__ONSHORE__TM65__IRISH_GRID__29902
AUSTRALIA__GDA__GDA94__4283
NEW_ZEALAND__ONSHORE__NZGD49__NEW_ZEALAND_MAP_GRID__27200
SWEDEN__SWEREF99_TM__3006
FINLAND__19_5_E_TO_20_5_E_ONSHORE_NOMINAL__ETRS89__GK20FIN__3874
DENMARK__ONSHORE_BORNHOLM__ETRS89__KP2000_BORNHOLM__2198
NORWAY__ONSHORE__NGO_1948__OSLO__4817
ICELAND__ONSHORE__REYKJAVIK_1900__4657
NETHERLANDS__ONSHORE__AMERSFOORT__RD_NEW__28992
BELGIUM__ONSHORE__BELGE_1972__BELGIAN_LAMBERT_72__31370
GERMANY__WEST_GERMANY__10_5_E_TO_13_5_E__DHDN__3_DEGREE_GAUSS_KRUGER_ZONE_4__31468
AUSTRIA__ETRS89__AUSTRIA_LAMBERT__3416
EUROPE__LIECHTENSTEIN_AND_SWITZERLAND__CH1903__LV03__21781 Les exemples ci-dessus avec des constantes en montrent très peu.
Il existe plusieurs milliers de constantes dans la classe générée.
Le nombre réel de constantes (pour la version de la classe des constantes que vous utilisez) peut facilement être récupérée avec le code C # 'Typeof (epsGnnumber) .getFields (). Length'.
Le même numéro peut également être vérifié avec la valeur renvoyée par l'instruction SQL 'SELECT COUNT (distinct coord_ref_sys_code) dans epsg_coordinateReferencesystem' (ou simplement `` Sélectionner le nombre (*) dans epsg_coordinateReferencesystem 'car `` coord_ref_sys_code' est la clé principale).