Как нарисовать точки в полилинии 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,83077122, 0,69084, -1,83077122, 0,69084 , 0,6908477, -1,8307738, 0,69084626, -1,8307749, 0,69084185, -1,8307792].

Как преобразовать точки типа «0,69086486, -1,8307719» в координаты x, y, которые можно использовать в обычной графике?

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

В техническом описании шейп-файла ESRI об этом не упоминается (http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf).


person Aaron    schedule 08.05.2010    source источник
comment
OpenMap может конвертировать в градусы для вас — вам придется углубиться в следующие классы и методы. *com.bbn.openmap.layer.shape.ESRIPolygonRecord (см. переменные «полигоны» типа ESRIFloatPoly[]) *com.bbn.openmap.layer.shape.ESRIPoly.ESRIFloatPoly *getDecimalDegrees(); (метод)   -  person Aaron    schedule 16.05.2010


Ответы (2)


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

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

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

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

(latitude0, longitude0) – координаты контрольной точки (например, нижнего левого угла ограничивающей рамки). Единицы – градусы для углов и метры для расстояний.

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

person Stéphane    schedule 15.05.2010
comment
Похоже, ты прав насчет радианов и уравнений. Как насчет объяснения того, что делают уравнения?... - person Aaron; 16.05.2010
comment
Аарон, не могли бы вы поделиться своим кодом ColdFusion для чтения шейп-файла? Спасибо, найди меня в твиттере с таким же именем. - person cfEngineers; 16.09.2010

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

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

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

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

person Don    schedule 19.05.2010