SSTAA : Subway Station Trading Area Analysis
C# .NET Framework์ EntityFramework ๋ฐ DevExpress๋ฅผ ์ด์ฉํด ์์ธ์ ๋ด ๊ฐ ๊ตฌ๋ณ ์๊ถ๋ถ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ์๋ค.
2020๋
12์ 28์ผ ~ 2021๋
01์ 08์ผ
IoT๊ธฐ๋ฐ ์ค๋งํธํฉํ ๋ฆฌ SW๊ฐ๋ฐ ์ ๋ฌธ๊ฐ๊ณผ์
๊น๋๊ทผ, ์์ฑ์ค, ์ด๋ํฌ ์ด 3๋ช
์ถ๋ ฅ ๊ธฐ๋ฅ(SSTAA.WinForm)
์ถ์ฒ์๊ถ์ ๋ณด๊ณ ์ถ์ ๊ตฌ ์ ํ(์์ธ์)
ํด๋น๊ตฌ ์ ํ, ์
์ข
์ ํ
ํด๋น๊ตฌ ์ ํ ๊ธฐ๋ฅ์ DevExpress MapControl๋ก ๊ตฌํ
ํด๋น๊ตฌ ์ฐ๋๋ณ ํ๊ฐ์ ์
์ ํ๋ ๊ตฌ์ ํด๋น๋๋ ์งํ์ฒ ์ญ ํ๊ฐ์ ์ ์์๋ก ์ถ์ฒ
์ฐ๋๋ณ ํ๊ฐ์ ์ ์ธ๋ถ๋ด์ญ
์งํ์ฒ ์ญ ๋๋ธํด๋ฆญ์ ํด๋น์ญ ์ธ๋ถ๋ด์ญ ์ถ๋ ฅ
์
๋ ฅ ๊ธฐ๋ฅ(SSTAA.Import)
csv ํ์ผ์ DB์ ์ ์ฅํ๋ ๊ธฐ๋ฅ ๊ตฌํ
Entity์ ๋ง๋ ํ์์ ํ์ผ ์ ํ ๊ธฐ๋ฅ, ์๋ฒ(DB)์ ์ ์ฅํ๋ ๊ธฐ๋ฅ์ผ๋ก ๋๋๋ค
์์
์ ์ํด์๋ง ์ฌ์ฉ(๋ฒ์ฉ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ด๋ ค์)
.Net FrameWork 4.8
EntityFrameWork 6.2
Winform
DevExpress 20.2.3 (Trial Version)
Windows 10
Microsoft Visual Studio Community 2019 v16.8
Microsoft SQL Server Management Studio v18.6
๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง
๋ชจ๋ ํญ๋ชฉ์ด ์ 3 ์ ๊ทํ๊น์ง ์๋ฃ๋๋ค
์ ์ ์ผ์ด์ค ๋ค์ด์ด๊ทธ๋จ
ํด๋์ค ๋ค์ด์ด๊ทธ๋จ
์ํธ์ค ๋ค์ด์ด๊ทธ๋จ
ํ๊ฐ์ ์ ๊ณ์ฐ ์ํธ์ค
๊ณ์ฐ์์ด ์๋๋๋ ์๊ฐ์ด ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ๋ ๋ฌธ์ #42
๊ณ์ฐ์์ด ์๋๋๋ ์๊ฐ์ด ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ๋ ๋ฌธ์
์์ฑํ ๊ณ์ฐ์์ ์ฝ๋๋ก ์
๋ ฅํ์ฌ ์ค์ ๊ณ์ฐ์ ์งํํ์๋๋ฐ, ์๊ฐ์ด ๋๋ฌด ์ค๋๊ฑธ๋ ธ๋ค
๋๋๋ฌธ๊ตฌ, ์ปคํผ์ ๋ฌธ์ ๊ธฐ์ค ์ฝ 2๋ถ
์์ธ์ ๊ณ์ฐ์ ์ํด ์ฆ์ DB์ ์ ๊ทผ, ํนํ๋ ๋ฉ์น๊ฐ ํฐ DB์ ์ ๊ทผํ๋ ํ์๊ฐ ๋ง์ ๊ฒ์ผ๋ก ํ๋จํ๋ค.
DB์ ์ ๊ทผํ๋ ํ์๊ฐ ์ ์ด์ง ์๋ก ๋นจ๋ผ์ง ๊ฒ์ด๋ผ ํ๋จํ์ฌ, ๊ณ์ฐ์์ ์๋์ํค๋ฉด ๋จผ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ๋ถ DB์ ์ ๊ทผํ์ฌ ๋ฐ์์จ ๋ค์ ๊ณ์ฐ์์ด ์งํ๋๋ ๋์์๋ DB์ ์ ๊ทผํ์ง ์๋๋ก ํ๋ก๊ทธ๋๋ฐํจ
๊ทธ ๊ฒฐ๊ณผ, ์๊ฐ ์ด์์ผ๋ก ์๊ฐ์ ์ค์ด๋ ๋ฐ ์ฑ๊ณตํจ
๋๋๋ฌธ๊ตฌ, ์ปคํผ์ ๋ฌธ์ ๊ธฐ์ค ์ฝ 12์ด
์ฐธ๊ณ ํ ์ฝ๋๋ ์คํฌ๋ฆฐ์ท
public List < AnnualEvaluationScoreModel > GetAnnualEvaluationScoreModels ( int upperLocationId , int fieldId )
{
// ๋ฏธ๋ฆฌ DB์ ์ ๊ทผํ์ฌ ํ์ํ ๋งํผ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ถ๋ถ
List < Station > stations = Dao . Station . GetByUpperLocation ( upperLocationId ) ;
List < LandPriceIndex > landPriceIndices = Dao . LandPriceIndex . GetByLocation ( upperLocationId ) ;
List < Competitor > competitors = Dao . Competitor . GetByField ( fieldId ) ;
// ๊ณ์ฐ์ ์งํํ์ฌ ๋ชจ๋ธ์ ์์ฑํ๋ ๋ถ๋ถ. DB์ ์ ๊ทผํ ๊ฒฝ์ฐ๋ฅผ ์ต์ํํ์ฌ ์ปฌ๋ ์
์ ๋ฐ์ดํฐ๋ก ๊ณ์ฐ์ ์งํํ๋ค
List < AnnualEvaluationScoreModel > models = new List < AnnualEvaluationScoreModel > ( ) ;
foreach ( var station in stations )
{
List < FootTraffic > footTraffics = Dao . FootTraffic . GetByStation ( station . StationId ) ;
// ...
}
// ...
return models ;
}
SHP ํ์ผ์ ์ด์ฉํ MapControl์ ๋ด๋ถ ์ ๋ณด๋ฅผ ์ฝ์ด์ค๋ ๋ฌธ์ #41
MapControl์์ ์ง์ ๋ ์์ญ์ ์ ํํ ํ, ํด๋น ์ง์ญ์ ๋ฐ์ดํฐ๋ฅผ shpํ์ผ์์ ์ฝ์ด์ค๋ ค๊ณ ํ์ผ๋ ๋ฐฉ๋ฒ์ ์ฐพ์ง ๋ชปํ์๋ค.
shp ํ์์ ์ ๋๋ก ์ดํดํ ์ํ๊ฐ ์๋์๋ค.
MapControl์์ Region, MapItem, Object์ ๊ตฌ๋ถํ์ง ๋ชปํ์๋ค.
์ํ๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์ผ๋ ค๊ณ ํ๋ค.
shp ํ์์ด 3๊ฐ ํํ์ ํ์ผ๋ค์ด ํฉ์ณ์ง vector ๋ฐ์ดํฐ ๋ผ๋ ๊ฒ์ ์ดํดํ์๋ค. ๋ํ, ๊ฐ ์์๋ค์ ๊ตฌ๋ถํ์ฌ, ์ํ๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ธฐ ์ํด์ ํ์ํ ์์๋ฅผ ์์๋ด์๋ค.
ํด๋น ๊ฐ๋ค์ MapItem.Data.Attributes๋ก ์ ๊ทผํ ์ ์์์ผ๋ฉฐ, ๋ฒกํฐํ์(binary reading)์ผ๋ก ์ ์ฅ๋์ด ์์๊ธฐ์ ์ธ์ฝ๋ฉ์ด ํ์ํ๋ค.
shapeFileAdapter๋ฅผ ์ด์ฉํด vectorItemsLayer์ ํด๋น ๋ฐ์ดํฐ๋ฅผ loadํ ๋ ํ์ํ ํ์์ผ๋ก ์ธ์ฝ๋ฉ์ ํ ํ, ์ดํ ๋ถ๋ฌ์จ ๋ฐ์ดํฐ๋ฅผ string์ผ๋ก ์บ์คํ
ํ์ฌ ํ์ํ ๊ณณ์ ์ฌ์ฉํ์๋ค.
์ฐธ๊ณ ํ ์ฝ๋๋ ์คํฌ๋ฆฐ์ท
shapefileDataAdapter1 . DefaultEncoding = Encoding . GetEncoding ( 51949 ) ;
shapefileDataAdapter1 . FileUri = new Uri ( _path [ 0 ] , UriKind . Absolute ) ;
mapControl1 . CenterPoint = new GeoPoint ( 37.5656754986042d , 126.98202985079d ) ;
mapControl1 . ZoomLevel = 10.8d ;
vectorItemsLayer1 . ItemStyle . Fill = Color . FromArgb ( 90 , Color . White ) ;
vectorItemsLayer1 . ItemStyle . Stroke = Color . White ;
vectorItemsLayer1 . SelectedItemStyle . Fill = Color . FromArgb ( 120 , Color . Blue ) ;
ํฌ๊ธฐ๊ฐ ํฐ ๋ฐ์ดํฐ๋ฅผ ํ๊บผ๋ฒ์ DB์ ์ ์ฅํ ๋ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๋ฌธ์ #23
csv file์ ๋ด์ฉ์ DB์ ์ ์ฅํ๋ ค๋๋ฐ, ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๊ฐ ๋ฐ์
FootTraffic ํ
์ด๋ธ์ ๋ค์ด๊ฐ csvํ์ผ ๋ฐ์ดํฐ๋ฅผ EF๋ฅผ ์ด์ฉํด ์ ์ฅํ๋ ค๊ณ ํ๋๋ฐ, ํ๋ก๊ทธ๋จ์ด ๋ฒ๋ฒ
๋๊ณ ์งํ๋์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์
์์ธ ํด๊ฒฐ์ ์ํด ์ฒ์์๋ ์ง์ ์ ์ฅํ๋ ๋์ Query๋ฌธ์ ๋ง๋ค์ด SQLํ์ผ๋ก SSMS๋ฅผ ์ด์ฉํด ์ ์ฅํ๋ ค๊ณ ํจ
ํ์ง๋ง SSMS์์๋ Query๋ฌธ์ด ๋๋ฌด ๊ธธ์ด์ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๊ฐ ๋ฐ์(SSMS๊ฐ 32bit๋ก ์๋ํ๊ธฐ ๋๋ฌธ์ธ ๊ฒ์ผ๋ก ์ถ์ธก๋จ)
๊ทธ๋์ ์ ์๋๊ณผ ๋
ผ์ํ ๊ฒฐ๊ณผ, ํด๋น CSVํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ถ ์ฝ์ด์ ํ๊บผ๋ฒ์ ์
๋ ฅํ๋ ๊ฒ์ด ์๋๋ผ ํ ์ค์ฉ ์ฝ์ด์ ์
๋ ฅํ๋ ๋ฐฉ์์ผ๋ก ์์ ํจ
๋น๋ก ๋๋ฆฌ๊ธฐ๋ ํ์ง๋ง ์ฐจ๊ทผ์ฐจ๊ทผ DB์ ๊ฐ์ด ๋ค์ด๊ฐ๊ณ ์๊ณ , Visual Studio ๋๋ฒ๊ทธ ๋ชจ๋์ ์ง๋จ ๋๊ตฌ๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๊ฒ์ ํ์ธํจ
์ฐธ๊ณ ํ ์ฝ๋๋ ์คํฌ๋ฆฐ์ท
// before
for ( int i = 0 ; i < rows . Count ; i ++ )
{
// ...
}
// for๋ฌธ์ผ๋ก ํ์ผ์ ๋ด์ฉ์ ์ ๋ถ ์ฝ์ด๋ค์ธ ๋ค์ DB์ ์
๋ ฅ
using ( var context = DbContextCreator . Create ( ) )
{
context . FootTraffics . AddRange ( footTraffics ) ;
context . SaveChanges ( ) ;
}
// -----------------------------------------------------------------
// after
for ( int i = 0 ; i < rows . Count ; i ++ )
{
// ...
// ํ ์ค์ ์ฝ์ ๋ค์ DB์ ์
๋ ฅ
using ( var context = DbContextCreator . Create ( ) )
{
context . FootTraffics . AddRange ( footTraffics ) ;
context . SaveChanges ( ) ;
}
}
ํฌ๋ช
๋ฐฐ๊ฒฝ์ ์ ์ ์ปจํธ๋กค์ด ๋ค๋ฅธ ์ปจํธ๋กค์ ๊ฐ๋ฆฌ๋ ๋ฌธ์ #9
์ ์ ์ปจํธ๋กค์ ํฌ๋ช
ํ๊ฒ ๋ง๋ค์ด๋ ๋ค๋ฅธ ์ปจํธ๋กค์ด ๋ณด์ด์ง ์๋ ๋ฌธ์
๋ก๋ฉ ์์ ์ถ๋ ฅ๋๋ ํ์
ํํ์ ์ปจํธ๋กค์ ๋ง๋ค๊ณ ์ถ์๋๋ฐ, ์ฃผ๋ณ ๋ค๋ฅธ ์ปจํธ๋กค์ ์๋๋์ง ์๋๋ก ํ๊ณ ์ถ์๋ค
๊ทธ๋์ ์ ์ ์ปจํธ๋กค์ ๋ง๋ค๊ณ ๋ฐฐ๊ฒฝ์ Transparent๋ก ์ค์ ํ ๋ค์ ํ์
์ญํ ์ ํ Panel์ ๋ง๋ค์๋ค.
์ดํ์ ํผ์ ๋ถ๋ฌ์๋๋ฐ, ํผ์ ์๋ ๋ค๋ฅธ ์ปจํธ๋กค์ด ๊ฐ๋ ค์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค
๊ทธ๋์ ์ปจํธ๋กค์ ํฌ๋ช
ํ๊ฒ ํ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ์๋ณด๊ธฐ๋ ํ๊ณ , DevExpress์์ ์ ๊ณตํ๋ XtraUserControl๋ก ๊ฐ๋ฅํ์ง ํ์ธํด๋ดค์ง๋ง ๊ฐ์ ๊ฒฐ๊ณผ๋ง ๋์๋ค.
๊ฒฐ๊ตญ, ํ์
์ ํผ์ผ๋ก ๋ค์ ๋ง๋ค๊ณ , ํผ์ ShowDialog๋ก ์ถ๋ ฅํ์ฌ ๋ค๋ฅธ ์ปจํธ๋กค์ด ์ ์ด๋์ง ์๋๋ก ํ๋ ๋ฐฉ์์ผ๋ก ์ ํํ๊ธฐ๋ก ํ๋ค.
์ ์ ์ปจํธ๋กค์ ํฌ๋ช
ํ๊ฒ ๋ง๋ค์ด ๋ค๋ฅธ ์ปจํธ๋กค์ด ๋น์น์ง๋ง ๋๋ฌํ์ง ๋ชปํ๋ ํํ๋ฅผ ๊ตฌํํ๊ธฐ ์ํ์ง๋ง, ์ ์ ์ปจํธ๋กค๋ ์ปจํธ๋กค์ด๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ ๋ณด๋ค ์๋์ ์๋ ์ปจํธ๋กค์ ๊ฐ๋ฆฐ๋ค๋ ์ฌ์ค์ ์๊ฒ ๋์๋ค.
์ฐธ๊ณ ํ ์ฝ๋๋ ์คํฌ๋ฆฐ์ท