Как мне нарисовать точки в полилинии ESRI, учитывая ограничивающую рамку как широта / долгота и "точки" как радианы?

Я использую OpenMap и читаю ShapeFile, используя com.bbn.openmap.layer.shape.ShapeFile. Ограничительная рамка читается как точки широты / долготы, например, 39.583642,-104.895486. Ограничительная рамка - это нижняя левая точка и верхняя правая точка, представляющая, где находятся эти точки. "Точки", которые называются "радианами" в OpenMap, имеют другой формат, который выглядит следующим образом: [0.69086486, -1.8307719, 0.6908546, -1.8307716, 0.6908518, -1.8307717, 0.69085056, -1.8307722, 0.69084936, -1.8307728 0,6908477, -1,8307738, 0,69084626, -1,8307749, 0,69084185, -1,8307792].

Как преобразовать точки типа "0.69086486, -1.8307719" в координаты x,y, которые можно использовать в обычной графике?

Я полагаю, что все, что здесь необходимо, это какое-то преобразование, потому что при переносе точек в Excel и построении их графика создается линия, кривая которой соответствует кривой дороги в данном месте (широта / долгота). Тем не менее, оси должны быть скорректированы вручную, и я не имею никакого отношения к тому, как регулировать оси, поскольку данный ограничивающий прямоугольник выглядит в другом формате, чем заданные точки.

Техническое описание ESRI Shapefile, похоже, не упоминает об этом ( http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf).

2 ответа

Решение

0.69086486, -1.8307719 это широта и долгота в радианах.

Сначала преобразуйте в градусы (умножьте на (180/pi)), затем у вас будут общие единицы измерения между вашей ограничительной рамкой и вашими координатами.

Затем вы можете отобразить все это в локальной рамке со следующим:

x = (longitude-longitude0)*(6378137*pi/180)*cos(latitude0*pi/180)
y = (latitude-latitude0)*(6378137*pi/180)

(широта0, долгота0) - координаты контрольной точки (например, левый нижний угол ограничительной рамки), единицы измерения - градусы для углов и метры для расстояний.

Правка - объяснение: Это ортографическая проекция Земли, рассматриваемая как сфера, радиус которой составляет 6378137,0 м (большая полуось эллипсоида WGS84) с центром в точке (lat0, lon0)

В OpenMap есть несколько способов преобразования радиан в десятичные градусы:

Length.DECIMAL_DEGREE.fromRadians(radVal);
Math.toDegrees(radVal)  // Standard java library

Для массива вы можете использовать ProjMath.arrayDegToRad(double[] radvals);

Будьте осторожны с этим последним, он выполняет преобразование на месте. Поэтому, если вы берете массив lat/lon из OMPoly, сначала сделайте его копию перед преобразованием. В противном случае вы испортите внутренние координаты OMPoly, которые, как ожидается, будут в радианах.

Другие вопросы по тегам