標籤: 網頁設計公司

  • 大眾因電池問題在美召回近5600輛e-Golf電動汽車

    據路透社報導,大眾汽車週一稱,該公司將在美國市場上召回近5600萬輛e-Golf電動汽車,以便修復一個可能導致車輛熄火的電池問題。

    大眾汽車表示,此次召回活動將覆蓋該公司自2014年11月份在美國市場上推出電動汽車以來所售出的全部車輛。

    美國高速公路安全管理局週一稱,大眾汽車淨召回2015-2016年款e-Golf電動汽車,原因是其“高壓電池管理系統”中的軟體“可能會非故意地將短暫的內部電流浪湧/峰值分類為一種緊急的電池狀況”,從而導致車輛熄火。

    大眾汽車已在此前承認其安裝了作弊軟體,從而使得58萬輛柴油動力汽車通過了美國的實驗室排放檢測,但其實際上路時的排放則遠高於標準,並因此而面臨諸多法律訴訟和業界批評。本月早些時候,該公司稱其美國部門首席執行官將會離職。

    經銷商將為大眾汽車召回的電動汽車安裝更新好的軟體。去年,大眾汽車在美國總共售出了4232輛e-Golf汽車,遠高於2014年的357輛。在今年前兩個月時間裡,該公司則售出了526輛e-Golf。另外,此次召回活動還覆蓋了經銷商手中尚未售出的157輛電動汽車。

    大眾汽車在其向美國高速公路安全管理局提交的檔中稱,這個問題可能會“導致高電壓電池突然被關閉,從而導致車輛的電動馬達熄火”。此前,大眾汽車曾在2015年初稱其首次收到了有關一樁熄火事件的資訊;在2015年6月份,一樁熄火事件則發生了在了一輛內部測試的車輛上。

    最近幾個月以來,大眾汽車一直都在收到來自美國車主對熄火問題的投訴,從而促使其啟動了此次召回行動。

    德國報紙《星期日世界報》曾在上個月報導稱,美國當局責令大眾汽車在該國生產電動汽車,從而作為彌補其操縱柴油車排放檢測過錯的一種方式。報導稱,美國環境保護署要求大眾汽車在其位於田納西州查特努加市的工廠生產電動汽車,並要求其幫助建設一個美國電動汽車充電站網路。美國環境保護署則拒絕就此報導置評。

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

    大陸寄台灣空運注意事項

    大陸海運台灣交貨時間多久?

    ※避免吃悶虧無故遭抬價!台中搬家公司免費估價,有契約讓您安心有保障!

  • 千萬數據量數據表分表實踐

    千萬數據量數據表分表實踐

    需求

    • 對平均 1200w 數據量的數據表進行優化
    • 數據表中有 2016年,2017 年,2018 年,2019 年數據
    • 只查詢最近半年的數據
    • 後台增加歷史數據查詢功能
    • 盡量減少代碼改動

    數據表

    • 積分日誌表 tb_user_points_log
    • 虛擬充值表 tb_order_recharge
    • 虛擬充值執行表 tb_order_recharge_do

    注意

    先備份數據,在備份的數據表的基礎上進行分表,不直接操作原始表!

    步驟

    將源數據表備份一份,依次將對應年份的數據歸檔,每成功歸檔一次,就將備份數據表中對應數據刪除(目的減少查詢數據量),最後根據備份表最小 ID,刪除源數據表 小於 ID 的所有數據。

    該步驟可以直接通過 SQL 執行,也可通過腳本執行。

    腳本執行

    刪除源數據表數據操作,建議通過手動執行 SQL完成,其他操作通過腳本執行

    以積分日誌表 tb_user_points_log 為例

    方式一、手動執行SQL

    1. 備份 tb_user_points_log 得到 tb_user_points_copy

      2016年數據歸檔

    2. 將數據表 tb_user_points_copy 2016 年的數據歸檔存入 2016 年數據表 tb_user_points_log_2016

      CREATE TABLE tb_user_points_log_2016 LIKE tb_user_points_log_copy;
      INSERT INTO tb_user_points_log_2016 SELECT * FROM tb_user_points_log_copy WHERE add_time < 1483200000;
      
    3. 對比數量

      SELECT COUNT(id) FROM tb_user_points_log_2016;
      SELECT COUNT(id) FROM tb_user_points_log_copy WHERE add_time < 1483200000;
      
    4. 一致則刪除 tb_user_points_copy 的 2016 年數據

      DELETE FROM tb_user_points_log_copy WHERE add_time < 1483200000;
      

      2017年數據歸檔

    5. 將數據表 tb_user_points_copy 2017 年的數據歸檔存入 2017 年數據表 tb_user_points_log_2017

      CREATE TABLE tb_user_points_log_2017 LIKE tb_user_points_log_copy;
      INSERT INTO tb_user_points_log_2017 SELECT * FROM tb_user_points_log_copy WHERE add_time < 1514736000;
      
    6. 對比數量

      SELECT COUNT(id) FROM tb_user_points_log_2017;
      SELECT COUNT(id) FROM tb_user_points_log_copy WHERE add_time < 1514736000;
      
    7. 一致則刪除 tb_user_points_copy 的 2017 年數據

      DELETE FROM tb_user_points_log_copy WHERE add_time < 1514736000;
      

      2018年數據歸檔

    8. 將數據表 tb_user_points_copy 2018 年的數據歸檔存入 2018 年數據表 tb_user_points_log_2018

      CREATE TABLE tb_user_points_log_2018 LIKE tb_user_points_log_copy;
      INSERT INTO tb_user_points_log_2018 SELECT * FROM tb_user_points_log_copy WHERE add_time < 1546272000;
      
    9. 對比數量

      SELECT COUNT(id) FROM tb_user_points_log_2018;
      SELECT COUNT(id) FROM tb_user_points_log_copy WHERE add_time < 1546272000;
      
    10. 一致則刪除 tb_user_points_copy 的 2018 年數據

      DELETE FROM tb_user_points_copy WHERE add_time < 1546272000;
      

      2019年數據歸檔

    11. 現在是 11 月,將 5 月之前的數據歸檔

      CREATE TABLE tb_user_points_log_2019 LIKE tb_user_points_log_copy;
      INSERT INTO tb_user_points_log_2019 SELECT * FROM tb_user_points_log_copy WHERE add_time < 1556640000;
      
    12. 對比數量

      SELECT COUNT(id) FROM tb_user_points_log_2019;
      SELECT COUNT(id) FROM tb_user_points_log_copy WHERE add_time < 1556640000;
      
    13. 一致則刪除 tb_user_points_copy 的 2019 年 5 月之前的數據

      DELETE FROM tb_user_points_log_copy WHERE add_time < 1556640000;
      

      刪除原始數據

    14. 根據最小 tb_user_points_copy 的最小 ID,刪除原始表 小於 ID 的所有數據

      DELETE FROM tb_user_points_log WHERE id < (SELECT id FROM tb_user_points_log_copy ORDER BY id asc LIMIT 1);
      
    15. 刪除臨時表

      DELETE FROM tb_user_points_log_copy;
      
    16. 數據表分表完成!

    17. 增量歸檔

      每日凌晨,執行腳本將最近半年之前的數據歸檔

    方式二、腳本執行

    <?php
    /**
     * Description: 將6個月前數據歸檔
     */
    
    namespace wladmin\cmd;
    
    
    use think\console\Command;
    use think\console\Input;
    use think\console\Output;
    use think\Db;
    
    class DataArchiving extends Command
    {
        protected function configure()
        {
            $this->setName('DataArchiving')->setDescription('將6個月前數據歸檔');
        }
    
        /**
         * 將6個月前數據歸檔
         * php think DataArchiving
         * @param Input $input
         * @param Output $output
         *
         * @return int|void|null
         */
        protected function execute(Input $input, Output $output)
        {
            try {
                $this->archiveData('tb_user_points_log', 'id', 'add_time');
                $this->archiveData('tb_order_recharge', 'or_id', 'create_time');
                $this->archiveData('tb_order_recharge_do', 'ord_id', 'create_time');
                echo '歸檔完成';
            } catch (\Exception $e) {
                mylog($e->getMessage(),'歸檔發生錯誤:'.PHP_EOL);
            }
        }
      
             /**
         * 歸檔數據表
         * @param string $sourceTable 源數據表名
         * @param string $primaryKey 主鍵名
         * @param string $timeKey 時間鍵名
         *
         * @author Dong.cx 2019-11-18 18:05
         * @version V4.0.1
         */
        private function archiveData($sourceTable, $primaryKey, $timeKey)
        {
            try {
                date_default_timezone_set('PRC');
                // 1.複製源數據表
                $copyTable = $sourceTable . '_copy';
                $isExist = $this->tableExist($copyTable, $sourceTable);
                if (!$isExist) {
                    echo "開始複製源數據表{$copyTable}" . PHP_EOL;
                    $archivingTimeLine = time();
                    $sql = "INSERT IGNORE INTO {$copyTable} SELECT * FROM {$sourceTable} WHERE {$timeKey} < {$archivingTimeLine}";
                    Db::execute($sql);
                    echo "複製源數據表{$copyTable}完成" . PHP_EOL;
                }
                echo "{$copyTable} 開始歸檔" . PHP_EOL;
                // 歸檔
                $this->archive(2016, $sourceTable, $primaryKey, $timeKey);
                $this->archive(2017, $sourceTable, $primaryKey, $timeKey);
                $this->archive(2018, $sourceTable, $primaryKey, $timeKey);
                $this->archive(2019, $sourceTable, $primaryKey, $timeKey);
                echo "{$copyTable} 歸檔完成";
    
            } catch (\Exception $e) {
                echo '歸檔發生錯誤:' . $e->getMessage() .PHP_EOL;
            }
        }
    
        /**
         * 歸檔操作
         * @param int $year 年份
         * @param string $sourceTable 源數據表名
         * @param string $primaryKey 主鍵名
         * @param string $timeKey 時間鍵名
         *
         * @return bool
         * @throws \Exception
         * @author Dong.cx 2019-11-18 18:12
         * @version V4.0.1
         */
        private function archive($year, $sourceTable, $primaryKey, $timeKey)
        {
            try {
                $copyTable = $sourceTable . '_copy';
                echo "{$copyTable} 開始歸檔{$year}年數據--->" . PHP_EOL;
                if ($year == date('Y')) {
                    // 注意現在是 11月份,可以簡單這樣寫,如果是小於6月,則要相應修改
                    $archivingTimeLine = strtotime('-6 month', strtotime('today'));
                } else {
                    $archivingTimeLine = mktime(0,0,0,1,1,$year+1);
                }
    
                $sql = "SELECT COUNT({$primaryKey}) as num FROM {$copyTable} WHERE {$timeKey} < {$archivingTimeLine}";
                $res = Db::query($sql);
                if (!$res || !$res[0]['num']) {
                    echo "{$copyTable} {$year}年數據歸檔完成,未查詢到需要歸檔的數據" . PHP_EOL;
                    return true;
                }
    
                // 需歸檔數量
                $targetNum = $res[0]['num'];
                // 歸檔表名
                $tableArchivingName = $sourceTable . '_' . $year;
                $this->tableExist($tableArchivingName, $sourceTable);
    
                // 分批歸檔
                $this->archivingBatch($tableArchivingName, $copyTable, $primaryKey,$timeKey, $archivingTimeLine, $year, $targetNum);
    
                return true;
            } catch (\Exception $e) {
                throw $e;
            }
        }
    
        /**
         * 分批歸檔
         * @param string $tableArchivingName 歸檔表名稱
         * @param string $copyTable 複製表名
         * @param string $primaryKey 主鍵名
         * @param string $timeKey 時間鍵
         * @param int $archivingTimeLine 歸檔時間線
         * @param string $year 歸檔年
         * @param int $targetNum 需歸檔的數據量
         *
         * @throws \Exception
         * @author Dong.cx 2019-11-19 13:10
         * @version V4.0.1
         */
        private function archivingBatch($tableArchivingName, $copyTable, $primaryKey,$timeKey, $archivingTimeLine, $year, $targetNum)
        {
            // 歸檔表起始ID
            $res = Db::query("SELECT {$primaryKey} FROM {$tableArchivingName} ORDER BY {$primaryKey} DESC LIMIT 1");
            $startID = $res ? $res[0][$primaryKey] : 0;
    
            $totalDelNum = 0;
            $batchNum = 10000;
            $taskNum = ceil($targetNum/$batchNum);
            $minID = Db::query("SELECT {$primaryKey} FROM {$copyTable} ORDER BY {$primaryKey} ASC LIMIT 1");
            if (!$minID) throw new \Exception('$minID為空!');
            $minID = $minID[0][$primaryKey];
            $maxID = Db::query("SELECT {$primaryKey} FROM {$copyTable} WHERE {$timeKey} < {$archivingTimeLine} ORDER BY {$primaryKey} DESC LIMIT 1");
            if (!$maxID) throw new \Exception('$max 為空!');
            $maxID = $maxID ? $maxID[0][$primaryKey] : 0;
    
            for ($i = 1; $i <= $taskNum; $i++) {
                if ($i == $taskNum) {
                    // 歸檔
                    $sql = "INSERT IGNORE INTO {$tableArchivingName} SELECT * FROM {$copyTable} WHERE {$primaryKey} <= {$maxID} AND {$timeKey} < {$archivingTimeLine}";
                    Db::execute($sql);
                    // 刪除
                    $sql = "DELETE FROM {$copyTable} WHERE {$primaryKey} <= {$maxID} AND {$timeKey} < {$archivingTimeLine}";
                    $totalDelNum += Db::execute($sql);
                } else {
                    $end = $minID + $i * $batchNum;
                    // 歸檔
                    $sql = "INSERT IGNORE INTO {$tableArchivingName} SELECT * FROM {$copyTable} WHERE {$primaryKey} <= {$end} AND {$timeKey} < {$archivingTimeLine}";
                    Db::execute($sql);
                    // 刪除
                    $sql = "DELETE FROM {$copyTable} WHERE {$primaryKey} <= {$end} AND {$timeKey} < {$archivingTimeLine}";
                    $totalDelNum += Db::execute($sql);
                }
            }
            // 成功歸檔數據量
            $num = Db::query("SELECT COUNT({$primaryKey}) as num FROM {$tableArchivingName} WHERE {$primaryKey} > {$startID}")[0]['num'];
            if ($targetNum != $num) throw new \Exception("歸檔數據不一致,過期數據量{$targetNum},歸檔量{$num},刪除量{$totalDelNum}");
            if ($num != $totalDelNum) throw new \Exception("刪除數據不一致,歸檔量{$num},刪除量{$totalDelNum}");
    
            echo "{$copyTable} {$year}年數據歸檔完成,過期數據量{$targetNum},歸檔量{$num},刪除量{$totalDelNum}" . PHP_EOL;
            
            // 刪除源數據表數據
            //echo "開始刪除源數據表 {$sourceTable}已歸檔數據" . PHP_EOL;    
            //$num = Db::execute("DELETE FROM {$sourceTable} WHERE {$primaryKey} < (SELECT id FROM {$copyTable} ORDER BY {$primaryKey} asc LIMIT 1)");
           //echo "源數據表 {$sourceTable}已歸檔數據刪除完成,刪除數據量{$num}" . PHP_EOL; 
          
            //echo "開始刪除臨時表 {$copyTable}" . PHP_EOL;    
            // 刪除臨時表
            //Db::execute("DELETE FROM {$copyTable}");
            //echo "臨時表{$copyTable}刪除完成" . PHP_EOL;
        }
    

    最後由於是要刪除源數據表,屬於敏感操作,(腳本最後註釋部分) 建議再複查一次數據歸檔正確性,確認無誤后,手動執行 SQL操作。

    DELETE FROM {$sourceTable} WHERE {$primaryKey} < (SELECT {$primaryKey} FROM {$copyTable} ORDER BY {$primaryKey} asc LIMIT 1;
    DELETE FROM {$copyTable};
    

    增量歸檔腳本

    <?php
    /**
     * Description: 將6個月前數據歸檔
     */
    
    namespace wladmin\cmd;
    
    
    use think\console\Command;
    use think\console\Input;
    use think\console\Output;
    use think\Db;
    
    class DataArchiving extends Command
    {
        protected function configure()
        {
            $this->setName('DataArchiving')->setDescription('將6個月前數據歸檔');
        }
    
        /**
         * 將6個月前數據歸檔
         * php think DataArchiving
         * @param Input $input
         * @param Output $output
         *
         * @return int|void|null
         */
        protected function execute(Input $input, Output $output)
        {
            try {
                $this->archiveDataEveryDay('tb_user_points_log', 'id', 'add_time');
                $this->archiveDataEveryDay('tb_order_recharge', 'or_id', 'create_time');
                $this->archiveDataEveryDay('tb_order_recharge_do', 'ord_id', 'create_time');
                echo '歸檔完成';
            } catch (\Exception $e) {
                mylog($e->getMessage(),'歸檔發生錯誤:'.PHP_EOL);
            }
        }
    
        /**
         * 歸檔數據
         * @param string $sourceTable 源數據表名
         * @param string $primaryKey 源數據表主鍵名
         * @param string $timeKey 時間控制鍵名
         *
         * @return bool
         * @throws \Exception
         * @author Dong.cx 2019-11-15 18:36
         * @version V4.0.1
         */
        private function archiveDataEveryDay($sourceTable, $primaryKey, $timeKey)
        {
            try {
                //mylog("{$sourceTable} 開始歸檔".PHP_EOL);
                // 歸檔時間線
                $archivingTimeLine = strtotime('-6 month', strtotime('today'));
                // 歸檔表的年份
                $year = date('Y', $archivingTimeLine);
                // 歸檔表名
                $tableArchivingName = $sourceTable . '_' . $year;
    
                // 需要歸檔的數據量
                $sql = "SELECT COUNT({$primaryKey}) as num FROM {$sourceTable} WHERE {$timeKey} < {$archivingTimeLine}";
                $res = Db::query($sql);
                // 沒有需要歸檔的,直接返回
                if (!$res) {
                    mylog("{$sourceTable} 歸檔完成,未查詢到需要歸檔的數據");
                    return true;
                }
                $count = $res[0]['num'];
    
                // 檢測數據表是否存在,不存在則創建
                $this->tableExist($tableArchivingName, $sourceTable);
                $sql = "INSERT IGNORE INTO {$tableArchivingName} SELECT * FROM {$sourceTable} WHERE {$timeKey} < {$archivingTimeLine}";
    
                // 1.開始歸檔
                // 歸檔表起始ID
                $res = Db::query("SELECT {$primaryKey} FROM {$tableArchivingName} ORDER BY {$primaryKey} DESC LIMIT 1");
                $startID = $res ? $res[0][$primaryKey] : 0;
                Db::execute($sql);
                // 成功歸檔數據量
                $num = Db::query("SELECT COUNT({$primaryKey}) as num FROM {$tableArchivingName} WHERE {$primaryKey} > {$startID}")[0]['num'];
                if ($count != $num) throw new \Exception("歸檔數據不一致,過期數據量{$count},歸檔量{$num}");
                $lastID = Db::query("SELECT {$primaryKey} FROM {$tableArchivingName} ORDER BY {$primaryKey} DESC LIMIT 1")[0][$primaryKey];
    
                // 2.刪除源數據
                $sql = "DELETE FROM {$sourceTable} WHERE {$primaryKey} <= {$lastID}  AND {$timeKey} < {$archivingTimeLine}";
                $delNum = Db::execute($sql);
                if ($delNum != $count) throw new \Exception("刪除數據不一致,過期數據量{$count},刪除量{$delNum}");
                //mylog("{$sourceTable} 歸檔完成,過期數據量{$count},歸檔量{$count},刪除量{$delNum}" . PHP_EOL);
                return true;
            } catch (\Exception $e) {
                Db::rollback();
                throw $e;
            }
        }
    
        /**
         * 檢測數據表是否存在,不存在則創建
         * @param $table
         * @param $likeTable
         */
        private function tableExist($table, $likeTable)
        {
            $sql = "SHOW TABLES LIKE '{$table}'";
            $isExist = Db::query($sql);
    
            if (!$isExist) {
                Db::execute("CREATE TABLE {$table} LIKE {$likeTable}");
            }
        }
    }
    

    歷史數據查詢

    在數據訪問層中根據需要查詢時間 動態修改數據表名即可

    這裏使用的是 thinkphp Query 類中的 setTable()getTable()

     if (isset($params['history']) && !empty($params['history'])) {
                $this->model()->setTable($this->model()->getTable().'_'.$params['history']);
            }
    

    遇到的問題

    • 開發中,曾嘗試使用事務控制,數據量太多會導致提交過慢,因此使用邏輯控制
    • DB 一次性執行100多w刪除操作后,發現程序不繼續向下執行,未找到原因,因此將數據分批進行處理,但是分批可能存在問題,因為主鍵可能不是連續的,如果間隔不大的話,影響不大。

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※帶您來了解什麼是 USB CONNECTOR  ?

    ※自行創業 缺乏曝光? 下一步”網站設計“幫您第一時間規劃公司的門面形象

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

    ※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

    ※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

    ※試算大陸海運運費!

  • Geometry 判斷幾何是否被另一個幾何/線段分割成多段

    Geometry 判斷幾何是否被另一個幾何/線段分割成多段

    如下圖,如何判斷幾何多邊形A被多邊形B,切割為多段幾何?

     幾何A被幾何B切割

    1. 獲取幾何A與幾何B的交集C

     var intersectGeometry = new CombinedGeometry(GeometryCombineMode.Intersect, geometry1, geometry2); 

     

     

    2.幾何A排除交集C,得到餘下空白區域D

     var combinedGeometry = new CombinedGeometry(GeometryCombineMode.Exclude, geometry1, intersectGeometry); 

     

     3.判斷幾何D區域是否包含多段幾何

    幾何D區分為倆段,獲取域的邊框近似點集,發現含有倆段線條的描述(倆段M->z的文本),與真實幾何分段對應。

    所以,可以通過線條終止字符”z”個數,來判斷幾何的分段數量。

    • 獲取幾何的近似多邊形值
    • 獲取其路徑內的點集
    • 判斷點集中是否含有2個及以上的線條繪製結束字符”z”
    1     var flattenedPathGeometry = combinedGeometry.GetFlattenedPathGeometry();
    2     var outerPointsString = flattenedPathGeometry.Figures.ToString();
    3     if (outerPointsString.Length > 2
    4         && outerPointsString.Replace("z", string.Empty).Length == outerPointsString.Length - 2)
    5     {
    6         return true;
    7     }

     完整函數見下方代碼

     1     /// <summary>
     2     /// 檢查幾何是否被另一個幾何分割成多段
     3     /// </summary>
     4     /// <param name="geometry1"></param>
     5     /// <param name="geometry2"></param>
     6     /// <returns></returns>
     7     private bool CheckGeometryIsDividedByAnotherGeometry(PathGeometry geometry1, Geometry geometry2)
     8     {
     9         var intersectGeometry = new CombinedGeometry(GeometryCombineMode.Intersect, geometry1, geometry2);
    10         var combinedGeometry = new CombinedGeometry(GeometryCombineMode.Exclude, geometry1, intersectGeometry);
    11         var flattenedPathGeometry = combinedGeometry.GetFlattenedPathGeometry();
    12         var outerPointsString = flattenedPathGeometry.Figures.ToString();
    13         var geometryList = outerPointsString.Split(new[] { 'M' }, StringSplitOptions.RemoveEmptyEntries).Where(i => i.Contains("z")).Select(i => $"M{i}").ToList();
    14         if (geometryList.Count >= 2 && HintStrokePath.Data == null)
    15         {
    16             var a = Geometry.Parse(geometryList[0]); ;
    17             var b = Geometry.Parse(geometryList[1]); ;
    18         }
    19         if (outerPointsString.Length > 2
    20             && outerPointsString.Replace("z", string.Empty).Length == outerPointsString.Length - 2)
    21         {
    22             return true;
    23         }
    24         return false;
    25     }

    View Code

    4. 獲取幾何被分割后的多段幾何內容

    解析”M”、”z”,分別獲取倆段幾何數據

    1     var geometryList = outerPointsString.Split(new[] { 'M' }, StringSplitOptions.RemoveEmptyEntries).Where(i => i.Contains("z")).Select(i => $"M{i}").ToList();
    2     if (geometryList.Count >= 2)
    3     {
    4         var geometry1 = Geometry.Parse(geometryList[0]); ;
    5         var geometry2 = Geometry.Parse(geometryList[1]); ;
    6     }

    幾何被直線分割

    幾何被線段分割,如何判斷或者獲取分割后的多段幾何?

    直接用線段與幾何重複上面的步驟,是有問題的。

    線段類似“M150,130L150,1300 150,170z”去與幾何去交集,CombinedGeometry中的數據是空的

    需要給線條添加1的粗細:

      var geometry2 = lineGeometry.GetWidenedPathGeometry(new System.Windows.Media.Pen(System.Windows.Media.Brushes.Black, 1)); 

    結果如下圖:

     

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

    ※專營大陸快遞台灣服務

    台灣快遞大陸的貨運公司有哪些呢?

  • 克羅埃西亞強震 鄰國斯洛維尼亞核電廠未受影響

    摘錄自2020年3月22日聯合報報導

    中歐國家克羅埃西亞今天(22日)上午遭遇規模5.3地震襲擊,鄰國斯洛維尼亞隨後表示,境內唯一一座位在克斯科(Krsko)的克斯科核電廠(NEK)並未受到影響。

    克斯科核電廠是斯洛維尼亞(Slovenia)和克羅埃西亞共有。斯洛維尼亞核子安全局長塞奇(Igor Sirc)在地震後表示:「這座核電廠持續以全產能運作。」但當局已展開正常預防程序,對核電廠的系統與設備進行檢查

    克羅埃西亞首都薩格勒布(Zagreb)北方發生規模5.3強震,引發人們奔逃上街,並造成建築物損害、車輛遭崩塌的瓦礫掩埋,還發生多起火警。

    核能
    災害
    能源議題
    土地水文
    國際新聞
    克羅埃西亞
    斯洛維尼亞
    地震
    核電廠

    本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※帶您來了解什麼是 USB CONNECTOR  ?

    ※自行創業 缺乏曝光? 下一步”網站設計“幫您第一時間規劃公司的門面形象

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

    ※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

    ※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

    ※試算大陸海運運費!

  • 強颱哈吉貝沖走91袋核災污染廢棄物 日官方估:12存放所有相同危機

    摘錄自2020年3月17日自由時報報導

    去年第19號颱風哈吉貝重創日本關東地區,更衝刷走核災污染物臨時存放所中的污染物,引發擔憂。經日本環境省調查,在同樣降雨量下,部分臨存放所都隱藏著廢棄物流出危機;今(17日)內閣會議之後,環境大臣小泉進次郎對此做出回應。

    環境省就存放所週邊河流與潛在淹水地區的322個地點進行調查,按強颱哈吉貝的降雨強度標準評估,共有12處臨時存放所,都有污染廢棄物流出的可能性,甚至還有土石流撕破塑膠袋等潛藏危機。

    小泉進次郎在記者會上表示,鑑於近年暴雨的危機逐漸高升,望盡可能對此提早採取應變措施。對此,環境省將以搬運污染物至臨時存儲設施中存放、加裝圍欄以防流出等方式作為5月底以前的應變對策。

    公害污染
    廢棄物
    核能
    能源議題
    國際新聞
    日本
    核災

    本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

    ※專營大陸快遞台灣服務

    台灣快遞大陸的貨運公司有哪些呢?

  • 武漢肺炎拖慢氣候行動腳步 開發中國家恐交不出升級版減碳目標

    環境資訊中心綜合外電;姜唯 編譯;林大利 審校

    本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

    大陸寄台灣空運注意事項

    大陸海運台灣交貨時間多久?

    ※避免吃悶虧無故遭抬價!台中搬家公司免費估價,有契約讓您安心有保障!

  • 福特計畫推出全新新能源車型 或將命名為Model E

    據海外媒體報導稱福特計畫推出一款全新新能源車型,其很有可能會命名為Model E。

    福特公司把這款Model E定位於一款緊湊車型,這款車會推出混動、插電式混動以及純電動版本,主要取代的是純電動版福克斯以及混動版和插電式混動版C-MAX。

    另外,福特公司將會投資16億美元的資金,在墨西哥San Luis Potosi建設全新的工廠,並且這款Model E也將會在這座工廠生產。這款車將在2018年正式亮相,在2019年投放市場。

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※帶您來了解什麼是 USB CONNECTOR  ?

    ※自行創業 缺乏曝光? 下一步”網站設計“幫您第一時間規劃公司的門面形象

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

    ※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

    ※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

    ※試算大陸海運運費!

  • 第六屆中國國際新能源汽車論壇2016即將在下周隆重開幕!

    第六屆中國國際新能源汽車論壇2016即將在下周隆重開幕!

    2016年4月20-22日∣中國·上海安亭穎奕皇冠假日酒店
    電池、電控電機、充電設施、汽車電子
    車聯網、車後市、創新核心技術、無線充電

    由希邁商務諮詢(上海)有限公司主辦的2016年第六屆中國國際新能源汽車論壇即將于下周4月20日-4月22日在上海隆重舉行。此次論壇獲得了亞太電動車學會、國家新能源機動車產品品質監督檢驗中心、上海交大密西根學院、賽迪顧問及中國綠色能源產業技術創新戰略聯盟的大力支持。截止3月14日,論壇已經確認42位演講嘉賓出席本次論壇並做高品質學術演講。演講嘉賓分別來自菲律賓電動車協會、國家新能源機動車產品品質監督檢驗中心、美國國家能源局、中國工程院等在內的政府單位與研究機構,以及包括寶馬、通用汽車、特斯拉、長安汽車、宇通客車、奇瑞、比亞迪戴姆勒、上汽、北汽、觀致等在內的多個知名整車商,將在論壇上共同研討新能源汽車行業發展趨勢、技術路線及難點、基礎設施建設、商業模式,延續以往的豐碩成果,繼續為新能源汽車行業作出貢獻。

    本屆得到行業內世界百強企業麥格納動力總成與格特拉克聯合作為論壇的鉑金贊助,同時也獲得了寧波招寶磁業有限公司作為論壇的銀牌贊助,廈門宏發電力電器有限公司作為論壇的銅牌贊助及北京易微行科技有限公司作為論壇的晚宴贊助的大力支持。此外,論壇還獲得了30多家來自全世界各地的知名媒體進行宣傳,並且將會在現場為部分企業進行專題訪問,將在為期3天的論壇上進行全方位的即時報導。

    本屆論壇相比歷屆舉辦規模最大的第六屆新能源汽車論壇,涉及主論壇及三個分論壇、考察活動、頒獎典禮和交流晚宴。屆時將有全球範圍內的整車製造商、電網電力公司、電池廠商、零部件供應商、核心技術提供商和政府官員一起,對新能源汽車產業面臨的挑戰,機遇與對策各方面進行為期三天更深層次並具有建設和戰略性的探討。歡迎各位行業內人士積極參與,如有意向請聯繫組委會,期待與您下周共同參與!

    會議結構

    大會連絡人:Hill ZENG(曾先生)
    聯繫電話:0086 21-6045 1760 或郵箱
    我們期待與貴單位一起出席於2016年4月20-22日在上海舉辦的第六屆中國國際新能源汽車論壇2016,以利決策!

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

    ※專營大陸快遞台灣服務

    台灣快遞大陸的貨運公司有哪些呢?

  • 蘋果電動車專案未止步,挖角、研發行動低調進行中

    市場瘋傳蘋果(Apple)將推出電動車,但至今仍只聞樓梯響。不過,海外媒體持續傳出蘋果電動車專案仍有大小動作,包含聘用新人、營運研發實驗室等,計畫看來並未胎死腹中。

    蘋果電動車的計畫代號傳聞為「Titan」,傳言將在2019年正式開始出貨。蘋果電動車被報導將搭載自動駕駛技術,也會研究採用載運工具共享服務。

    科技網站Electrek報導,蘋果將聘用原特斯拉(Tesla)工程開發副總裁Chris Porritt接替將要離職的Steve Zadesky,繼續執行與電動車專案相關的工作。而在這之前,蘋果已從特斯拉、福特、賓士、通用汽車等國際車廠與電池廠挖角專家,也聘用曾在福斯汽車、Nvidia等公司服務,專注於先進駕駛輔助系統與自動駕駛系統領域的專業人士。

    此外,MacRumors也引述德國FrankfurterAllgemeine Zeitung報導,指出蘋果正在德國柏林暗中營運一座研發實驗室,共有15~20名研發人員,主要來自德國汽車產業界,或許正是蘋果電動車專案的一部分。

    蘋果執行長Tim Cook過去曾參訪BMW的電動車i3產線,與電動車相關的傳言滿天飛。但蘋果對於電動車計畫始終守口如瓶,沒有正面回應。

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

    大陸寄台灣空運注意事項

    大陸海運台灣交貨時間多久?

    ※避免吃悶虧無故遭抬價!台中搬家公司免費估價,有契約讓您安心有保障!

  • 長安李偉:汽車智慧化分為智慧駕駛、智慧互聯和智慧交互三大發展範疇

    未來汽車應該是什麼樣子?每個人都有自己的想像,每個車企都有各自的概念。而在差異化之中的相似之處是,許多企業都把智慧化作為發展方向,將無人駕駛作為嘗試的關鍵步驟。

    長安汽車副總裁李偉表示智慧汽車可分為三大發展範疇:智慧駕駛、智慧互聯和智慧交互,而智慧駕駛又可分為四級技術水準。

    智慧汽車的第一個範疇——智慧駕駛。對於長安汽車來講,智慧駕駛的一級技術已經成熟且在車上搭載,例如全速的自我調整巡航,緊急高速自動、緊急制動等,這些技術都已經在16款睿騁、CS75、逸動等車型上實現量產;智慧駕駛的二級技術,現在已經在做產品的研發和測試,二級技術主要是在一級自我調整巡航系統的基礎上升級,爭取把手解脫了,另外再加一個全自動倒車,二級的系統長安預計在2017年要量產;智慧駕駛三級技術水準是實現在高速路段的無人駕駛,從重慶到北京的整個無人駕駛汽車,實際上就是智慧駕駛的三級水準,長安汽車計畫在2018年實現整個技術儲備開發,全部匹配結束,2019年能夠得以上市。另外全自動化駕駛技術,就是智慧駕駛的最高級四級,長安努力爭取在2025年前能夠實現量產。

    智能汽車的第二個範疇——智能互聯。李偉簡單舉了個例子,“現在長安在美國MTC現場進行叫智慧互聯汽車,它實際上是車和車可以通訊,車和路可以通訊,車和交通信號可以通訊等等。大家如果設想一下,我們現在長安目前的無人駕駛狀態,實際上是靠車本身的信號識別來判斷我的交通情況。未來如果說我們城市是智慧城市,我的交通都是數位的信號,在一公里之前車就能感知我那邊的紅綠燈什麼時候變紅燈什麼時候變綠燈,除了前邊車之外還有什麼車,通過車和車的通訊就會知道,這樣整個交通就會更加更加智慧。未來智慧城市,車聯網和車更加融合,這個車就會更加智慧,沒看到就會知道是什麼前邊情況,從這個方面來講,傳統自動智慧駕駛汽車和智慧互聯再有機的融合,就會帶來更聰明的汽車,就會有更自動的汽車。”

    智能汽車的第三個範疇——智能交互。這個階段就是所謂的”人機交互”階段,需要發出什麼指令,不用操作,也不用說出來,只需要在腦袋裡一想,汽車就能執行相應命令。

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

    大陸寄台灣空運注意事項

    大陸海運台灣交貨時間多久?

    ※避免吃悶虧無故遭抬價!台中搬家公司免費估價,有契約讓您安心有保障!