Страница 1 из 1

OGR API или создание промежуточных точек

Добавлено: 07 ноя 2011, 21:14
tyko
Добрый день!
Я использую библиотеку OGR для создания слоя MapInfo в проекте на Visual Studio C#.
Создавать точечные объекты я научился, присваивать свою, местную систему координат тоже.
Но, мне нужно между двумя основными точками рассчитать положение еще одной-двух-трех на одинаковом расстоянии друг от друга.
Есть ли инструменты в API OGR для данной процедуры?
А так же.. Могу ли я "вручную" рассчитать эти точки, считая, что нахожусь на плоскости и "тупо" используя школьную геометрию вычислить положение промежуточных точек? Дистанция между основными может быть в пределах одного километра..

Re: OGR API или создание промежуточных точек

Добавлено: 07 ноя 2011, 21:24
Voltron
В OGR API насколько знаю такого нет. Да оно и не нужно, задачка же из школьного курса геометрии

Re: OGR API или создание промежуточных точек

Добавлено: 07 ноя 2011, 21:27
tyko
Так то оно да. Но я плохо знаю проекции и с чем их едят. Меня интересует погрешность при вычислениях. Могу ли я все рассчитывать исходя из того что работаю на однородной плоскости? И до кучи, если СК будет в долготе\широте, то такой же подход для расчета используется?

Re: OGR API или создание промежуточных точек

Добавлено: 07 ноя 2011, 21:38
Voltron
Еслу у вас расстояние между точками не превышает 1 км, то погрешностью можно вообще пренебречь. Долгота/широта те же координаты, что и метры, только единицы измерения другие.

Еще можете посмотреть на GEOS, там нужный функционал должен быть, только вот интервейса к C# у нее нет

Re: OGR API или создание промежуточных точек

Добавлено: 07 ноя 2011, 21:46
tyko
Большое спасибо!

Re: OGR API или создание промежуточных точек

Добавлено: 07 ноя 2011, 22:50
Дмитрий Барышников
OGR и есть тонкая обертка над GEOS.
Документация по GEOS: http://geos.osgeo.org/doxygen/
Но это все не нужно!
Есть метод для линии (OGRLineString) называется Value (http://gdal.org/ogr/classOGRLineString. ... 14a6c150a0)
который возвращает точку на линии по расстоянию. Можно и для сегмента такое сделать. Читайте доки.

Re: OGR API или создание промежуточных точек

Добавлено: 07 ноя 2011, 23:37
Voltron
Bishop писал(а):Но это все не нужно!
Позволю себе не согласиться
Bishop писал(а):Есть метод для линии (OGRLineString) называется Value... Читайте доки.
Метод-то есть и доку мы читаем, только вот незадача... в public API его (метода) нет.

Re: OGR API или создание промежуточных точек

Добавлено: 08 ноя 2011, 00:11
Дмитрий Барышников
Voltron писал(а): Метод-то есть и доку мы читаем, только вот незадача... в public API его (метода) нет.
Здесь уже я не согласен. Если брать "древний" С API то может быть и да, но в С++ все есть.
Привожу описание класса из GDAL/OGR 1.8.0

Код: Выделить всё

class CPL_DLL OGRLineString : public OGRCurve
{
protected:
int nPointCount;
OGRRawPoint *paoPoints;
double *padfZ;

void Make3D();
void Make2D();

public:
OGRLineString();
virtual ~OGRLineString();

// IWks Interface
virtual int WkbSize() const;
virtual OGRErr importFromWkb( unsigned char *, int = -1 );
virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
virtual OGRErr importFromWkt( char ** );
virtual OGRErr exportToWkt( char ** ppszDstText ) const;

// IGeometry interface
virtual int getDimension() const;
virtual OGRGeometry *clone() const;
virtual void empty();
virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
virtual OGRBoolean IsEmpty() const;

// ICurve methods
virtual double get_Length() const;
virtual void StartPoint(OGRPoint *) const;
virtual void EndPoint(OGRPoint *) const;
virtual void Value( double, OGRPoint * ) const;

// ILineString methods
int getNumPoints() const { return nPointCount; }
void getPoint( int, OGRPoint * ) const;
double getX( int i ) const { return paoPoints.x; }
double getY( int i ) const { return paoPoints.y; }
double getZ( int i ) const;

// ISpatialRelation
virtual OGRBoolean Equals( OGRGeometry * ) const;

// non standard.
virtual void setCoordinateDimension( int nDimension );
void setNumPoints( int );
void setPoint( int, OGRPoint * );
void setPoint( int, double, double );
void setPoint( int, double, double, double );
void setPoints( int, OGRRawPoint *, double * = NULL );
void setPoints( int, double * padfX, double * padfY,
double *padfZ = NULL );
void addPoint( OGRPoint * );
void addPoint( double, double );
void addPoint( double, double, double );

void getPoints( OGRRawPoint *, double * = NULL ) const;

void addSubLineString( const OGRLineString *,
int nStartVertex = 0, int nEndVertex = -1 );

// non-standard from OGRGeometry
virtual OGRwkbGeometryType getGeometryType() const;
virtual const char *getGeometryName() const;
virtual OGRErr transform( OGRCoordinateTransformation *poCT );
virtual void flattenTo2D();
virtual void segmentize(double dfMaxLength);

virtual void swapXY();
};

CPL_DLL Говорит что класс экспортируется из DLL и все доступно!
Вот про два вида API http://gdal.org/ogr/ogr_apitut.html

Re: OGR API или создание промежуточных точек

Добавлено: 08 ноя 2011, 12:05
Voltron
Пусть так, но в Python API такого нет, нет этого и в R, Perl, VB6 и Ruby. За C# не скажу, мне его собрать негде, но подозреваю, что и там этого тоже нет.

Re: OGR API или создание промежуточных точек

Добавлено: 08 ноя 2011, 13:57
Дмитрий Барышников
Ну так баг однако?

Re: OGR API или создание промежуточных точек

Добавлено: 08 ноя 2011, 14:22
Voltron
Не уверен. Если посмотреть на ogr_api.h (если правильно понимаю, это главный заголовочный файл для OGR), то там многих вещей нет и так было еще при 1.5.0. Возможно, сделано специально, хотя не знаю зачем