Skip to content

Commit 4813ced

Browse files
authored
Merge pull request #49 from Digitelektro/beta
Beta
2 parents 3c33000 + c905a4d commit 4813ced

18 files changed

Lines changed: 1041 additions & 242 deletions

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ Thumbs.db
3535
/.qmake.cache
3636
/.qmake.stash
3737
Build/
38+
build/
3839

3940
# qtcreator generated files
4041
*.pro.user*

CMakeLists.txt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,14 @@ ExternalProject_Add(libcorrect
3939
CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
4040
)
4141

42-
find_package(OpenCV REQUIRED PATHS "D:/Programozas/opencv/own_build/install/")
42+
find_package(OpenCV)
4343

4444
link_directories(
4545
${CMAKE_BINARY_DIR}/sgp4-build/libsgp4
4646
${CMAKE_BINARY_DIR}/libcorrect-build/lib
4747
)
4848

49-
add_definitions(-D_USE_MATH_DEFINES)
49+
add_definitions(-D_USE_MATH_DEFINES -D_SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING)
5050

5151
add_executable(meteordemod
5252
main.cpp
@@ -124,12 +124,14 @@ if(WIN32)
124124
${OpenCV_LIBS}
125125
sgp4.lib
126126
correct.lib
127+
stdc++fs
127128
)
128129
else()
129130
target_link_libraries(meteordemod
130131
${OpenCV_LIBS}
131132
sgp4.a
132133
correct.a
134+
stdc++fs
133135
)
134136
endif()
135137

@@ -148,8 +150,8 @@ if(UNIX AND NOT APPLE)
148150
if (DEBIAN_FOUND)
149151
SET(CPACK_GENERATOR "DEB")
150152
SET(CPACK_PACKAGE_VERSION_MAJOR "2")
151-
SET(CPACK_PACKAGE_VERSION_MINOR "3")
152-
SET(CPACK_PACKAGE_VERSION_PATCH "1")
153+
SET(CPACK_PACKAGE_VERSION_MINOR "4")
154+
SET(CPACK_PACKAGE_VERSION_PATCH "4")
153155
SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "Digitelektro")
154156
SET(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://github.com/Digitelektro/MeteorDemod")
155157
SET(CPACK_DEBIAN_PACKAGE_DESCRIPTION "Russian Meteor M2 weather satellite data decoder")

GIS/shaperenderer.cpp

Lines changed: 28 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ GIS::ShapeRenderer::ShapeRenderer(const std::string shapeFile, const cv::Scalar
1010
, mAltitude(altitude)
1111
, mThicknes(5)
1212
, mPointRadius(10)
13-
, mFontScale(2)
13+
, mFontHeight(40)
14+
, mFontLineWidth(2)
1415
{
1516

1617
}
@@ -25,7 +26,7 @@ void GIS::ShapeRenderer::setTextFieldName(const std::string &name)
2526
mTextFieldName = name;
2627
}
2728

28-
void GIS::ShapeRenderer::drawShapeMercator(cv::Mat &src, float xStart, float yStart)
29+
void GIS::ShapeRenderer::drawShapeMercator(cv::Mat &src, float xStart, float yStart, float scale)
2930
{
3031
if(!load()) {
3132
return;
@@ -43,7 +44,7 @@ void GIS::ShapeRenderer::drawShapeMercator(cv::Mat &src, float xStart, float ySt
4344
for(polyLineIterator->begin(); *polyLineIterator != polyLineIterator->end(); ++(*polyLineIterator)) {
4445
//std::cout << polyLineIterator->point.x << " " << polyLineIterator->point.y << std::endl;
4546

46-
PixelGeolocationCalculator::CartesianCoordinateF coordinate = PixelGeolocationCalculator::coordinateToMercatorProjection(polyLineIterator->point.y, polyLineIterator->point.x, mEarthRadius + mAltitude);
47+
PixelGeolocationCalculator::CartesianCoordinateF coordinate = PixelGeolocationCalculator::coordinateToMercatorProjection<float>({polyLineIterator->point.y, polyLineIterator->point.x, 0}, mEarthRadius + mAltitude, scale);
4748

4849
coordinate.x += -xStart;
4950
coordinate.y += -yStart;
@@ -65,7 +66,7 @@ void GIS::ShapeRenderer::drawShapeMercator(cv::Mat &src, float xStart, float ySt
6566
for(recordIterator->begin(); *recordIterator != recordIterator->end(); ++(*recordIterator)) {
6667
ShapeReader::Point point(*recordIterator);
6768

68-
PixelGeolocationCalculator::CartesianCoordinateF coordinate = PixelGeolocationCalculator::coordinateToMercatorProjection(point.y, point.x, mEarthRadius + mAltitude);
69+
PixelGeolocationCalculator::CartesianCoordinateF coordinate = PixelGeolocationCalculator::coordinateToMercatorProjection<float>({point.y, point.x, 0}, mEarthRadius + mAltitude, scale);
6970
coordinate.x += -xStart;
7071
coordinate.y += -yStart;
7172

@@ -83,7 +84,7 @@ void GIS::ShapeRenderer::drawShapeMercator(cv::Mat &src, float xStart, float ySt
8384
ShapeReader::Point point(*recordIterator);
8485
std::vector<std::string> fieldValues = dbFilereader.getFieldValues(i);
8586

86-
PixelGeolocationCalculator::CartesianCoordinateF coordinate = PixelGeolocationCalculator::coordinateToMercatorProjection(point.y, point.x, mEarthRadius + mAltitude);
87+
PixelGeolocationCalculator::CartesianCoordinateF coordinate = PixelGeolocationCalculator::coordinateToMercatorProjection<float>({point.y, point.x, 0}, mEarthRadius + mAltitude, scale);
8788
coordinate.x += -xStart;
8889
coordinate.y += -yStart;
8990

@@ -113,18 +114,19 @@ void GIS::ShapeRenderer::drawShapeMercator(cv::Mat &src, float xStart, float ySt
113114
}
114115

115116
if(drawName) {
117+
double fontScale = cv::getFontScaleFromHeight(cv::FONT_ITALIC, mFontHeight, mFontLineWidth);
116118
int baseLine;
117-
cv::Size size = cv::getTextSize(fieldValues[namePos], cv::FONT_ITALIC, mFontScale, mThicknes, &baseLine);
118-
cv::putText(src, fieldValues[namePos], cv::Point2d(coordinate.x - (size.width/2), coordinate.y - size.height + baseLine), cv::FONT_ITALIC, mFontScale, cv::Scalar(0,0,0), mThicknes+1, cv::LINE_AA);
119-
cv::putText(src, fieldValues[namePos], cv::Point2d(coordinate.x - (size.width/2), coordinate.y - size.height + baseLine), cv::FONT_ITALIC, mFontScale, mColor, mThicknes, cv::LINE_AA);
119+
cv::Size size = cv::getTextSize(fieldValues[namePos], cv::FONT_ITALIC, fontScale, mFontLineWidth, &baseLine);
120+
cv::putText(src, fieldValues[namePos], cv::Point2d(coordinate.x - (size.width/2), coordinate.y - size.height + baseLine), cv::FONT_ITALIC, fontScale, cv::Scalar(0,0,0), mFontLineWidth+1, cv::LINE_AA);
121+
cv::putText(src, fieldValues[namePos], cv::Point2d(coordinate.x - (size.width/2), coordinate.y - size.height + baseLine), cv::FONT_ITALIC, fontScale, mColor, mFontLineWidth, cv::LINE_AA);
120122
}
121123
}
122124
}
123125
}
124126
}
125127
}
126128

127-
void GIS::ShapeRenderer::drawShapeEquidistant(cv::Mat &src, float xStart, float yStart, float centerLatitude, float centerLongitude)
129+
void GIS::ShapeRenderer::drawShapeEquidistant(cv::Mat &src, float xStart, float yStart, float centerLatitude, float centerLongitude, float scale)
128130
{
129131
if(!load()) {
130132
return;
@@ -142,7 +144,7 @@ void GIS::ShapeRenderer::drawShapeEquidistant(cv::Mat &src, float xStart, float
142144
for(polyLineIterator->begin(); *polyLineIterator != polyLineIterator->end(); ++(*polyLineIterator)) {
143145
//std::cout << polyLineIterator->point.x << " " << polyLineIterator->point.y << std::endl;
144146

145-
PixelGeolocationCalculator::CartesianCoordinateF coordinate = PixelGeolocationCalculator::coordinateToAzimuthalEquidistantProjection(polyLineIterator->point.y, polyLineIterator->point.x, centerLatitude, centerLongitude, mEarthRadius + mAltitude);
147+
PixelGeolocationCalculator::CartesianCoordinateF coordinate = PixelGeolocationCalculator::coordinateToAzimuthalEquidistantProjection<float>({polyLineIterator->point.y, polyLineIterator->point.x, 0}, {centerLatitude, centerLongitude, 0}, mEarthRadius + mAltitude, scale);
146148

147149
coordinate.x += -xStart;
148150
coordinate.y += -yStart;
@@ -166,7 +168,7 @@ void GIS::ShapeRenderer::drawShapeEquidistant(cv::Mat &src, float xStart, float
166168
for(recordIterator->begin(); *recordIterator != recordIterator->end(); ++(*recordIterator)) {
167169
ShapeReader::Point point(*recordIterator);
168170

169-
PixelGeolocationCalculator::CartesianCoordinateF coordinate = PixelGeolocationCalculator::coordinateToAzimuthalEquidistantProjection(point.y, point.x, centerLatitude, centerLongitude, mEarthRadius + mAltitude);
171+
PixelGeolocationCalculator::CartesianCoordinateF coordinate = PixelGeolocationCalculator::coordinateToAzimuthalEquidistantProjection<float>({point.y, point.x, 0}, {centerLatitude, centerLongitude, 0}, mEarthRadius + mAltitude, scale);
170172
coordinate.x += -xStart;
171173
coordinate.y += -yStart;
172174

@@ -188,7 +190,7 @@ void GIS::ShapeRenderer::drawShapeEquidistant(cv::Mat &src, float xStart, float
188190
ShapeReader::Point point(*recordIterator);
189191
std::vector<std::string> fieldValues = dbFilereader.getFieldValues(i);
190192

191-
PixelGeolocationCalculator::CartesianCoordinateF coordinate = PixelGeolocationCalculator::coordinateToAzimuthalEquidistantProjection(point.y, point.x, centerLatitude, centerLongitude, mEarthRadius + mAltitude);
193+
PixelGeolocationCalculator::CartesianCoordinateF coordinate = PixelGeolocationCalculator::coordinateToAzimuthalEquidistantProjection<float>({point.y, point.x, 0}, {centerLatitude, centerLongitude, 0}, mEarthRadius + mAltitude, scale);
192194
coordinate.x += -xStart;
193195
coordinate.y += -yStart;
194196

@@ -222,10 +224,11 @@ void GIS::ShapeRenderer::drawShapeEquidistant(cv::Mat &src, float xStart, float
222224
}
223225

224226
if(drawName) {
227+
double fontScale = cv::getFontScaleFromHeight(cv::FONT_ITALIC, mFontHeight, mFontLineWidth);
225228
int baseLine;
226-
cv::Size size = cv::getTextSize(fieldValues[namePos], cv::FONT_ITALIC, mFontScale, mThicknes, &baseLine);
227-
cv::putText(src, fieldValues[namePos], cv::Point2d(coordinate.x - (size.width/2), coordinate.y - size.height + baseLine), cv::FONT_ITALIC, mFontScale, cv::Scalar(0,0,0), mThicknes+1, cv::LINE_AA);
228-
cv::putText(src, fieldValues[namePos], cv::Point2d(coordinate.x - (size.width/2), coordinate.y - size.height + baseLine), cv::FONT_ITALIC, mFontScale, mColor, mThicknes, cv::LINE_AA);
229+
cv::Size size = cv::getTextSize(fieldValues[namePos], cv::FONT_ITALIC, fontScale, mFontLineWidth, &baseLine);
230+
cv::putText(src, fieldValues[namePos], cv::Point2d(coordinate.x - (size.width/2), coordinate.y - size.height + baseLine), cv::FONT_ITALIC, fontScale, cv::Scalar(0,0,0), mFontLineWidth+1, cv::LINE_AA);
231+
cv::putText(src, fieldValues[namePos], cv::Point2d(coordinate.x - (size.width/2), coordinate.y - size.height + baseLine), cv::FONT_ITALIC, fontScale, mColor, mFontLineWidth, cv::LINE_AA);
229232
}
230233
}
231234
}
@@ -235,36 +238,17 @@ void GIS::ShapeRenderer::drawShapeEquidistant(cv::Mat &src, float xStart, float
235238

236239
bool GIS::ShapeRenderer::equidistantCheck(float latitude, float longitude, float centerLatitude, float centerLongitude)
237240
{
238-
bool longResult = true;
239-
bool latResult = true;
240-
241-
int minLongitude = static_cast<int>(centerLongitude - 90);
242-
int maxLongitude = static_cast<int>(centerLongitude + 90);
243-
int minLatitude = static_cast<int>(centerLatitude - 45);
244-
int maxLatitude = static_cast<int>(centerLatitude + 45);
245-
246-
//Normalize
247-
minLongitude = ((minLongitude + 540) % 360 - 180);
248-
maxLongitude = ((maxLongitude + 540) % 360 - 180);
249-
minLatitude = ((minLatitude + 270) % 180 - 90);
250-
maxLatitude = ((maxLatitude + 270) % 180 - 90);
251-
252-
if(maxLatitude < minLatitude)
253-
{
254-
latResult = latitude > minLatitude || latitude < maxLatitude;
255-
}
256-
else
257-
{
258-
latResult = latitude > minLatitude && latitude < maxLatitude;
259-
}
260-
if(maxLongitude < minLongitude)
261-
{
262-
longResult = longitude < minLongitude || longitude < maxLongitude;
263-
}
264-
else
241+
//Degree To radian
242+
latitude = M_PI * latitude / 180.0f;
243+
longitude = M_PI * longitude / 180.0f;
244+
centerLatitude= M_PI * centerLatitude / 180.0f;
245+
centerLongitude= M_PI * centerLongitude / 180.0f;
246+
247+
float deltaSigma = std::sin(centerLatitude) * std::sin(latitude) + std::cos(latitude) * std::cos(longitude - centerLongitude);
248+
if (deltaSigma < 0.0)
265249
{
266-
longResult = longitude > minLongitude && longitude < maxLongitude;
250+
return false;
267251
}
268252

269-
return longResult && latResult;
253+
return true;
270254
}

GIS/shaperenderer.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ class ShapeRenderer : public ShapeReader
2020
void addNumericFilter(const std::string name, int value);
2121
void setTextFieldName(const std::string &name);
2222

23-
void drawShapeMercator(cv::Mat &src, float xStart, float yStart);
24-
void drawShapeEquidistant(cv::Mat &src, float xStart, float yStart, float centerLatitude, float centerLongitude);
23+
void drawShapeMercator(cv::Mat &src, float xStart, float yStart, float scale);
24+
void drawShapeEquidistant(cv::Mat &src, float xStart, float yStart, float centerLatitude, float centerLongitude, float scale);
2525

2626
public: //setters
2727
void setThickness(int thickness) {
@@ -30,8 +30,11 @@ class ShapeRenderer : public ShapeReader
3030
void setPointRadius(int radius) {
3131
mPointRadius = radius;
3232
}
33-
void setFontScale(int scale) {
34-
mFontScale = scale;
33+
void setFontHeight(int height) {
34+
mFontHeight = height;
35+
}
36+
void setFontLineWidth(int width) {
37+
mFontLineWidth = width;
3538
}
3639

3740
private:
@@ -45,7 +48,8 @@ class ShapeRenderer : public ShapeReader
4548
std::string mTextFieldName;
4649
int mThicknes;
4750
int mPointRadius;
48-
int mFontScale;
51+
int mFontHeight;
52+
int mFontLineWidth;
4953
};
5054

5155
} //namespace GIS

MeteorDemod.pro

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ CONFIG -= app_bundle
77
# deprecated API in order to know how to port your code away from it.
88
DEFINES += QT_DEPRECATED_WARNINGS LIQUID_BUILD_CPLUSPLUS
99
DEFINES +=_USE_MATH_DEFINES
10+
DEFINES += _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING
11+
12+
QMAKE_LFLAGS += -lstdc++fs
1013

1114
# You can also make your code fail to compile if it uses deprecated APIs.
1215
# In order to do so, uncomment the following line.

common/settings.cpp

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,18 @@ void Settings::parseIni(const std::string &path)
6161
ini::extract(mIniParser.sections["Program"]["RollM2"], mM2Roll, -2.9f);
6262
ini::extract(mIniParser.sections["Program"]["PitchM2"], mM2Pitch, 0.3f);
6363
ini::extract(mIniParser.sections["Program"]["YawM2"], mM2Yaw, 0.0f);
64+
ini::extract(mIniParser.sections["Program"]["TimeOffsetM2"], mTimeOffsetM2Sec, 0);
6465
ini::extract(mIniParser.sections["Program"]["NightPassTreshold"], mNightPassTreshold, 10.0f);
66+
ini::extract(mIniParser.sections["Program"]["ProjectionScale"], mProjectionScale, 0.75f);
67+
ini::extract(mIniParser.sections["Program"]["CompositeProjectionScale"], mCompositeProjectionScale, 0.75f);
68+
ini::extract(mIniParser.sections["Program"]["CompositeAzimuthalEquidistantProjection"], mCompositeEquadistantProjection, true);
69+
ini::extract(mIniParser.sections["Program"]["CompositeMercatorProjection"], mCompositeMercatorProjection, false);
70+
ini::extract(mIniParser.sections["Program"]["GenerateComposite123"], mGenerateComposite123, true);
71+
ini::extract(mIniParser.sections["Program"]["GenerateComposite125"], mGenerateComposite125, true);
72+
ini::extract(mIniParser.sections["Program"]["GenerateComposite221"], mGenerateComposite221, true);
73+
ini::extract(mIniParser.sections["Program"]["GenerateComposite68"], mGenerateComposite68, true);
74+
ini::extract(mIniParser.sections["Program"]["GenerateCompositeThermal"], mGenerateCompositeThermal, true);
75+
ini::extract(mIniParser.sections["Program"]["GenerateComposite68Rain"], mGenerateComposite68Rain, true);
6576

6677
ini::extract(mIniParser.sections["Demodulator"]["CostasBandwidth"], mCostasBw, 50);
6778
ini::extract(mIniParser.sections["Demodulator"]["RRCFilterOrder"], mRRCFilterOrder, 64);
@@ -71,7 +82,8 @@ void Settings::parseIni(const std::string &path)
7182

7283
ini::extract(mIniParser.sections["Watermark"]["Place"], mWaterMarkPlace);
7384
ini::extract(mIniParser.sections["Watermark"]["Color"], mWaterMarkColor, HTMLColor(0xAD880C));
74-
ini::extract(mIniParser.sections["Watermark"]["Size"], mWaterMarkSize, 5);
85+
ini::extract(mIniParser.sections["Watermark"]["Size"], mWaterMarkSize, 80);
86+
ini::extract(mIniParser.sections["Watermark"]["Width"], mWaterMarkLineWidth, 3);
7587
ini::extract(mIniParser.sections["Watermark"]["Text"], mWaterMarkText);
7688

7789
ini::extract(mIniParser.sections["ReceiverLocation"]["Draw"], mDrawreceiver, false);
@@ -84,20 +96,20 @@ void Settings::parseIni(const std::string &path)
8496

8597
ini::extract(mIniParser.sections["ShapeFileGraticules"]["FileName"], mShapeGraticulesFile);
8698
ini::extract(mIniParser.sections["ShapeFileGraticules"]["Color"], mShapeGraticulesColor, HTMLColor(0xC8C8C8));
87-
ini::extract(mIniParser.sections["ShapeFileGraticules"]["Thickness"], mShapeGraticulesThickness, 5);
99+
ini::extract(mIniParser.sections["ShapeFileGraticules"]["Thickness"], mShapeGraticulesThickness, 1);
88100

89101
ini::extract(mIniParser.sections["ShapeFileCoastLines"]["FileName"], mShapeCoastLinesFile);
90102
ini::extract(mIniParser.sections["ShapeFileCoastLines"]["Color"], mShapeCoastLinesColor, HTMLColor(0x808000));
91-
ini::extract(mIniParser.sections["ShapeFileCoastLines"]["Thickness"], mShapeCoastLinesThickness, 5);
103+
ini::extract(mIniParser.sections["ShapeFileCoastLines"]["Thickness"], mShapeCoastLinesThickness, 2);
92104

93105
ini::extract(mIniParser.sections["ShapeFileBoundaryLines"]["FileName"], mShapeBoundaryLinesFile);
94106
ini::extract(mIniParser.sections["ShapeFileBoundaryLines"]["Color"], mShapeBoundaryLinesColor, HTMLColor(0xC8C8C8));
95-
ini::extract(mIniParser.sections["ShapeFileBoundaryLines"]["Thickness"], mShapeBoundaryLinesThickness, 5);
107+
ini::extract(mIniParser.sections["ShapeFileBoundaryLines"]["Thickness"], mShapeBoundaryLinesThickness, 2);
96108

97109
ini::extract(mIniParser.sections["ShapeFilePopulatedPlaces"]["FileName"], mShapePopulatedPlacesFile);
98110
ini::extract(mIniParser.sections["ShapeFilePopulatedPlaces"]["Color"], mShapePopulatedPlacesColor, HTMLColor(0x5A42F5));
99-
ini::extract(mIniParser.sections["ShapeFilePopulatedPlaces"]["Thickness"], mShapePopulatedPlacesThickness, 5);
100-
ini::extract(mIniParser.sections["ShapeFilePopulatedPlaces"]["FontScale"], mShapePopulatedPlacesFontScale, 2);
111+
ini::extract(mIniParser.sections["ShapeFilePopulatedPlaces"]["Width"], mShapePopulatedPlacesFontWidth, 2);
112+
ini::extract(mIniParser.sections["ShapeFilePopulatedPlaces"]["Size"], mShapePopulatedPlacesFontSize, 40);
101113
ini::extract(mIniParser.sections["ShapeFilePopulatedPlaces"]["PointRadius"], mShapePopulatedPlacesPointradius, 10);
102114
ini::extract(mIniParser.sections["ShapeFilePopulatedPlaces"]["FilterColumnName"], mShapePopulatedPlacesFilterColumnName, std::string("ADM0CAP"));
103115
ini::extract(mIniParser.sections["ShapeFilePopulatedPlaces"]["NumericFilter"], mShapePopulatedPlacesNumbericFilter, 1);

0 commit comments

Comments
 (0)