正在显示
15 个修改的文件
包含
680 行增加
和
188 行删除
BuildImage-arm64/Dockerfile
0 → 100644
1 | +From osgeo/gdal:ubuntu-small-3.4.1 | ||
2 | + | ||
3 | + | ||
4 | +WORKDIR /root | ||
5 | +#设置编码 | ||
6 | +ENV LANG=en_US.UTF-8 | ||
7 | +#设置时区 | ||
8 | +ENV TZ=Asia/Shanghai | ||
9 | + | ||
10 | +COPY . . | ||
11 | + | ||
12 | +RUN apt-get update | ||
13 | +#安装pip3 | ||
14 | +RUN apt-get install python3-pip -y | ||
15 | +#安装apache2 | ||
16 | +RUN apt-get install apache2 -y && apt-get install apache2-dev -y | ||
17 | +#安装pg_config | ||
18 | +RUN apt-get install libpq-dev | ||
19 | +#安装依赖 | ||
20 | +RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn | ||
21 | + | ||
22 | +RUN mod_wsgi-express install-module | ||
23 | + |
BuildImage-arm64/requirements.txt
0 → 100644
1 | +flask==1.1.2 | ||
2 | +SQLAlchemy==1.3.17 | ||
3 | +Flask-SQLAlchemy==2.4.3 | ||
4 | +flask_cors==3.0.8 | ||
5 | +flasgger==0.9.5 | ||
6 | +psycopg2-binary==2.8.5 | ||
7 | +pyDes==2.0.1 | ||
8 | +mod_wsgi==4.8.0 | ||
9 | +opencv-python-headless==4.5.1.48 | ||
10 | +thrift==0.13.0 | ||
11 | +Authlib==0.13 | ||
12 | +kazoo==2.8.0 | ||
13 | +paramiko==2.8.0 | ||
14 | +requests==2.26.0 | ||
15 | +schedule==1.1.0 | ||
16 | +gmssl==3.2.1 | ||
17 | +pycryptodome==3.13.0 | ||
18 | +oauthlib==3.2.0 | ||
19 | + | ||
20 | + | ||
21 | +MarkupSafe==2.0.1 | ||
22 | +itsdangerous==1.1.0 | ||
23 | +Werkzeug==2.0.1 | ||
24 | +Jinja2==3.0.1 |
BuildImage-arm64/second-build/Dockerfile
0 → 100644
1 | +From osgeo/gdal:ubuntu-small-3.4.1 | ||
2 | +WORKDIR /root | ||
3 | +#设置编码 | ||
4 | +ENV LANG=en_US.UTF-8 | ||
5 | +#设置时区 | ||
6 | +ENV TZ=Asia/Shanghai | ||
7 | + | ||
8 | +#安装apache2 | ||
9 | +RUN apt-get update | ||
10 | +RUN apt-get install apache2 -y | ||
11 | + | ||
12 | +COPY --from=dci/dmapserver:build-dev /usr/local /usr/local | ||
13 | +COPY --from=dci/dmapserver:build-dev /usr/lib/apache2/modules /usr/lib/apache2/modules | ||
14 | +CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"] | ||
15 | + | ||
16 | + |
@@ -14,6 +14,8 @@ RUN apt-get update | @@ -14,6 +14,8 @@ RUN apt-get update | ||
14 | RUN apt-get install python3-pip -y | 14 | RUN apt-get install python3-pip -y |
15 | #安装apache2 | 15 | #安装apache2 |
16 | RUN apt-get install apache2 -y && apt-get install apache2-dev -y | 16 | RUN apt-get install apache2 -y && apt-get install apache2-dev -y |
17 | +#安装pg_config | ||
18 | +RUN apt-get install libpq-dev | ||
17 | #安装依赖 | 19 | #安装依赖 |
18 | RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn | 20 | RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn |
19 | 21 |
apache2.arm64.conf
0 → 100644
1 | +# This is the main Apache server configuration file. It contains the | ||
2 | +# configuration directives that give the server its instructions. | ||
3 | +# See http://httpd.apache.org/docs/2.4/ for detailed information about | ||
4 | +# the directives and /usr/share/doc/apache2/README.Debian about Debian specific | ||
5 | +# hints. | ||
6 | +# | ||
7 | +# | ||
8 | +# Summary of how the Apache 2 configuration works in Debian: | ||
9 | +# The Apache 2 web server configuration in Debian is quite different to | ||
10 | +# upstream's suggested way to configure the web server. This is because Debian's | ||
11 | +# default Apache2 installation attempts to make adding and removing modules, | ||
12 | +# virtual hosts, and extra configuration directives as flexible as possible, in | ||
13 | +# order to make automating the changes and administering the server as easy as | ||
14 | +# possible. | ||
15 | + | ||
16 | +# It is split into several files forming the configuration hierarchy outlined | ||
17 | +# below, all located in the /etc/apache2/ directory: | ||
18 | +# | ||
19 | +# /etc/apache2/ | ||
20 | +# |-- apache2.conf | ||
21 | +# | `-- ports.conf | ||
22 | +# |-- mods-enabled | ||
23 | +# | |-- *.load | ||
24 | +# | `-- *.conf | ||
25 | +# |-- conf-enabled | ||
26 | +# | `-- *.conf | ||
27 | +# `-- sites-enabled | ||
28 | +# `-- *.conf | ||
29 | +# | ||
30 | +# | ||
31 | +# * apache2.conf is the main configuration file (this file). It puts the pieces | ||
32 | +# together by including all remaining configuration files when starting up the | ||
33 | +# web server. | ||
34 | +# | ||
35 | +# * ports.conf is always included from the main configuration file. It is | ||
36 | +# supposed to determine listening ports for incoming connections which can be | ||
37 | +# customized anytime. | ||
38 | +# | ||
39 | +# * Configuration files in the mods-enabled/, conf-enabled/ and sites-enabled/ | ||
40 | +# directories contain particular configuration snippets which manage modules, | ||
41 | +# global configuration fragments, or virtual host configurations, | ||
42 | +# respectively. | ||
43 | +# | ||
44 | +# They are activated by symlinking available configuration files from their | ||
45 | +# respective *-available/ counterparts. These should be managed by using our | ||
46 | +# helpers a2enmod/a2dismod, a2ensite/a2dissite and a2enconf/a2disconf. See | ||
47 | +# their respective man pages for detailed information. | ||
48 | +# | ||
49 | +# * The binary is called apache2. Due to the use of environment variables, in | ||
50 | +# the default configuration, apache2 needs to be started/stopped with | ||
51 | +# /etc/init.d/apache2 or apache2ctl. Calling /usr/bin/apache2 directly will not | ||
52 | +# work with the default configuration. | ||
53 | + | ||
54 | + | ||
55 | +# Global configuration | ||
56 | +# | ||
57 | + | ||
58 | +# | ||
59 | +# ServerRoot: The top of the directory tree under which the server's | ||
60 | +# configuration, error, and log files are kept. | ||
61 | +# | ||
62 | +# NOTE! If you intend to place this on an NFS (or otherwise network) | ||
63 | +# mounted filesystem then please read the Mutex documentation (available | ||
64 | +# at <URL:http://httpd.apache.org/docs/2.4/mod/core.html#mutex>); | ||
65 | +# you will save yourself a lot of trouble. | ||
66 | +# | ||
67 | +# Do NOT add a slash at the end of the directory path. | ||
68 | +# | ||
69 | +#ServerRoot "/etc/apache2" | ||
70 | + | ||
71 | +# | ||
72 | +# The accept serialization lock file MUST BE STORED ON A LOCAL DISK. | ||
73 | +# | ||
74 | +#Mutex file:${APACHE_LOCK_DIR} default | ||
75 | + | ||
76 | +# | ||
77 | +# The directory where shm and other runtime files will be stored. | ||
78 | +# | ||
79 | + | ||
80 | +DefaultRuntimeDir ${APACHE_RUN_DIR} | ||
81 | + | ||
82 | +# | ||
83 | +# PidFile: The file in which the server should record its process | ||
84 | +# identification number when it starts. | ||
85 | +# This needs to be set in /etc/apache2/envvars | ||
86 | +# | ||
87 | +PidFile ${APACHE_PID_FILE} | ||
88 | + | ||
89 | +# | ||
90 | +# Timeout: The number of seconds before receives and sends time out. | ||
91 | +# | ||
92 | +Timeout 300 | ||
93 | + | ||
94 | +# | ||
95 | +# KeepAlive: Whether or not to allow persistent connections (more than | ||
96 | +# one request per connection). Set to "Off" to deactivate. | ||
97 | +# | ||
98 | +KeepAlive On | ||
99 | + | ||
100 | +# | ||
101 | +# MaxKeepAliveRequests: The maximum number of requests to allow | ||
102 | +# during a persistent connection. Set to 0 to allow an unlimited amount. | ||
103 | +# We recommend you leave this number high, for maximum performance. | ||
104 | +# | ||
105 | +MaxKeepAliveRequests 100 | ||
106 | + | ||
107 | +# | ||
108 | +# KeepAliveTimeout: Number of seconds to wait for the next request from the | ||
109 | +# same client on the same connection. | ||
110 | +# | ||
111 | +KeepAliveTimeout 5 | ||
112 | + | ||
113 | + | ||
114 | +# These need to be set in /etc/apache2/envvars | ||
115 | +User ${APACHE_RUN_USER} | ||
116 | +Group ${APACHE_RUN_GROUP} | ||
117 | + | ||
118 | +# | ||
119 | +# HostnameLookups: Log the names of clients or just their IP addresses | ||
120 | +# e.g., www.apache.org (on) or 204.62.129.132 (off). | ||
121 | +# The default is off because it'd be overall better for the net if people | ||
122 | +# had to knowingly turn this feature on, since enabling it means that | ||
123 | +# each client request will result in AT LEAST one lookup request to the | ||
124 | +# nameserver. | ||
125 | +# | ||
126 | +HostnameLookups Off | ||
127 | + | ||
128 | +# ErrorLog: The location of the error log file. | ||
129 | +# If you do not specify an ErrorLog directive within a <VirtualHost> | ||
130 | +# container, error messages relating to that virtual host will be | ||
131 | +# logged here. If you *do* define an error logfile for a <VirtualHost> | ||
132 | +# container, that host's errors will be logged there and not here. | ||
133 | +# | ||
134 | +ErrorLog ${APACHE_LOG_DIR}/error.log | ||
135 | + | ||
136 | +# | ||
137 | +# LogLevel: Control the severity of messages logged to the error_log. | ||
138 | +# Available values: trace8, ..., trace1, debug, info, notice, warn, | ||
139 | +# error, crit, alert, emerg. | ||
140 | +# It is also possible to configure the log level for particular modules, e.g. | ||
141 | +# "LogLevel info ssl:warn" | ||
142 | +# | ||
143 | +LogLevel warn | ||
144 | + | ||
145 | +# Include module configuration: | ||
146 | +IncludeOptional mods-enabled/*.load | ||
147 | +IncludeOptional mods-enabled/*.conf | ||
148 | + | ||
149 | +# Include list of ports to listen on | ||
150 | +Include ports.conf | ||
151 | + | ||
152 | + | ||
153 | +# Sets the default security model of the Apache2 HTTPD server. It does | ||
154 | +# not allow access to the root filesystem outside of /usr/share and /var/www. | ||
155 | +# The former is used by web applications packaged in Debian, | ||
156 | +# the latter may be used for local directories served by the web server. If | ||
157 | +# your system is serving content from a sub-directory in /srv you must allow | ||
158 | +# access here, or in any related virtual host. | ||
159 | +<Directory /> | ||
160 | + Options FollowSymLinks | ||
161 | + AllowOverride None | ||
162 | + Require all denied | ||
163 | +</Directory> | ||
164 | + | ||
165 | +<Directory /usr/share> | ||
166 | + AllowOverride None | ||
167 | + Require all granted | ||
168 | +</Directory> | ||
169 | + | ||
170 | +<Directory /var/www/> | ||
171 | + Options Indexes FollowSymLinks | ||
172 | + AllowOverride All | ||
173 | + Require all granted | ||
174 | +</Directory> | ||
175 | + | ||
176 | +#<Directory /srv/> | ||
177 | +# Options Indexes FollowSymLinks | ||
178 | +# AllowOverride None | ||
179 | +# Require all granted | ||
180 | +#</Directory> | ||
181 | + | ||
182 | + | ||
183 | +# AccessFileName: The name of the file to look for in each directory | ||
184 | +# for additional configuration directives. See also the AllowOverride | ||
185 | +# directive. | ||
186 | +# | ||
187 | +AccessFileName .htaccess | ||
188 | + | ||
189 | +# | ||
190 | +# The following lines prevent .htaccess and .htpasswd files from being | ||
191 | +# viewed by Web clients. | ||
192 | +# | ||
193 | +<FilesMatch "^\.ht"> | ||
194 | + Require all denied | ||
195 | +</FilesMatch> | ||
196 | + | ||
197 | + | ||
198 | +# | ||
199 | +# The following directives define some format nicknames for use with | ||
200 | +# a CustomLog directive. | ||
201 | +# | ||
202 | +# These deviate from the Common Log Format definitions in that they use %O | ||
203 | +# (the actual bytes sent including headers) instead of %b (the size of the | ||
204 | +# requested file), because the latter makes it impossible to detect partial | ||
205 | +# requests. | ||
206 | +# | ||
207 | +# Note that the use of %{X-Forwarded-For}i instead of %h is not recommended. | ||
208 | +# Use mod_remoteip instead. | ||
209 | +# | ||
210 | +LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined | ||
211 | +LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined | ||
212 | +LogFormat "%h %l %u %t \"%r\" %>s %O" common | ||
213 | +LogFormat "%{Referer}i -> %U" referer | ||
214 | +LogFormat "%{User-agent}i" agent | ||
215 | + | ||
216 | +# Include of directories ignores editors' and dpkg's backup files, | ||
217 | +# see README.Debian for details. | ||
218 | + | ||
219 | +# Include generic snippets of statements | ||
220 | +IncludeOptional conf-enabled/*.conf | ||
221 | + | ||
222 | +# Include the virtual host configurations: | ||
223 | +IncludeOptional sites-enabled/*.conf | ||
224 | + | ||
225 | +LoadModule wsgi_module "/usr/lib/apache2/modules/mod_wsgi-py38.cpython-38-aarch64-linux-gnu.so" | ||
226 | +WSGIPythonHome "/usr" | ||
227 | + | ||
228 | +LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so |
compile-py38.py
0 → 100644
1 | +# coding=utf-8 | ||
2 | +#author: 4N | ||
3 | +#createtime: 2022/2/28 | ||
4 | +#email: nheweijun@sina.com | ||
5 | + | ||
6 | +import py_compile | ||
7 | +import os | ||
8 | +import shutil | ||
9 | + | ||
10 | +def compile(des): | ||
11 | + | ||
12 | + | ||
13 | + project_dir = os.path.dirname(os.path.realpath(__file__)) | ||
14 | + if os.path.normpath(project_dir) == os.path.normpath(des): | ||
15 | + raise Exception("目标目录不能与代码目录一样!") | ||
16 | + | ||
17 | + if os.path.exists(des): | ||
18 | + os.system("rd/s/q {}".format(des)) | ||
19 | + shutil.rmtree(des, True) | ||
20 | + | ||
21 | + shutil.copytree(project_dir, des) | ||
22 | + git_path = os.path.join(des,".git") | ||
23 | + if os.path.exists(os.path.join(des,".git")): | ||
24 | + os.system("rd/s/q {}".format(git_path)) | ||
25 | + | ||
26 | + for root, dirs, files in os.walk(os.path.join(des,"app")): | ||
27 | + for fn in files: | ||
28 | + if fn.endswith("py"): | ||
29 | + py_file = os.path.join(root, fn) | ||
30 | + py_compile.compile(py_file) | ||
31 | + os.remove(py_file) | ||
32 | + pyc_file = os.path.join(root, "__pycache__",fn.split(".")[0]+".cpython-38.pyc") | ||
33 | + des_pyc_file = os.path.join(root,fn.split(".")[0]+".pyc") | ||
34 | + shutil.copy(pyc_file,des_pyc_file) | ||
35 | + | ||
36 | +if __name__ == '__main__': | ||
37 | + des="H:\DMapManager" | ||
38 | + compile(des) | ||
39 | + |
@@ -34,6 +34,6 @@ def compile(des): | @@ -34,6 +34,6 @@ def compile(des): | ||
34 | shutil.copy(pyc_file,des_pyc_file) | 34 | shutil.copy(pyc_file,des_pyc_file) |
35 | 35 | ||
36 | if __name__ == '__main__': | 36 | if __name__ == '__main__': |
37 | - des="D:\DMapManagerPublish" #D:\DMapManagerPublish | 37 | + des="H:\DMapManagerPublish" |
38 | compile(des) | 38 | compile(des) |
39 | 39 |
@@ -37,9 +37,9 @@ echo "正在启动容器..." | @@ -37,9 +37,9 @@ echo "正在启动容器..." | ||
37 | 37 | ||
38 | set="--restart=always -e ALLOW_IP_RANGE=0.0.0.0/0 -p $port1:80 -p $port2:81 " | 38 | set="--restart=always -e ALLOW_IP_RANGE=0.0.0.0/0 -p $port1:80 -p $port2:81 " |
39 | codeMap="-v ${curPath}:/usr/src/app -v ${curPath}/html:/var/www/html" | 39 | codeMap="-v ${curPath}:/usr/src/app -v ${curPath}/html:/var/www/html" |
40 | -apacheMap="-v ${curPath}/apache2.conf:/etc/apache2/apache2.conf -v ${curPath}/dmapmanager.conf:/etc/apache2/sites-enabled/dmapmanager.conf -v ${curPath}/envvars:/etc/apache2/envvars" | 40 | +apacheMap="-v ${curPath}/apache2.arm64.conf:/etc/apache2/apache2.conf -v ${curPath}/dmapmanager.conf:/etc/apache2/sites-enabled/dmapmanager.conf -v ${curPath}/envvars:/etc/apache2/envvars" |
41 | 41 | ||
42 | -docker run -it -d --name ${container_name} ${set} ${codeMap} ${apacheMap} dci/dmapmanager:4.1 | 42 | +docker run -it -d --name ${container_name} ${set} ${codeMap} ${apacheMap} dci/dmapmanager:4.0-arm64 |
43 | sleep 5 | 43 | sleep 5 |
44 | curl localhost:$port2/release | 44 | curl localhost:$port2/release |
45 | 45 |
run.apache.ubuntu.x86.sh
0 → 100644
1 | +#! /bin/sh | ||
2 | +container_name="dmapmanager" | ||
3 | +#停止容器 | ||
4 | +echo "正在关闭容器..." | ||
5 | +docker stop $container_name | ||
6 | +docker rm $container_name | ||
7 | + | ||
8 | +curPath=$(readlink -f $(dirname $0)) | ||
9 | + | ||
10 | + | ||
11 | +#设置日志权限 | ||
12 | +chmod -R 777 $curPath | ||
13 | + | ||
14 | +#设置端口 | ||
15 | +port="" | ||
16 | +if [ ! -n "$1" ] ;then | ||
17 | + | ||
18 | +port1="8830" | ||
19 | +echo "未设置端口1,使用默认8830端口..." | ||
20 | +else | ||
21 | +port1=$1 | ||
22 | +echo "端口1设置为$1 ..." | ||
23 | +fi | ||
24 | + | ||
25 | +port2="" | ||
26 | +if [ ! -n "$2" ] ;then | ||
27 | +port2="8840" | ||
28 | +echo "未设置端口2,使用默认8840端口..." | ||
29 | +else | ||
30 | +port2=$2 | ||
31 | +echo "端口2设置为$2 ..." | ||
32 | +fi | ||
33 | + | ||
34 | + | ||
35 | +#启动容器 | ||
36 | +echo "正在启动容器..." | ||
37 | + | ||
38 | +set="--restart=always -e ALLOW_IP_RANGE=0.0.0.0/0 -p $port1:80 -p $port2:81 " | ||
39 | +codeMap="-v ${curPath}:/usr/src/app -v ${curPath}/html:/var/www/html" | ||
40 | +apacheMap="-v ${curPath}/apache2.x86.conf:/etc/apache2/apache2.conf -v ${curPath}/dmapmanager.conf:/etc/apache2/sites-enabled/dmapmanager.conf -v ${curPath}/envvars:/etc/apache2/envvars" | ||
41 | + | ||
42 | +docker run -it -d --name ${container_name} ${set} ${codeMap} ${apacheMap} dci/dmapmanager:4.0-x86 | ||
43 | +sleep 5 | ||
44 | +curl localhost:$port2/release | ||
45 | + |
@@ -16,7 +16,7 @@ else | @@ -16,7 +16,7 @@ else | ||
16 | echo "端口设置为$1 ..." | 16 | echo "端口设置为$1 ..." |
17 | fi | 17 | fi |
18 | 18 | ||
19 | -docker run -d --name $dn -e TZ="Asia/Shanghai" --restart=always -e ALLOW_IP_RANGE=0.0.0.0/0 -p $port:8840 -v $curPath:/usr/src/app -w /usr/src/app dci/dmapmanager:4.1 python3 ./run.py | 19 | +docker run -d --name $dn -e TZ="Asia/Shanghai" --restart=always -e ALLOW_IP_RANGE=0.0.0.0/0 -p $port:8840 -v $curPath:/usr/src/app -w /usr/src/app dci/dmapmanager:4.0 python3 ./run.py |
20 | # 清除未完成的任务任务 | 20 | # 清除未完成的任务任务 |
21 | sleep 5 | 21 | sleep 5 |
22 | curl localhost:$port/release | 22 | curl localhost:$port/release |
@@ -28,7 +28,7 @@ class MapSynthesize: | @@ -28,7 +28,7 @@ class MapSynthesize: | ||
28 | data:ShapeData | 28 | data:ShapeData |
29 | area_threshold = 10.0 | 29 | area_threshold = 10.0 |
30 | buffer_threshold = 100.0 | 30 | buffer_threshold = 100.0 |
31 | - distance_buffer_threshold = 1.114691025217302e-04 | 31 | + |
32 | 32 | ||
33 | def __init__(self,data): | 33 | def __init__(self,data): |
34 | self.data = data | 34 | self.data = data |
@@ -46,7 +46,7 @@ class MapSynthesize: | @@ -46,7 +46,7 @@ class MapSynthesize: | ||
46 | short_length = min(polygon_env[1]-polygon_env[0],polygon_env[3]-polygon_env[2]) | 46 | short_length = min(polygon_env[1]-polygon_env[0],polygon_env[3]-polygon_env[2]) |
47 | 47 | ||
48 | center:Geometry = polygon.Centroid() | 48 | center:Geometry = polygon.Centroid() |
49 | - # print(center) | 49 | + |
50 | 50 | ||
51 | 51 | ||
52 | # 提前return | 52 | # 提前return |
@@ -87,6 +87,9 @@ class MapSynthesize: | @@ -87,6 +87,9 @@ class MapSynthesize: | ||
87 | oneside_area, otherside_area = None,None | 87 | oneside_area, otherside_area = None,None |
88 | for angle in direction: | 88 | for angle in direction: |
89 | 89 | ||
90 | + # print("\"" + center.ExportToWkt() + "\",") | ||
91 | + | ||
92 | + | ||
90 | if in_hole: | 93 | if in_hole: |
91 | line = self.get_doubleline(center.GetX(),center.GetY(),angle,line_length) | 94 | line = self.get_doubleline(center.GetX(),center.GetY(),angle,line_length) |
92 | else: | 95 | else: |
@@ -181,7 +184,7 @@ class MapSynthesize: | @@ -181,7 +184,7 @@ class MapSynthesize: | ||
181 | plist_d.sort(key=lambda x:x[1]) | 184 | plist_d.sort(key=lambda x:x[1]) |
182 | reprecent_point = self.creat_point(((plist_d[0][0].GetX()+ plist_d[1][0].GetX())/2.0, (plist_d[0][0].GetY()+plist_d[1][0].GetY())/2.0)) | 185 | reprecent_point = self.creat_point(((plist_d[0][0].GetX()+ plist_d[1][0].GetX())/2.0, (plist_d[0][0].GetY()+plist_d[1][0].GetY())/2.0)) |
183 | 186 | ||
184 | - # print("\""+reprecent_point.ExportToWkt() + "\",") | 187 | + |
185 | 188 | ||
186 | rp = RepresentPoint(reprecent_point,polygon) | 189 | rp = RepresentPoint(reprecent_point,polygon) |
187 | 190 | ||
@@ -216,24 +219,33 @@ class MapSynthesize: | @@ -216,24 +219,33 @@ class MapSynthesize: | ||
216 | return line | 219 | return line |
217 | 220 | ||
218 | def get_radline(self,x0,y0,x1,y1,len_size): | 221 | def get_radline(self,x0,y0,x1,y1,len_size): |
222 | + | ||
219 | a2 = math.pow((x1-x0),2) | 223 | a2 = math.pow((x1-x0),2) |
220 | b2 = math.pow((y1-y0),2) | 224 | b2 = math.pow((y1-y0),2) |
221 | len_size = len_size+ math.sqrt(a2+b2) | 225 | len_size = len_size+ math.sqrt(a2+b2) |
222 | 226 | ||
223 | line: Geometry = ogr.Geometry(ogr.wkbLineString) | 227 | line: Geometry = ogr.Geometry(ogr.wkbLineString) |
224 | line.AddPoint(x0, y0) | 228 | line.AddPoint(x0, y0) |
225 | - tanx = abs(y1-y0) / abs(x1-x0) | ||
226 | - cosx = 1 / math.sqrt(1 + tanx *tanx) | ||
227 | - dx = cosx* len_size | ||
228 | - dy = tanx * dx | 229 | + |
230 | + | ||
229 | 231 | ||
230 | if x1 == x0: | 232 | if x1 == x0: |
231 | x2 = x0 | 233 | x2 = x0 |
234 | + # if y1 > y0 : | ||
235 | + # y2 = y0 + abs(dy) | ||
236 | + # else: | ||
237 | + # y2 = y0 - abs(dy) | ||
232 | if y1 > y0 : | 238 | if y1 > y0 : |
233 | - y2 = y0 + abs(dy) | 239 | + y2 = y0 + abs(len_size) |
234 | else: | 240 | else: |
235 | - y2 = y0 - abs(dy) | 241 | + y2 = y0 - abs(len_size) |
236 | else: | 242 | else: |
243 | + | ||
244 | + tanx = abs(y1 - y0) / abs(x1 - x0) | ||
245 | + cosx = 1 / math.sqrt(1 + tanx * tanx) | ||
246 | + dx = cosx * len_size | ||
247 | + dy = tanx * dx | ||
248 | + | ||
237 | if x1 < x0: | 249 | if x1 < x0: |
238 | x2 = x0 - dx | 250 | x2 = x0 - dx |
239 | else: | 251 | else: |
@@ -293,7 +305,6 @@ class MapSynthesize: | @@ -293,7 +305,6 @@ class MapSynthesize: | ||
293 | else: | 305 | else: |
294 | triangle1, triangle2 = self.get_side_triangle(line, angle) | 306 | triangle1, triangle2 = self.get_side_triangle(line, angle) |
295 | 307 | ||
296 | - | ||
297 | for gi in range(clip_geom.GetGeometryCount()): | 308 | for gi in range(clip_geom.GetGeometryCount()): |
298 | clip_geom_i: Geometry = clip_geom.GetGeometryRef(gi) | 309 | clip_geom_i: Geometry = clip_geom.GetGeometryRef(gi) |
299 | it = clip_geom_i.Intersection(triangle1) | 310 | it = clip_geom_i.Intersection(triangle1) |
@@ -320,7 +331,6 @@ class MapSynthesize: | @@ -320,7 +331,6 @@ class MapSynthesize: | ||
320 | 331 | ||
321 | mid_angle = (angle1 + angle2)/2.0 | 332 | mid_angle = (angle1 + angle2)/2.0 |
322 | 333 | ||
323 | - | ||
324 | if in_hole: | 334 | if in_hole: |
325 | line = self.get_doubleline(center.GetX(), center.GetY(), mid_angle, line_length) | 335 | line = self.get_doubleline(center.GetX(), center.GetY(), mid_angle, line_length) |
326 | else: | 336 | else: |
@@ -577,69 +587,6 @@ class MapSynthesize: | @@ -577,69 +587,6 @@ class MapSynthesize: | ||
577 | 587 | ||
578 | return polygon_line | 588 | return polygon_line |
579 | 589 | ||
580 | - def merge_concave(self, trees, distance_threshold): | ||
581 | - merge_polygons = [] | ||
582 | - count = 1 | ||
583 | - | ||
584 | - for tree in trees: | ||
585 | - print(count) | ||
586 | - count+=1 | ||
587 | - polygons = list(tree.get_polygons()) | ||
588 | - | ||
589 | - merge_raw: Geometry = polygons[0] | ||
590 | - for p in polygons: | ||
591 | - merge_raw = merge_raw.Union(p) | ||
592 | - | ||
593 | - points = [] | ||
594 | - | ||
595 | - | ||
596 | - for i in range(merge_raw.GetGeometryCount()): | ||
597 | - | ||
598 | - poly = merge_raw.GetGeometryRef(i) | ||
599 | - poly_line :Geometry = self.get_polygon_lines(poly) | ||
600 | - if poly_line: | ||
601 | - for indx in range(poly_line.GetPointCount() - 1): | ||
602 | - poi = poly_line.GetPoint(indx) | ||
603 | - | ||
604 | - points.append(poi) | ||
605 | - | ||
606 | - poi_next = poly_line.GetPoint(indx + 1) | ||
607 | - | ||
608 | - dis = math.sqrt(math.pow(poi[0] - poi_next[0], 2) + math.pow(poi[1] - poi_next[1], 2)) | ||
609 | - # print(dis) | ||
610 | - if dis > distance_threshold: | ||
611 | - times = int(dis / distance_threshold) | ||
612 | - # print(times) | ||
613 | - for time in range(1, times + 1): | ||
614 | - x, y = self.get_subpoint(poi[0], poi[1], poi_next[0], poi_next[1], (time * distance_threshold)) | ||
615 | - points.append([x, y]) | ||
616 | - | ||
617 | - points = np.array([[p[0], p[1]] for p in points]) | ||
618 | - | ||
619 | - | ||
620 | - cp = [] | ||
621 | - for pp in points: | ||
622 | - poi = ogr.Geometry(ogr.wkbPoint) | ||
623 | - poi.AddPoint(pp[0], pp[1]) | ||
624 | - cp.append(poi) | ||
625 | - | ||
626 | - merge_p_line = concaveHull(points, 3) | ||
627 | - | ||
628 | - ring = ogr.Geometry(ogr.wkbLinearRing) | ||
629 | - | ||
630 | - merge_p = ogr.Geometry(ogr.wkbPolygon) | ||
631 | - | ||
632 | - for l in merge_p_line: | ||
633 | - ring.AddPoint(l[0], l[1]) | ||
634 | - | ||
635 | - ring.AddPoint(merge_p_line[0][0], merge_p_line[0][1]) | ||
636 | - | ||
637 | - merge_p.AddGeometry(ring) | ||
638 | - merge_p = merge_p.Simplify(self.distance_buffer_threshold/10) | ||
639 | - merge_polygons.append(merge_p) | ||
640 | - | ||
641 | - return merge_polygons | ||
642 | - | ||
643 | def get_subpoint(self, x0, y0, x1, y1, len_size): | 590 | def get_subpoint(self, x0, y0, x1, y1, len_size): |
644 | 591 | ||
645 | len_size = len_size | 592 | len_size = len_size |
@@ -667,13 +614,19 @@ class MapSynthesize: | @@ -667,13 +614,19 @@ class MapSynthesize: | ||
667 | 614 | ||
668 | return x2, y2 | 615 | return x2, y2 |
669 | 616 | ||
670 | - def process(self): | 617 | + def process(self,distance_buffer_threshold): |
618 | + | ||
619 | + # self.distance_buffer_threshold = distance_buffer_threshold | ||
620 | + | ||
671 | polygons = self.data.get_polygons() | 621 | polygons = self.data.get_polygons() |
672 | rps = [] | 622 | rps = [] |
673 | 623 | ||
674 | for poly in polygons: | 624 | for poly in polygons: |
675 | rp = self.get_polygon_reprecent_point(poly) | 625 | rp = self.get_polygon_reprecent_point(poly) |
676 | rps.append(rp) | 626 | rps.append(rp) |
627 | + | ||
628 | + | ||
629 | + | ||
677 | print("完成代表点计算") | 630 | print("完成代表点计算") |
678 | 631 | ||
679 | #代表点要融合 | 632 | #代表点要融合 |
@@ -682,17 +635,26 @@ class MapSynthesize: | @@ -682,17 +635,26 @@ class MapSynthesize: | ||
682 | print("完成树生成计算") | 635 | print("完成树生成计算") |
683 | min_delauney = self.create_min_delauney(delauney_lines,rps_sub) | 636 | min_delauney = self.create_min_delauney(delauney_lines,rps_sub) |
684 | print("完成最小生成树计算") | 637 | print("完成最小生成树计算") |
685 | - trees = self.cut_delauney_min_tree(min_delauney,self.distance_buffer_threshold) | 638 | + |
639 | + | ||
640 | + | ||
641 | + trees = self.cut_delauney_min_tree(min_delauney,distance_buffer_threshold) | ||
686 | print("完成树裁剪") | 642 | print("完成树裁剪") |
687 | 643 | ||
644 | + | ||
688 | polygon_result = [] | 645 | polygon_result = [] |
646 | + print(len(list(trees))) | ||
689 | for index,tree in enumerate(trees): | 647 | for index,tree in enumerate(trees): |
690 | - | ||
691 | - polygons = tree.get_polygons() | ||
692 | print(index) | 648 | print(index) |
649 | + polygons = tree.get_polygons() | ||
650 | + # print(index) | ||
693 | polygons = list(polygons) | 651 | polygons = list(polygons) |
694 | - print(len(polygons)) | ||
695 | - polygon_result.append(PolygonMerge.merge(polygons,self.distance_buffer_threshold)) | 652 | + # print(len(polygons)) |
653 | + | ||
654 | + | ||
655 | + polygon_result.append(PolygonMerge.merge(polygons,distance_buffer_threshold)) | ||
656 | + | ||
657 | + # polygon_result.extend(PolygonMerge.merge(polygons,self.distance_buffer_threshold)) | ||
696 | 658 | ||
697 | # polygons = self.merge_concave(trees,self.distance_buffer_threshold) | 659 | # polygons = self.merge_concave(trees,self.distance_buffer_threshold) |
698 | 660 | ||
@@ -703,11 +665,16 @@ if __name__ == '__main__': | @@ -703,11 +665,16 @@ if __name__ == '__main__': | ||
703 | 665 | ||
704 | 666 | ||
705 | t1 = time.time() | 667 | t1 = time.time() |
706 | - sd = ShapeData(r"J:\Data\制图综合result\zhongshansub.shp") | 668 | + sd = ShapeData(r"J:\Data\制图综合result\zhongshan_2_5w.shp") |
707 | 669 | ||
708 | mapsynthesize = MapSynthesize(sd) | 670 | mapsynthesize = MapSynthesize(sd) |
709 | - wkts = mapsynthesize.process() | ||
710 | - result = r"J:\Data\制图综合result\zhongshansub_merge22.shp" | 671 | + |
672 | + base = 9.009009009009009009009009009009e-5 | ||
673 | + | ||
674 | + wkts = mapsynthesize.process(base*5) | ||
675 | + | ||
676 | + | ||
677 | + result = r"J:\Data\制图综合result\zhongshan_5w.shp" | ||
711 | ShapeData.create_shp_fromwkts(result,"zh",wkts) | 678 | ShapeData.create_shp_fromwkts(result,"zh",wkts) |
712 | 679 | ||
713 | print(time.time()-t1) | 680 | print(time.time()-t1) |
@@ -6,10 +6,9 @@ | @@ -6,10 +6,9 @@ | ||
6 | 6 | ||
7 | from osgeo import ogr,gdal | 7 | from osgeo import ogr,gdal |
8 | from osgeo.ogr import * | 8 | from osgeo.ogr import * |
9 | - | ||
10 | -from test.zonghe.ShapeData import ShapeData | 9 | +from test.MapSynthesize.ShapeData import ShapeData |
11 | import copy | 10 | import copy |
12 | - | 11 | +import math |
13 | from rtreelib import RTree,Rect | 12 | from rtreelib import RTree,Rect |
14 | 13 | ||
15 | 14 | ||
@@ -49,38 +48,69 @@ class PolygonMerge: | @@ -49,38 +48,69 @@ class PolygonMerge: | ||
49 | if d < 0: | 48 | if d < 0: |
50 | polygon_line_points.reverse() | 49 | polygon_line_points.reverse() |
51 | 50 | ||
52 | - tris = list(cls.get_tri(polygon_line_points)) | 51 | + tris = list(cls.simple_polygon_division(polygon_line_points)) |
53 | 52 | ||
54 | return tris | 53 | return tris |
55 | 54 | ||
56 | @classmethod | 55 | @classmethod |
57 | - def get_tri(cls,polygon_line_points:list): | ||
58 | - | ||
59 | - if len(polygon_line_points) == 4 or len(polygon_line_points) == 3: | 56 | + def simple_polygon_division(cls,polygon_line_points:list): |
57 | + ''' | ||
58 | + 简单多边形三角剖分算法 | ||
59 | + :param polygon_line_points: 多边形逆时针点序列 | ||
60 | + :return: | ||
61 | + ''' | ||
62 | + | ||
63 | + if len(polygon_line_points) == 4: | ||
60 | yield cls.create_polygon(polygon_line_points) | 64 | yield cls.create_polygon(polygon_line_points) |
61 | else: | 65 | else: |
62 | for index,point in enumerate(polygon_line_points): | 66 | for index,point in enumerate(polygon_line_points): |
63 | - if index == 0: | ||
64 | - continue | ||
65 | - else: | ||
66 | - try: | ||
67 | - point_front = polygon_line_points[index-1] | ||
68 | - point_next = polygon_line_points[index+1] | ||
69 | - except Exception as e: | ||
70 | - print(e) | ||
71 | - kk=1 | ||
72 | - d=1 | ||
73 | - | ||
74 | - check = (point[0]-point_front[0]) * (point_next[1]-point[1]) - (point_next[0]-point[0])*(point[1]-point_front[1]) | ||
75 | - | 67 | + try: |
68 | + if index == 0: | ||
69 | + point_front = polygon_line_points[-1] | ||
70 | + point_next = polygon_line_points[1] | ||
71 | + elif index == len(polygon_line_points) - 1: | ||
72 | + point_front = polygon_line_points[index - 1] | ||
73 | + point_next = polygon_line_points[0] | ||
74 | + else: | ||
75 | + point_front = polygon_line_points[index - 1] | ||
76 | + point_next = polygon_line_points[index + 1] | ||
77 | + | ||
78 | + except: | ||
79 | + dd=1 | ||
80 | + check = (point[0] - point_front[0]) * (point_next[1] -point[1]) - (point_next[0] - point[0]) * (point[1] - point_front[1]) | ||
81 | + | ||
82 | + #如果是凸点 | ||
76 | if check > 0: | 83 | if check > 0: |
77 | triangle = cls.create_polygon([point_front,point,point_next,point_front]) | 84 | triangle = cls.create_polygon([point_front,point,point_next,point_front]) |
78 | - yield triangle | ||
79 | 85 | ||
80 | - polygon_line_points.pop(index) | ||
81 | - for tri in cls.get_tri(polygon_line_points): | ||
82 | - yield tri | ||
83 | - break | 86 | + #判断是否包含其他点 |
87 | + contains = False | ||
88 | + for i,poi_xy in enumerate(polygon_line_points): | ||
89 | + | ||
90 | + if index == 0: | ||
91 | + if i in [0, 1, len(polygon_line_points) - 1]: | ||
92 | + continue | ||
93 | + | ||
94 | + elif index == len(polygon_line_points) - 1: | ||
95 | + if i in [index, 0 ,index - 1]: | ||
96 | + continue | ||
97 | + else: | ||
98 | + if i in [index, index-1, index+1]: | ||
99 | + continue | ||
100 | + | ||
101 | + poi:Geometry = ogr.Geometry(ogr.wkbPoint) | ||
102 | + poi.AddPoint(poi_xy[0],poi_xy[1]) | ||
103 | + if triangle.Contains(poi): | ||
104 | + contains = True | ||
105 | + | ||
106 | + #如果不包含其他点,为有效剖分,结束循环 | ||
107 | + if not contains: | ||
108 | + yield triangle | ||
109 | + polygon_line_points.pop(index) | ||
110 | + for tri in cls.simple_polygon_division(polygon_line_points): | ||
111 | + yield tri | ||
112 | + break | ||
113 | + | ||
84 | 114 | ||
85 | @classmethod | 115 | @classmethod |
86 | def merge(cls,polygons:list,distance_buffer_threshold): | 116 | def merge(cls,polygons:list,distance_buffer_threshold): |
@@ -92,30 +122,27 @@ class PolygonMerge: | @@ -92,30 +122,27 @@ class PolygonMerge: | ||
92 | # for poly in polygons: | 122 | # for poly in polygons: |
93 | # multipolygon.AddGeometry(poly) | 123 | # multipolygon.AddGeometry(poly) |
94 | 124 | ||
125 | + tris = [] | ||
95 | for poly in polygons: | 126 | for poly in polygons: |
96 | polygon = polygon.Union(poly) | 127 | polygon = polygon.Union(poly) |
97 | 128 | ||
98 | - | ||
99 | - | ||
100 | delauney: Geometry = polygon.DelaunayTriangulation() | 129 | delauney: Geometry = polygon.DelaunayTriangulation() |
101 | 130 | ||
102 | for index in range(delauney.GetGeometryCount()): | 131 | for index in range(delauney.GetGeometryCount()): |
103 | de:Geometry = copy.deepcopy(delauney.GetGeometryRef(index)) | 132 | de:Geometry = copy.deepcopy(delauney.GetGeometryRef(index)) |
104 | de_extent = de.GetEnvelope() | 133 | de_extent = de.GetEnvelope() |
105 | rtree.insert(RTreeData(de,1), env2rect(de_extent)) | 134 | rtree.insert(RTreeData(de,1), env2rect(de_extent)) |
135 | + tris.append(de) | ||
106 | 136 | ||
107 | bians: list = cls.get_bian(polygon) | 137 | bians: list = cls.get_bian(polygon) |
108 | 138 | ||
109 | - | ||
110 | for bian in bians: | 139 | for bian in bians: |
111 | 140 | ||
112 | bian_ext = bian.GetEnvelope() | 141 | bian_ext = bian.GetEnvelope() |
113 | - | ||
114 | - query_result = rtree.query(env2rect(bian_ext)) | 142 | + query_result = list(rtree.query(env2rect(bian_ext))) |
115 | 143 | ||
116 | intersection_data = [] | 144 | intersection_data = [] |
117 | 145 | ||
118 | - | ||
119 | for entry in query_result: | 146 | for entry in query_result: |
120 | 147 | ||
121 | # 已被抛弃的不要 | 148 | # 已被抛弃的不要 |
@@ -123,67 +150,65 @@ class PolygonMerge: | @@ -123,67 +150,65 @@ class PolygonMerge: | ||
123 | continue | 150 | continue |
124 | intersection_geom: Geometry = bian.Intersection(entry.data.triangle) | 151 | intersection_geom: Geometry = bian.Intersection(entry.data.triangle) |
125 | 152 | ||
153 | + | ||
126 | if not intersection_geom.IsEmpty(): | 154 | if not intersection_geom.IsEmpty(): |
127 | if not intersection_geom.Equals(bian): | 155 | if not intersection_geom.Equals(bian): |
128 | if intersection_geom.GetGeometryType() in [2, 5, -2147483643, -2147483646, 3002, 3005]: | 156 | if intersection_geom.GetGeometryType() in [2, 5, -2147483643, -2147483646, 3002, 3005]: |
129 | intersection_data.append(entry.data) | 157 | intersection_data.append(entry.data) |
130 | 158 | ||
131 | 159 | ||
160 | + | ||
132 | for data in intersection_data: | 161 | for data in intersection_data: |
133 | data.set_state(0) | 162 | data.set_state(0) |
134 | 163 | ||
135 | if intersection_data: | 164 | if intersection_data: |
136 | 165 | ||
166 | + | ||
137 | inter_tri_merge:Geometry = intersection_data[0].triangle | 167 | inter_tri_merge:Geometry = intersection_data[0].triangle |
138 | 168 | ||
139 | for ind in range(1,len(intersection_data)): | 169 | for ind in range(1,len(intersection_data)): |
140 | inter_tri_merge = inter_tri_merge.Union(intersection_data[ind].triangle) | 170 | inter_tri_merge = inter_tri_merge.Union(intersection_data[ind].triangle) |
141 | 171 | ||
172 | + try: | ||
173 | + inter_tri_merge_line:Geometry = cls.get_polygon_lines(inter_tri_merge) | ||
142 | 174 | ||
143 | - inter_tri_merge_line:Geometry = cls.get_polygon_lines(inter_tri_merge) | ||
144 | - | ||
145 | - inter_tri_merge_line_points:list = inter_tri_merge_line.GetPoints() | 175 | + inter_tri_merge_line_points:list = inter_tri_merge_line.GetPoints() |
146 | 176 | ||
147 | - bian_ps = bian.GetPoints() | 177 | + bian_ps = bian.GetPoints() |
148 | 178 | ||
149 | - if len(inter_tri_merge_line_points[0]) == 3: | ||
150 | - try: | 179 | + if len(inter_tri_merge_line_points[0]) == 3: |
151 | first_index = inter_tri_merge_line_points.index(bian_ps[0]) | 180 | first_index = inter_tri_merge_line_points.index(bian_ps[0]) |
152 | second_index = inter_tri_merge_line_points.index(bian_ps[1]) | 181 | second_index = inter_tri_merge_line_points.index(bian_ps[1]) |
153 | - except: | ||
154 | - rtree.insert(RTreeData(inter_tri_merge, 1), env2rect(inter_tri_merge.GetEnvelope())) | ||
155 | - continue | ||
156 | - else: | ||
157 | - try: | 182 | + else: |
183 | + | ||
158 | first_index = inter_tri_merge_line_points.index((bian_ps[0][0],bian_ps[0][1])) | 184 | first_index = inter_tri_merge_line_points.index((bian_ps[0][0],bian_ps[0][1])) |
159 | second_index = inter_tri_merge_line_points.index((bian_ps[1][0],bian_ps[1][1])) | 185 | second_index = inter_tri_merge_line_points.index((bian_ps[1][0],bian_ps[1][1])) |
160 | - except: | ||
161 | - rtree.insert(RTreeData(inter_tri_merge, 1), env2rect(inter_tri_merge.GetEnvelope())) | ||
162 | - continue | ||
163 | 186 | ||
187 | + small_index = min(first_index,second_index) | ||
188 | + big_index = max(first_index,second_index) | ||
164 | 189 | ||
190 | + small_points:list = inter_tri_merge_line_points[:small_index+1] | ||
191 | + small_points.extend(inter_tri_merge_line_points[big_index:]) | ||
192 | + small_polygon:Geometry = cls.create_polygon(small_points) | ||
165 | 193 | ||
166 | - small_index = min(first_index,second_index) | ||
167 | - big_index = max(first_index,second_index) | 194 | + delauney = cls.get_delauney(small_polygon) |
195 | + for de in delauney: | ||
196 | + de_extent = de.GetEnvelope() | ||
197 | + rtree.insert(RTreeData(de, 1), env2rect(de_extent)) | ||
168 | 198 | ||
169 | - small_points:list = inter_tri_merge_line_points[:small_index+1] | ||
170 | - small_points.extend(inter_tri_merge_line_points[big_index:]) | ||
171 | - small_polygon:Geometry = cls.create_polygon(small_points) | 199 | + big_points = inter_tri_merge_line_points[small_index:big_index+1] |
200 | + big_points.append(inter_tri_merge_line_points[small_index]) | ||
172 | 201 | ||
173 | - delauney = cls.get_delauney(small_polygon) | ||
174 | - for de in delauney: | ||
175 | - de_extent = de.GetEnvelope() | ||
176 | - rtree.insert(RTreeData(de, 1), env2rect(de_extent)) | 202 | + big_polygon:Geometry = cls.create_polygon(big_points) |
177 | 203 | ||
178 | - big_points = inter_tri_merge_line_points[small_index:big_index+1] | ||
179 | - big_points.append(inter_tri_merge_line_points[small_index]) | 204 | + delauney = cls.get_delauney(big_polygon) |
205 | + for de in delauney: | ||
206 | + de_extent = de.GetEnvelope() | ||
207 | + rtree.insert(RTreeData(de, 1), env2rect(de_extent)) | ||
208 | + except: | ||
209 | + print(inter_tri_merge) | ||
210 | + print(bian) | ||
180 | 211 | ||
181 | - big_polygon:Geometry = cls.create_polygon(big_points) | ||
182 | - | ||
183 | - delauney = cls.get_delauney(big_polygon) | ||
184 | - for de in delauney: | ||
185 | - de_extent = de.GetEnvelope() | ||
186 | - rtree.insert(RTreeData(de, 1), env2rect(de_extent)) | ||
187 | 212 | ||
188 | for entry in rtree.get_leaf_entries(): | 213 | for entry in rtree.get_leaf_entries(): |
189 | triangle = entry.data.triangle | 214 | triangle = entry.data.triangle |
@@ -192,42 +217,176 @@ class PolygonMerge: | @@ -192,42 +217,176 @@ class PolygonMerge: | ||
192 | if polygon.Contains(triangle): | 217 | if polygon.Contains(triangle): |
193 | pass | 218 | pass |
194 | else: | 219 | else: |
195 | - tri_center,tri_center2 = cls.get_center(triangle) | ||
196 | - distance = tri_center.Distance(polygon) | ||
197 | - distance2 = tri_center2.Distance(polygon) | 220 | + centers = cls.get_center(triangle) |
221 | + # querycenter :Geometry= tri_center.Buffer(distance_buffer_threshold) | ||
222 | + | ||
223 | + # query_result = list(rtree.query(env2rect(querycenter.GetEnvelope()))) | ||
224 | + | ||
225 | + pass_ = False | ||
226 | + for center in centers: | ||
227 | + distance = center.Distance(polygon) | ||
228 | + if distance > distance_buffer_threshold : | ||
229 | + pass_ = True | ||
230 | + break | ||
198 | 231 | ||
199 | - if distance > distance_buffer_threshold : | 232 | + if pass_: |
200 | continue | 233 | continue |
201 | - # if distance2 > distance_buffer_threshold: | 234 | + |
235 | + # if len(query_result)==0: | ||
202 | # continue | 236 | # continue |
237 | + polygon:Geometry = polygon.Union(triangle) | ||
203 | 238 | ||
204 | - polygon = polygon.Union(triangle) | ||
205 | # polygon.AddGeometry(triangle) | 239 | # polygon.AddGeometry(triangle) |
206 | 240 | ||
207 | - result :Geometry = polygon | 241 | + # result: Geometry = polygon |
242 | + | ||
243 | + # 去岛 | ||
244 | + result :Geometry = cls.remove_hole(polygon,distance_buffer_threshold) | ||
208 | 245 | ||
209 | return result | 246 | return result |
210 | 247 | ||
248 | + @classmethod | ||
249 | + def remove_hole(cls,polygon:Geometry,distance_buffer_threshold): | ||
250 | + | ||
251 | + polygons = [] | ||
252 | + | ||
253 | + if polygon.GetGeometryType() in [6, -2147483642, 3006]: | ||
254 | + for index in range(polygon.GetGeometryCount()): | ||
255 | + each = polygon.GetGeometryRef(index) | ||
256 | + polygons.append(each) | ||
257 | + else: | ||
258 | + polygons.append(polygon) | ||
259 | + | ||
260 | + polygons = [cls.remove_hole_simple(p,distance_buffer_threshold) for p in polygons] | ||
261 | + | ||
262 | + if len(polygons) == 1: | ||
263 | + return polygons[0] | ||
264 | + else: | ||
265 | + mp:Geometry = ogr.Geometry(ogr.wkbMultiPolygon) | ||
266 | + for p in polygons: | ||
267 | + mp.AddGeometry(p) | ||
268 | + return mp | ||
211 | 269 | ||
212 | @classmethod | 270 | @classmethod |
213 | - def get_center(cls,tri:Geometry): | 271 | + def remove_hole_simple(cls,polygon:Geometry,distance_buffer_threshold): |
272 | + | ||
273 | + if polygon.GetGeometryCount() >1: | ||
274 | + for index in range(1,polygon.GetGeometryCount()): | ||
275 | + | ||
276 | + each:Geometry = copy.deepcopy(polygon.GetGeometryRef(index)) | ||
277 | + | ||
278 | + if each.GetArea() < distance_buffer_threshold*distance_buffer_threshold*5: | ||
279 | + polygon.RemoveGeometry(index) | ||
280 | + cls.remove_hole_simple(polygon,distance_buffer_threshold) | ||
281 | + break | ||
282 | + | ||
283 | + return polygon | ||
284 | + | ||
285 | + @classmethod | ||
286 | + def remove_hole_simple2(cls,polygon:Geometry,distance_buffer_threshold): | ||
287 | + | ||
288 | + if polygon.GetGeometryCount() >1: | ||
289 | + for index in range(1,polygon.GetGeometryCount()): | ||
290 | + | ||
291 | + each:Geometry = polygon.GetGeometryRef(index) | ||
292 | + print(polygon.GetGeometryCount()) | ||
293 | + if each: | ||
294 | + if each.GetArea() < distance_buffer_threshold*distance_buffer_threshold*18: | ||
295 | + polygon.RemoveGeometry(index) | ||
296 | + | ||
297 | + return polygon | ||
298 | + | ||
299 | + @classmethod | ||
300 | + def get_center2(cls,tri:Geometry): | ||
301 | + | ||
302 | + tri_line: Geometry = cls.get_polygon_lines(tri) | ||
303 | + tri_line_points = tri_line.GetPoints() | ||
304 | + | ||
305 | + | ||
306 | + | ||
307 | + max = 0 | ||
308 | + poi_tuple = [] | ||
309 | + | ||
310 | + | ||
311 | + center1 = ogr.Geometry(ogr.wkbPoint) | ||
312 | + center2 = ogr.Geometry(ogr.wkbPoint) | ||
313 | + center3 = ogr.Geometry(ogr.wkbPoint) | ||
314 | + | ||
315 | + | ||
316 | + for index in range(len(tri_line_points)-1): | ||
317 | + | ||
318 | + first = tri_line_points[index] | ||
319 | + second = tri_line_points[index+1] | ||
320 | + | ||
321 | + dis = math.sqrt(math.pow(first[0]-second[0],2) + math.pow(first[1]-second[1],2)) | ||
322 | + | ||
323 | + if dis > max: | ||
324 | + max = dis | ||
325 | + poi_tuple = [first, second] | ||
326 | + | ||
327 | + | ||
328 | + | ||
329 | + center1.AddPoint((poi_tuple[0][0]+poi_tuple[1][0])/2,(poi_tuple[0][1]+poi_tuple[1][1])/2) | ||
330 | + center2.AddPoint((poi_tuple[0][0] + center1.GetX()) / 2, (poi_tuple[0][1] + center1.GetY()) / 2) | ||
331 | + center3.AddPoint((poi_tuple[1][0] + center1.GetX()) / 2, (poi_tuple[1][1] + center1.GetY()) / 2) | ||
332 | + | ||
333 | + | ||
334 | + | ||
335 | + return [center1,center2,center3] | ||
336 | + | ||
337 | + @classmethod | ||
338 | + def get_center(cls, tri: Geometry): | ||
339 | + | ||
340 | + center_set = set() | ||
214 | 341 | ||
215 | tri_line: Geometry = cls.get_polygon_lines(tri) | 342 | tri_line: Geometry = cls.get_polygon_lines(tri) |
216 | tri_line_points = tri_line.GetPoints() | 343 | tri_line_points = tri_line.GetPoints() |
217 | 344 | ||
218 | - lines = [] | 345 | + |
346 | + | ||
347 | + max = 0 | ||
348 | + poi_tuple = [] | ||
349 | + | ||
350 | + | ||
351 | + center1 = ogr.Geometry(ogr.wkbPoint) | ||
352 | + center2 = ogr.Geometry(ogr.wkbPoint) | ||
353 | + center3 = ogr.Geometry(ogr.wkbPoint) | ||
354 | + | ||
219 | 355 | ||
220 | for index in range(len(tri_line_points)-1): | 356 | for index in range(len(tri_line_points)-1): |
357 | + | ||
221 | first = tri_line_points[index] | 358 | first = tri_line_points[index] |
222 | second = tri_line_points[index+1] | 359 | second = tri_line_points[index+1] |
223 | - line: Geometry = ogr.Geometry(ogr.wkbLineString) | ||
224 | - line.AddPoint(first[0], first[1]) | ||
225 | - line.AddPoint(second[0], second[1]) | ||
226 | - lines.append(line) | ||
227 | 360 | ||
228 | - lines = sorted(lines,key=lambda l:l.Length()) | 361 | + dis = math.sqrt(math.pow(first[0]-second[0],2) + math.pow(first[1]-second[1],2)) |
362 | + | ||
363 | + if dis > max: | ||
364 | + max = dis | ||
365 | + poi_tuple = [first, second] | ||
366 | + | ||
367 | + | ||
368 | + | ||
369 | + center1.AddPoint((poi_tuple[0][0]+poi_tuple[1][0])/2,(poi_tuple[0][1]+poi_tuple[1][1])/2) | ||
370 | + center2.AddPoint((poi_tuple[0][0] + center1.GetX()) / 2, (poi_tuple[0][1] + center1.GetY()) / 2) | ||
371 | + center3.AddPoint((poi_tuple[1][0] + center1.GetX()) / 2, (poi_tuple[1][1] + center1.GetY()) / 2) | ||
372 | + | ||
373 | + center_set.add(center1) | ||
374 | + center_set.add(center2) | ||
375 | + center_set.add(center3) | ||
229 | 376 | ||
230 | - return lines[-1].Centroid(),lines[-2].Centroid() | 377 | + center4 = ogr.Geometry(ogr.wkbPoint) |
378 | + center5 = ogr.Geometry(ogr.wkbPoint) | ||
379 | + center6 = ogr.Geometry(ogr.wkbPoint) | ||
380 | + | ||
381 | + center4.AddPoint((tri_line_points[0][0] + tri_line_points[1][0]) / 2, (tri_line_points[0][1] + tri_line_points[1][1]) / 2) | ||
382 | + center5.AddPoint((tri_line_points[1][0] + tri_line_points[2][0]) / 2, (tri_line_points[1][1] + tri_line_points[2][1]) / 2) | ||
383 | + center6.AddPoint((tri_line_points[2][0] + tri_line_points[3][0]) / 2, (tri_line_points[2][1] + tri_line_points[3][1]) / 2) | ||
384 | + | ||
385 | + center_set.add(center4) | ||
386 | + center_set.add(center5) | ||
387 | + center_set.add(center6) | ||
388 | + | ||
389 | + return center_set | ||
231 | 390 | ||
232 | @classmethod | 391 | @classmethod |
233 | def get_polygon_lines(cls,polygon): | 392 | def get_polygon_lines(cls,polygon): |
@@ -289,32 +448,17 @@ if __name__ == '__main__': | @@ -289,32 +448,17 @@ if __name__ == '__main__': | ||
289 | t1 = time.time() | 448 | t1 = time.time() |
290 | 449 | ||
291 | 450 | ||
292 | - # sd = ShapeData(r"J:\Data\制图综合result\t4.shp") | ||
293 | - # mp = ogr.Geometry(ogr.wkbMultiPolygon) | ||
294 | - # polygons = sd.get_polygons() | ||
295 | - # | ||
296 | - # wkts = PolygonMerge.merge(polygons) | ||
297 | - # | ||
298 | - # result = r"J:\Data\制图综合result\t4_merge.shp" | ||
299 | - # | ||
300 | - # ShapeData.create_shp_fromwkts(result,"zh",wkts) | ||
301 | - # | ||
302 | - # print(time.time()-t1) | 451 | + sd = ShapeData(r"J:\Data\论文\rh.shp") |
452 | + | ||
453 | + polygons = sd.get_polygons() | ||
454 | + | ||
455 | + p_rh = [PolygonMerge.remove_hole(p,1.114691025217302e-04) for p in polygons] | ||
303 | 456 | ||
457 | + wkts = [p.ExportToWkt() for p in p_rh] | ||
304 | 458 | ||
305 | - p = PolygonMerge.create_polygon([(113.37029204400005, 22.526576828100076, 0.0), (113.36972403800007, 22.526369320699985, 0.0), (113.36974547200009, 22.526379207800005, 0.0), (113.37025989200004, 22.52656695200011, 0.0), (113.37029204400005, 22.526576828100076, 0.0)]) | 459 | + result = r"J:\Data\论文\rhresult.shp" |
306 | 460 | ||
307 | - pl:Geometry = ogr.ForceToLineString(p) | 461 | + ShapeData.create_shp_fromwkts(result,"zh",wkts) |
308 | 462 | ||
309 | - ps:list = pl.GetPoints() | ||
310 | - ps.reverse() | ||
311 | 463 | ||
312 | - PolygonMerge.get_tri(ps) | ||
313 | 464 | ||
314 | - # wkts =[p.ExportToWkt()] | ||
315 | - # | ||
316 | - # result = r"J:\Data\制图综合result\error.shp" | ||
317 | - # | ||
318 | - # ShapeData.create_shp_fromwkts(result,"zh",wkts) | ||
319 | - # | ||
320 | - # print(time.time()-t1) |
请
注册
或
登录
后发表评论