Как да начертая точките в полилиния на 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).


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)

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

Редактиране -- обяснение: Това е ортографска проекция на Земята, разглеждана като сфера, чийто радиус е 6378137.0 m (голяма полуос на елипсоида WGS84), центрирана в точката (lat0, lon0)

person Stéphane    schedule 15.05.2010
comment
Изглежда, че си прав за радианите и уравненията. Какво ще кажете за обяснение какво правят уравненията?... - person Aaron; 16.05.2010
comment
Аарон имаш ли нещо против да споделиш своя код на ColdFusion, за да прочетеш Shapefile? Благодаря, намери ме в Twitter със същото име - person cfEngineers; 16.09.2010

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

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

За масив можете да използвате ProjMath.arrayDegToRad(double[] radvals);

Внимавайте с последния, той прави преобразуването на място. Така че, ако вземете масив от lat/long от OMPoly, първо направете негово копие, преди да го конвертирате. В противен случай ще объркате вътрешните координати на OMPoly, които очаква да бъдат в радиани.

person Don    schedule 19.05.2010