2016-10-02 4 views
0

Я получаю много координат от радара, эти координаты отформатированы почти так же, как и координаты Google maps, я не уверен, но я спросил компанию, и они сказали мне для того, чтобы получить координаты на проекции Альбера, я должен сделать следующее:Преобразование долготы и широты в изображение X, координаты пикселя Y на проекции Альбера

Вы тогда сможете создать 2 CoordinateReferenceSystem (т.е. систем координат), установить один по умолчанию (который является долгота/широчайшим), и установите другой с строкой WKT (которая будет проецироваться x/y). Тогда вы можете легко создать 2 MathTransform для преобразования в обоих направлениях .

Это OGC WKT для проекции Альбера в:

PROJCS["unnamed", 
    GEOGCS["WGS 84", 
     DATUM["WGS_1984", 
      SPHEROID["WGS 84",6378137,298.2572235629972, 
       AUTHORITY["EPSG","7030"]], 
      AUTHORITY["EPSG","6326"]], 
     PRIMEM["Greenwich",0], 
     UNIT["degree",0.0174532925199433], 
     AUTHORITY["EPSG","4326"]], 
    PROJECTION["Albers_Conic_Equal_Area"], 
    PARAMETER["standard_parallel_1",31.996308], 
    PARAMETER["standard_parallel_2",33.996308], 
    PARAMETER["latitude_of_center",32.996308], 
    PARAMETER["longitude_of_center",35.415901], 
    PARAMETER["false_easting",0], 
    PARAMETER["false_northing",0], 
    UNIT["metre",1,AUTHORITY["EPSG","9001"]]] 

Так от того, что я получаю, мне нужно преобразовать из длинных/лат в этой проекции WKT показать на проекции изображения карты Альбера в.

Так GeoTools я использовал следующий код:

CoordinateReferenceSystem source = CRS.decode("EPSG:4326"); 
    CoordinateReferenceSystem target = CRS.parseWKT("PROJCS[\"unnamed\", GEOGCS[\"WGS 84\", DATUM[\"WGS_1984\", SPHEROID[\"WGS 84\",6378137,298.2572235629972, AUTHORITY[\"EPSG\",\"7030\"]], AUTHORITY[\"EPSG\",\"6326\"]], PRIMEM[\"Greenwich\",0], UNIT[\"degree\",0.0174532925199433], AUTHORITY[\"EPSG\",\"4326\"]], PROJECTION[\"Albers_Conic_Equal_Area\"], PARAMETER[\"standard_parallel_1\",31.996308], PARAMETER[\"standard_parallel_2\",33.996308], PARAMETER[\"latitude_of_center\",32.996308], PARAMETER[\"longitude_of_center\",35.415901], PARAMETER[\"false_easting\",0], PARAMETER[\"false_northing\",0], UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]]]"); 
    MathTransform transform = CRS.findMathTransform(source, target, true); 

    Coordinate c = JTS.transform(new Coordinate(34, 35), new Coordinate(), transform); 
    System.out.println(c.toString()); 

И это выход я получаю:

(-38422.86847540497, 111410.0483012808, NaN) 

Теперь, это может быть из-за неправильного источника системы координат, но что он имел в виду по умолчанию long/lat system?

Даже если я решу это, как я могу заставить это показать эти точки на моем изображении карты? Я имею в виду, что он должен знать ширину/высоту изображения, не так ли?

ответ

0

Эта проекция эллинга WKT проектирует из EPSG 4326 на расстояние в метрах от нулевой точки (см. Параметры). Откуда мы знаем, что это счетчики? потому что WKT есть метка UNIT, обозначающая ее как единица измерения.

Как я использовал его?

Моя компания предоставила мне два файла: файл JPEG карты и файл XML для постоянных карт.

Этот файл констант карты XML содержит расстояние от нулевой точки этой карты до углов карты. Поэтому, если у вас есть по крайней мере одна точка на карте, вы можете найти все.

Вещи, которые вы должны знать, чтобы преобразовать его к карте X/Y:

  • Сколько километров каждый пиксель (в моем случае его 1,6 ровно 1 мили)
  • по крайней мере одна известная точка на карта на расстоянии от нулевой точки

Это, как я это сделал:

 MathTransform transform = CRS.findMathTransform(epsg4326, targetWKT, true); 

     DirectPosition2D srcDirectPosition2D 
       = new DirectPosition2D(epsg4326, latitude, longitude); 
     DirectPosition2D destDirectPosition2D 
       = new DirectPosition2D(); 
     transform.transform(srcDirectPosition2D, destDirectPosition2D); 

     double transX = destDirectPosition2D.x; 
     double transY = destDirectPosition2D.y; 

     int kmPerPixel = mapImage.getWidth/1024; // It is known to me that my map is 1024x1024km ... 

     double x = zeroPointX + ((transX * 0.001) * kmPerPixel); 
     double y = zeroPointY + (((transX * -1) * 0.001) * kmPerPixel); 

zeroPointX и Y вы можете получить от того же вычисления, не добавляя, в точке, которую вы имеете на карте на расстоянии, как я сделал с моим углом.

Может помочь некоторым людям, чтобы я опубликовал то, что я понял.

Смежные вопросы